@llm-translate/cli 1.0.0-next.1 → 1.0.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/docker-publish.yml +99 -0
- package/Dockerfile +1 -1
- package/dist/cli/index.js +40 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +20 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/serve.ts +7 -0
- package/src/core/engine.ts +23 -12
- package/src/server/index.ts +9 -0
- package/src/server/routes/translate.ts +9 -2
- package/src/server/types.ts +2 -0
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/options.ts","../../src/errors.ts","../../src/services/config.ts","../../src/types/mqm.ts","../../src/types/analysis.ts","../../src/types/modes.ts","../../src/services/glossary.ts","../../src/utils/logger.ts","../../src/core/agent.ts","../../src/utils/tokens.ts","../../src/core/chunker.ts","../../src/parsers/markdown.ts","../../src/providers/claude.ts","../../src/providers/openai.ts","../../src/providers/ollama.ts","../../src/providers/registry.ts","../../src/services/cache.ts","../../src/core/engine.ts","../../src/cli/commands/file.ts","../../src/cli/index.ts","../../src/cli/commands/dir.ts","../../src/cli/commands/init.ts","../../src/cli/commands/glossary.ts","../../src/server/middleware/auth.ts","../../src/server/middleware/logger.ts","../../src/server/routes/health.ts","../../src/server/types.ts","../../src/server/routes/translate.ts","../../src/server/index.ts","../../src/cli/commands/serve.ts"],"names":["config","mapFinishReason","MODEL_INFO","DEFAULT_MODEL","generateText","streamText","createOpenAI","dirname","readFile","Command","resolve","join","startTime","mapFormat","mkdir","writeFile","defaultConfig","loadGlossary","result","createMiddleware","providers","z","MODE_PRESETS","Hono","HTTPException","handleStdinTranslation"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderName, DocumentFormat } from '../types/index.js';\n\n// ============================================================================\n// CLI Option Types\n// ============================================================================\n\nexport interface GlobalOptions {\n sourceLang: string;\n targetLang: string;\n config?: string;\n verbose?: boolean;\n quiet?: boolean;\n}\n\nexport interface TranslationOptions extends GlobalOptions {\n glossary?: string;\n provider?: ProviderName;\n model?: string;\n quality?: string; // Commander returns strings, parsed to number in handler\n maxIterations?: string; // Commander returns strings, parsed to number in handler\n}\n\nexport interface OutputOptions {\n output?: string;\n format?: DocumentFormat;\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport interface AdvancedOptions {\n chunkSize?: string; // Commander returns strings, parsed to number in handler\n parallel?: number;\n cache?: boolean; // Commander's --no-cache sets this to false\n context?: string;\n strictQuality?: boolean;\n strictGlossary?: boolean;\n}\n\nexport interface FileCommandOptions\n extends TranslationOptions,\n OutputOptions,\n AdvancedOptions {}\n\nexport interface DirCommandOptions\n extends TranslationOptions,\n OutputOptions,\n AdvancedOptions {}\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nexport const defaults = {\n quality: 85,\n maxIterations: 4,\n chunkSize: 1024,\n parallel: 3,\n provider: 'claude' as ProviderName,\n} as const;\n","// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport enum ErrorCode {\n // Configuration Errors\n CONFIG_NOT_FOUND = 'CONFIG_NOT_FOUND',\n CONFIG_INVALID = 'CONFIG_INVALID',\n\n // Glossary Errors\n GLOSSARY_NOT_FOUND = 'GLOSSARY_NOT_FOUND',\n GLOSSARY_INVALID = 'GLOSSARY_INVALID',\n\n // Provider Errors\n PROVIDER_NOT_FOUND = 'PROVIDER_NOT_FOUND',\n PROVIDER_AUTH_FAILED = 'PROVIDER_AUTH_FAILED',\n PROVIDER_RATE_LIMITED = 'PROVIDER_RATE_LIMITED',\n PROVIDER_ERROR = 'PROVIDER_ERROR',\n\n // Translation Errors\n QUALITY_THRESHOLD_NOT_MET = 'QUALITY_THRESHOLD_NOT_MET',\n GLOSSARY_COMPLIANCE_FAILED = 'GLOSSARY_COMPLIANCE_FAILED',\n\n // File Errors\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\n FILE_READ_ERROR = 'FILE_READ_ERROR',\n FILE_WRITE_ERROR = 'FILE_WRITE_ERROR',\n\n // Format Errors\n UNSUPPORTED_FORMAT = 'UNSUPPORTED_FORMAT',\n CHUNK_TOO_LARGE = 'CHUNK_TOO_LARGE',\n\n // General Errors\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n// ============================================================================\n// Error Messages\n// ============================================================================\n\nconst errorMessages: Record<ErrorCode, string> = {\n [ErrorCode.CONFIG_NOT_FOUND]:\n 'Configuration file not found. Run `llm-translate init` to create one.',\n [ErrorCode.CONFIG_INVALID]:\n 'Configuration file is invalid. Please check the format and required fields.',\n [ErrorCode.GLOSSARY_NOT_FOUND]:\n 'Glossary file not found at the specified path.',\n [ErrorCode.GLOSSARY_INVALID]:\n 'Glossary file is invalid. Please check the JSON format and structure.',\n [ErrorCode.PROVIDER_NOT_FOUND]:\n 'The specified LLM provider is not available. Supported providers: claude, openai, ollama.',\n [ErrorCode.PROVIDER_AUTH_FAILED]:\n 'Authentication failed. Check your API key in environment variables.',\n [ErrorCode.PROVIDER_RATE_LIMITED]:\n 'Rate limited by the LLM provider. Please wait and try again.',\n [ErrorCode.PROVIDER_ERROR]:\n 'An error occurred while communicating with the LLM provider.',\n [ErrorCode.QUALITY_THRESHOLD_NOT_MET]:\n 'Translation quality ({score}) did not meet threshold ({threshold}). Use --quality to adjust or --max-iterations to allow more refinement.',\n [ErrorCode.GLOSSARY_COMPLIANCE_FAILED]:\n 'Glossary compliance failed. Missing terms: {missed}. Use --no-strict-glossary to allow partial compliance.',\n [ErrorCode.FILE_NOT_FOUND]: 'The specified file was not found.',\n [ErrorCode.FILE_READ_ERROR]: 'Failed to read the file.',\n [ErrorCode.FILE_WRITE_ERROR]: 'Failed to write to the output file.',\n [ErrorCode.UNSUPPORTED_FORMAT]:\n 'The file format is not supported. Supported formats: markdown, html, text.',\n [ErrorCode.CHUNK_TOO_LARGE]:\n 'A chunk exceeds the maximum token limit and cannot be processed.',\n [ErrorCode.UNKNOWN_ERROR]: 'An unexpected error occurred.',\n};\n\n// ============================================================================\n// Translation Error Class\n// ============================================================================\n\nexport class TranslationError extends Error {\n public readonly code: ErrorCode;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: ErrorCode,\n details?: Record<string, unknown>,\n customMessage?: string\n ) {\n const message = customMessage ?? formatErrorMessage(code, details);\n super(message);\n\n this.name = 'TranslationError';\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TranslationError);\n }\n }\n\n /**\n * Create a JSON representation of the error\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatErrorMessage(\n code: ErrorCode,\n details?: Record<string, unknown>\n): string {\n let message = errorMessages[code] ?? errorMessages[ErrorCode.UNKNOWN_ERROR];\n\n if (details) {\n // Replace placeholders like {score} with actual values\n for (const [key, value] of Object.entries(details)) {\n message = message.replace(`{${key}}`, String(value));\n }\n }\n\n return message;\n}\n\n// ============================================================================\n// Error Type Guards\n// ============================================================================\n\nexport function isTranslationError(error: unknown): error is TranslationError {\n return error instanceof TranslationError;\n}\n\nexport function isErrorCode(error: unknown, code: ErrorCode): boolean {\n return isTranslationError(error) && error.code === code;\n}\n\n// ============================================================================\n// Exit Codes (for CLI)\n// ============================================================================\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n INVALID_ARGUMENTS: 2,\n FILE_NOT_FOUND: 3,\n QUALITY_THRESHOLD_NOT_MET: 4,\n PROVIDER_ERROR: 5,\n GLOSSARY_VALIDATION_FAILED: 6,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Map error codes to exit codes\n */\nexport function getExitCode(error: TranslationError): ExitCode {\n switch (error.code) {\n case ErrorCode.FILE_NOT_FOUND:\n case ErrorCode.CONFIG_NOT_FOUND:\n case ErrorCode.GLOSSARY_NOT_FOUND:\n return ExitCode.FILE_NOT_FOUND;\n\n case ErrorCode.CONFIG_INVALID:\n case ErrorCode.UNSUPPORTED_FORMAT:\n return ExitCode.INVALID_ARGUMENTS;\n\n case ErrorCode.QUALITY_THRESHOLD_NOT_MET:\n return ExitCode.QUALITY_THRESHOLD_NOT_MET;\n\n case ErrorCode.PROVIDER_NOT_FOUND:\n case ErrorCode.PROVIDER_AUTH_FAILED:\n case ErrorCode.PROVIDER_RATE_LIMITED:\n case ErrorCode.PROVIDER_ERROR:\n return ExitCode.PROVIDER_ERROR;\n\n case ErrorCode.GLOSSARY_INVALID:\n return ExitCode.GLOSSARY_VALIDATION_FAILED;\n\n default:\n return ExitCode.GENERAL_ERROR;\n }\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { z } from 'zod';\nimport type { TranslateConfig, ProviderName } from '../types/index.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\n\n// ============================================================================\n// Zod Schema for Config Validation\n// ============================================================================\n\nconst providerNameSchema = z.enum(['claude', 'openai', 'ollama', 'custom']);\n\nconst configSchema = z.object({\n version: z.string(),\n project: z\n .object({\n name: z.string(),\n description: z.string(),\n purpose: z.string(),\n })\n .optional(),\n languages: z.object({\n source: z.string(),\n targets: z.array(z.string()),\n styles: z.record(z.string(), z.string()).optional(),\n }),\n provider: z.object({\n default: providerNameSchema,\n model: z.string().optional(),\n fallback: z.array(providerNameSchema).optional(),\n apiKeys: z.record(providerNameSchema, z.string()).optional(),\n }),\n quality: z.object({\n threshold: z.number().min(0).max(100),\n maxIterations: z.number().min(1).max(10),\n evaluationMethod: z.enum(['llm', 'embedding', 'hybrid']),\n }),\n chunking: z.object({\n maxTokens: z.number().min(100).max(8000),\n overlapTokens: z.number().min(0),\n preserveStructure: z.boolean(),\n }),\n glossary: z\n .object({\n path: z.string(),\n strict: z.boolean(),\n })\n .optional(),\n paths: z.object({\n output: z.string(),\n cache: z.string().optional(),\n }),\n ignore: z.array(z.string()).optional(),\n});\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst defaultConfig: TranslateConfig = {\n version: '1.0',\n languages: {\n source: 'en',\n targets: [],\n },\n provider: {\n default: 'claude',\n },\n quality: {\n threshold: 85,\n maxIterations: 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: {\n output: './{lang}',\n },\n};\n\n// ============================================================================\n// Config Loader\n// ============================================================================\n\nconst explorer = cosmiconfig('translate', {\n searchPlaces: [\n '.translaterc',\n '.translaterc.json',\n '.translaterc.yaml',\n '.translaterc.yml',\n 'translate.config.js',\n 'translate.config.mjs',\n ],\n});\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\nexport async function loadConfig(\n options: LoadConfigOptions = {}\n): Promise<TranslateConfig> {\n const { configPath, cwd = process.cwd() } = options;\n\n let result;\n\n try {\n if (configPath) {\n result = await explorer.load(configPath);\n } else {\n result = await explorer.search(cwd);\n }\n } catch (error) {\n throw new TranslationError(ErrorCode.CONFIG_NOT_FOUND, {\n path: configPath ?? cwd,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (!result || result.isEmpty) {\n // Return default config if no config file found\n return defaultConfig;\n }\n\n // Validate config\n const parseResult = configSchema.safeParse(result.config);\n\n if (!parseResult.success) {\n throw new TranslationError(ErrorCode.CONFIG_INVALID, {\n path: result.filepath,\n errors: parseResult.error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n }\n\n return parseResult.data as TranslateConfig;\n}\n\n// ============================================================================\n// Config Merger (CLI options override config file)\n// ============================================================================\n\nexport interface CLIOverrides {\n sourceLang?: string;\n targetLang?: string;\n provider?: ProviderName;\n model?: string;\n quality?: number;\n maxIterations?: number;\n chunkSize?: number;\n glossary?: string;\n output?: string;\n noCache?: boolean;\n}\n\nexport function mergeConfig(\n config: TranslateConfig,\n overrides: CLIOverrides\n): TranslateConfig {\n const merged = { ...config };\n\n if (overrides.sourceLang) {\n merged.languages = { ...merged.languages, source: overrides.sourceLang };\n }\n\n if (overrides.targetLang) {\n merged.languages = {\n ...merged.languages,\n targets: [overrides.targetLang],\n };\n }\n\n if (overrides.provider) {\n merged.provider = { ...merged.provider, default: overrides.provider };\n }\n\n if (overrides.model) {\n merged.provider = { ...merged.provider, model: overrides.model };\n }\n\n if (overrides.quality !== undefined) {\n merged.quality = { ...merged.quality, threshold: overrides.quality };\n }\n\n if (overrides.maxIterations !== undefined) {\n merged.quality = {\n ...merged.quality,\n maxIterations: overrides.maxIterations,\n };\n }\n\n if (overrides.chunkSize !== undefined) {\n merged.chunking = { ...merged.chunking, maxTokens: overrides.chunkSize };\n }\n\n if (overrides.glossary) {\n merged.glossary = {\n path: overrides.glossary,\n strict: merged.glossary?.strict ?? false,\n };\n }\n\n if (overrides.output) {\n merged.paths = { ...merged.paths, output: overrides.output };\n }\n\n if (overrides.noCache) {\n merged.paths = { ...merged.paths, cache: undefined };\n }\n\n return merged;\n}\n","/**\n * MQM (Multidimensional Quality Metrics) Types\n * Based on https://themqm.org/ framework used in WMT evaluations\n *\n * Reference: TEaR (Translate, Estimate, Refine) - NAACL 2025\n * https://arxiv.org/abs/2402.16379\n */\n\n/**\n * MQM Error Categories\n */\nexport type MQMErrorType =\n // Accuracy errors - meaning/content issues\n | 'accuracy/mistranslation' // Incorrect meaning\n | 'accuracy/omission' // Missing content from source\n | 'accuracy/addition' // Extra content not in source\n | 'accuracy/untranslated' // Source text left unchanged\n // Fluency errors - target language issues\n | 'fluency/grammar' // Grammatical errors\n | 'fluency/spelling' // Spelling/typos\n | 'fluency/register' // Inappropriate formality level\n | 'fluency/inconsistency' // Inconsistent terminology\n // Style errors - quality/naturalness issues\n | 'style/awkward' // Unnatural phrasing\n | 'style/unidiomatic'; // Non-native expressions\n\n/**\n * MQM Severity Levels\n */\nexport type MQMSeverity = 'minor' | 'major' | 'critical';\n\n/**\n * MQM Severity Weights for score calculation\n */\nexport const MQM_SEVERITY_WEIGHTS: Record<MQMSeverity, number> = {\n minor: 1, // Noticeable but doesn't affect understanding\n major: 5, // Affects understanding or usability\n critical: 25, // Completely wrong or unusable\n};\n\n/**\n * Individual MQM error annotation\n */\nexport interface MQMError {\n /** Error category */\n type: MQMErrorType;\n\n /** Error severity */\n severity: MQMSeverity;\n\n /** The affected text in translation */\n span: string;\n\n /** Suggested correction */\n suggestion: string;\n\n /** Brief reason for the error */\n explanation?: string;\n\n /** Corresponding source text (if applicable) */\n sourceSpan?: string;\n}\n\n/**\n * MQM evaluation result\n */\nexport interface MQMEvaluation {\n /** List of identified errors */\n errors: MQMError[];\n\n /** Quality score: 100 - sum(error weights), min 0 */\n score: number;\n\n /** Brief overall assessment */\n summary: string;\n\n /** Error count breakdown by category */\n breakdown: {\n accuracy: number;\n fluency: number;\n style: number;\n };\n}\n\n/**\n * Calculate MQM score from errors\n * Score = max(0, 100 - Σ(error_weight))\n */\nexport function calculateMQMScore(errors: MQMError[]): number {\n const totalPenalty = errors.reduce(\n (sum, err) => sum + MQM_SEVERITY_WEIGHTS[err.severity],\n 0\n );\n return Math.max(0, 100 - totalPenalty);\n}\n\n/**\n * Calculate error breakdown by category\n */\nexport function calculateMQMBreakdown(\n errors: MQMError[]\n): MQMEvaluation['breakdown'] {\n return {\n accuracy: errors.filter((e) => e.type.startsWith('accuracy/')).length,\n fluency: errors.filter((e) => e.type.startsWith('fluency/')).length,\n style: errors.filter((e) => e.type.startsWith('style/')).length,\n };\n}\n\n/**\n * Parse MQM evaluation JSON response from LLM\n */\nexport function parseMQMResponse(response: string): MQMEvaluation | null {\n try {\n // Extract JSON from response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n errors?: MQMError[];\n score?: number;\n summary?: string;\n };\n\n const errors = parsed.errors ?? [];\n const score = parsed.score ?? calculateMQMScore(errors);\n\n return {\n errors,\n score,\n summary: parsed.summary ?? '',\n breakdown: calculateMQMBreakdown(errors),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format MQM errors for refinement prompt\n */\nexport function formatMQMErrorsForPrompt(errors: MQMError[]): string {\n if (errors.length === 0) {\n return 'No errors identified.';\n }\n\n return errors\n .map((err, i) => {\n const severity = err.severity.toUpperCase();\n return `${i + 1}. [${severity}] ${err.type}\n Text: \"${err.span}\"\n Fix: \"${err.suggestion}\"${err.explanation ? `\\n Reason: ${err.explanation}` : ''}`;\n })\n .join('\\n\\n');\n}\n","/**\n * Pre-Translation Analysis Types\n * Based on MAPS (Multi-Aspect Prompting and Selection) framework\n *\n * Reference: TACL 2024\n * https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00642/119992\n * https://github.com/zwhe99/MAPS-mt\n */\n\n/**\n * Key term identified during pre-analysis\n */\nexport interface AnalyzedTerm {\n /** The term in source language */\n term: string;\n\n /** Usage context */\n context: string;\n\n /** Suggested translation (if not in glossary) */\n suggestedTranslation?: string;\n\n /** Whether this term was found in the glossary */\n fromGlossary: boolean;\n}\n\n/**\n * Ambiguous phrase that needs clarification\n */\nexport interface AmbiguousPhrase {\n /** The ambiguous phrase */\n phrase: string;\n\n /** Possible interpretations */\n interpretations: string[];\n\n /** Recommended interpretation */\n recommendation: string;\n}\n\n/**\n * Domain classification for the content\n */\nexport type ContentDomain =\n | 'technical'\n | 'marketing'\n | 'legal'\n | 'medical'\n | 'general';\n\n/**\n * Register/formality recommendation\n */\nexport type RegisterLevel = 'formal' | 'informal' | 'neutral';\n\n/**\n * Pre-translation analysis result (MAPS-style)\n */\nexport interface PreTranslationAnalysis {\n /** Key domain-specific terms identified */\n keyTerms: AnalyzedTerm[];\n\n /** Phrases with multiple possible interpretations */\n ambiguousPhrases: AmbiguousPhrase[];\n\n /** Items that should NOT be translated (code, URLs, names) */\n preserveExact: string[];\n\n /** Identified translation challenges for this language pair */\n challenges: string[];\n\n /** Detected content domain */\n domain: ContentDomain;\n\n /** Recommended formality level */\n registerRecommendation: RegisterLevel;\n}\n\n/**\n * Parse pre-analysis JSON response from LLM\n */\nexport function parseAnalysisResponse(\n response: string\n): PreTranslationAnalysis | null {\n try {\n // Extract JSON from response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as Partial<PreTranslationAnalysis>;\n\n return {\n keyTerms: parsed.keyTerms ?? [],\n ambiguousPhrases: parsed.ambiguousPhrases ?? [],\n preserveExact: parsed.preserveExact ?? [],\n challenges: parsed.challenges ?? [],\n domain: parsed.domain ?? 'general',\n registerRecommendation: parsed.registerRecommendation ?? 'neutral',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format analysis result for translation prompt\n */\nexport function formatAnalysisForPrompt(\n analysis: PreTranslationAnalysis\n): string {\n const sections: string[] = [];\n\n // Key terms section\n if (analysis.keyTerms.length > 0) {\n const terms = analysis.keyTerms\n .map((t) => {\n const translation = t.suggestedTranslation\n ? ` → ${t.suggestedTranslation}`\n : '';\n const source = t.fromGlossary ? ' (glossary)' : '';\n return `- \"${t.term}\"${translation}${source}: ${t.context}`;\n })\n .join('\\n');\n sections.push(`**Key Terms:**\\n${terms}`);\n }\n\n // Ambiguous phrases section\n if (analysis.ambiguousPhrases.length > 0) {\n const phrases = analysis.ambiguousPhrases\n .map((p) => `- \"${p.phrase}\": Use interpretation \"${p.recommendation}\"`)\n .join('\\n');\n sections.push(`**Ambiguous Phrases (use these interpretations):**\\n${phrases}`);\n }\n\n // Preserve exact section\n if (analysis.preserveExact.length > 0) {\n sections.push(\n `**Do NOT translate (keep exactly as-is):**\\n${analysis.preserveExact.map((s) => `- ${s}`).join('\\n')}`\n );\n }\n\n // Domain and register\n sections.push(\n `**Content Type:** ${analysis.domain}\\n**Tone:** ${analysis.registerRecommendation}`\n );\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Create empty analysis result (for fast mode)\n */\nexport function createEmptyAnalysis(): PreTranslationAnalysis {\n return {\n keyTerms: [],\n ambiguousPhrases: [],\n preserveExact: [],\n challenges: [],\n domain: 'general',\n registerRecommendation: 'neutral',\n };\n}\n","/**\n * Translation Mode Configurations\n *\n * Defines preset configurations for different translation quality/speed tradeoffs\n */\n\n/**\n * Available translation modes\n */\nexport type TranslationMode = 'fast' | 'balanced' | 'quality';\n\n/**\n * Configuration for a translation mode\n */\nexport interface ModeConfig {\n /** Enable pre-translation analysis (MAPS-style) */\n enableAnalysis: boolean;\n\n /** Use MQM-based evaluation instead of simple scoring */\n useMQMEvaluation: boolean;\n\n /** Maximum refinement iterations */\n maxIterations: number;\n\n /** Quality threshold (0 = skip threshold check) */\n qualityThreshold: number;\n}\n\n/**\n * Mode preset configurations\n */\nexport const MODE_PRESETS: Record<TranslationMode, ModeConfig> = {\n /**\n * Fast mode: Single pass, no evaluation\n * Best for: Quick drafts, large batches, local models\n * Speed: ~1x (fastest)\n */\n fast: {\n enableAnalysis: false,\n useMQMEvaluation: false,\n maxIterations: 1,\n qualityThreshold: 0, // Skip threshold check\n },\n\n /**\n * Balanced mode: TEaR with MQM evaluation\n * Best for: General use, good quality with reasonable speed\n * Speed: ~2-3x\n */\n balanced: {\n enableAnalysis: false,\n useMQMEvaluation: true,\n maxIterations: 2,\n qualityThreshold: 75,\n },\n\n /**\n * Quality mode: Full MAPS + TEaR pipeline\n * Best for: Production content, critical documents\n * Speed: ~4-5x\n */\n quality: {\n enableAnalysis: true,\n useMQMEvaluation: true,\n maxIterations: 4,\n qualityThreshold: 85,\n },\n};\n\n/**\n * Get mode configuration with optional overrides\n */\nexport function getModeConfig(\n mode: TranslationMode,\n overrides?: Partial<ModeConfig>\n): ModeConfig {\n const preset = MODE_PRESETS[mode];\n\n if (!overrides) {\n return preset;\n }\n\n return {\n enableAnalysis: overrides.enableAnalysis ?? preset.enableAnalysis,\n useMQMEvaluation: overrides.useMQMEvaluation ?? preset.useMQMEvaluation,\n maxIterations: overrides.maxIterations ?? preset.maxIterations,\n qualityThreshold: overrides.qualityThreshold ?? preset.qualityThreshold,\n };\n}\n\n/**\n * Determine effective mode from CLI options\n */\nexport function resolveMode(options: {\n mode?: TranslationMode;\n quality?: number;\n maxIterations?: number;\n noAnalysis?: boolean;\n noMqm?: boolean;\n}): ModeConfig {\n const baseMode = options.mode ?? 'balanced';\n const preset = MODE_PRESETS[baseMode];\n\n return {\n enableAnalysis:\n options.noAnalysis !== undefined\n ? !options.noAnalysis\n : preset.enableAnalysis,\n useMQMEvaluation:\n options.noMqm !== undefined ? !options.noMqm : preset.useMQMEvaluation,\n maxIterations: options.maxIterations ?? preset.maxIterations,\n qualityThreshold: options.quality ?? preset.qualityThreshold,\n };\n}\n\n/**\n * Check if mode allows skipping evaluation\n */\nexport function shouldSkipEvaluation(config: ModeConfig): boolean {\n return config.maxIterations <= 1 && config.qualityThreshold <= 0;\n}\n","import { readFile } from 'node:fs/promises';\nimport type {\n Glossary,\n GlossaryTerm,\n ResolvedGlossary,\n ResolvedGlossaryTerm,\n} from '../types/index.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\n\n// ============================================================================\n// Glossary Loading\n// ============================================================================\n\nexport async function loadGlossary(path: string): Promise<Glossary> {\n let content: string;\n\n try {\n content = await readFile(path, 'utf-8');\n } catch (error) {\n throw new TranslationError(ErrorCode.GLOSSARY_NOT_FOUND, {\n path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n return JSON.parse(content) as Glossary;\n } catch (error) {\n throw new TranslationError(ErrorCode.GLOSSARY_INVALID, {\n path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n// ============================================================================\n// Glossary Resolution\n// ============================================================================\n\nexport function resolveGlossary(\n glossary: Glossary,\n targetLang: string\n): ResolvedGlossary {\n return {\n metadata: {\n name: glossary.metadata.name,\n sourceLang: glossary.metadata.sourceLang,\n targetLang,\n version: glossary.metadata.version,\n domain: glossary.metadata.domain,\n },\n terms: glossary.terms\n .map((term) => resolveGlossaryTerm(term, targetLang))\n .filter((term): term is ResolvedGlossaryTerm => term !== null),\n };\n}\n\nfunction resolveGlossaryTerm(\n term: GlossaryTerm,\n targetLang: string\n): ResolvedGlossaryTerm | null {\n const target = resolveTarget(term, targetLang);\n\n // Skip if no translation available and not a doNotTranslate term\n if (target === undefined) {\n return null;\n }\n\n return {\n source: term.source,\n target,\n context: term.context,\n caseSensitive: term.caseSensitive ?? false,\n doNotTranslate: resolveDoNotTranslate(term, targetLang),\n };\n}\n\nfunction resolveTarget(term: GlossaryTerm, targetLang: string): string | undefined {\n if (term.doNotTranslate) {\n return term.source;\n }\n\n if (term.doNotTranslateFor?.includes(targetLang)) {\n return term.source;\n }\n\n const translation = term.targets[targetLang];\n if (translation) {\n return translation;\n }\n\n // No translation available for this language\n return undefined;\n}\n\nfunction resolveDoNotTranslate(term: GlossaryTerm, targetLang: string): boolean {\n return (\n term.doNotTranslate === true ||\n term.doNotTranslateFor?.includes(targetLang) === true\n );\n}\n\n// ============================================================================\n// Glossary Lookup\n// ============================================================================\n\nexport interface GlossaryLookup {\n /**\n * Find a term in the glossary\n */\n find(text: string): ResolvedGlossaryTerm | undefined;\n\n /**\n * Find all matching terms in a text\n */\n findAll(text: string): ResolvedGlossaryTerm[];\n\n /**\n * Get all terms\n */\n getTerms(): ResolvedGlossaryTerm[];\n\n /**\n * Format glossary for prompt injection\n */\n formatForPrompt(): string;\n}\n\nexport function createGlossaryLookup(glossary: ResolvedGlossary): GlossaryLookup {\n // Create a map for fast lookup\n const termMap = new Map<string, ResolvedGlossaryTerm>();\n const caseSensitiveTerms: ResolvedGlossaryTerm[] = [];\n const caseInsensitiveTerms: ResolvedGlossaryTerm[] = [];\n\n for (const term of glossary.terms) {\n if (term.caseSensitive) {\n termMap.set(term.source, term);\n caseSensitiveTerms.push(term);\n } else {\n termMap.set(term.source.toLowerCase(), term);\n caseInsensitiveTerms.push(term);\n }\n }\n\n return {\n find(text: string): ResolvedGlossaryTerm | undefined {\n // Try exact match first\n const exact = termMap.get(text);\n if (exact) return exact;\n\n // Try case-insensitive\n return termMap.get(text.toLowerCase());\n },\n\n findAll(text: string): ResolvedGlossaryTerm[] {\n const matches: ResolvedGlossaryTerm[] = [];\n\n // Check case-sensitive terms\n for (const term of caseSensitiveTerms) {\n if (text.includes(term.source)) {\n matches.push(term);\n }\n }\n\n // Check case-insensitive terms\n const lowerText = text.toLowerCase();\n for (const term of caseInsensitiveTerms) {\n if (lowerText.includes(term.source.toLowerCase())) {\n matches.push(term);\n }\n }\n\n return matches;\n },\n\n getTerms(): ResolvedGlossaryTerm[] {\n return glossary.terms;\n },\n\n formatForPrompt(): string {\n const lines: string[] = [];\n\n for (const term of glossary.terms) {\n const flags: string[] = [];\n\n if (term.caseSensitive) {\n flags.push('case-sensitive');\n } else {\n flags.push('case-insensitive');\n }\n\n if (term.context) {\n flags.push(`context: ${term.context}`);\n }\n\n const flagStr = flags.length > 0 ? ` (${flags.join(', ')})` : '';\n\n if (term.doNotTranslate) {\n lines.push(`- \"${term.source}\" → [DO NOT TRANSLATE, keep as-is]${flagStr}`);\n } else {\n lines.push(`- \"${term.source}\" → \"${term.target}\"${flagStr}`);\n }\n }\n\n return lines.join('\\n');\n },\n };\n}\n\n// ============================================================================\n// Glossary Compliance Check\n// ============================================================================\n\nexport interface ComplianceResult {\n applied: string[];\n missed: string[];\n score: number;\n}\n\nexport function checkGlossaryCompliance(\n sourceText: string,\n translatedText: string,\n glossary: ResolvedGlossary\n): ComplianceResult {\n const lookup = createGlossaryLookup(glossary);\n const sourceTerms = lookup.findAll(sourceText);\n\n const applied: string[] = [];\n const missed: string[] = [];\n\n for (const term of sourceTerms) {\n const targetInTranslation = term.caseSensitive\n ? translatedText.includes(term.target)\n : translatedText.toLowerCase().includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n const total = sourceTerms.length;\n const score = total > 0 ? (applied.length / total) * 100 : 100;\n\n return { applied, missed, score };\n}\n","import chalk from 'chalk';\n\n// ============================================================================\n// Log Levels\n// ============================================================================\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n// ============================================================================\n// Logger Configuration\n// ============================================================================\n\ninterface LoggerConfig {\n level: LogLevel;\n quiet: boolean;\n json: boolean;\n}\n\nlet config: LoggerConfig = {\n level: 'info',\n quiet: false,\n json: false,\n};\n\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n// ============================================================================\n// Logger Implementation\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n if (config.quiet && level !== 'error') {\n return false;\n }\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[config.level];\n}\n\nfunction formatMessage(\n level: LogLevel,\n message: string,\n data?: Record<string, unknown>\n): string {\n if (config.json) {\n return JSON.stringify({\n level,\n message,\n timestamp: new Date().toISOString(),\n ...data,\n });\n }\n\n const timestamp = new Date().toISOString().slice(11, 19);\n const prefix = `[${timestamp}]`;\n\n switch (level) {\n case 'debug':\n return chalk.gray(`${prefix} ${message}`);\n case 'info':\n return `${prefix} ${message}`;\n case 'warn':\n return chalk.yellow(`${prefix} ⚠ ${message}`);\n case 'error':\n return chalk.red(`${prefix} ✗ ${message}`);\n }\n}\n\nexport const logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message, data));\n }\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('info')) {\n console.log(formatMessage('info', message, data));\n }\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message, data));\n }\n },\n\n error(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message, data));\n }\n },\n\n success(message: string): void {\n if (!config.quiet) {\n console.log(chalk.green(`✓ ${message}`));\n }\n },\n\n progress(current: number, total: number, message: string): void {\n if (!config.quiet && !config.json) {\n const percent = Math.round((current / total) * 100);\n const bar = '█'.repeat(Math.round(percent / 5)) + '░'.repeat(20 - Math.round(percent / 5));\n process.stdout.write(`\\r[${bar}] ${percent}% ${message}`);\n if (current === total) {\n console.log();\n }\n }\n },\n};\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\nexport function createTimer(): {\n elapsed: () => number;\n format: () => string;\n} {\n const start = performance.now();\n\n return {\n elapsed(): number {\n return performance.now() - start;\n },\n format(): string {\n const ms = this.elapsed();\n if (ms < 1000) {\n return `${ms.toFixed(0)}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n },\n };\n}\n","import type {\n TranslationRequest,\n TranslationResult,\n ResolvedGlossary,\n QualityEvaluation,\n MQMEvaluation,\n MQMError,\n PreTranslationAnalysis,\n TranslationMode,\n} from \"../types/index.js\";\nimport {\n parseMQMResponse,\n formatMQMErrorsForPrompt,\n} from \"../types/mqm.js\";\nimport {\n parseAnalysisResponse,\n formatAnalysisForPrompt,\n createEmptyAnalysis,\n} from \"../types/analysis.js\";\nimport { getModeConfig } from \"../types/modes.js\";\nimport type {\n LLMProvider,\n ChatMessage,\n CacheableTextPart,\n} from \"../providers/interface.js\";\nimport { createGlossaryLookup } from \"../services/glossary.js\";\nimport { logger, createTimer } from \"../utils/logger.js\";\nimport { TranslationError, ErrorCode } from \"../errors.js\";\n\n// ============================================================================\n// Prompt Templates (from RFC.md Section 7.2)\n// ============================================================================\n\n/**\n * Build cacheable system instructions for translation\n * This part is static and can be cached across multiple requests\n */\nfunction buildSystemInstructions(\n sourceLang: string,\n targetLang: string\n): string {\n return `You are a professional translator specializing in ${sourceLang} to ${targetLang} translation.\n\n## Rules:\n1. Apply glossary terms exactly as specified\n2. Preserve all formatting (markdown, HTML tags, code blocks)\n3. Maintain the same tone and style\n4. Do not translate content inside code blocks\n5. Keep URLs, file paths, and technical identifiers unchanged\n6. Keep placeholders like __CODE_BLOCK_0__ unchanged`;\n}\n\n/**\n * Build cacheable glossary section\n * This can be cached as it's reused across multiple chunks\n */\nfunction buildGlossarySection(glossaryText: string): string {\n return `## Glossary (MUST use these exact translations):\n${glossaryText || \"No glossary provided.\"}`;\n}\n\n/**\n * Build the dynamic part of the translation prompt (not cached)\n */\nfunction buildTranslationContent(\n sourceText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): string {\n const styleSection = context?.styleInstruction\n ? `Style: ${context.styleInstruction}\\n`\n : \"\";\n\n return `## Document Context:\nPurpose: ${context?.documentPurpose ?? \"General translation\"}\n${styleSection}Previous content: ${context?.previousContext ?? \"None\"}\n\n## Source Text:\n${sourceText}\n\nProvide ONLY the translated text below, with no additional commentary or headers:`;\n}\n\n/**\n * Build message with cacheable parts for initial translation\n * Uses prompt caching for system instructions and glossary\n */\nfunction buildCacheableTranslationMessage(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): ChatMessage {\n const systemInstructions = buildSystemInstructions(sourceLang, targetLang);\n const glossarySection = buildGlossarySection(glossaryText);\n const translationContent = buildTranslationContent(sourceText, context);\n\n // Structure content parts with cache control\n // System instructions + glossary are cached (static across chunks)\n // Translation content is dynamic (changes per chunk)\n const contentParts: CacheableTextPart[] = [\n {\n type: \"text\",\n text: systemInstructions,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: glossarySection,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: translationContent,\n // No cache control - this is dynamic per request\n },\n ];\n\n return {\n role: \"user\",\n content: contentParts,\n };\n}\n\nfunction buildInitialTranslationPrompt(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): string {\n const styleSection = context?.styleInstruction\n ? `Style: ${context.styleInstruction}\\n`\n : \"\";\n\n return `You are a professional translator. Translate the following ${sourceLang} text to ${targetLang}.\n\n## Glossary (MUST use these exact translations):\n${glossaryText || \"No glossary provided.\"}\n\n## Document Context:\nPurpose: ${context?.documentPurpose ?? \"General translation\"}\n${styleSection}Previous content: ${context?.previousContext ?? \"None\"}\n\n## Rules:\n1. Apply glossary terms exactly as specified\n2. Preserve all formatting (markdown, HTML tags, code blocks)\n3. Maintain the same tone and style\n4. Do not translate content inside code blocks\n5. Keep URLs, file paths, and technical identifiers unchanged\n6. Keep placeholders like __CODE_BLOCK_0__ unchanged\n\n## Source Text:\n${sourceText}\n\nProvide ONLY the translated text below, with no additional commentary or headers:`;\n}\n\nfunction buildReflectionPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Review this translation and provide specific improvement suggestions.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Glossary Requirements:\n${glossaryText || \"No glossary provided.\"}\n\n## Evaluate and suggest improvements for:\n1. **Accuracy**: Does the translation convey the exact meaning?\n2. **Glossary Compliance**: Are all glossary terms applied correctly?\n3. **Fluency**: Does it read naturally in ${targetLang}?\n4. **Formatting**: Is the structure preserved?\n5. **Consistency**: Are terms translated consistently?\n\nProvide a numbered list of specific, actionable suggestions:`;\n}\n\nfunction buildImprovementPrompt(\n sourceText: string,\n currentTranslation: string,\n suggestions: string,\n glossaryText: string\n): string {\n return `Improve this translation based on the following suggestions.\n\n## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Improvement Suggestions:\n${suggestions}\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}\n\nProvide ONLY the improved translation below, with no additional commentary or headers:`;\n}\n\nfunction buildQualityEvaluationPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string\n): string {\n return `Rate this translation's quality from 0 to 100.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Evaluation Criteria:\n- Semantic accuracy (40 points)\n- Fluency and naturalness (25 points)\n- Glossary compliance (20 points)\n- Format preservation (15 points)\n\nRespond with only a JSON object:\n{\"score\": <number>, \"breakdown\": {\"accuracy\": <n>, \"fluency\": <n>, \"glossary\": <n>, \"format\": <n>}, \"issues\": [\"issue1\", \"issue2\"]}`;\n}\n\n/**\n * Build MQM evaluation prompt (TEaR-style)\n * Based on https://arxiv.org/abs/2402.16379\n */\nfunction buildMQMEvaluationPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Evaluate this translation using MQM (Multidimensional Quality Metrics) framework.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Glossary Terms (must be applied exactly):\n${glossaryText || \"No glossary provided.\"}\n\n## MQM Error Categories:\n- accuracy/mistranslation: Incorrect meaning\n- accuracy/omission: Missing content from source\n- accuracy/addition: Extra content not in source\n- accuracy/untranslated: Source text left unchanged\n- fluency/grammar: Grammatical errors\n- fluency/spelling: Spelling/typos\n- fluency/register: Inappropriate formality\n- fluency/inconsistency: Inconsistent terminology\n- style/awkward: Unnatural phrasing\n- style/unidiomatic: Non-native expressions\n\n## Severity Weights:\n- \"minor\" (1 point): Noticeable but doesn't affect understanding\n- \"major\" (5 points): Affects understanding or usability\n- \"critical\" (25 points): Completely wrong or unusable\n\n## Instructions:\n1. Identify all translation errors\n2. Classify each by type and severity\n3. Provide the span and suggested fix\n4. Calculate score: 100 - sum(weights)\n\nRespond with only a JSON object:\n{\n \"errors\": [\n {\"type\": \"accuracy/mistranslation\", \"severity\": \"major\", \"span\": \"affected text\", \"suggestion\": \"corrected text\", \"explanation\": \"reason\"}\n ],\n \"score\": <100 - sum of weights>,\n \"summary\": \"brief overall assessment\"\n}`;\n}\n\n/**\n * Build MQM-based refinement prompt\n * Uses specific error annotations to guide improvements\n */\nfunction buildMQMRefinementPrompt(\n sourceText: string,\n currentTranslation: string,\n errors: MQMError[],\n glossaryText: string\n): string {\n const errorList = formatMQMErrorsForPrompt(errors);\n\n return `Fix the following translation errors.\n\n## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Errors to Fix:\n${errorList}\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}\n\nApply ONLY the fixes listed above. Do not make other changes.\nProvide ONLY the corrected translation, with no additional commentary:`;\n}\n\n/**\n * Build pre-translation analysis prompt (MAPS-style)\n * Based on https://github.com/zwhe99/MAPS-mt\n */\nfunction buildPreAnalysisPrompt(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Analyze this ${sourceLang} text before translating to ${targetLang}.\n\n## Source Text:\n${sourceText}\n\n## Available Glossary Terms:\n${glossaryText || \"No glossary provided.\"}\n\n## Analyze and extract:\n1. **Key Terms**: Important domain-specific terms needing careful translation\n2. **Ambiguous Phrases**: Phrases with multiple possible interpretations\n3. **Preserve Exact**: Code, URLs, names that should NOT be translated\n4. **Challenges**: Specific difficulties for ${sourceLang}→${targetLang}\n\nRespond with only a JSON object:\n{\n \"keyTerms\": [{\"term\": \"...\", \"context\": \"...\", \"suggestedTranslation\": \"...\", \"fromGlossary\": true/false}],\n \"ambiguousPhrases\": [{\"phrase\": \"...\", \"interpretations\": [\"...\"], \"recommendation\": \"...\"}],\n \"preserveExact\": [\"code snippets\", \"URLs\", \"names\"],\n \"challenges\": [\"challenge 1\", \"challenge 2\"],\n \"domain\": \"technical|marketing|legal|medical|general\",\n \"registerRecommendation\": \"formal|informal|neutral\"\n}`;\n}\n\n// ============================================================================\n// Translation Agent\n// ============================================================================\n\nexport interface TranslationAgentOptions {\n provider: LLMProvider;\n qualityThreshold?: number;\n maxIterations?: number;\n verbose?: boolean;\n /** If true, throw error when quality threshold is not met after max iterations */\n strictQuality?: boolean;\n /** Enable prompt caching for Claude provider (default: true) */\n enableCaching?: boolean;\n /** Translation mode: fast, balanced, quality (default: balanced) */\n mode?: TranslationMode;\n /** Enable pre-translation analysis (MAPS-style) - overrides mode setting */\n enableAnalysis?: boolean;\n /** Use MQM-based evaluation - overrides mode setting */\n useMQMEvaluation?: boolean;\n}\n\nexport class TranslationAgent {\n private provider: LLMProvider;\n private qualityThreshold: number;\n private maxIterations: number;\n private verbose: boolean;\n private strictQuality: boolean;\n private enableCaching: boolean;\n private enableAnalysis: boolean;\n private useMQMEvaluation: boolean;\n\n constructor(options: TranslationAgentOptions) {\n this.provider = options.provider;\n this.verbose = options.verbose ?? false;\n this.strictQuality = options.strictQuality ?? false;\n\n // Get mode configuration\n const modeConfig = getModeConfig(options.mode ?? \"balanced\");\n\n // Apply mode settings, allowing explicit overrides\n this.qualityThreshold = options.qualityThreshold ?? modeConfig.qualityThreshold;\n this.maxIterations = options.maxIterations ?? modeConfig.maxIterations;\n this.enableAnalysis = options.enableAnalysis ?? modeConfig.enableAnalysis;\n this.useMQMEvaluation = options.useMQMEvaluation ?? modeConfig.useMQMEvaluation;\n\n // Enable caching by default for Claude provider\n this.enableCaching =\n options.enableCaching ?? options.provider.name === \"claude\";\n\n if (this.verbose) {\n logger.info(`Translation mode: ${options.mode ?? \"balanced\"}`);\n logger.info(` - Analysis: ${this.enableAnalysis ? \"enabled\" : \"disabled\"}`);\n logger.info(` - MQM evaluation: ${this.useMQMEvaluation ? \"enabled\" : \"disabled\"}`);\n logger.info(` - Quality threshold: ${this.qualityThreshold}`);\n logger.info(` - Max iterations: ${this.maxIterations}`);\n }\n }\n\n /**\n * Translate content using Self-Refine loop with optional MAPS analysis and MQM evaluation\n */\n async translate(request: TranslationRequest): Promise<TranslationResult> {\n const timer = createTimer();\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheReadTokens = 0;\n let totalCacheWriteTokens = 0;\n let iterations = 0;\n\n // Prepare glossary text for prompts\n const glossaryText = request.glossary\n ? createGlossaryLookup(\n request.glossary as ResolvedGlossary\n ).formatForPrompt()\n : \"\";\n\n // Step 1: Pre-Translation Analysis (MAPS-style, optional)\n let analysis: PreTranslationAnalysis | null = null;\n if (this.enableAnalysis) {\n if (this.verbose) {\n logger.info(\"Analyzing source text (MAPS)...\");\n }\n analysis = await this.analyzeSource(\n request.content,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n if (this.verbose && analysis) {\n logger.info(` - Domain: ${analysis.domain}`);\n logger.info(` - Key terms: ${analysis.keyTerms.length}`);\n logger.info(` - Challenges: ${analysis.challenges.length}`);\n }\n }\n\n // Step 2: Initial Translation\n if (this.verbose) {\n logger.info(\"Starting initial translation...\");\n }\n\n const initialResult = await this.generateInitialTranslation(\n request.content,\n request.sourceLang,\n request.targetLang,\n glossaryText,\n request.context,\n analysis\n );\n let currentTranslation = initialResult.content;\n iterations++;\n\n totalInputTokens += initialResult.usage.inputTokens;\n totalOutputTokens += initialResult.usage.outputTokens;\n totalCacheReadTokens += initialResult.usage.cacheReadTokens ?? 0;\n totalCacheWriteTokens += initialResult.usage.cacheWriteTokens ?? 0;\n\n // Fast mode: Skip evaluation and refinement\n if (this.maxIterations <= 1 && this.qualityThreshold <= 0) {\n if (this.verbose) {\n logger.info(\"Fast mode: Skipping evaluation and refinement\");\n }\n return {\n content: currentTranslation,\n metadata: {\n qualityScore: 0,\n qualityThreshold: 0,\n thresholdMet: true,\n iterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n cacheRead: totalCacheReadTokens,\n cacheWrite: totalCacheWriteTokens,\n },\n duration: timer.elapsed(),\n provider: this.provider.name,\n model: \"default\",\n },\n glossaryCompliance: request.glossary\n ? this.checkGlossaryCompliance(\n request.content,\n currentTranslation,\n request.glossary as ResolvedGlossary\n )\n : undefined,\n };\n }\n\n // Step 3: Evaluate and Refine Loop\n let qualityScore = 0;\n let lastEvaluation: QualityEvaluation | null = null;\n let lastMQMEvaluation: MQMEvaluation | null = null;\n\n while (iterations < this.maxIterations) {\n // Evaluate quality (MQM or simple)\n if (this.verbose) {\n logger.info(\n `Evaluating translation quality (iteration ${iterations})...`\n );\n }\n\n if (this.useMQMEvaluation) {\n // MQM-based evaluation\n lastMQMEvaluation = await this.evaluateQualityMQM(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n qualityScore = lastMQMEvaluation.score;\n\n if (this.verbose) {\n logger.info(`MQM score: ${qualityScore}/${this.qualityThreshold}`);\n if (lastMQMEvaluation.errors.length > 0) {\n logger.info(` - Errors: ${lastMQMEvaluation.errors.length} (${lastMQMEvaluation.breakdown.accuracy} accuracy, ${lastMQMEvaluation.breakdown.fluency} fluency, ${lastMQMEvaluation.breakdown.style} style)`);\n }\n }\n } else {\n // Simple evaluation\n lastEvaluation = await this.evaluateQuality(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang\n );\n qualityScore = lastEvaluation.score;\n\n if (this.verbose) {\n logger.info(`Quality score: ${qualityScore}/${this.qualityThreshold}`);\n }\n }\n\n // Check if quality threshold is met\n if (qualityScore >= this.qualityThreshold) {\n if (this.verbose) {\n logger.success(\n `Quality threshold met after ${iterations} iterations`\n );\n }\n break;\n }\n\n // Step 4: Refine translation\n if (this.verbose) {\n logger.info(\"Refining translation...\");\n }\n\n let improveResult: {\n content: string;\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number };\n };\n\n if (this.useMQMEvaluation && lastMQMEvaluation && lastMQMEvaluation.errors.length > 0) {\n // MQM-based refinement: Apply specific error fixes\n improveResult = await this.refineWithMQM(\n request.content,\n currentTranslation,\n lastMQMEvaluation.errors,\n glossaryText\n );\n } else {\n // Legacy refinement: Generate suggestions then apply\n const suggestions = await this.generateReflection(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n\n improveResult = await this.improveTranslation(\n request.content,\n currentTranslation,\n suggestions,\n glossaryText\n );\n }\n\n currentTranslation = improveResult.content;\n iterations++;\n totalInputTokens += improveResult.usage.inputTokens;\n totalOutputTokens += improveResult.usage.outputTokens;\n totalCacheReadTokens += improveResult.usage.cacheReadTokens ?? 0;\n totalCacheWriteTokens += improveResult.usage.cacheWriteTokens ?? 0;\n }\n\n // Final evaluation if not done\n if (this.useMQMEvaluation) {\n if (!lastMQMEvaluation || iterations === this.maxIterations) {\n lastMQMEvaluation = await this.evaluateQualityMQM(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n qualityScore = lastMQMEvaluation.score;\n }\n } else {\n if (!lastEvaluation || iterations === this.maxIterations) {\n lastEvaluation = await this.evaluateQuality(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang\n );\n qualityScore = lastEvaluation.score;\n }\n }\n\n // Check if quality threshold was met\n const thresholdMet = qualityScore >= this.qualityThreshold;\n\n if (!thresholdMet && this.strictQuality) {\n throw new TranslationError(ErrorCode.QUALITY_THRESHOLD_NOT_MET, {\n score: qualityScore,\n threshold: this.qualityThreshold,\n iterations,\n maxIterations: this.maxIterations,\n issues: lastEvaluation?.issues ?? lastMQMEvaluation?.errors.map(e => `${e.type}: ${e.span}`) ?? [],\n });\n }\n\n if (!thresholdMet && this.verbose) {\n logger.warn(\n `Quality threshold not met: ${qualityScore}/${this.qualityThreshold} after ${iterations} iterations`\n );\n }\n\n // Log cache efficiency if verbose and caching was used\n if (this.verbose && (totalCacheReadTokens > 0 || totalCacheWriteTokens > 0)) {\n const cacheHitRate =\n totalCacheReadTokens > 0\n ? ((totalCacheReadTokens / (totalCacheReadTokens + totalInputTokens)) * 100).toFixed(1)\n : \"0\";\n logger.info(\n `Cache stats: ${totalCacheReadTokens} read, ${totalCacheWriteTokens} written (${cacheHitRate}% hit rate)`\n );\n }\n\n return {\n content: currentTranslation,\n metadata: {\n qualityScore,\n qualityThreshold: this.qualityThreshold,\n thresholdMet,\n iterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n cacheRead: totalCacheReadTokens,\n cacheWrite: totalCacheWriteTokens,\n },\n duration: timer.elapsed(),\n provider: this.provider.name,\n model: \"default\",\n },\n glossaryCompliance: request.glossary\n ? this.checkGlossaryCompliance(\n request.content,\n currentTranslation,\n request.glossary as ResolvedGlossary\n )\n : undefined,\n };\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private async generateInitialTranslation(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: {\n documentPurpose?: string;\n styleInstruction?: string;\n previousChunks?: string[];\n documentSummary?: string;\n },\n analysis?: PreTranslationAnalysis | null\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n let messages: ChatMessage[];\n\n // Build analysis context if available\n const analysisContext = analysis ? formatAnalysisForPrompt(analysis) : \"\";\n const enrichedContext = {\n documentPurpose: context?.documentPurpose,\n styleInstruction: context?.styleInstruction,\n previousContext: context?.previousChunks?.slice(-2).join(\"\\n\"),\n };\n\n if (this.enableCaching) {\n // Use cacheable message format for Claude\n const baseMessage = buildCacheableTranslationMessage(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText,\n enrichedContext\n );\n\n // Add analysis context if available\n if (analysisContext && Array.isArray(baseMessage.content)) {\n const contentParts = baseMessage.content as CacheableTextPart[];\n // Insert analysis after glossary, before translation content\n contentParts.splice(2, 0, {\n type: \"text\",\n text: `\\n## Pre-Translation Analysis:\\n${analysisContext}\\n`,\n });\n }\n\n messages = [baseMessage];\n } else {\n // Fallback to simple string format for other providers\n let prompt = buildInitialTranslationPrompt(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText,\n enrichedContext\n );\n\n // Inject analysis into prompt if available\n if (analysisContext) {\n prompt = prompt.replace(\n \"## Source Text:\",\n `## Pre-Translation Analysis:\\n${analysisContext}\\n\\n## Source Text:`\n );\n }\n\n messages = [{ role: \"user\", content: prompt }];\n }\n\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n private async generateReflection(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<string> {\n const prompt = buildReflectionPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n const response = await this.provider.chat({ messages });\n return response.content.trim();\n }\n\n private async improveTranslation(\n sourceText: string,\n currentTranslation: string,\n suggestions: string,\n glossaryText: string\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n let messages: ChatMessage[];\n\n if (this.enableCaching) {\n // Use cacheable format - glossary is cached\n const contentParts: CacheableTextPart[] = [\n {\n type: \"text\",\n text: `Improve this translation based on the following suggestions.\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}`,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: `## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Improvement Suggestions:\n${suggestions}\n\nProvide ONLY the improved translation below, with no additional commentary or headers:`,\n },\n ];\n messages = [{ role: \"user\", content: contentParts }];\n } else {\n const prompt = buildImprovementPrompt(\n sourceText,\n currentTranslation,\n suggestions,\n glossaryText\n );\n messages = [{ role: \"user\", content: prompt }];\n }\n\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n private async evaluateQuality(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string\n ): Promise<QualityEvaluation> {\n const prompt = buildQualityEvaluationPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n const response = await this.provider.chat({ messages });\n\n try {\n // Extract JSON from response\n const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(\"No JSON found in response\");\n }\n\n const evaluation = JSON.parse(jsonMatch[0]) as {\n score: number;\n breakdown: {\n accuracy: number;\n fluency: number;\n glossary: number;\n format: number;\n };\n issues: string[];\n };\n\n return {\n score: evaluation.score,\n breakdown: evaluation.breakdown,\n issues: evaluation.issues,\n };\n } catch {\n // Fallback if parsing fails\n return {\n score: 75, // Default score\n breakdown: {\n accuracy: 30,\n fluency: 20,\n glossary: 15,\n format: 10,\n },\n issues: [\"Failed to parse quality evaluation response\"],\n };\n }\n }\n\n /**\n * Pre-translation analysis using MAPS-style approach\n * Identifies key terms, ambiguous phrases, and translation challenges\n */\n private async analyzeSource(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<PreTranslationAnalysis | null> {\n const prompt = buildPreAnalysisPrompt(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n try {\n const response = await this.provider.chat({ messages });\n return parseAnalysisResponse(response.content);\n } catch (error) {\n if (this.verbose) {\n logger.warn(`Pre-analysis failed: ${error}`);\n }\n return createEmptyAnalysis();\n }\n }\n\n /**\n * Evaluate translation quality using MQM framework\n * Returns structured error annotations for targeted refinement\n */\n private async evaluateQualityMQM(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<MQMEvaluation> {\n const prompt = buildMQMEvaluationPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n try {\n const response = await this.provider.chat({ messages });\n const evaluation = parseMQMResponse(response.content);\n\n if (evaluation) {\n return evaluation;\n }\n\n // Fallback if parsing fails\n return {\n errors: [],\n score: 75,\n summary: \"Failed to parse MQM evaluation\",\n breakdown: { accuracy: 0, fluency: 0, style: 0 },\n };\n } catch {\n return {\n errors: [],\n score: 75,\n summary: \"MQM evaluation failed\",\n breakdown: { accuracy: 0, fluency: 0, style: 0 },\n };\n }\n }\n\n /**\n * Refine translation based on MQM error annotations\n * Applies targeted fixes for identified errors\n */\n private async refineWithMQM(\n sourceText: string,\n currentTranslation: string,\n errors: MQMError[],\n glossaryText: string\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n const prompt = buildMQMRefinementPrompt(\n sourceText,\n currentTranslation,\n errors,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n /**\n * Clean up translation output by removing prompt artifacts\n * Uses guardrails to detect and remove any trailing prompt-like content\n */\n private cleanTranslationOutput(text: string): string {\n let cleaned = text.trim();\n\n // Guardrail 1: Remove trailing markdown headers that look like prompt sections\n // These are likely prompt artifacts, not actual translation content\n const trailingHeaderPattern = /\\n+##\\s+[A-Z][^:\\n]*:\\s*$/;\n cleaned = cleaned.replace(trailingHeaderPattern, '');\n\n // Guardrail 2: If the text ends with a colon followed by optional whitespace,\n // it's likely an incomplete prompt artifact\n const incompletePromptPattern = /:\\s*$/;\n if (incompletePromptPattern.test(cleaned)) {\n // Find the last complete line/paragraph\n const lines = cleaned.split('\\n');\n while (lines.length > 0 && incompletePromptPattern.test(lines[lines.length - 1]?.trim() ?? '')) {\n lines.pop();\n }\n cleaned = lines.join('\\n');\n }\n\n // Guardrail 3: Remove any trailing numbered list items that look like evaluation criteria\n // (typically starts with \"1. **\" pattern for bold evaluation headers)\n const evaluationListPattern = /\\n+\\d+\\.\\s*\\*\\*[^*]+\\*\\*[\\s\\S]*$/;\n if (evaluationListPattern.test(cleaned)) {\n cleaned = cleaned.replace(evaluationListPattern, '');\n }\n\n return cleaned.trim();\n }\n\n /**\n * Preserve leading/trailing whitespace from source text in translated text\n * This ensures document structure (line breaks between sections) is maintained\n */\n private preserveWhitespace(\n sourceText: string,\n translatedText: string\n ): string {\n // Extract leading whitespace from source\n const leadingMatch = sourceText.match(/^(\\s*)/);\n const leadingWhitespace = leadingMatch ? leadingMatch[1] : \"\";\n\n // Extract trailing whitespace from source\n const trailingMatch = sourceText.match(/(\\s*)$/);\n const trailingWhitespace = trailingMatch ? trailingMatch[1] : \"\";\n\n return leadingWhitespace + translatedText + trailingWhitespace;\n }\n\n private checkGlossaryCompliance(\n sourceText: string,\n translatedText: string,\n glossary: ResolvedGlossary\n ): { applied: string[]; missed: string[] } {\n const lookup = createGlossaryLookup(glossary);\n const sourceTerms = lookup.findAll(sourceText);\n\n const applied: string[] = [];\n const missed: string[] = [];\n\n for (const term of sourceTerms) {\n const targetInTranslation = term.caseSensitive\n ? translatedText.includes(term.target)\n : translatedText.toLowerCase().includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n return { applied, missed };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createTranslationAgent(\n options: TranslationAgentOptions\n): TranslationAgent {\n return new TranslationAgent(options);\n}\n","// ============================================================================\n// Token Counting Utilities\n// ============================================================================\n\n/**\n * Approximate token count for a given text.\n * This is a rough estimate - actual token counts may vary by model.\n *\n * Rules of thumb:\n * - English: ~4 characters per token\n * - CJK (Korean, Japanese, Chinese): ~1.5 characters per token\n * - Code: ~3.5 characters per token\n */\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n\n // Count different character types\n let latinChars = 0;\n let cjkChars = 0;\n let otherChars = 0;\n\n for (const char of text) {\n const code = char.charCodeAt(0);\n\n // CJK Unified Ideographs and related ranges\n if (\n (code >= 0x4e00 && code <= 0x9fff) || // CJK Unified Ideographs\n (code >= 0x3400 && code <= 0x4dbf) || // CJK Extension A\n (code >= 0xac00 && code <= 0xd7af) || // Hangul Syllables\n (code >= 0x3040 && code <= 0x309f) || // Hiragana\n (code >= 0x30a0 && code <= 0x30ff) // Katakana\n ) {\n cjkChars++;\n } else if (\n (code >= 0x0041 && code <= 0x005a) || // A-Z\n (code >= 0x0061 && code <= 0x007a) || // a-z\n (code >= 0x0030 && code <= 0x0039) // 0-9\n ) {\n latinChars++;\n } else {\n otherChars++;\n }\n }\n\n // Calculate tokens based on character types\n const latinTokens = latinChars / 4;\n const cjkTokens = cjkChars / 1.5;\n const otherTokens = otherChars / 3;\n\n return Math.ceil(latinTokens + cjkTokens + otherTokens);\n}\n\n/**\n * Check if text exceeds a token limit\n */\nexport function exceedsTokenLimit(text: string, limit: number): boolean {\n return estimateTokens(text) > limit;\n}\n\n/**\n * Truncate text to approximately fit within a token limit\n */\nexport function truncateToTokenLimit(text: string, limit: number): string {\n const estimated = estimateTokens(text);\n\n if (estimated <= limit) {\n return text;\n }\n\n // Estimate character limit based on average token ratio\n const avgCharsPerToken = text.length / estimated;\n const targetChars = Math.floor(limit * avgCharsPerToken * 0.95); // 5% safety margin\n\n return text.slice(0, targetChars) + '...';\n}\n\n// ============================================================================\n// Token Budget Calculator\n// ============================================================================\n\nexport interface TokenBudget {\n total: number;\n system: number;\n glossary: number;\n context: number;\n content: number;\n reserved: number;\n}\n\nexport function calculateTokenBudget(\n maxTokens: number,\n glossarySize: number,\n contextSize: number\n): TokenBudget {\n // Reserve tokens for system prompt, formatting, etc.\n const reserved = 500;\n\n // Glossary and context have fixed sizes\n const glossary = glossarySize;\n const context = contextSize;\n\n // System prompt estimate\n const system = 300;\n\n // Content gets the remainder\n const content = maxTokens - reserved - glossary - context - system;\n\n return {\n total: maxTokens,\n system,\n glossary,\n context,\n content: Math.max(content, 100), // Ensure minimum content budget\n reserved,\n };\n}\n","import type { Chunk, ChunkingConfig } from \"../types/index.js\";\nimport { estimateTokens } from \"../utils/tokens.js\";\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst DEFAULT_CONFIG: ChunkingConfig = {\n maxTokens: 1024,\n overlapTokens: 150,\n separators: [\"\\n\\n\", \"\\n\", \". \", \" \"],\n preservePatterns: [\n /```[\\s\\S]*?```/g, // Code blocks\n /`[^`]+`/g, // Inline code\n /\\[.*?\\]\\(.*?\\)/g, // Links\n ],\n};\n\n// ============================================================================\n// Chunker Implementation\n// ============================================================================\n\nexport interface ChunkerOptions {\n maxTokens?: number;\n overlapTokens?: number;\n preserveCodeBlocks?: boolean;\n}\n\n/**\n * Split content into chunks that respect token limits\n */\nexport function chunkContent(\n content: string,\n options: ChunkerOptions = {}\n): Chunk[] {\n // Handle empty or whitespace-only content\n if (!content.trim()) {\n return [];\n }\n\n const config: ChunkingConfig = {\n ...DEFAULT_CONFIG,\n maxTokens: options.maxTokens ?? DEFAULT_CONFIG.maxTokens,\n overlapTokens: options.overlapTokens ?? DEFAULT_CONFIG.overlapTokens,\n };\n\n // Extract header hierarchy from the entire content\n const headerHierarchy = extractHeaderHierarchy(content);\n\n // First, identify and extract preserved sections (code blocks, etc.)\n const { segments } = extractPreservedSections(content);\n\n // Chunk the translatable segments\n const chunks: Chunk[] = [];\n let previousChunkContent: string | undefined;\n\n for (const segment of segments) {\n // Find relevant headers for this segment\n const segmentHeaders = getHeadersForPosition(\n headerHierarchy,\n segment.startOffset\n );\n\n if (segment.type === \"preserve\") {\n // Preserved content (code blocks) - don't chunk\n chunks.push({\n id: `chunk-${chunks.length}`,\n content: segment.content,\n type: \"preserve\",\n startOffset: segment.startOffset,\n endOffset: segment.endOffset,\n metadata: {\n headerHierarchy: segmentHeaders,\n },\n });\n } else {\n // Translatable content - split into chunks\n const textChunks = splitIntoChunks(\n segment.content,\n config,\n segment.startOffset\n );\n\n for (let idx = 0; idx < textChunks.length; idx++) {\n const chunk = textChunks[idx];\n if (!chunk) continue;\n\n // Find headers specific to this chunk's position\n const chunkHeaders = getHeadersForPosition(\n headerHierarchy,\n chunk.startOffset\n );\n\n chunks.push({\n ...chunk,\n id: `chunk-${chunks.length}`,\n metadata: {\n headerHierarchy:\n chunkHeaders.length > 0 ? chunkHeaders : segmentHeaders,\n previousContext: previousChunkContent,\n },\n });\n\n // Store current chunk content for next iteration (truncate if too long)\n previousChunkContent = truncateForContext(chunk.content, 200);\n }\n }\n }\n\n return chunks;\n}\n\n/**\n * Extract header hierarchy from markdown content\n */\nfunction extractHeaderHierarchy(\n content: string\n): Array<{ level: number; text: string; offset: number }> {\n const headers: Array<{ level: number; text: string; offset: number }> = [];\n const headerRegex = /^(#{1,6})\\s+(.+)$/gm;\n let match: RegExpExecArray | null;\n\n while ((match = headerRegex.exec(content)) !== null) {\n const hashMarks = match[1];\n if (hashMarks) {\n headers.push({\n level: hashMarks.length,\n text: match[0],\n offset: match.index,\n });\n }\n }\n\n return headers;\n}\n\n/**\n * Get relevant headers for a given position in the document\n */\nfunction getHeadersForPosition(\n headers: Array<{ level: number; text: string; offset: number }>,\n position: number\n): string[] {\n const relevantHeaders: string[] = [];\n const currentLevels: Map<number, string> = new Map();\n\n for (const header of headers) {\n if (header.offset > position) break;\n\n // Clear all lower level headers when we encounter a new header\n for (const [level] of currentLevels) {\n if (level >= header.level) {\n currentLevels.delete(level);\n }\n }\n currentLevels.set(header.level, header.text);\n }\n\n // Build hierarchy from level 1 to 6\n for (let level = 1; level <= 6; level++) {\n const headerText = currentLevels.get(level);\n if (headerText) {\n relevantHeaders.push(headerText);\n }\n }\n\n return relevantHeaders;\n}\n\n/**\n * Truncate content for context, preserving word boundaries\n */\nfunction truncateForContext(content: string, maxChars: number): string {\n if (content.length <= maxChars) return content;\n\n const truncated = content.slice(-maxChars);\n const firstSpace = truncated.indexOf(\" \");\n if (firstSpace > 0 && firstSpace < 50) {\n return \"...\" + truncated.slice(firstSpace + 1);\n }\n return \"...\" + truncated;\n}\n\n// ============================================================================\n// Preserved Section Extraction\n// ============================================================================\n\ninterface Segment {\n content: string;\n type: \"translatable\" | \"preserve\";\n startOffset: number;\n endOffset: number;\n headerHierarchy?: string[];\n}\n\nfunction extractPreservedSections(content: string): { segments: Segment[] } {\n const preservedRanges: Array<{\n start: number;\n end: number;\n content: string;\n }> = [];\n\n // Find all code blocks (fenced)\n const codeBlockRegex = /```[\\s\\S]*?```/g;\n let match: RegExpExecArray | null;\n\n while ((match = codeBlockRegex.exec(content)) !== null) {\n preservedRanges.push({\n start: match.index,\n end: match.index + match[0].length,\n content: match[0],\n });\n }\n\n // Sort by start position\n preservedRanges.sort((a, b) => a.start - b.start);\n\n // Build segments\n const segments: Segment[] = [];\n let lastEnd = 0;\n\n for (const range of preservedRanges) {\n // Add translatable segment before this preserved section\n if (range.start > lastEnd) {\n const translatableContent = content.slice(lastEnd, range.start);\n // Include segment even if it's only whitespace (to preserve line breaks)\n if (translatableContent.length > 0) {\n segments.push({\n content: translatableContent,\n type: translatableContent.trim() ? \"translatable\" : \"preserve\",\n startOffset: lastEnd,\n endOffset: range.start,\n });\n }\n }\n\n // Add preserved segment\n segments.push({\n content: range.content,\n type: \"preserve\",\n startOffset: range.start,\n endOffset: range.end,\n });\n\n lastEnd = range.end;\n }\n\n // Add remaining translatable content\n if (lastEnd < content.length) {\n const remainingContent = content.slice(lastEnd);\n // Include segment even if it's only whitespace (to preserve line breaks)\n if (remainingContent.length > 0) {\n segments.push({\n content: remainingContent,\n type: remainingContent.trim() ? \"translatable\" : \"preserve\",\n startOffset: lastEnd,\n endOffset: content.length,\n });\n }\n }\n\n // If no preserved sections, return whole content as translatable\n if (segments.length === 0) {\n segments.push({\n content,\n type: \"translatable\",\n startOffset: 0,\n endOffset: content.length,\n });\n }\n\n return { segments };\n}\n\n// ============================================================================\n// Text Chunking with Overlap\n// ============================================================================\n\nfunction splitIntoChunks(\n text: string,\n config: ChunkingConfig,\n baseOffset: number\n): Chunk[] {\n const chunks: Chunk[] = [];\n const tokenCount = estimateTokens(text);\n\n // If text fits in one chunk, return it as-is (preserve whitespace)\n if (tokenCount <= config.maxTokens) {\n return [\n {\n id: \"\",\n content: text,\n type: \"translatable\",\n startOffset: baseOffset,\n endOffset: baseOffset + text.length,\n },\n ];\n }\n\n // Split by paragraph boundaries while preserving the separators\n // Use a regex that captures the separator so we can preserve exact whitespace\n const parts = text.split(/(\\n\\n+)/);\n\n let currentChunk = \"\";\n let chunkStartOffset = baseOffset;\n let textOffset = baseOffset;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n const potentialChunk = currentChunk + part;\n const potentialTokens = estimateTokens(potentialChunk);\n\n if (potentialTokens > config.maxTokens && currentChunk) {\n // Save current chunk - preserve content as-is without trimming\n chunks.push({\n id: \"\",\n content: currentChunk,\n type: \"translatable\",\n startOffset: chunkStartOffset,\n endOffset: textOffset,\n });\n\n // Start new chunk\n currentChunk = part;\n chunkStartOffset = textOffset;\n } else {\n currentChunk = potentialChunk;\n }\n\n textOffset += part.length;\n }\n\n // Add remaining content (preserve as-is)\n if (currentChunk.length > 0) {\n chunks.push({\n id: \"\",\n content: currentChunk,\n type: \"translatable\",\n startOffset: chunkStartOffset,\n endOffset: baseOffset + text.length,\n });\n }\n\n return chunks;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Reassemble chunks back into a document\n * Note: Chunks should not have overlapping content - overlap is only used for context metadata\n */\nexport function reassembleChunks(chunks: Chunk[]): string {\n // Sort chunks by startOffset\n const sorted = [...chunks].sort((a, b) => a.startOffset - b.startOffset);\n\n // Simply concatenate - no overlap handling needed since content doesn't overlap\n return sorted.map((chunk) => chunk.content).join(\"\");\n}\n\n/**\n * Get chunk statistics\n */\nexport function getChunkStats(chunks: Chunk[]): {\n totalChunks: number;\n translatableChunks: number;\n preservedChunks: number;\n totalTokens: number;\n averageTokens: number;\n} {\n const translatableChunks = chunks.filter((c) => c.type === \"translatable\");\n const preservedChunks = chunks.filter((c) => c.type === \"preserve\");\n\n const totalTokens = chunks.reduce(\n (sum, chunk) => sum + estimateTokens(chunk.content),\n 0\n );\n\n return {\n totalChunks: chunks.length,\n translatableChunks: translatableChunks.length,\n preservedChunks: preservedChunks.length,\n totalTokens,\n averageTokens:\n chunks.length > 0 ? Math.round(totalTokens / chunks.length) : 0,\n };\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkStringify from 'remark-stringify';\nimport remarkGfm from 'remark-gfm';\nimport type { Root, RootContent, Text, Code, InlineCode } from 'mdast';\nimport { visit } from 'unist-util-visit';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ParsedDocument {\n /** Original markdown content */\n original: string;\n /** AST representation */\n ast: Root;\n /** Extracted text nodes for translation */\n textNodes: TextNode[];\n}\n\nexport interface TextNode {\n /** Unique identifier for this node */\n id: string;\n /** Text content to translate */\n content: string;\n /** Node type in AST */\n type: string;\n /** Position in source document */\n position?: {\n start: { line: number; column: number; offset?: number };\n end: { line: number; column: number; offset?: number };\n };\n /** Path to node in AST (for restoration) */\n path: number[];\n /** Whether this node should be translated */\n translatable: boolean;\n}\n\nexport interface TranslationMap {\n [nodeId: string]: string;\n}\n\n// ============================================================================\n// Parser Implementation\n// ============================================================================\n\n/**\n * Parse markdown content and extract translatable text nodes\n */\nexport async function parseMarkdown(content: string): Promise<ParsedDocument> {\n const processor = unified()\n .use(remarkParse)\n .use(remarkGfm);\n\n const ast = processor.parse(content) as Root;\n const textNodes = extractTextNodes(ast);\n\n return {\n original: content,\n ast,\n textNodes,\n };\n}\n\n/**\n * Apply translations to AST and stringify back to markdown\n */\nexport async function applyTranslations(\n document: ParsedDocument,\n translations: TranslationMap\n): Promise<string> {\n // Clone the AST to avoid mutating original\n const ast = structuredClone(document.ast);\n\n // Apply translations to each text node\n for (const textNode of document.textNodes) {\n if (!textNode.translatable) continue;\n\n const translation = translations[textNode.id];\n if (!translation) continue;\n\n // Navigate to the node in AST and update its value\n const node = getNodeAtPath(ast, textNode.path);\n if (node && 'value' in node) {\n (node as Text).value = translation;\n }\n }\n\n // Stringify back to markdown\n const processor = unified()\n .use(remarkGfm)\n .use(remarkStringify, {\n bullet: '-',\n emphasis: '*',\n strong: '*',\n fence: '`',\n fences: true,\n listItemIndent: 'one',\n });\n\n const result = processor.stringify(ast);\n return String(result);\n}\n\n// ============================================================================\n// Text Node Extraction\n// ============================================================================\n\nfunction extractTextNodes(ast: Root): TextNode[] {\n const textNodes: TextNode[] = [];\n let nodeId = 0;\n\n visit(ast, (node, index, parent) => {\n // Skip code blocks - they should not be translated\n if (node.type === 'code' || node.type === 'inlineCode') {\n textNodes.push({\n id: `node-${nodeId++}`,\n content: (node as Code | InlineCode).value,\n type: node.type,\n position: node.position,\n path: getNodePath(ast, node, index, parent),\n translatable: false,\n });\n return;\n }\n\n // Extract text nodes\n if (node.type === 'text') {\n const textContent = (node as Text).value;\n\n // Skip empty or whitespace-only text\n if (!textContent.trim()) return;\n\n textNodes.push({\n id: `node-${nodeId++}`,\n content: textContent,\n type: node.type,\n position: node.position,\n path: getNodePath(ast, node, index, parent),\n translatable: true,\n });\n }\n });\n\n return textNodes;\n}\n\n// ============================================================================\n// AST Navigation Helpers\n// ============================================================================\n\nfunction getNodePath(\n _root: Root,\n _node: unknown,\n index: number | undefined,\n parent: unknown\n): number[] {\n const path: number[] = [];\n\n // Build path by traversing up to root\n let currentParent = parent as { children?: unknown[] } | null;\n let currentIndex = index;\n\n while (currentParent && currentIndex !== undefined) {\n path.unshift(currentIndex);\n // Note: This is a simplified path - for full implementation,\n // we'd need to track parent references during traversal\n break;\n }\n\n if (index !== undefined) {\n path.push(index);\n }\n\n return path;\n}\n\nfunction getNodeAtPath(ast: Root, path: number[]): RootContent | null {\n let current: Root | RootContent = ast;\n\n for (const index of path) {\n if ('children' in current && Array.isArray(current.children)) {\n const child: RootContent | undefined = current.children[index];\n if (!child) return null;\n current = child;\n } else {\n return null;\n }\n }\n\n return current as RootContent;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get only translatable text from a parsed document\n */\nexport function getTranslatableText(document: ParsedDocument): string[] {\n return document.textNodes\n .filter((node) => node.translatable)\n .map((node) => node.content);\n}\n\n/**\n * Create a translation map from an array of translations\n * (in same order as getTranslatableText output)\n */\nexport function createTranslationMap(\n document: ParsedDocument,\n translations: string[]\n): TranslationMap {\n const translatableNodes = document.textNodes.filter((node) => node.translatable);\n const map: TranslationMap = {};\n\n for (let i = 0; i < translatableNodes.length && i < translations.length; i++) {\n const node = translatableNodes[i];\n if (node) {\n map[node.id] = translations[i] ?? node.content;\n }\n }\n\n return map;\n}\n\n/**\n * Extract full text content for translation (preserving structure markers)\n *\n * Processing order is important:\n * 1. First, handle fenced code blocks (must be at line start with newline after opener)\n * 2. Then, handle multi-backtick inline code (for examples like ` ```js...``` `)\n * 3. Then, handle single-backtick inline code\n * 4. Finally, handle link URLs\n */\nexport function extractTextForTranslation(content: string): {\n text: string;\n preservedSections: Map<string, string>;\n} {\n const preservedSections = new Map<string, string>();\n let placeholderIndex = 0;\n\n // Step 1: Replace fenced code blocks FIRST (must start at beginning of line with newline)\n // This ensures proper code blocks are captured before multi-backtick inline code\n let text = content.replace(/^[ \\t]*```[^\\n]*\\n[\\s\\S]*?^[ \\t]*```[ \\t]*$/gm, (match) => {\n const placeholder = `__CODE_BLOCK_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 2: Replace multi-backtick inline code (2+ backticks on same line)\n // This catches examples like `` `variable` `` or ` ```js...``` ` in tables\n // Only matches within a single line to avoid matching across paragraphs\n text = text.replace(/(`{2,})(?:[^`\\n]|`(?!\\1))*?\\1/g, (match) => {\n const placeholder = `__INLINE_CODE_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 3: Replace remaining single-backtick inline code\n text = text.replace(/`[^`\\n]+`/g, (match) => {\n const placeholder = `__INLINE_CODE_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 4: Replace URLs in links with placeholders\n text = text.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, linkText, url) => {\n const placeholder = `__LINK_URL_${placeholderIndex++}__`;\n preservedSections.set(placeholder, url as string);\n return `[${linkText}](${placeholder})`;\n });\n\n return { text, preservedSections };\n}\n\n/**\n * Restore preserved sections after translation\n *\n * Uses flexible regex matching to handle cases where LLM may have:\n * - Added spaces around placeholders\n * - Changed case\n * - Added extra underscores\n */\nexport function restorePreservedSections(\n translatedText: string,\n preservedSections: Map<string, string>\n): string {\n let result = translatedText;\n\n // Sort by key length descending to handle CODE_BLOCK_12 before CODE_BLOCK_1\n const sortedEntries = [...preservedSections.entries()].sort(\n (a, b) => b[0].length - a[0].length\n );\n\n for (const [placeholder, original] of sortedEntries) {\n // Extract the core identifier (e.g., \"CODE_BLOCK_12\" from \"__CODE_BLOCK_12__\")\n const match = placeholder.match(/^__(.+)__$/);\n if (match && match[1]) {\n const identifier = match[1];\n // Escape any regex special characters in identifier\n const escapedId = identifier.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Create flexible regex that handles:\n // - Optional surrounding spaces (but NOT newlines - use [ \\t]* instead of \\s*)\n // - Extra underscores\n // - Case insensitivity\n // - (?!\\d) ensures CODE_BLOCK_1 doesn't match part of CODE_BLOCK_12\n const flexiblePattern = new RegExp(\n `[ \\\\t]*_*_*[ \\\\t]*${escapedId}(?!\\\\d)[ \\\\t]*_*_*[ \\\\t]*`,\n 'gi'\n );\n // Use function replacement to avoid special character interpretation ($&, $', etc.)\n result = result.replace(flexiblePattern, () => original);\n } else {\n // Fallback to exact replacement - also use function to avoid special chars\n result = result.split(placeholder).join(original);\n }\n }\n\n // Post-process: Ensure proper spacing around inline code\n // This fixes cases where LLM removed spaces around placeholders during translation\n result = ensureInlineCodeSpacing(result);\n\n return result;\n}\n\n/**\n * Ensure proper spacing around inline code backticks.\n * LLMs often remove spaces around placeholders, causing markdown formatting issues.\n *\n * Rules:\n * - Add space before ` if preceded by word char (letter/number/CJK)\n * - Add space before ` if preceded by number+period (markdown list like \"1.\")\n * - Add space after ` if followed by word char/CJK\n * - Don't add spaces at line start/end\n */\nfunction ensureInlineCodeSpacing(text: string): string {\n // Match inline code: backtick(s) + content + same backticks\n // We need to add spaces where they're missing around inline code\n\n // CJK Unicode ranges: \\u3000-\\u9fff\\uac00-\\ud7af (Chinese, Japanese, Korean)\n\n // Add space before inline code if preceded by:\n // - word/CJK character\n // - number followed by period (markdown numbered list: \"1.\")\n let result = text.replace(\n /([\\w\\u3000-\\u9fff\\uac00-\\ud7af])(`+[^`\\n]+`+)/g,\n '$1 $2'\n );\n\n // Handle markdown numbered list case: \"1.`code`\" → \"1. `code`\"\n result = result.replace(\n /(\\d+\\.)(`+[^`\\n]+`+)/g,\n '$1 $2'\n );\n\n // Add space after inline code if followed by word/CJK character\n result = result.replace(\n /(`+[^`\\n]+`+)([\\w\\u3000-\\u9fff\\uac00-\\ud7af])/g,\n '$1 $2'\n );\n\n return result;\n}\n\n/**\n * Simple markdown translation that preserves structure\n * This is the main function to use for translating markdown content\n */\nexport async function translateMarkdownContent(\n content: string,\n translateFn: (text: string) => Promise<string>\n): Promise<string> {\n // Extract text for translation with preserved sections\n const { text, preservedSections } = extractTextForTranslation(content);\n\n // Translate the text\n const translatedText = await translateFn(text);\n\n // Restore preserved sections\n return restorePreservedSections(translatedText, preservedSections);\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n CacheableTextPart,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // Latest Claude 4.5 models\n 'claude-sonnet-4-5-20250929': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.015,\n },\n 'claude-opus-4-5-20251101': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.075,\n },\n 'claude-haiku-4-5-20251001': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.001,\n costPer1kOutput: 0.005,\n },\n // Claude 4 models (previous generation)\n 'claude-sonnet-4-20250514': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.015,\n },\n 'claude-opus-4-20250514': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.075,\n },\n // Claude 3.5 models\n 'claude-3-5-haiku-20241022': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.001,\n costPer1kOutput: 0.005,\n },\n};\n\n// Use Claude Haiku 4.5 as default for cost-efficiency\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\n\n// ============================================================================\n// Claude Provider Implementation\n// ============================================================================\n\nexport class ClaudeProvider implements LLMProvider {\n readonly name: ProviderName = 'claude';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createAnthropic>;\n\n constructor(config: ProviderConfig = {}) {\n const apiKey = config.apiKey ?? process.env['ANTHROPIC_API_KEY'];\n\n if (!apiKey) {\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'claude',\n message: 'ANTHROPIC_API_KEY environment variable is not set',\n });\n }\n\n this.client = createAnthropic({\n apiKey,\n baseURL: config.baseUrl,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const messages = this.convertMessages(request.messages) as any;\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n // Extract cache token usage from provider metadata\n const anthropicMeta = result.providerMetadata?.anthropic as\n | {\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n }\n | undefined;\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n cacheReadTokens: anthropicMeta?.cacheReadInputTokens,\n cacheWriteTokens: anthropicMeta?.cacheCreationInputTokens,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format with cache control support\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | CacheableTextPart[];\n }>\n ) {\n return messages.map((msg) => {\n // Simple string content - no caching\n if (typeof msg.content === 'string') {\n return { role: msg.role, content: msg.content };\n }\n\n // Array of parts with potential cache control\n const parts = msg.content.map((part) => ({\n type: 'text' as const,\n text: part.text,\n ...(part.cacheControl && {\n providerOptions: {\n anthropic: { cacheControl: part.cacheControl },\n },\n }),\n }));\n\n return { role: msg.role, content: parts };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const messages = this.convertMessages(request.messages) as any;\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation since exact counting requires API call\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n return (\n MODEL_INFO[modelName] ?? {\n maxContextTokens: 200000,\n supportsStreaming: true,\n }\n );\n }\n\n private handleError(error: unknown): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for rate limiting\n if (\n errorMessage.includes('rate_limit') ||\n errorMessage.includes('429')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_RATE_LIMITED, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n\n // Check for auth errors\n if (\n errorMessage.includes('authentication') ||\n errorMessage.includes('401') ||\n errorMessage.includes('invalid_api_key')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n case 'end_turn':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createClaudeProvider(config: ProviderConfig = {}): LLMProvider {\n return new ClaudeProvider(config);\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // GPT-4o models (latest)\n 'gpt-4o': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n 'gpt-4o-2024-11-20': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n 'gpt-4o-2024-08-06': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n // GPT-4o mini (cost-effective)\n 'gpt-4o-mini': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.00015,\n costPer1kOutput: 0.0006,\n },\n 'gpt-4o-mini-2024-07-18': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.00015,\n costPer1kOutput: 0.0006,\n },\n // GPT-4 Turbo\n 'gpt-4-turbo': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.01,\n costPer1kOutput: 0.03,\n },\n 'gpt-4-turbo-2024-04-09': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.01,\n costPer1kOutput: 0.03,\n },\n // GPT-4 (original)\n 'gpt-4': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n costPer1kInput: 0.03,\n costPer1kOutput: 0.06,\n },\n // GPT-3.5 Turbo\n 'gpt-3.5-turbo': {\n maxContextTokens: 16385,\n supportsStreaming: true,\n costPer1kInput: 0.0005,\n costPer1kOutput: 0.0015,\n },\n // o1 models (reasoning)\n 'o1': {\n maxContextTokens: 200000,\n supportsStreaming: false,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.06,\n },\n 'o1-preview': {\n maxContextTokens: 128000,\n supportsStreaming: false,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.06,\n },\n 'o1-mini': {\n maxContextTokens: 128000,\n supportsStreaming: false,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.012,\n },\n};\n\n// Use GPT-4o mini as default for cost-efficiency\nconst DEFAULT_MODEL = 'gpt-4o-mini';\n\n// ============================================================================\n// OpenAI Provider Implementation\n// ============================================================================\n\nexport class OpenAIProvider implements LLMProvider {\n readonly name: ProviderName = 'openai';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createOpenAI>;\n\n constructor(config: ProviderConfig = {}) {\n const apiKey = config.apiKey ?? process.env['OPENAI_API_KEY'];\n\n if (!apiKey) {\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'openai',\n message: 'OPENAI_API_KEY environment variable is not set',\n });\n }\n\n this.client = createOpenAI({\n apiKey,\n baseURL: config.baseUrl,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n const messages = this.convertMessages(request.messages);\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format\n * OpenAI doesn't support cache control like Claude, so we simplify content\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>\n ) {\n return messages.map((msg) => {\n // If content is an array of parts, concatenate text\n if (Array.isArray(msg.content)) {\n return {\n role: msg.role,\n content: msg.content.map((part) => part.text).join(''),\n };\n }\n return { role: msg.role, content: msg.content };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n const modelInfo = this.getModelInfo(model);\n\n // o1 models don't support streaming\n if (!modelInfo.supportsStreaming) {\n const response = await this.chat(request);\n yield response.content;\n return;\n }\n\n try {\n const messages = this.convertMessages(request.messages);\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation since exact counting requires tiktoken\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n return (\n MODEL_INFO[modelName] ?? {\n maxContextTokens: 128000,\n supportsStreaming: true,\n }\n );\n }\n\n private handleError(error: unknown): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for rate limiting\n if (\n errorMessage.includes('rate_limit') ||\n errorMessage.includes('429') ||\n errorMessage.includes('Rate limit')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_RATE_LIMITED, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n // Check for auth errors\n if (\n errorMessage.includes('authentication') ||\n errorMessage.includes('401') ||\n errorMessage.includes('invalid_api_key') ||\n errorMessage.includes('Incorrect API key')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n // Check for quota exceeded\n if (\n errorMessage.includes('quota') ||\n errorMessage.includes('insufficient_quota')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'openai',\n message: 'API quota exceeded. Please check your billing settings.',\n });\n }\n\n // Check for context length errors\n if (\n errorMessage.includes('context_length_exceeded') ||\n errorMessage.includes('maximum context length')\n ) {\n return new TranslationError(ErrorCode.CHUNK_TOO_LARGE, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createOpenAIProvider(config: ProviderConfig = {}): LLMProvider {\n return new OpenAIProvider(config);\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\n// Common Ollama models with their context sizes\n// Note: These are estimates - actual limits depend on model variant and system memory\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // Llama 3.x models\n 'llama3.3': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3.2': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3.1': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n // Llama 2 models\n llama2: {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n 'llama2:13b': {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n 'llama2:70b': {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n // Mistral models\n mistral: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n 'mistral-nemo': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n mixtral: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n // Qwen models\n qwen2: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n 'qwen2.5': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'qwen2.5-coder': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n // Gemma models\n gemma2: {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n gemma: {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n // Phi models\n phi3: {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'phi3:mini': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n // Code models\n codellama: {\n maxContextTokens: 16384,\n supportsStreaming: true,\n },\n 'deepseek-coder': {\n maxContextTokens: 16384,\n supportsStreaming: true,\n },\n // Other popular models\n 'neural-chat': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n vicuna: {\n maxContextTokens: 2048,\n supportsStreaming: true,\n },\n};\n\n// Default to llama3.2 for better multilingual support\nconst DEFAULT_MODEL = 'llama3.2';\nconst DEFAULT_BASE_URL = 'http://localhost:11434';\n\n// ============================================================================\n// Ollama Provider Implementation\n// ============================================================================\n\nexport class OllamaProvider implements LLMProvider {\n readonly name: ProviderName = 'ollama';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createOpenAI>;\n private readonly baseUrl: string;\n\n constructor(config: ProviderConfig = {}) {\n this.baseUrl =\n config.baseUrl ??\n process.env['OLLAMA_BASE_URL'] ??\n DEFAULT_BASE_URL;\n\n // Ollama uses OpenAI-compatible API at /v1 endpoint\n this.client = createOpenAI({\n apiKey: 'ollama', // Ollama doesn't require an API key\n baseURL: `${this.baseUrl}/v1`,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n await this.ensureModelAvailable(model);\n\n const messages = this.convertMessages(request.messages);\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error, model);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format\n * Ollama doesn't support cache control, so we simplify content\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>\n ) {\n return messages.map((msg) => {\n // If content is an array of parts, concatenate text\n if (Array.isArray(msg.content)) {\n return {\n role: msg.role,\n content: msg.content.map((part) => part.text).join(''),\n };\n }\n return { role: msg.role, content: msg.content };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n\n try {\n await this.ensureModelAvailable(model);\n\n const messages = this.convertMessages(request.messages);\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error, model);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation for Ollama models\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n\n // Try exact match first\n if (MODEL_INFO[modelName]) {\n return MODEL_INFO[modelName];\n }\n\n // Try base model name (e.g., \"llama3.2:7b\" -> \"llama3.2\")\n const baseModel = modelName.split(':')[0] ?? modelName;\n if (baseModel && MODEL_INFO[baseModel]) {\n return MODEL_INFO[baseModel];\n }\n\n // Default fallback\n return {\n maxContextTokens: 4096,\n supportsStreaming: true,\n };\n }\n\n /**\n * Check if the Ollama server is running and the model is available\n */\n private async ensureModelAvailable(model: string): Promise<void> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`);\n\n if (!response.ok) {\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n message: `Ollama server not responding at ${this.baseUrl}`,\n });\n }\n\n const data = (await response.json()) as {\n models?: Array<{ name: string }>;\n };\n const models = data.models ?? [];\n const modelNames = models.map((m) => m.name);\n\n // Check for exact match or base model match\n const modelExists = modelNames.some(\n (name) => name === model || name.startsWith(`${model}:`)\n );\n\n if (!modelExists) {\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n availableModels: modelNames.slice(0, 10), // Show first 10\n message: `Model \"${model}\" not found. Pull it with: ollama pull ${model}`,\n });\n }\n } catch (error) {\n if (error instanceof TranslationError) {\n throw error;\n }\n\n // Connection refused or other network error\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n baseUrl: this.baseUrl,\n message: `Cannot connect to Ollama server at ${this.baseUrl}. Is Ollama running?`,\n });\n }\n }\n\n private handleError(error: unknown, model?: string): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for connection errors\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('fetch failed') ||\n errorMessage.includes('network')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n baseUrl: this.baseUrl,\n message: `Cannot connect to Ollama server at ${this.baseUrl}. Is Ollama running?`,\n });\n }\n\n // Check for model not found\n if (\n errorMessage.includes('model') &&\n errorMessage.includes('not found')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n message: `Model \"${model}\" not found. Pull it with: ollama pull ${model}`,\n });\n }\n\n // Check for context length errors\n if (\n errorMessage.includes('context') ||\n errorMessage.includes('too long')\n ) {\n return new TranslationError(ErrorCode.CHUNK_TOO_LARGE, {\n provider: 'ollama',\n model,\n message: errorMessage,\n });\n }\n\n // Check for out of memory\n if (\n errorMessage.includes('out of memory') ||\n errorMessage.includes('OOM')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n message: 'Out of memory. Try a smaller model or reduce chunk size.',\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createOllamaProvider(config: ProviderConfig = {}): LLMProvider {\n return new OllamaProvider(config);\n}\n","import type { ProviderName } from '../types/index.js';\nimport type { LLMProvider, ProviderConfig, ProviderFactory } from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { createClaudeProvider } from './claude.js';\nimport { createOpenAIProvider } from './openai.js';\nimport { createOllamaProvider } from './ollama.js';\n\n// ============================================================================\n// Provider Registry\n// ============================================================================\n\nconst providers = new Map<ProviderName, ProviderFactory>();\n\nexport function registerProvider(\n name: ProviderName,\n factory: ProviderFactory\n): void {\n providers.set(name, factory);\n}\n\nexport function getProvider(\n name: ProviderName,\n config: ProviderConfig = {}\n): LLMProvider {\n const factory = providers.get(name);\n\n if (!factory) {\n throw new TranslationError(ErrorCode.PROVIDER_NOT_FOUND, {\n provider: name,\n available: Array.from(providers.keys()),\n });\n }\n\n return factory(config);\n}\n\nexport function hasProvider(name: ProviderName): boolean {\n return providers.has(name);\n}\n\nexport function getAvailableProviders(): ProviderName[] {\n return Array.from(providers.keys());\n}\n\n// ============================================================================\n// Provider Configuration from Environment\n// ============================================================================\n\nexport function getProviderConfigFromEnv(name: ProviderName): ProviderConfig {\n switch (name) {\n case 'claude':\n return {\n apiKey: process.env['ANTHROPIC_API_KEY'],\n // defaultModel is handled by the provider itself\n };\n\n case 'openai':\n return {\n apiKey: process.env['OPENAI_API_KEY'],\n defaultModel: 'gpt-4o',\n };\n\n case 'ollama':\n return {\n baseUrl: process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434',\n defaultModel: 'llama3.2', // Better multilingual support than llama2\n };\n\n case 'custom':\n return {\n apiKey: process.env['LLM_API_KEY'],\n baseUrl: process.env['LLM_BASE_URL'],\n };\n\n default:\n return {};\n }\n}\n\n// ============================================================================\n// Create Provider with Fallback\n// ============================================================================\n\nexport interface CreateProviderOptions {\n primary: ProviderName;\n fallback?: ProviderName[];\n config?: Partial<Record<ProviderName, ProviderConfig>>;\n}\n\n// ============================================================================\n// Auto-register Built-in Providers\n// ============================================================================\n\nregisterProvider('claude', createClaudeProvider);\nregisterProvider('openai', createOpenAIProvider);\nregisterProvider('ollama', createOllamaProvider);\n\n// ============================================================================\n// Create Provider with Fallback\n// ============================================================================\n\n/**\n * Check if a provider can be used (has required credentials)\n * Ollama doesn't require an API key, only a running server\n */\nfunction canUseProvider(name: ProviderName, config: ProviderConfig): boolean {\n if (!hasProvider(name)) {\n return false;\n }\n\n // Ollama doesn't require an API key\n if (name === 'ollama') {\n return true;\n }\n\n // Other providers require an API key\n return !!config.apiKey;\n}\n\nexport function createProviderWithFallback(\n options: CreateProviderOptions\n): LLMProvider {\n const { primary, fallback = [], config = {} } = options;\n\n // Try primary provider\n const primaryConfig = {\n ...getProviderConfigFromEnv(primary),\n ...config[primary],\n };\n\n if (canUseProvider(primary, primaryConfig)) {\n return getProvider(primary, primaryConfig);\n }\n\n // Try fallback providers\n for (const fallbackName of fallback) {\n const fallbackConfig = {\n ...getProviderConfigFromEnv(fallbackName),\n ...config[fallbackName],\n };\n\n if (canUseProvider(fallbackName, fallbackConfig)) {\n return getProvider(fallbackName, fallbackConfig);\n }\n }\n\n // No provider available\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n primary,\n fallback,\n message: 'No API key found for any configured provider',\n });\n}\n","/**\n * Translation Cache Service\n *\n * File-based caching using content hashes to avoid re-translating unchanged content.\n * Cache entries are indexed by a composite key of content hash, target language,\n * glossary hash, provider, and model.\n */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync, readdirSync, statSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { CacheEntry, CacheIndex } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst CACHE_VERSION = '1.0';\nconst INDEX_FILE = 'index.json';\nconst ENTRIES_DIR = 'entries';\n\n// ============================================================================\n// Invalidation Policy Types\n// ============================================================================\n\n/**\n * Context provided to invalidation policies for evaluation\n */\nexport interface InvalidationContext {\n /** Current glossary hash (if glossary is used) */\n glossaryHash?: string;\n /** Previous glossary hash (stored in cache metadata) */\n previousGlossaryHash?: string;\n /** Provider name */\n provider?: string;\n /** Model name */\n model?: string;\n /** Cache entry creation timestamp */\n entryCreatedAt?: string;\n /** Current timestamp */\n currentTime?: Date;\n /** Custom metadata for policy-specific checks */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result of an invalidation check\n */\nexport interface InvalidationResult {\n /** Whether invalidation should occur */\n shouldInvalidate: boolean;\n /** Reason for invalidation (for logging) */\n reason?: string;\n /** Scope of invalidation */\n scope: 'all' | 'matching' | 'none';\n /** Filter function for 'matching' scope - returns true if entry should be invalidated */\n filter?: (entry: CacheEntry, key: string) => boolean;\n}\n\n/**\n * Abstract invalidation policy interface\n */\nexport interface InvalidationPolicy {\n /** Policy name for logging */\n readonly name: string;\n /** Check if cache should be invalidated */\n check(context: InvalidationContext): InvalidationResult;\n}\n\n// ============================================================================\n// Built-in Invalidation Policies\n// ============================================================================\n\n/**\n * Invalidates all cache entries when glossary changes\n */\nexport class GlossaryChangePolicy implements InvalidationPolicy {\n readonly name = 'GlossaryChangePolicy';\n\n private readonly mode: 'all' | 'matching';\n\n /**\n * @param mode - 'all' invalidates entire cache, 'matching' only entries with old glossary hash\n */\n constructor(mode: 'all' | 'matching' = 'all') {\n this.mode = mode;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const { glossaryHash, previousGlossaryHash } = context;\n\n // No glossary or no previous hash - no invalidation needed\n if (!glossaryHash || !previousGlossaryHash) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Glossary hasn't changed\n if (glossaryHash === previousGlossaryHash) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Glossary changed\n if (this.mode === 'all') {\n return {\n shouldInvalidate: true,\n reason: `Glossary changed (${previousGlossaryHash.slice(0, 8)} → ${glossaryHash.slice(0, 8)})`,\n scope: 'all',\n };\n }\n\n // Matching mode - only invalidate entries with old glossary hash\n return {\n shouldInvalidate: true,\n reason: `Glossary changed, invalidating matching entries`,\n scope: 'matching',\n filter: (entry) => entry.glossaryHash === previousGlossaryHash,\n };\n }\n}\n\n/**\n * Invalidates cache entries older than specified TTL\n */\nexport class TTLPolicy implements InvalidationPolicy {\n readonly name = 'TTLPolicy';\n\n private readonly ttlMs: number;\n\n /**\n * @param ttlMs - Time-to-live in milliseconds\n */\n constructor(ttlMs: number) {\n this.ttlMs = ttlMs;\n }\n\n /**\n * Create policy with TTL in hours\n */\n static hours(hours: number): TTLPolicy {\n return new TTLPolicy(hours * 60 * 60 * 1000);\n }\n\n /**\n * Create policy with TTL in days\n */\n static days(days: number): TTLPolicy {\n return new TTLPolicy(days * 24 * 60 * 60 * 1000);\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const currentTime = context.currentTime ?? new Date();\n const ttlMs = this.ttlMs;\n\n return {\n shouldInvalidate: true,\n reason: `TTL check (${this.ttlMs}ms)`,\n scope: 'matching',\n filter: (entry) => {\n const createdAt = new Date(entry.createdAt);\n const age = currentTime.getTime() - createdAt.getTime();\n return age > ttlMs;\n },\n };\n }\n}\n\n/**\n * Invalidates cache entries when provider or model changes\n */\nexport class ProviderChangePolicy implements InvalidationPolicy {\n readonly name = 'ProviderChangePolicy';\n\n private readonly checkModel: boolean;\n\n /**\n * @param checkModel - If true, also invalidate when model changes within same provider\n */\n constructor(checkModel: boolean = true) {\n this.checkModel = checkModel;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const { provider, model } = context;\n\n if (!provider) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n return {\n shouldInvalidate: true,\n reason: `Provider/model mismatch check`,\n scope: 'matching',\n filter: (entry) => {\n if (entry.provider !== provider) return true;\n if (this.checkModel && model && entry.model !== model) return true;\n return false;\n },\n };\n }\n}\n\n/**\n * Invalidates cache entries below a quality threshold\n */\nexport class QualityThresholdPolicy implements InvalidationPolicy {\n readonly name = 'QualityThresholdPolicy';\n\n private readonly threshold: number;\n\n /**\n * @param threshold - Minimum quality score (0-100)\n */\n constructor(threshold: number) {\n this.threshold = threshold;\n }\n\n check(_context: InvalidationContext): InvalidationResult {\n const threshold = this.threshold;\n\n return {\n shouldInvalidate: true,\n reason: `Quality below threshold (${threshold})`,\n scope: 'matching',\n filter: (entry) => entry.qualityScore < threshold,\n };\n }\n}\n\n/**\n * Combines multiple policies - invalidates if ANY policy triggers\n */\nexport class CompositePolicy implements InvalidationPolicy {\n readonly name = 'CompositePolicy';\n\n private readonly policies: InvalidationPolicy[];\n private readonly mode: 'any' | 'all';\n\n /**\n * @param policies - Array of policies to combine\n * @param mode - 'any' triggers if any policy matches, 'all' requires all policies to match\n */\n constructor(policies: InvalidationPolicy[], mode: 'any' | 'all' = 'any') {\n this.policies = policies;\n this.mode = mode;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const results = this.policies.map((p) => ({\n policy: p,\n result: p.check(context),\n }));\n\n // Collect all filters that want to invalidate\n const activeResults = results.filter((r) => r.result.shouldInvalidate);\n\n if (activeResults.length === 0) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Check for 'all' scope - takes priority\n const allScope = activeResults.find((r) => r.result.scope === 'all');\n if (allScope) {\n return {\n shouldInvalidate: true,\n reason: `${allScope.policy.name}: ${allScope.result.reason}`,\n scope: 'all',\n };\n }\n\n // Combine matching filters\n const filters = activeResults\n .filter((r) => r.result.filter)\n .map((r) => r.result.filter!);\n\n if (filters.length === 0) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n const reasons = activeResults.map((r) => `${r.policy.name}`).join(', ');\n\n if (this.mode === 'any') {\n return {\n shouldInvalidate: true,\n reason: `Composite (any): ${reasons}`,\n scope: 'matching',\n filter: (entry, key) => filters.some((f) => f(entry, key)),\n };\n } else {\n return {\n shouldInvalidate: true,\n reason: `Composite (all): ${reasons}`,\n scope: 'matching',\n filter: (entry, key) => filters.every((f) => f(entry, key)),\n };\n }\n }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CacheOptions {\n /** Cache directory path */\n cacheDir: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Invalidation policies to apply */\n invalidationPolicies?: InvalidationPolicy[];\n}\n\nexport interface CacheKey {\n /** Source content (will be hashed) */\n content: string;\n /** Source language */\n sourceLang: string;\n /** Target language */\n targetLang: string;\n /** Glossary content or hash (will be hashed if string) */\n glossary?: string;\n /** Provider name */\n provider: string;\n /** Model name */\n model: string;\n}\n\nexport interface CacheStats {\n /** Total number of cached entries */\n entries: number;\n /** Total cache size in bytes */\n sizeBytes: number;\n /** Cache version */\n version: string;\n /** Number of entries invalidated by policies */\n invalidated?: number;\n}\n\n/**\n * Cache metadata stored separately for tracking state across sessions\n */\nexport interface CacheMetadata {\n /** Last known glossary hash */\n glossaryHash?: string;\n /** Last known provider */\n provider?: string;\n /** Last known model */\n model?: string;\n /** Last invalidation timestamp */\n lastInvalidation?: string;\n /** Custom metadata */\n custom?: Record<string, unknown>;\n}\n\nexport interface CacheResult {\n /** Whether the entry was found in cache */\n hit: boolean;\n /** The cached entry if found */\n entry?: CacheEntry;\n}\n\n// ============================================================================\n// Hash Utilities\n// ============================================================================\n\n/**\n * Generate SHA-256 hash of content\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 16);\n}\n\n/**\n * Generate cache key from components\n */\nexport function generateCacheKey(key: CacheKey): string {\n const contentHash = hashContent(key.content);\n const glossaryHash = key.glossary ? hashContent(key.glossary) : 'none';\n\n // Create composite key: content_source_target_glossary_provider_model\n return `${contentHash}_${key.sourceLang}_${key.targetLang}_${glossaryHash}_${key.provider}_${key.model}`;\n}\n\n// ============================================================================\n// Cache Manager\n// ============================================================================\n\nexport class CacheManager {\n private cacheDir: string;\n private indexPath: string;\n private entriesDir: string;\n private metadataPath: string;\n private verbose: boolean;\n private index: CacheIndex | null = null;\n private policies: InvalidationPolicy[];\n private metadata: CacheMetadata | null = null;\n\n constructor(options: CacheOptions) {\n this.cacheDir = options.cacheDir;\n this.indexPath = join(this.cacheDir, INDEX_FILE);\n this.entriesDir = join(this.cacheDir, ENTRIES_DIR);\n this.metadataPath = join(this.cacheDir, 'metadata.json');\n this.verbose = options.verbose ?? false;\n this.policies = options.invalidationPolicies ?? [];\n }\n\n /**\n * Initialize cache directory and load index\n */\n private ensureInitialized(): void {\n if (this.index !== null) return;\n\n // Create cache directories if needed\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n if (!existsSync(this.entriesDir)) {\n mkdirSync(this.entriesDir, { recursive: true });\n }\n\n // Load or create index\n if (existsSync(this.indexPath)) {\n try {\n const data = readFileSync(this.indexPath, 'utf-8');\n this.index = JSON.parse(data) as CacheIndex;\n\n // Check version compatibility\n if (this.index.version !== CACHE_VERSION) {\n if (this.verbose) {\n logger.warn(`Cache version mismatch (${this.index.version} vs ${CACHE_VERSION}), clearing cache`);\n }\n this.clearSync();\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n } catch {\n if (this.verbose) {\n logger.warn('Failed to load cache index, creating new one');\n }\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n } else {\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n\n // Load metadata\n this.loadMetadata();\n }\n\n /**\n * Load cache metadata from disk\n */\n private loadMetadata(): void {\n if (existsSync(this.metadataPath)) {\n try {\n const data = readFileSync(this.metadataPath, 'utf-8');\n this.metadata = JSON.parse(data) as CacheMetadata;\n } catch {\n this.metadata = {};\n }\n } else {\n this.metadata = {};\n }\n }\n\n /**\n * Save cache metadata to disk\n */\n private saveMetadata(): void {\n if (!this.metadata) return;\n\n try {\n writeFileSync(this.metadataPath, JSON.stringify(this.metadata, null, 2), 'utf-8');\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to save cache metadata: ${error}`);\n }\n }\n }\n\n /**\n * Update cache metadata\n */\n updateMetadata(updates: Partial<CacheMetadata>): void {\n this.ensureInitialized();\n this.metadata = { ...this.metadata, ...updates };\n this.saveMetadata();\n }\n\n /**\n * Get current cache metadata\n */\n getMetadata(): CacheMetadata {\n this.ensureInitialized();\n return { ...this.metadata! };\n }\n\n /**\n * Apply all configured invalidation policies\n * @returns Number of entries invalidated\n */\n applyPolicies(context: InvalidationContext): number {\n this.ensureInitialized();\n\n if (this.policies.length === 0) {\n return 0;\n }\n\n let totalInvalidated = 0;\n\n for (const policy of this.policies) {\n const result = policy.check({\n ...context,\n previousGlossaryHash: this.metadata?.glossaryHash,\n currentTime: context.currentTime ?? new Date(),\n });\n\n if (!result.shouldInvalidate) {\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Applying ${policy.name}: ${result.reason}`);\n }\n\n if (result.scope === 'all') {\n const count = Object.keys(this.index!.entries).length;\n this.clear();\n totalInvalidated += count;\n break; // No need to check other policies after full clear\n }\n\n if (result.scope === 'matching' && result.filter) {\n const invalidated = this.invalidateMatching(result.filter);\n totalInvalidated += invalidated;\n }\n }\n\n // Update metadata after applying policies\n if (context.glossaryHash) {\n this.metadata!.glossaryHash = context.glossaryHash;\n }\n if (context.provider) {\n this.metadata!.provider = context.provider;\n }\n if (context.model) {\n this.metadata!.model = context.model;\n }\n if (totalInvalidated > 0) {\n this.metadata!.lastInvalidation = new Date().toISOString();\n }\n this.saveMetadata();\n\n return totalInvalidated;\n }\n\n /**\n * Invalidate entries matching a filter function\n * @returns Number of entries invalidated\n */\n invalidateMatching(filter: (entry: CacheEntry, key: string) => boolean): number {\n this.ensureInitialized();\n\n const keysToDelete: string[] = [];\n\n for (const [key, entry] of Object.entries(this.index!.entries)) {\n if (filter(entry, key)) {\n keysToDelete.push(key);\n }\n }\n\n for (const key of keysToDelete) {\n // Remove entry file\n const entryPath = join(this.entriesDir, `${key}.json`);\n try {\n if (existsSync(entryPath)) {\n rmSync(entryPath);\n }\n } catch {\n // Ignore file deletion errors\n }\n\n // Remove from index\n delete this.index!.entries[key];\n }\n\n if (keysToDelete.length > 0) {\n this.saveIndex();\n if (this.verbose) {\n logger.info(`Invalidated ${keysToDelete.length} cache entries`);\n }\n }\n\n return keysToDelete.length;\n }\n\n /**\n * Add an invalidation policy at runtime\n */\n addPolicy(policy: InvalidationPolicy): void {\n this.policies.push(policy);\n }\n\n /**\n * Remove an invalidation policy by name\n */\n removePolicy(name: string): boolean {\n const index = this.policies.findIndex((p) => p.name === name);\n if (index !== -1) {\n this.policies.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get all configured policies\n */\n getPolicies(): InvalidationPolicy[] {\n return [...this.policies];\n }\n\n /**\n * Save index to disk\n */\n private saveIndex(): void {\n if (!this.index) return;\n\n try {\n const dir = dirname(this.indexPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.indexPath, JSON.stringify(this.index, null, 2), 'utf-8');\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to save cache index: ${error}`);\n }\n }\n }\n\n /**\n * Get cached translation if available\n */\n get(key: CacheKey): CacheResult {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n const entry = this.index!.entries[cacheKey];\n\n if (entry) {\n // Verify the entry file exists\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n if (existsSync(entryPath)) {\n if (this.verbose) {\n logger.info(`Cache hit: ${cacheKey.slice(0, 20)}...`);\n }\n return { hit: true, entry };\n } else {\n // Entry in index but file missing, remove from index\n delete this.index!.entries[cacheKey];\n this.saveIndex();\n }\n }\n\n if (this.verbose) {\n logger.debug(`Cache miss: ${cacheKey.slice(0, 20)}...`);\n }\n return { hit: false };\n }\n\n /**\n * Store translation in cache\n */\n set(key: CacheKey, translation: string, qualityScore: number): void {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n const contentHash = hashContent(key.content);\n const glossaryHash = key.glossary ? hashContent(key.glossary) : '';\n\n const entry: CacheEntry = {\n sourceHash: contentHash,\n sourceLang: key.sourceLang,\n targetLang: key.targetLang,\n glossaryHash,\n translation,\n qualityScore,\n createdAt: new Date().toISOString(),\n provider: key.provider,\n model: key.model,\n };\n\n // Save entry file\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n try {\n writeFileSync(entryPath, JSON.stringify(entry, null, 2), 'utf-8');\n\n // Update index\n this.index!.entries[cacheKey] = entry;\n this.saveIndex();\n\n if (this.verbose) {\n logger.info(`Cached: ${cacheKey.slice(0, 20)}...`);\n }\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to cache entry: ${error}`);\n }\n }\n }\n\n /**\n * Check if entry exists in cache\n */\n has(key: CacheKey): boolean {\n return this.get(key).hit;\n }\n\n /**\n * Remove entry from cache\n */\n delete(key: CacheKey): boolean {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n\n if (this.index!.entries[cacheKey]) {\n // Remove entry file\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n try {\n if (existsSync(entryPath)) {\n rmSync(entryPath);\n }\n } catch {\n // Ignore file deletion errors\n }\n\n // Remove from index\n delete this.index!.entries[cacheKey];\n this.saveIndex();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Clear entire cache (synchronous)\n */\n private clearSync(): void {\n try {\n if (existsSync(this.entriesDir)) {\n rmSync(this.entriesDir, { recursive: true, force: true });\n }\n if (existsSync(this.indexPath)) {\n rmSync(this.indexPath);\n }\n mkdirSync(this.entriesDir, { recursive: true });\n } catch {\n // Ignore errors during clear\n }\n }\n\n /**\n * Clear entire cache\n */\n clear(): void {\n this.clearSync();\n this.index = { version: CACHE_VERSION, entries: {} };\n this.saveIndex();\n\n if (this.verbose) {\n logger.info('Cache cleared');\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n this.ensureInitialized();\n\n let sizeBytes = 0;\n\n // Calculate size of all entry files\n if (existsSync(this.entriesDir)) {\n try {\n const files = readdirSync(this.entriesDir);\n for (const file of files) {\n const filePath = join(this.entriesDir, file);\n try {\n const stat = statSync(filePath);\n sizeBytes += stat.size;\n } catch {\n // Ignore stat errors\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Add index file size\n if (existsSync(this.indexPath)) {\n try {\n const stat = statSync(this.indexPath);\n sizeBytes += stat.size;\n } catch {\n // Ignore stat errors\n }\n }\n\n return {\n entries: Object.keys(this.index?.entries ?? {}).length,\n sizeBytes,\n version: CACHE_VERSION,\n };\n }\n\n /**\n * Get all cached entries (for debugging)\n */\n getAllEntries(): Record<string, CacheEntry> {\n this.ensureInitialized();\n return { ...this.index!.entries };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a cache manager instance\n */\nexport function createCacheManager(options: CacheOptions): CacheManager {\n return new CacheManager(options);\n}\n\n/**\n * Create a no-op cache manager that never caches (for --no-cache mode)\n */\nexport function createNullCacheManager(): CacheManager & { isNull: true } {\n const nullManager = {\n isNull: true as const,\n get: () => ({ hit: false }),\n set: () => {},\n has: () => false,\n delete: () => false,\n clear: () => {},\n getStats: () => ({ entries: 0, sizeBytes: 0, version: CACHE_VERSION }),\n getAllEntries: () => ({}),\n updateMetadata: () => {},\n getMetadata: () => ({}),\n applyPolicies: () => 0,\n invalidateMatching: () => 0,\n addPolicy: () => {},\n removePolicy: () => false,\n getPolicies: () => [],\n };\n\n return nullManager as unknown as CacheManager & { isNull: true };\n}\n\n// ============================================================================\n// Preset Policy Configurations\n// ============================================================================\n\n/**\n * Create default invalidation policies for typical translation workflow\n */\nexport function createDefaultPolicies(): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('all'),\n TTLPolicy.days(30),\n ];\n}\n\n/**\n * Create strict invalidation policies (more aggressive invalidation)\n */\nexport function createStrictPolicies(qualityThreshold: number = 85): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('all'),\n new ProviderChangePolicy(true),\n new QualityThresholdPolicy(qualityThreshold),\n TTLPolicy.days(7),\n ];\n}\n\n/**\n * Create minimal invalidation policies (only glossary changes)\n */\nexport function createMinimalPolicies(): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('matching'),\n ];\n}\n","import type {\n TranslateConfig,\n TranslationRequest,\n DocumentResult,\n ChunkResult,\n Chunk,\n DocumentFormat,\n ResolvedGlossary,\n} from '../types/index.js';\nimport type { LLMProvider } from '../providers/interface.js';\nimport { TranslationAgent, createTranslationAgent } from './agent.js';\nimport { chunkContent, getChunkStats } from './chunker.js';\nimport {\n extractTextForTranslation,\n restorePreservedSections,\n} from '../parsers/markdown.js';\nimport { loadGlossary, resolveGlossary } from '../services/glossary.js';\nimport { getProvider, getProviderConfigFromEnv } from '../providers/registry.js';\nimport { logger, createTimer } from '../utils/logger.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport {\n CacheManager,\n createCacheManager,\n createNullCacheManager,\n type CacheKey,\n} from '../services/cache.js';\n\n// ============================================================================\n// Engine Options\n// ============================================================================\n\nexport interface TranslationEngineOptions {\n config: TranslateConfig;\n provider?: LLMProvider;\n verbose?: boolean;\n /** Disable caching (--no-cache mode) */\n noCache?: boolean;\n}\n\nexport interface TranslateFileOptions {\n content: string;\n sourceLang: string;\n targetLang: string;\n format?: DocumentFormat;\n glossaryPath?: string;\n qualityThreshold?: number;\n maxIterations?: number;\n context?: string;\n /** Per-language style instruction (e.g., \"경어체\", \"です・ます調\"). Falls back to config.languages.styles[targetLang] if not specified. */\n styleInstruction?: string;\n /** If true, throw error when quality threshold is not met */\n strictQuality?: boolean;\n /** If true, throw error when glossary terms are missed */\n strictGlossary?: boolean;\n}\n\n// ============================================================================\n// Translation Engine\n// ============================================================================\n\nexport class TranslationEngine {\n private config: TranslateConfig;\n private provider: LLMProvider;\n private verbose: boolean;\n private cache: CacheManager;\n private cacheHits = 0;\n private cacheMisses = 0;\n\n constructor(options: TranslationEngineOptions) {\n this.config = options.config;\n this.verbose = options.verbose ?? false;\n\n // Initialize provider\n if (options.provider) {\n this.provider = options.provider;\n } else {\n const providerConfig = getProviderConfigFromEnv(this.config.provider.default);\n // Use model from config if specified (CLI --model option)\n if (this.config.provider.model) {\n providerConfig.defaultModel = this.config.provider.model;\n }\n this.provider = getProvider(this.config.provider.default, providerConfig);\n }\n\n // Initialize cache\n const cacheDisabled = options.noCache || !this.config.paths?.cache;\n if (cacheDisabled) {\n this.cache = createNullCacheManager();\n if (this.verbose && options.noCache) {\n logger.info('Cache disabled (--no-cache)');\n }\n } else {\n this.cache = createCacheManager({\n cacheDir: this.config.paths.cache!,\n verbose: this.verbose,\n });\n if (this.verbose) {\n const stats = this.cache.getStats();\n logger.info(`Cache initialized: ${stats.entries} entries`);\n }\n }\n }\n\n /**\n * Translate a single file/content\n */\n async translateContent(options: TranslateFileOptions): Promise<DocumentResult> {\n const timer = createTimer();\n const format = options.format ?? this.detectFormat(options.content);\n\n if (this.verbose) {\n logger.info(`Translating content (${format} format)`);\n logger.info(`Source: ${options.sourceLang} → Target: ${options.targetLang}`);\n }\n\n // Load glossary if provided\n let glossary: ResolvedGlossary | undefined;\n if (options.glossaryPath) {\n try {\n const rawGlossary = await loadGlossary(options.glossaryPath);\n glossary = resolveGlossary(rawGlossary, options.targetLang);\n if (this.verbose) {\n logger.info(`Loaded glossary: ${glossary.terms.length} terms`);\n }\n } catch (error) {\n if (this.verbose) {\n logger.warn(`Failed to load glossary: ${error}`);\n }\n }\n } else if (this.config.glossary?.path) {\n try {\n const rawGlossary = await loadGlossary(this.config.glossary.path);\n glossary = resolveGlossary(rawGlossary, options.targetLang);\n if (this.verbose) {\n logger.info(`Loaded glossary from config: ${glossary.terms.length} terms`);\n }\n } catch {\n // Glossary is optional\n }\n }\n\n // Process based on format\n let result: DocumentResult;\n\n switch (format) {\n case 'markdown':\n result = await this.translateMarkdown(options, glossary);\n break;\n case 'html':\n // For now, treat HTML as plain text (Phase 2 will add proper HTML support)\n result = await this.translatePlainText(options, glossary);\n break;\n case 'text':\n default:\n result = await this.translatePlainText(options, glossary);\n break;\n }\n\n result.metadata.totalDuration = timer.elapsed();\n\n // Check glossary compliance if glossary is provided\n if (glossary && glossary.terms.length > 0) {\n const compliance = this.checkDocumentGlossaryCompliance(\n options.content,\n result.content,\n glossary\n );\n result.glossaryCompliance = compliance;\n\n if (this.verbose) {\n logger.info(`Glossary compliance: ${compliance.applied.length}/${compliance.applied.length + compliance.missed.length} terms applied`);\n if (compliance.missed.length > 0) {\n logger.warn(`Missed glossary terms: ${compliance.missed.join(', ')}`);\n }\n }\n\n // Strict glossary mode - fail if any terms are missed\n if (options.strictGlossary && !compliance.compliant) {\n throw new TranslationError(ErrorCode.GLOSSARY_COMPLIANCE_FAILED, {\n missed: compliance.missed.join(', '),\n applied: compliance.applied,\n total: glossary.terms.length,\n });\n }\n }\n\n if (this.verbose) {\n logger.success(`Translation complete in ${timer.format()}`);\n logger.info(`Average quality: ${result.metadata.averageQuality.toFixed(1)}/100`);\n }\n\n return result;\n }\n\n /**\n * Check glossary compliance for the entire document\n */\n private checkDocumentGlossaryCompliance(\n sourceContent: string,\n translatedContent: string,\n glossary: ResolvedGlossary\n ): { applied: string[]; missed: string[]; compliant: boolean } {\n const applied: string[] = [];\n const missed: string[] = [];\n const sourceLower = sourceContent.toLowerCase();\n const translatedLower = translatedContent.toLowerCase();\n\n for (const term of glossary.terms) {\n // Check if source term exists in original content\n const sourceInContent = term.caseSensitive\n ? sourceContent.includes(term.source)\n : sourceLower.includes(term.source.toLowerCase());\n\n if (!sourceInContent) {\n // Term not in source, skip\n continue;\n }\n\n // Check if target term exists in translated content\n const targetInTranslation = term.caseSensitive\n ? translatedContent.includes(term.target)\n : translatedLower.includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n return {\n applied,\n missed,\n compliant: missed.length === 0,\n };\n }\n\n // ============================================================================\n // Format-Specific Translation\n // ============================================================================\n\n private async translateMarkdown(\n options: TranslateFileOptions,\n glossary?: ResolvedGlossary\n ): Promise<DocumentResult> {\n // Extract text for translation, preserving code blocks etc.\n const { text, preservedSections } = extractTextForTranslation(options.content);\n\n // Chunk the content\n const chunks = chunkContent(text, {\n maxTokens: this.config.chunking.maxTokens,\n overlapTokens: this.config.chunking.overlapTokens,\n });\n\n if (this.verbose) {\n const stats = getChunkStats(chunks);\n logger.info(`Chunked into ${stats.translatableChunks} translatable sections`);\n }\n\n // Create translation agent\n const agent = createTranslationAgent({\n provider: this.provider,\n qualityThreshold: options.qualityThreshold ?? this.config.quality.threshold,\n maxIterations: options.maxIterations ?? this.config.quality.maxIterations,\n verbose: this.verbose,\n strictQuality: options.strictQuality,\n });\n\n // Translate each chunk\n const chunkResults: ChunkResult[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalIterations = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n if (!chunk) continue;\n\n if (chunk.type === 'preserve') {\n // Keep preserved content as-is\n chunkResults.push({\n original: chunk.content,\n translated: chunk.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 100,\n });\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Translating chunk ${i + 1}/${chunks.length}...`);\n }\n\n const result = await this.translateChunk(chunk, options, glossary, agent);\n chunkResults.push(result);\n\n // Accumulate token and iteration counts\n if (result.tokensUsed) {\n totalInputTokens += result.tokensUsed.input;\n totalOutputTokens += result.tokensUsed.output;\n }\n if (result.iterations) {\n totalIterations += result.iterations;\n }\n }\n\n // Reassemble translated content\n const translatedText = chunkResults.map((r) => r.translated).join('');\n\n // Restore preserved sections\n const finalContent = restorePreservedSections(translatedText, preservedSections);\n\n // Calculate average quality\n const qualityScores = chunkResults\n .filter((r) => r.qualityScore > 0)\n .map((r) => r.qualityScore);\n const averageQuality =\n qualityScores.length > 0\n ? qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length\n : 0;\n\n // Calculate cache statistics from chunk results\n const cacheHits = chunkResults.filter((r) => r.cached).length;\n const cacheMisses = chunkResults.filter((r) => !r.cached && r.qualityScore > 0).length;\n\n return {\n content: finalContent,\n chunks: chunkResults,\n metadata: {\n totalTokensUsed: totalInputTokens + totalOutputTokens,\n totalDuration: 0, // Will be set by caller\n averageQuality,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n totalIterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n },\n },\n };\n }\n\n private async translatePlainText(\n options: TranslateFileOptions,\n glossary?: ResolvedGlossary\n ): Promise<DocumentResult> {\n // Chunk the content\n const chunks = chunkContent(options.content, {\n maxTokens: this.config.chunking.maxTokens,\n overlapTokens: this.config.chunking.overlapTokens,\n });\n\n // Create translation agent\n const agent = createTranslationAgent({\n provider: this.provider,\n qualityThreshold: options.qualityThreshold ?? this.config.quality.threshold,\n maxIterations: options.maxIterations ?? this.config.quality.maxIterations,\n verbose: this.verbose,\n strictQuality: options.strictQuality,\n });\n\n // Translate each chunk\n const chunkResults: ChunkResult[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalIterations = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n if (!chunk) continue;\n\n if (chunk.type === 'preserve') {\n chunkResults.push({\n original: chunk.content,\n translated: chunk.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 100,\n });\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Translating chunk ${i + 1}/${chunks.length}...`);\n }\n\n const result = await this.translateChunk(chunk, options, glossary, agent);\n chunkResults.push(result);\n\n // Accumulate token and iteration counts\n if (result.tokensUsed) {\n totalInputTokens += result.tokensUsed.input;\n totalOutputTokens += result.tokensUsed.output;\n }\n if (result.iterations) {\n totalIterations += result.iterations;\n }\n }\n\n // Reassemble\n const translatedContent = chunkResults.map((r) => r.translated).join('');\n\n // Calculate average quality\n const qualityScores = chunkResults\n .filter((r) => r.qualityScore > 0)\n .map((r) => r.qualityScore);\n const averageQuality =\n qualityScores.length > 0\n ? qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length\n : 0;\n\n // Calculate cache statistics from chunk results\n const cacheHits = chunkResults.filter((r) => r.cached).length;\n const cacheMisses = chunkResults.filter((r) => !r.cached && r.qualityScore > 0).length;\n\n return {\n content: translatedContent,\n chunks: chunkResults,\n metadata: {\n totalTokensUsed: totalInputTokens + totalOutputTokens,\n totalDuration: 0,\n averageQuality,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n totalIterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n },\n },\n };\n }\n\n private async translateChunk(\n chunk: Chunk,\n options: TranslateFileOptions,\n glossary: ResolvedGlossary | undefined,\n agent: TranslationAgent\n ): Promise<ChunkResult> {\n // Build cache key\n const glossaryString = glossary\n ? JSON.stringify(glossary.terms.map((t) => ({ s: t.source, t: t.target })))\n : undefined;\n\n const cacheKey: CacheKey = {\n content: chunk.content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n glossary: glossaryString,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n };\n\n // Check cache first\n const cacheResult = this.cache.get(cacheKey);\n if (cacheResult.hit && cacheResult.entry) {\n this.cacheHits++;\n if (this.verbose) {\n logger.info(` ↳ Cache hit (quality: ${cacheResult.entry.qualityScore})`);\n }\n return {\n original: chunk.content,\n translated: cacheResult.entry.translation,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: cacheResult.entry.qualityScore,\n iterations: 0,\n tokensUsed: { input: 0, output: 0, cacheRead: 1 },\n cached: true,\n };\n }\n\n this.cacheMisses++;\n\n // Build context from chunk metadata and options\n // Resolve style instruction: CLI option > config.languages.styles[targetLang]\n const resolvedStyleInstruction =\n options.styleInstruction ?? this.config.languages.styles?.[options.targetLang];\n\n const context: TranslationRequest['context'] = {\n documentPurpose: options.context,\n styleInstruction: resolvedStyleInstruction,\n };\n\n // Add header hierarchy context if available\n if (chunk.metadata?.headerHierarchy && chunk.metadata.headerHierarchy.length > 0) {\n context.documentSummary = `Current section: ${chunk.metadata.headerHierarchy.join(' > ')}`;\n }\n\n // Add previous context if available\n if (chunk.metadata?.previousContext) {\n context.previousChunks = [chunk.metadata.previousContext];\n }\n\n const request: TranslationRequest = {\n content: chunk.content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: options.format ?? 'text',\n glossary,\n context,\n };\n\n try {\n const result = await agent.translate(request);\n\n // Store in cache\n this.cache.set(cacheKey, result.content, result.metadata.qualityScore);\n\n return {\n original: chunk.content,\n translated: result.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: result.metadata.qualityScore,\n iterations: result.metadata.iterations,\n tokensUsed: result.metadata.tokensUsed,\n };\n } catch (error) {\n // Log error but continue with original content\n logger.error(`Failed to translate chunk: ${error}`);\n\n return {\n original: chunk.content,\n translated: chunk.content, // Fallback to original\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 0,\n iterations: 0,\n tokensUsed: { input: 0, output: 0 },\n };\n }\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n private detectFormat(content: string): DocumentFormat {\n // Check for markdown indicators\n if (\n content.includes('# ') ||\n content.includes('## ') ||\n content.includes('```') ||\n content.includes('- ') ||\n content.match(/\\[.+\\]\\(.+\\)/)\n ) {\n return 'markdown';\n }\n\n // Check for HTML indicators\n if (\n content.includes('<html') ||\n content.includes('<body') ||\n content.includes('<div') ||\n content.includes('<p>')\n ) {\n return 'html';\n }\n\n return 'text';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createTranslationEngine(\n options: TranslationEngineOptions\n): TranslationEngine {\n return new TranslationEngine(options);\n}\n\n// ============================================================================\n// Simple Translation Function (for direct use)\n// ============================================================================\n\nexport async function translateText(\n content: string,\n sourceLang: string,\n targetLang: string,\n options?: {\n provider?: LLMProvider;\n glossaryPath?: string;\n qualityThreshold?: number;\n maxIterations?: number;\n verbose?: boolean;\n }\n): Promise<string> {\n const defaultConfig: TranslateConfig = {\n version: '1.0',\n languages: { source: sourceLang, targets: [targetLang] },\n provider: { default: 'claude' },\n quality: {\n threshold: options?.qualityThreshold ?? 85,\n maxIterations: options?.maxIterations ?? 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: { output: './' },\n };\n\n const engine = createTranslationEngine({\n config: defaultConfig,\n provider: options?.provider,\n verbose: options?.verbose,\n });\n\n const result = await engine.translateContent({\n content,\n sourceLang,\n targetLang,\n glossaryPath: options?.glossaryPath,\n qualityThreshold: options?.qualityThreshold,\n maxIterations: options?.maxIterations,\n });\n\n return result.content;\n}\n","import { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { resolve, dirname, basename, extname } from 'node:path';\nimport { mkdir } from 'node:fs/promises';\nimport type { FileCommandOptions } from '../options.js';\nimport { defaults } from '../options.js';\nimport { loadConfig, mergeConfig } from '../../services/config.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { logger, configureLogger } from '../../utils/logger.js';\nimport { TranslationError, getExitCode } from '../../errors.js';\nimport type { DocumentFormat } from '../../types/index.js';\n\nexport const fileCommand = new Command('file')\n .description('Translate a single file')\n .argument('<input>', 'Input file path')\n .argument('[output]', 'Output file path (optional)')\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option('-g, --glossary <path>', 'Path to glossary file')\n .option(\n '-p, --provider <name>',\n 'LLM provider (claude|openai|ollama)',\n defaults.provider\n )\n .option('-m, --model <name>', 'Model name')\n .option(\n '--quality <0-100>',\n 'Quality threshold',\n String(defaults.quality)\n )\n .option(\n '--max-iterations <n>',\n 'Max refinement iterations',\n String(defaults.maxIterations)\n )\n .option('-o, --output <path>', 'Output path')\n .option('-f, --format <fmt>', 'Force output format (md|html|txt)')\n .option('--dry-run', 'Show what would be translated')\n .option('--json', 'Output results as JSON')\n .option(\n '--chunk-size <tokens>',\n 'Max tokens per chunk',\n String(defaults.chunkSize)\n )\n .option('--no-cache', 'Disable translation cache')\n .option('--context <text>', 'Additional context for translation')\n .option('--strict-quality', 'Fail if quality threshold is not met')\n .option('--strict-glossary', 'Fail if glossary terms are not applied')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output')\n .action(async (input: string, output: string | undefined, options: FileCommandOptions) => {\n try {\n // Configure logger\n configureLogger({\n level: options.verbose ? 'debug' : 'info',\n quiet: options.quiet ?? false,\n json: options.json ?? false,\n });\n\n // Validate required options\n if (!options.sourceLang) {\n console.error('Error: Source language (-s, --source-lang) is required');\n process.exit(2);\n }\n\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n chunkSize: options.chunkSize ? parseInt(options.chunkSize, 10) : undefined,\n glossary: options.glossary,\n noCache: options.cache === false,\n });\n\n // Read input file\n const inputPath = resolve(input);\n let content: string;\n\n try {\n content = await readFile(inputPath, 'utf-8');\n } catch (error) {\n console.error(`Error: Could not read file '${inputPath}'`);\n process.exit(3);\n }\n\n if (!options.quiet) {\n logger.info(`Reading: ${inputPath}`);\n logger.info(`Translating: ${options.sourceLang} → ${options.targetLang}`);\n if (options.glossary) {\n logger.info(`Glossary: ${resolve(options.glossary)}`);\n }\n }\n\n // Dry run - just show what would be done\n if (options.dryRun) {\n console.log('Dry run mode - no translation will be performed');\n console.log(`Input: ${inputPath}`);\n console.log(`Output: ${output ?? determineOutputPath(inputPath, options.targetLang)}`);\n console.log(`Source language: ${options.sourceLang}`);\n console.log(`Target language: ${options.targetLang}`);\n console.log(`Content length: ${content.length} characters`);\n return;\n }\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: options.verbose,\n noCache: options.cache === false,\n });\n\n // Translate content\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n strictQuality: options.strictQuality,\n strictGlossary: options.strictGlossary,\n });\n\n // Determine output path\n const outputPath = output ?? options.output ?? determineOutputPath(inputPath, options.targetLang);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write output\n await writeFile(outputPath, result.content, 'utf-8');\n\n // Output results\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n input: inputPath,\n output: outputPath,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n quality: result.metadata.averageQuality,\n duration: result.metadata.totalDuration,\n chunks: result.chunks.length,\n provider: result.metadata.provider,\n model: result.metadata.model,\n iterations: result.metadata.totalIterations,\n tokensUsed: result.metadata.tokensUsed,\n }, null, 2));\n } else if (!options.quiet) {\n logger.success(`Written to ${outputPath}`);\n console.log('');\n console.log(' Translation Summary:');\n console.log(` - Model: ${result.metadata.provider}/${result.metadata.model}`);\n console.log(` - Quality: ${result.metadata.averageQuality.toFixed(0)}/100`);\n console.log(` - Chunks: ${result.chunks.length}`);\n console.log(` - Iterations: ${result.metadata.totalIterations}`);\n console.log(` - Tokens: ${result.metadata.tokensUsed.input.toLocaleString()} input / ${result.metadata.tokensUsed.output.toLocaleString()} output`);\n console.log(` - Duration: ${(result.metadata.totalDuration / 1000).toFixed(1)}s`);\n }\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n/**\n * Handle stdin/stdout translation mode\n */\nexport async function handleStdinTranslation(\n options: FileCommandOptions\n): Promise<void> {\n try {\n // Configure logger for quiet mode (stdout is for translation output)\n configureLogger({\n level: 'error',\n quiet: true,\n json: false,\n });\n\n // Validate required options\n if (!options.sourceLang) {\n console.error('Error: Source language (-s, --source-lang) is required');\n process.exit(2);\n }\n\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Read from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n const content = Buffer.concat(chunks).toString('utf-8');\n\n if (!content.trim()) {\n console.error('Error: No input provided');\n process.exit(2);\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n glossary: options.glossary,\n });\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: false,\n noCache: options.cache === false,\n });\n\n // Translate content\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n });\n\n // Output to stdout\n process.stdout.write(result.content);\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction determineOutputPath(inputPath: string, targetLang: string): string {\n const dir = dirname(inputPath);\n const ext = extname(inputPath);\n const base = basename(inputPath, ext);\n\n return resolve(dir, `${base}.${targetLang}${ext}`);\n}\n\nfunction mapFormat(format: string | undefined): DocumentFormat | undefined {\n if (!format) return undefined;\n\n switch (format.toLowerCase()) {\n case 'md':\n case 'markdown':\n return 'markdown';\n case 'html':\n return 'html';\n case 'txt':\n case 'text':\n return 'text';\n default:\n return undefined;\n }\n}\n","import { Command } from 'commander';\nimport { fileCommand } from './commands/file.js';\nimport { dirCommand } from './commands/dir.js';\nimport { initCommand } from './commands/init.js';\nimport { glossaryCommand } from './commands/glossary.js';\nimport { serveCommand } from './commands/serve.js';\n\nconst program = new Command();\n\nprogram\n .name('llm-translate')\n .description(\n 'CLI-based document translation tool powered by LLMs with glossary enforcement'\n )\n .version('0.1.0')\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ============================================================================\n// Global Options (for stdin/stdout mode)\n// ============================================================================\n\nprogram\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option(\n '-c, --config <path>',\n 'Path to config file (default: .translaterc.json)'\n )\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output');\n\n// ============================================================================\n// Commands\n// ============================================================================\n\nprogram.addCommand(fileCommand);\nprogram.addCommand(dirCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(glossaryCommand);\nprogram.addCommand(serveCommand);\n\n// ============================================================================\n// Stdin/Stdout Mode (default when no command specified)\n// ============================================================================\n\nprogram.action(async (options) => {\n // Handle stdin/stdout translation when piped\n if (!process.stdin.isTTY) {\n const { handleStdinTranslation } = await import('./commands/file.js');\n await handleStdinTranslation(options);\n } else {\n program.help();\n }\n});\n\n// ============================================================================\n// Parse and Execute\n// ============================================================================\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import { Command } from 'commander';\nimport { readFile, writeFile, readdir, mkdir } from 'node:fs/promises';\nimport { resolve, dirname, relative, join } from 'node:path';\nimport type { DirCommandOptions } from '../options.js';\nimport { defaults } from '../options.js';\nimport { loadConfig, mergeConfig } from '../../services/config.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { logger, configureLogger } from '../../utils/logger.js';\nimport { TranslationError, getExitCode } from '../../errors.js';\nimport type { DocumentFormat, DocumentResult } from '../../types/index.js';\n\nexport const dirCommand = new Command('dir')\n .description('Translate all files in a directory')\n .argument('<input>', 'Input directory path')\n .argument('<output>', 'Output directory path')\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option('-g, --glossary <path>', 'Path to glossary file')\n .option(\n '-p, --provider <name>',\n 'LLM provider (claude|openai|ollama)',\n defaults.provider\n )\n .option('-m, --model <name>', 'Model name')\n .option(\n '--quality <0-100>',\n 'Quality threshold',\n String(defaults.quality)\n )\n .option(\n '--max-iterations <n>',\n 'Max refinement iterations',\n String(defaults.maxIterations)\n )\n .option('-f, --format <fmt>', 'Force output format (md|html|txt)')\n .option('--dry-run', 'Show what would be translated')\n .option('--json', 'Output results as JSON')\n .option(\n '--chunk-size <tokens>',\n 'Max tokens per chunk',\n String(defaults.chunkSize)\n )\n .option(\n '--parallel <n>',\n 'Parallel file processing',\n String(defaults.parallel)\n )\n .option('--no-cache', 'Disable translation cache')\n .option('--context <text>', 'Additional context for translation')\n .option('--include <patterns>', 'File patterns to include (comma-separated)', '*.md,*.markdown')\n .option('--exclude <patterns>', 'File patterns to exclude (comma-separated)')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output')\n .action(async (input: string, output: string, options: DirCommandOptions & { include?: string; exclude?: string }) => {\n try {\n // Configure logger\n configureLogger({\n level: options.verbose ? 'debug' : 'info',\n quiet: options.quiet ?? false,\n json: options.json ?? false,\n });\n\n // Validate required options\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Resolve paths\n const inputDir = resolve(input);\n const outputDir = resolve(output);\n\n // Parse include/exclude patterns\n const includePatterns = options.include?.split(',').map(p => p.trim()) ?? ['*.md', '*.markdown'];\n const excludePatterns = options.exclude?.split(',').map(p => p.trim()) ?? [];\n\n // Find all matching files (exclude output directory and locale directories)\n const files = await findFiles(inputDir, includePatterns, excludePatterns, outputDir);\n\n if (files.length === 0) {\n console.log('No files found matching the specified patterns');\n return;\n }\n\n if (!options.quiet) {\n logger.info(`Found ${files.length} file(s) to translate`);\n logger.info(`Input: ${inputDir}`);\n logger.info(`Output: ${outputDir}`);\n logger.info(`Target language: ${options.targetLang}`);\n if (options.glossary) {\n logger.info(`Glossary: ${resolve(options.glossary)}`);\n }\n }\n\n // Dry run - just show what would be done\n if (options.dryRun) {\n console.log('\\nDry run mode - no translation will be performed\\n');\n console.log('Files to translate:');\n for (const file of files) {\n const relativePath = relative(inputDir, file);\n const outputPath = join(outputDir, relativePath);\n console.log(` ${relativePath} → ${relative(process.cwd(), outputPath)}`);\n }\n console.log(`\\nTotal: ${files.length} file(s)`);\n return;\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n chunkSize: options.chunkSize ? parseInt(options.chunkSize, 10) : undefined,\n glossary: options.glossary,\n noCache: options.cache === false,\n });\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: options.verbose,\n noCache: options.cache === false,\n });\n\n // Process files\n const parallelCount = typeof options.parallel === 'string'\n ? parseInt(options.parallel, 10)\n : (options.parallel ?? defaults.parallel);\n\n if (!options.quiet) {\n logger.info(`Parallel processing: ${parallelCount} file(s) at a time`);\n }\n\n const results = await processFiles(\n files,\n inputDir,\n outputDir,\n engine,\n options,\n parallelCount\n );\n\n // Output results\n outputResults(results, options);\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FileResult {\n inputPath: string;\n outputPath: string;\n relativePath: string;\n success: boolean;\n error?: string;\n result?: DocumentResult;\n duration: number;\n}\n\ninterface DirResults {\n files: FileResult[];\n totalDuration: number;\n successCount: number;\n failCount: number;\n totalTokensInput: number;\n totalTokensOutput: number;\n totalCacheRead: number;\n totalCacheWrite: number;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Find all files matching the include patterns and not matching exclude patterns\n */\nasync function findFiles(\n dir: string,\n includePatterns: string[],\n excludePatterns: string[],\n outputDir?: string\n): Promise<string[]> {\n const files: string[] = [];\n\n // If output is inside input dir, exclude it\n const outputRelative = outputDir ? relative(dir, outputDir) : null;\n const isOutputInsideInput = outputRelative && !outputRelative.startsWith('..');\n\n async function scan(currentDir: string): Promise<void> {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n const relativePath = relative(dir, fullPath);\n\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n if (entry.isDirectory()) {\n // Skip output directory if it's inside input directory\n if (isOutputInsideInput && relativePath === outputRelative) {\n continue;\n }\n\n // Also skip common locale directories (2-letter codes like ko, ja, zh)\n if (/^[a-z]{2}(-[A-Z]{2})?$/.test(entry.name)) {\n continue;\n }\n\n // Check if directory should be excluded\n if (!matchesPatterns(relativePath + '/', excludePatterns)) {\n await scan(fullPath);\n }\n } else if (entry.isFile()) {\n // Check if file matches include patterns and not exclude patterns\n if (\n matchesPatterns(entry.name, includePatterns) &&\n !matchesPatterns(relativePath, excludePatterns)\n ) {\n files.push(fullPath);\n }\n }\n }\n }\n\n await scan(dir);\n return files.sort();\n}\n\n/**\n * Check if a path matches any of the given glob patterns\n */\nfunction matchesPatterns(path: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (matchGlob(path, pattern)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Simple glob matching (supports * and **)\n */\nfunction matchGlob(path: string, pattern: string): boolean {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*\\*/g, '{{DOUBLESTAR}}') // Temp placeholder for **\n .replace(/\\*/g, '[^/]*') // * matches anything except /\n .replace(/{{DOUBLESTAR}}/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single char\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n}\n\n/**\n * Process files with parallel execution using worker pool pattern.\n * As soon as one file completes, the next file starts immediately.\n */\nasync function processFiles(\n files: string[],\n inputDir: string,\n outputDir: string,\n engine: ReturnType<typeof createTranslationEngine>,\n options: DirCommandOptions & { include?: string; exclude?: string },\n parallelCount: number\n): Promise<DirResults> {\n const startTime = Date.now();\n const results: FileResult[] = new Array(files.length);\n let completed = 0;\n let nextIndex = 0;\n\n // Process a single file and return the result\n const processFile = async (inputPath: string, _index: number): Promise<FileResult> => {\n const relativePath = relative(inputDir, inputPath);\n const outputPath = join(outputDir, relativePath);\n const fileStartTime = Date.now();\n\n try {\n // Read input file\n const content = await readFile(inputPath, 'utf-8');\n\n // Translate\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang!,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n });\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write output\n await writeFile(outputPath, result.content, 'utf-8');\n\n completed++;\n if (!options.quiet && !options.json) {\n const progress = `[${completed}/${files.length}]`;\n logger.success(`${progress} ${relativePath}`);\n }\n\n return {\n inputPath,\n outputPath,\n relativePath,\n success: true,\n result,\n duration: Date.now() - fileStartTime,\n };\n } catch (error) {\n completed++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (!options.quiet && !options.json) {\n const progress = `[${completed}/${files.length}]`;\n logger.error(`${progress} ${relativePath}: ${errorMessage}`);\n }\n\n return {\n inputPath,\n outputPath,\n relativePath,\n success: false,\n error: errorMessage,\n duration: Date.now() - fileStartTime,\n };\n }\n };\n\n // Worker function: continuously process files until none remain\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= files.length) break;\n\n const inputPath = files[index];\n if (!inputPath) break;\n\n const result = await processFile(inputPath, index);\n results[index] = result;\n }\n };\n\n // Start workers (up to parallelCount or file count, whichever is smaller)\n const workerCount = Math.min(parallelCount, files.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // Calculate totals\n const successResults = results.filter(r => r.success && r.result);\n const totalTokensInput = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.input ?? 0), 0);\n const totalTokensOutput = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.output ?? 0), 0);\n const totalCacheRead = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.cacheRead ?? 0), 0);\n const totalCacheWrite = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.cacheWrite ?? 0), 0);\n\n return {\n files: results,\n totalDuration: Date.now() - startTime,\n successCount: results.filter(r => r.success).length,\n failCount: results.filter(r => !r.success).length,\n totalTokensInput,\n totalTokensOutput,\n totalCacheRead,\n totalCacheWrite,\n };\n}\n\n/**\n * Output results summary\n */\nfunction outputResults(results: DirResults, options: DirCommandOptions): void {\n if (options.json) {\n console.log(JSON.stringify({\n success: results.failCount === 0,\n totalFiles: results.files.length,\n successCount: results.successCount,\n failCount: results.failCount,\n totalDuration: results.totalDuration,\n tokensUsed: {\n input: results.totalTokensInput,\n output: results.totalTokensOutput,\n cacheRead: results.totalCacheRead,\n cacheWrite: results.totalCacheWrite,\n },\n files: results.files.map(f => ({\n input: f.relativePath,\n output: f.outputPath,\n success: f.success,\n error: f.error,\n duration: f.duration,\n quality: f.result?.metadata.averageQuality ?? 0,\n tokens: f.result ? {\n input: f.result.metadata.tokensUsed.input,\n output: f.result.metadata.tokensUsed.output,\n } : undefined,\n })),\n }, null, 2));\n return;\n }\n\n if (options.quiet) {\n return;\n }\n\n console.log('');\n console.log('─'.repeat(60));\n console.log(' Translation Summary');\n console.log('─'.repeat(60));\n console.log(` Files: ${results.successCount} succeeded, ${results.failCount} failed`);\n console.log(` Duration: ${(results.totalDuration / 1000).toFixed(1)}s`);\n console.log(` Tokens: ${results.totalTokensInput.toLocaleString()} input / ${results.totalTokensOutput.toLocaleString()} output`);\n\n if (results.totalCacheRead > 0 || results.totalCacheWrite > 0) {\n console.log(` Cache: ${results.totalCacheRead.toLocaleString()} read / ${results.totalCacheWrite.toLocaleString()} write`);\n }\n\n if (results.failCount > 0) {\n console.log('');\n console.log(' Failed files:');\n for (const file of results.files.filter(f => !f.success)) {\n console.log(` - ${file.relativePath}: ${file.error}`);\n }\n }\n\n console.log('─'.repeat(60));\n}\n\nfunction mapFormat(format: string | undefined): DocumentFormat | undefined {\n if (!format) return undefined;\n\n switch (format.toLowerCase()) {\n case 'md':\n case 'markdown':\n return 'markdown';\n case 'html':\n return 'html';\n case 'txt':\n case 'text':\n return 'text';\n default:\n return undefined;\n }\n}\n","import { Command } from 'commander';\nimport { writeFile, access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { TranslateConfig } from '../../types/index.js';\n\nconst defaultConfig: TranslateConfig = {\n version: '1.0',\n project: {\n name: 'My Project',\n description: 'Project description',\n purpose: 'Technical documentation translation',\n },\n languages: {\n source: 'en',\n targets: ['ko'],\n },\n provider: {\n default: 'claude',\n model: 'claude-sonnet-4-20250514',\n },\n quality: {\n threshold: 85,\n maxIterations: 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: {\n output: './docs/{lang}',\n cache: './.translate-cache',\n },\n ignore: ['**/node_modules/**', '**/*.test.md'],\n};\n\nexport const initCommand = new Command('init')\n .description('Initialize project configuration')\n .option('-f, --force', 'Overwrite existing configuration')\n .action(async (options: { force?: boolean }) => {\n const configPath = join(process.cwd(), '.translaterc.json');\n\n // Check if config already exists\n if (!options.force) {\n try {\n await access(configPath);\n console.error(\n 'Configuration file already exists. Use --force to overwrite.'\n );\n process.exit(1);\n } catch {\n // File doesn't exist, continue\n }\n }\n\n try {\n await writeFile(configPath, JSON.stringify(defaultConfig, null, 2));\n console.log('Created .translaterc.json');\n console.log('\\nNext steps:');\n console.log('1. Edit .translaterc.json to configure your project');\n console.log('2. Set your API key: export ANTHROPIC_API_KEY=your-key');\n console.log('3. Run: llm-translate file <input> -s en -t ko');\n } catch (error) {\n console.error('Failed to create configuration file:', error);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport type { Glossary, GlossaryTerm } from '../../types/index.js';\n\nexport const glossaryCommand = new Command('glossary')\n .description('Manage glossary (add, remove, list, validate)');\n\n// ============================================================================\n// Subcommands\n// ============================================================================\n\nglossaryCommand\n .command('list')\n .description('List all terms in a glossary')\n .argument('<path>', 'Path to glossary file')\n .option('--lang <lang>', 'Filter by target language')\n .action(async (path: string, options: { lang?: string }) => {\n try {\n const glossary = await loadGlossary(path);\n console.log(`Glossary: ${glossary.metadata.name}`);\n console.log(`Source: ${glossary.metadata.sourceLang}`);\n console.log(`Targets: ${glossary.metadata.targetLangs.join(', ')}`);\n console.log(`Terms: ${glossary.terms.length}`);\n console.log('---');\n\n for (const term of glossary.terms) {\n if (term.doNotTranslate) {\n console.log(` ${term.source} → [do not translate]`);\n } else if (options.lang && term.targets[options.lang]) {\n console.log(` ${term.source} → ${term.targets[options.lang]}`);\n } else if (!options.lang) {\n const translations = Object.entries(term.targets)\n .map(([lang, val]) => `${lang}: ${val}`)\n .join(', ');\n console.log(` ${term.source} → ${translations || '[no translations]'}`);\n }\n }\n } catch (error) {\n console.error('Failed to load glossary:', error);\n process.exit(1);\n }\n });\n\nglossaryCommand\n .command('validate')\n .description('Validate a glossary file')\n .argument('<path>', 'Path to glossary file')\n .action(async (path: string) => {\n try {\n const glossary = await loadGlossary(path);\n const errors = validateGlossary(glossary);\n\n if (errors.length === 0) {\n console.log('Glossary is valid!');\n console.log(` Name: ${glossary.metadata.name}`);\n console.log(` Terms: ${glossary.terms.length}`);\n console.log(` Source: ${glossary.metadata.sourceLang}`);\n console.log(` Targets: ${glossary.metadata.targetLangs.join(', ')}`);\n } else {\n console.error('Glossary validation failed:');\n for (const error of errors) {\n console.error(` - ${error}`);\n }\n process.exit(6); // GLOSSARY_VALIDATION_FAILED\n }\n } catch (error) {\n console.error('Failed to load glossary:', error);\n process.exit(1);\n }\n });\n\nglossaryCommand\n .command('add')\n .description('Add a term to the glossary')\n .argument('<path>', 'Path to glossary file')\n .argument('<source>', 'Source term')\n .option('--target <lang:value...>', 'Target translations (e.g., ko:번역)')\n .option('--context <text>', 'Usage context')\n .option('--do-not-translate', 'Mark as do not translate')\n .action(\n async (\n path: string,\n source: string,\n options: {\n target?: string[];\n context?: string;\n doNotTranslate?: boolean;\n }\n ) => {\n try {\n const glossary = await loadGlossary(path);\n\n // Check if term already exists\n const existing = glossary.terms.find(\n (t) => t.source.toLowerCase() === source.toLowerCase()\n );\n if (existing) {\n console.error(`Term \"${source}\" already exists in glossary.`);\n process.exit(1);\n }\n\n // Parse targets\n const targets: Record<string, string> = {};\n if (options.target) {\n for (const t of options.target) {\n const [lang, ...rest] = t.split(':');\n if (lang && rest.length > 0) {\n targets[lang] = rest.join(':');\n }\n }\n }\n\n const newTerm: GlossaryTerm = {\n source,\n targets,\n context: options.context,\n doNotTranslate: options.doNotTranslate,\n };\n\n glossary.terms.push(newTerm);\n await writeFile(path, JSON.stringify(glossary, null, 2));\n console.log(`Added term: ${source}`);\n } catch (error) {\n console.error('Failed to add term:', error);\n process.exit(1);\n }\n }\n );\n\nglossaryCommand\n .command('remove')\n .description('Remove a term from the glossary')\n .argument('<path>', 'Path to glossary file')\n .argument('<source>', 'Source term to remove')\n .action(async (path: string, source: string) => {\n try {\n const glossary = await loadGlossary(path);\n const index = glossary.terms.findIndex(\n (t) => t.source.toLowerCase() === source.toLowerCase()\n );\n\n if (index === -1) {\n console.error(`Term \"${source}\" not found in glossary.`);\n process.exit(1);\n }\n\n glossary.terms.splice(index, 1);\n await writeFile(path, JSON.stringify(glossary, null, 2));\n console.log(`Removed term: ${source}`);\n } catch (error) {\n console.error('Failed to remove term:', error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function loadGlossary(path: string): Promise<Glossary> {\n const content = await readFile(path, 'utf-8');\n return JSON.parse(content) as Glossary;\n}\n\nfunction validateGlossary(glossary: Glossary): string[] {\n const errors: string[] = [];\n\n // Check metadata\n if (!glossary.metadata) {\n errors.push('Missing metadata section');\n } else {\n if (!glossary.metadata.name) {\n errors.push('Missing metadata.name');\n }\n if (!glossary.metadata.sourceLang) {\n errors.push('Missing metadata.sourceLang');\n }\n if (\n !glossary.metadata.targetLangs ||\n glossary.metadata.targetLangs.length === 0\n ) {\n errors.push('Missing or empty metadata.targetLangs');\n }\n }\n\n // Check terms\n if (!glossary.terms || !Array.isArray(glossary.terms)) {\n errors.push('Missing or invalid terms array');\n } else {\n const seenSources = new Set<string>();\n\n for (let i = 0; i < glossary.terms.length; i++) {\n const term = glossary.terms[i];\n if (!term) continue;\n\n if (!term.source) {\n errors.push(`Term at index ${i}: missing source`);\n continue;\n }\n\n // Check for duplicates\n const normalizedSource = term.source.toLowerCase();\n if (seenSources.has(normalizedSource)) {\n errors.push(`Duplicate term: \"${term.source}\"`);\n }\n seenSources.add(normalizedSource);\n\n // Check targets if not doNotTranslate\n if (!term.doNotTranslate && Object.keys(term.targets).length === 0) {\n // This is a warning, not an error - term might have doNotTranslateFor\n if (!term.doNotTranslateFor || term.doNotTranslateFor.length === 0) {\n errors.push(\n `Term \"${term.source}\": no translations and not marked as do-not-translate`\n );\n }\n }\n }\n }\n\n return errors;\n}\n","import { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Context, Next } from 'hono';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AuthConfig {\n enabled: boolean;\n apiKey?: string;\n}\n\n// ============================================================================\n// Authentication Middleware\n// ============================================================================\n\n/**\n * API Key authentication middleware\n * Supports both X-API-Key header and Authorization: Bearer token\n */\nexport function createAuthMiddleware(config: AuthConfig) {\n return createMiddleware(async (c: Context, next: Next) => {\n // Skip auth if disabled\n if (!config.enabled) {\n return next();\n }\n\n // Get API key from config or environment\n const expectedKey = config.apiKey ?? process.env.TRANSLATE_API_KEY;\n\n if (!expectedKey) {\n // No API key configured, skip auth (warning should be logged at startup)\n return next();\n }\n\n // Check X-API-Key header first\n let providedKey = c.req.header('X-API-Key');\n\n // Fall back to Authorization: Bearer <token>\n if (!providedKey) {\n const authHeader = c.req.header('Authorization');\n if (authHeader?.startsWith('Bearer ')) {\n providedKey = authHeader.slice(7);\n }\n }\n\n if (!providedKey) {\n throw new HTTPException(401, {\n message:\n 'API key required. Provide via X-API-Key header or Authorization: Bearer <token>',\n });\n }\n\n // Constant-time comparison to prevent timing attacks\n if (!timingSafeEqual(providedKey, expectedKey)) {\n throw new HTTPException(401, {\n message: 'Invalid API key',\n });\n }\n\n return next();\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Timing-safe string comparison to prevent timing attacks\n * @param a First string\n * @param b Second string\n * @returns true if strings are equal\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n // Still perform comparison to maintain constant time\n // even when lengths differ\n let result = 1;\n const maxLen = Math.max(a.length, b.length);\n for (let i = 0; i < maxLen; i++) {\n result |= (a.charCodeAt(i % a.length) || 0) ^ (b.charCodeAt(i % b.length) || 0);\n }\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n","import { createMiddleware } from 'hono/factory';\nimport type { Context, Next } from 'hono';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LoggerConfig {\n json: boolean;\n}\n\ninterface LogEntry {\n timestamp: string;\n requestId: string;\n method: string;\n path: string;\n status: number;\n duration: number;\n userAgent?: string;\n}\n\n// ============================================================================\n// Logger Middleware\n// ============================================================================\n\n/**\n * Request logging middleware with structured JSON output for containers\n */\nexport function createLoggerMiddleware(config: LoggerConfig) {\n return createMiddleware(async (c: Context, next: Next) => {\n const start = Date.now();\n const requestId = generateRequestId();\n\n // Store request ID for correlation in other middleware/handlers\n c.set('requestId', requestId);\n\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n\n if (config.json) {\n // Structured JSON logging for container environments\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n requestId,\n method,\n path,\n status,\n duration,\n userAgent: c.req.header('User-Agent'),\n };\n console.log(JSON.stringify(entry));\n } else {\n // Human-readable logging for development\n const statusColor = getStatusColor(status);\n console.log(`${statusColor}${status}\\x1b[0m ${method} ${path} - ${duration}ms`);\n }\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a short unique request ID\n */\nfunction generateRequestId(): string {\n return Math.random().toString(36).substring(2, 10);\n}\n\n/**\n * Get ANSI color code based on HTTP status\n */\nfunction getStatusColor(status: number): string {\n if (status >= 500) {\n return '\\x1b[31m'; // Red for server errors\n }\n if (status >= 400) {\n return '\\x1b[33m'; // Yellow for client errors\n }\n if (status >= 300) {\n return '\\x1b[36m'; // Cyan for redirects\n }\n return '\\x1b[32m'; // Green for success\n}\n","import { Hono } from 'hono';\nimport type { HealthResponse } from '../types.js';\nimport {\n getAvailableProviders,\n getProviderConfigFromEnv,\n} from '../../providers/registry.js';\nimport type { ProviderName } from '../../types/index.js';\n\n// ============================================================================\n// Health Router\n// ============================================================================\n\nconst healthRouter = new Hono();\n\n// Track server start time for uptime calculation\nconst startTime = Date.now();\n\n/**\n * GET /health - Comprehensive health check endpoint\n * Suitable for k8s liveness/readiness probes\n */\nhealthRouter.get('/', async (c) => {\n const providers = getAvailableProviders();\n\n const providerStatus = providers.map((name: ProviderName) => {\n const config = getProviderConfigFromEnv(name);\n\n // Check if provider has required configuration\n let available = false;\n if (name === 'ollama') {\n // Ollama doesn't require API key, just assumes server is running\n available = true;\n } else {\n available = !!config.apiKey;\n }\n\n return { name, available };\n });\n\n const anyProviderAvailable = providerStatus.some((p) => p.available);\n\n const response: HealthResponse = {\n status: anyProviderAvailable ? 'healthy' : 'degraded',\n version: process.env['npm_package_version'] ?? '0.1.0',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n providers: providerStatus,\n };\n\n // Return 503 if no providers available (for k8s readiness probe)\n const status = anyProviderAvailable ? 200 : 503;\n\n return c.json(response, status);\n});\n\n/**\n * GET /health/live - Simple liveness probe\n * Returns 200 as long as the server is running\n */\nhealthRouter.get('/live', (c) => {\n return c.json({ status: 'ok' });\n});\n\n/**\n * GET /health/ready - Readiness probe\n * Returns 200 if the server is ready to accept requests\n */\nhealthRouter.get('/ready', async (c) => {\n const providers = getAvailableProviders();\n\n // Check if at least one provider is configured\n const hasConfiguredProvider = providers.some((name: ProviderName) => {\n if (name === 'ollama') return true;\n const config = getProviderConfigFromEnv(name);\n return !!config.apiKey;\n });\n\n if (hasConfiguredProvider) {\n return c.json({ status: 'ready' });\n }\n\n return c.json({ status: 'not_ready', reason: 'No providers configured' }, 503);\n});\n\nexport { healthRouter };\n","import { z } from 'zod';\n\n// ============================================================================\n// Request Validation Schemas\n// ============================================================================\n\n/**\n * Translation mode enum\n */\nexport const TranslationModeSchema = z.enum(['fast', 'balanced', 'quality']);\nexport type TranslationMode = z.infer<typeof TranslationModeSchema>;\n\n/**\n * Inline glossary term schema (simplified for API)\n */\nexport const InlineGlossaryTermSchema = z.object({\n source: z.string().min(1, 'Source term is required'),\n target: z.string().min(1, 'Target term is required'),\n context: z.string().optional(),\n caseSensitive: z.boolean().optional(),\n doNotTranslate: z.boolean().optional(),\n});\n\nexport type InlineGlossaryTerm = z.infer<typeof InlineGlossaryTermSchema>;\n\n/**\n * POST /translate request body schema\n */\nexport const TranslateRequestSchema = z.object({\n content: z.string().min(1, 'Content is required'),\n sourceLang: z\n .string()\n .min(2, 'Source language code must be at least 2 characters')\n .max(10, 'Source language code must be at most 10 characters'),\n targetLang: z\n .string()\n .min(2, 'Target language code must be at least 2 characters')\n .max(10, 'Target language code must be at most 10 characters'),\n format: z.enum(['markdown', 'html', 'text']).optional().default('text'),\n glossary: z.array(InlineGlossaryTermSchema).optional(),\n provider: z.enum(['claude', 'openai', 'ollama']).optional(),\n model: z.string().optional(),\n mode: TranslationModeSchema.optional().default('balanced'),\n qualityThreshold: z.number().min(0).max(100).optional(),\n maxIterations: z.number().min(1).max(10).optional(),\n context: z.string().optional(),\n});\n\nexport type TranslateRequest = z.infer<typeof TranslateRequestSchema>;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * POST /translate response\n */\nexport interface TranslateResponse {\n translated: string;\n quality: number;\n iterations: number;\n tokensUsed: {\n input: number;\n output: number;\n };\n glossaryCompliance?: {\n applied: string[];\n missed: string[];\n };\n duration: number;\n provider: string;\n model: string;\n}\n\n/**\n * GET /health response\n */\nexport interface HealthResponse {\n status: 'healthy' | 'degraded';\n version: string;\n uptime: number;\n providers: {\n name: string;\n available: boolean;\n }[];\n}\n\n/**\n * Error response format\n */\nexport interface ErrorResponse {\n error: string;\n code: string;\n details?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Server Configuration\n// ============================================================================\n\n/**\n * Server configuration options\n */\nexport interface ServerConfig {\n port: number;\n host: string;\n enableAuth: boolean;\n enableCors: boolean;\n apiKey?: string;\n jsonLogging?: boolean;\n}\n\n// ============================================================================\n// Hono Context Variables\n// ============================================================================\n\n/**\n * Custom variables stored in Hono context\n */\nexport interface HonoVariables {\n requestId: string;\n}\n\n// ============================================================================\n// Mode Presets\n// ============================================================================\n\n/**\n * Mode configuration presets\n */\nexport const MODE_PRESETS: Record<\n TranslationMode,\n { qualityThreshold: number; maxIterations: number }\n> = {\n fast: { qualityThreshold: 0, maxIterations: 1 },\n balanced: { qualityThreshold: 75, maxIterations: 2 },\n quality: { qualityThreshold: 85, maxIterations: 4 },\n};\n","import { Hono, type Context } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport {\n TranslateRequestSchema,\n MODE_PRESETS,\n type TranslateResponse,\n type ErrorResponse,\n type InlineGlossaryTerm,\n type HonoVariables,\n} from '../types.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { loadConfig } from '../../services/config.js';\nimport { TranslationError, ErrorCode } from '../../errors.js';\nimport type { ResolvedGlossary, ResolvedGlossaryTerm } from '../../types/index.js';\n\n// ============================================================================\n// Translate Router\n// ============================================================================\n\nconst translateRouter = new Hono<{ Variables: HonoVariables }>();\n\n/**\n * POST /translate - Main translation endpoint\n */\ntranslateRouter.post(\n '/',\n zValidator('json', TranslateRequestSchema, (result, c) => {\n if (!result.success) {\n const errors = result.error.errors.map((e) => ({\n field: e.path.join('.'),\n message: e.message,\n }));\n\n return c.json<ErrorResponse>(\n {\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: { errors },\n },\n 400\n );\n }\n // Validation successful - continue to handler\n return undefined;\n }),\n async (c) => {\n const body = c.req.valid('json');\n const requestId = c.get('requestId') ?? 'unknown';\n const startTime = Date.now();\n\n try {\n // Load base config\n const baseConfig = await loadConfig();\n\n // Get mode presets\n const modeConfig = MODE_PRESETS[body.mode ?? 'balanced'];\n\n // Build config with overrides\n const config = {\n ...baseConfig,\n languages: {\n ...baseConfig.languages,\n source: body.sourceLang,\n targets: [body.targetLang],\n },\n provider: {\n ...baseConfig.provider,\n default: body.provider ?? baseConfig.provider.default,\n model: body.model ?? baseConfig.provider.model,\n },\n quality: {\n ...baseConfig.quality,\n threshold: body.qualityThreshold ?? modeConfig.qualityThreshold,\n maxIterations: body.maxIterations ?? modeConfig.maxIterations,\n },\n };\n\n // Create engine (API mode doesn't use file cache)\n const engine = createTranslationEngine({\n config,\n verbose: false,\n noCache: true,\n });\n\n // Convert inline glossary to resolved format if provided\n // Note: glossary support via inline terms will be implemented\n // when TranslationEngine supports passing glossary directly\n if (body.glossary && body.glossary.length > 0) {\n // TODO: Pass glossary to engine when supported\n convertInlineGlossary(body.glossary, body.sourceLang, body.targetLang);\n }\n\n // Translate content\n const result = await engine.translateContent({\n content: body.content,\n sourceLang: body.sourceLang,\n targetLang: body.targetLang,\n format: body.format,\n qualityThreshold: config.quality.threshold,\n maxIterations: config.quality.maxIterations,\n context: body.context,\n });\n\n const duration = Date.now() - startTime;\n\n const response: TranslateResponse = {\n translated: result.content,\n quality: result.metadata.averageQuality,\n iterations: result.metadata.totalIterations,\n tokensUsed: {\n input: result.metadata.tokensUsed.input,\n output: result.metadata.tokensUsed.output,\n },\n glossaryCompliance: result.glossaryCompliance\n ? {\n applied: result.glossaryCompliance.applied,\n missed: result.glossaryCompliance.missed,\n }\n : undefined,\n duration,\n provider: result.metadata.provider,\n model: result.metadata.model,\n };\n\n return c.json(response, 200);\n } catch (error) {\n return handleTranslationError(c, error, requestId);\n }\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert inline glossary terms to resolved glossary format\n */\nfunction convertInlineGlossary(\n terms: InlineGlossaryTerm[],\n sourceLang: string,\n targetLang: string\n): ResolvedGlossary {\n return {\n metadata: {\n name: 'inline',\n sourceLang,\n targetLang,\n version: '1.0',\n },\n terms: terms.map(\n (term): ResolvedGlossaryTerm => ({\n source: term.source,\n target: term.doNotTranslate ? term.source : term.target,\n context: term.context,\n caseSensitive: term.caseSensitive ?? false,\n doNotTranslate: term.doNotTranslate ?? false,\n })\n ),\n };\n}\n\n/**\n * Handle translation errors and return appropriate HTTP response\n */\ntype StatusCode = 200 | 400 | 401 | 422 | 429 | 500 | 502;\n\nfunction handleTranslationError(\n c: Context<{ Variables: HonoVariables }>,\n error: unknown,\n requestId: string\n): Response {\n if (error instanceof TranslationError) {\n const statusMap: Record<string, StatusCode> = {\n [ErrorCode.PROVIDER_AUTH_FAILED]: 401,\n [ErrorCode.PROVIDER_RATE_LIMITED]: 429,\n [ErrorCode.PROVIDER_ERROR]: 502,\n [ErrorCode.PROVIDER_NOT_FOUND]: 400,\n [ErrorCode.QUALITY_THRESHOLD_NOT_MET]: 422,\n [ErrorCode.GLOSSARY_INVALID]: 400,\n [ErrorCode.GLOSSARY_NOT_FOUND]: 400,\n [ErrorCode.CONFIG_INVALID]: 400,\n [ErrorCode.UNSUPPORTED_FORMAT]: 400,\n };\n\n const status: StatusCode = statusMap[error.code] ?? 500;\n\n return c.json<ErrorResponse>(\n {\n error: error.message,\n code: error.code,\n details: error.details,\n },\n status\n );\n }\n\n // Unknown error\n console.error(`[${requestId}] Translation error:`, error);\n\n return c.json<ErrorResponse>(\n {\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n}\n\nexport { translateRouter };\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { serve, type ServerType } from '@hono/node-server';\nimport { HTTPException } from 'hono/http-exception';\n\nimport { createAuthMiddleware } from './middleware/auth.js';\nimport { createLoggerMiddleware } from './middleware/logger.js';\nimport { healthRouter } from './routes/health.js';\nimport { translateRouter } from './routes/translate.js';\nimport type { ServerConfig, ErrorResponse, HonoVariables } from './types.js';\n\n// ============================================================================\n// Server Factory\n// ============================================================================\n\n/**\n * Create and configure the Hono application\n */\nexport function createApp(options: ServerConfig) {\n const app = new Hono<{ Variables: HonoVariables }>();\n\n // Request logging (first middleware)\n app.use('*', createLoggerMiddleware({\n json: options.jsonLogging ?? false,\n }));\n\n // CORS middleware (before auth)\n if (options.enableCors) {\n app.use('*', cors({\n origin: '*',\n allowMethods: ['GET', 'POST', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key'],\n exposeHeaders: ['X-Request-Id'],\n maxAge: 86400,\n }));\n }\n\n // Health endpoints (no auth required)\n app.route('/health', healthRouter);\n\n // Authentication middleware for /translate\n app.use('/translate/*', createAuthMiddleware({\n enabled: options.enableAuth,\n apiKey: options.apiKey,\n }));\n\n // Also apply auth to the base /translate endpoint\n app.use('/translate', createAuthMiddleware({\n enabled: options.enableAuth,\n apiKey: options.apiKey,\n }));\n\n // Translation endpoint\n app.route('/translate', translateRouter);\n\n // Global error handler\n app.onError((error, c) => {\n if (error instanceof HTTPException) {\n return c.json<ErrorResponse>(\n {\n error: error.message,\n code: 'HTTP_ERROR',\n },\n error.status\n );\n }\n\n console.error('Unhandled error:', error);\n\n return c.json<ErrorResponse>(\n {\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n });\n\n // 404 handler\n app.notFound((c) => {\n return c.json<ErrorResponse>(\n {\n error: 'Not found',\n code: 'NOT_FOUND',\n },\n 404\n );\n });\n\n return app;\n}\n\n// ============================================================================\n// Server Startup\n// ============================================================================\n\n/**\n * Start the HTTP server with graceful shutdown\n */\nexport function startServer(options: ServerConfig): ServerType {\n const app = createApp(options);\n\n const server = serve({\n fetch: app.fetch,\n port: options.port,\n hostname: options.host,\n });\n\n // Log startup information\n console.log(`\\nllm-translate server started`);\n console.log(` - Address: http://${options.host}:${options.port}`);\n console.log(` - Health: http://${options.host}:${options.port}/health`);\n console.log(` - Translate: http://${options.host}:${options.port}/translate`);\n console.log(` - Auth: ${options.enableAuth ? 'enabled' : 'disabled'}`);\n console.log(` - CORS: ${options.enableCors ? 'enabled' : 'disabled'}`);\n console.log('');\n\n // Graceful shutdown handlers\n const shutdown = (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down gracefully...`);\n\n server.close((err) => {\n if (err) {\n console.error('Error during shutdown:', err);\n process.exit(1);\n }\n console.log('Server closed');\n process.exit(0);\n });\n\n // Force exit after timeout\n setTimeout(() => {\n console.error('Forced shutdown after timeout');\n process.exit(1);\n }, 10000);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n return server;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport type { ServerConfig } from './types.js';\nexport { createAuthMiddleware } from './middleware/auth.js';\nexport { createLoggerMiddleware } from './middleware/logger.js';\nexport { healthRouter } from './routes/health.js';\nexport { translateRouter } from './routes/translate.js';\n","import { Command } from 'commander';\nimport { startServer } from '../../server/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ServeCommandOptions {\n port?: string;\n host?: string;\n auth?: boolean; // Commander's --no-auth sets this to false\n cors?: boolean;\n json?: boolean;\n}\n\n// ============================================================================\n// Serve Command\n// ============================================================================\n\nexport const serveCommand = new Command('serve')\n .description('Start the translation API server')\n .option(\n '-p, --port <number>',\n 'Server port (env: TRANSLATE_PORT)',\n process.env['TRANSLATE_PORT'] ?? '3000'\n )\n .option('-H, --host <string>', 'Host to bind', '0.0.0.0')\n .option('--no-auth', 'Disable API key authentication')\n .option('--cors', 'Enable CORS for browser clients')\n .option('--json', 'Use JSON logging format (for containers)')\n .action((options: ServeCommandOptions) => {\n const port = parseInt(options.port ?? '3000', 10);\n const host = options.host ?? '0.0.0.0';\n\n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error('Error: Invalid port number. Must be between 1 and 65535.');\n process.exit(2);\n }\n\n // Check for API key if auth is enabled\n const enableAuth = options.auth !== false;\n if (enableAuth && !process.env['TRANSLATE_API_KEY']) {\n console.warn(\n 'Warning: TRANSLATE_API_KEY not set. API key authentication is disabled.'\n );\n console.warn(\n 'Set TRANSLATE_API_KEY environment variable to enable authentication.\\n'\n );\n }\n\n startServer({\n port,\n host,\n enableAuth,\n enableCors: options.cors ?? false,\n apiKey: process.env['TRANSLATE_API_KEY'],\n jsonLogging: options.json ?? false,\n });\n });\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/options.ts","../../src/errors.ts","../../src/services/config.ts","../../src/types/mqm.ts","../../src/types/analysis.ts","../../src/types/modes.ts","../../src/services/glossary.ts","../../src/utils/logger.ts","../../src/core/agent.ts","../../src/utils/tokens.ts","../../src/core/chunker.ts","../../src/parsers/markdown.ts","../../src/providers/claude.ts","../../src/providers/openai.ts","../../src/providers/ollama.ts","../../src/providers/registry.ts","../../src/services/cache.ts","../../src/core/engine.ts","../../src/cli/commands/file.ts","../../src/cli/index.ts","../../src/cli/commands/dir.ts","../../src/cli/commands/init.ts","../../src/cli/commands/glossary.ts","../../src/server/middleware/auth.ts","../../src/server/middleware/logger.ts","../../src/server/routes/health.ts","../../src/server/types.ts","../../src/server/routes/translate.ts","../../src/server/index.ts","../../src/cli/commands/serve.ts"],"names":["config","mapFinishReason","MODEL_INFO","DEFAULT_MODEL","generateText","streamText","createOpenAI","dirname","readFile","Command","resolve","join","startTime","mapFormat","mkdir","writeFile","defaultConfig","loadGlossary","result","createMiddleware","providers","z","MODE_PRESETS","Hono","HTTPException","handleStdinTranslation"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderName, DocumentFormat } from '../types/index.js';\n\n// ============================================================================\n// CLI Option Types\n// ============================================================================\n\nexport interface GlobalOptions {\n sourceLang: string;\n targetLang: string;\n config?: string;\n verbose?: boolean;\n quiet?: boolean;\n}\n\nexport interface TranslationOptions extends GlobalOptions {\n glossary?: string;\n provider?: ProviderName;\n model?: string;\n quality?: string; // Commander returns strings, parsed to number in handler\n maxIterations?: string; // Commander returns strings, parsed to number in handler\n}\n\nexport interface OutputOptions {\n output?: string;\n format?: DocumentFormat;\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport interface AdvancedOptions {\n chunkSize?: string; // Commander returns strings, parsed to number in handler\n parallel?: number;\n cache?: boolean; // Commander's --no-cache sets this to false\n context?: string;\n strictQuality?: boolean;\n strictGlossary?: boolean;\n}\n\nexport interface FileCommandOptions\n extends TranslationOptions,\n OutputOptions,\n AdvancedOptions {}\n\nexport interface DirCommandOptions\n extends TranslationOptions,\n OutputOptions,\n AdvancedOptions {}\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nexport const defaults = {\n quality: 85,\n maxIterations: 4,\n chunkSize: 1024,\n parallel: 3,\n provider: 'claude' as ProviderName,\n} as const;\n","// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport enum ErrorCode {\n // Configuration Errors\n CONFIG_NOT_FOUND = 'CONFIG_NOT_FOUND',\n CONFIG_INVALID = 'CONFIG_INVALID',\n\n // Glossary Errors\n GLOSSARY_NOT_FOUND = 'GLOSSARY_NOT_FOUND',\n GLOSSARY_INVALID = 'GLOSSARY_INVALID',\n\n // Provider Errors\n PROVIDER_NOT_FOUND = 'PROVIDER_NOT_FOUND',\n PROVIDER_AUTH_FAILED = 'PROVIDER_AUTH_FAILED',\n PROVIDER_RATE_LIMITED = 'PROVIDER_RATE_LIMITED',\n PROVIDER_ERROR = 'PROVIDER_ERROR',\n\n // Translation Errors\n QUALITY_THRESHOLD_NOT_MET = 'QUALITY_THRESHOLD_NOT_MET',\n GLOSSARY_COMPLIANCE_FAILED = 'GLOSSARY_COMPLIANCE_FAILED',\n\n // File Errors\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\n FILE_READ_ERROR = 'FILE_READ_ERROR',\n FILE_WRITE_ERROR = 'FILE_WRITE_ERROR',\n\n // Format Errors\n UNSUPPORTED_FORMAT = 'UNSUPPORTED_FORMAT',\n CHUNK_TOO_LARGE = 'CHUNK_TOO_LARGE',\n\n // General Errors\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n// ============================================================================\n// Error Messages\n// ============================================================================\n\nconst errorMessages: Record<ErrorCode, string> = {\n [ErrorCode.CONFIG_NOT_FOUND]:\n 'Configuration file not found. Run `llm-translate init` to create one.',\n [ErrorCode.CONFIG_INVALID]:\n 'Configuration file is invalid. Please check the format and required fields.',\n [ErrorCode.GLOSSARY_NOT_FOUND]:\n 'Glossary file not found at the specified path.',\n [ErrorCode.GLOSSARY_INVALID]:\n 'Glossary file is invalid. Please check the JSON format and structure.',\n [ErrorCode.PROVIDER_NOT_FOUND]:\n 'The specified LLM provider is not available. Supported providers: claude, openai, ollama.',\n [ErrorCode.PROVIDER_AUTH_FAILED]:\n 'Authentication failed. Check your API key in environment variables.',\n [ErrorCode.PROVIDER_RATE_LIMITED]:\n 'Rate limited by the LLM provider. Please wait and try again.',\n [ErrorCode.PROVIDER_ERROR]:\n 'An error occurred while communicating with the LLM provider.',\n [ErrorCode.QUALITY_THRESHOLD_NOT_MET]:\n 'Translation quality ({score}) did not meet threshold ({threshold}). Use --quality to adjust or --max-iterations to allow more refinement.',\n [ErrorCode.GLOSSARY_COMPLIANCE_FAILED]:\n 'Glossary compliance failed. Missing terms: {missed}. Use --no-strict-glossary to allow partial compliance.',\n [ErrorCode.FILE_NOT_FOUND]: 'The specified file was not found.',\n [ErrorCode.FILE_READ_ERROR]: 'Failed to read the file.',\n [ErrorCode.FILE_WRITE_ERROR]: 'Failed to write to the output file.',\n [ErrorCode.UNSUPPORTED_FORMAT]:\n 'The file format is not supported. Supported formats: markdown, html, text.',\n [ErrorCode.CHUNK_TOO_LARGE]:\n 'A chunk exceeds the maximum token limit and cannot be processed.',\n [ErrorCode.UNKNOWN_ERROR]: 'An unexpected error occurred.',\n};\n\n// ============================================================================\n// Translation Error Class\n// ============================================================================\n\nexport class TranslationError extends Error {\n public readonly code: ErrorCode;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n code: ErrorCode,\n details?: Record<string, unknown>,\n customMessage?: string\n ) {\n const message = customMessage ?? formatErrorMessage(code, details);\n super(message);\n\n this.name = 'TranslationError';\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TranslationError);\n }\n }\n\n /**\n * Create a JSON representation of the error\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatErrorMessage(\n code: ErrorCode,\n details?: Record<string, unknown>\n): string {\n let message = errorMessages[code] ?? errorMessages[ErrorCode.UNKNOWN_ERROR];\n\n if (details) {\n // Replace placeholders like {score} with actual values\n for (const [key, value] of Object.entries(details)) {\n message = message.replace(`{${key}}`, String(value));\n }\n }\n\n return message;\n}\n\n// ============================================================================\n// Error Type Guards\n// ============================================================================\n\nexport function isTranslationError(error: unknown): error is TranslationError {\n return error instanceof TranslationError;\n}\n\nexport function isErrorCode(error: unknown, code: ErrorCode): boolean {\n return isTranslationError(error) && error.code === code;\n}\n\n// ============================================================================\n// Exit Codes (for CLI)\n// ============================================================================\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n INVALID_ARGUMENTS: 2,\n FILE_NOT_FOUND: 3,\n QUALITY_THRESHOLD_NOT_MET: 4,\n PROVIDER_ERROR: 5,\n GLOSSARY_VALIDATION_FAILED: 6,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Map error codes to exit codes\n */\nexport function getExitCode(error: TranslationError): ExitCode {\n switch (error.code) {\n case ErrorCode.FILE_NOT_FOUND:\n case ErrorCode.CONFIG_NOT_FOUND:\n case ErrorCode.GLOSSARY_NOT_FOUND:\n return ExitCode.FILE_NOT_FOUND;\n\n case ErrorCode.CONFIG_INVALID:\n case ErrorCode.UNSUPPORTED_FORMAT:\n return ExitCode.INVALID_ARGUMENTS;\n\n case ErrorCode.QUALITY_THRESHOLD_NOT_MET:\n return ExitCode.QUALITY_THRESHOLD_NOT_MET;\n\n case ErrorCode.PROVIDER_NOT_FOUND:\n case ErrorCode.PROVIDER_AUTH_FAILED:\n case ErrorCode.PROVIDER_RATE_LIMITED:\n case ErrorCode.PROVIDER_ERROR:\n return ExitCode.PROVIDER_ERROR;\n\n case ErrorCode.GLOSSARY_INVALID:\n return ExitCode.GLOSSARY_VALIDATION_FAILED;\n\n default:\n return ExitCode.GENERAL_ERROR;\n }\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { z } from 'zod';\nimport type { TranslateConfig, ProviderName } from '../types/index.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\n\n// ============================================================================\n// Zod Schema for Config Validation\n// ============================================================================\n\nconst providerNameSchema = z.enum(['claude', 'openai', 'ollama', 'custom']);\n\nconst configSchema = z.object({\n version: z.string(),\n project: z\n .object({\n name: z.string(),\n description: z.string(),\n purpose: z.string(),\n })\n .optional(),\n languages: z.object({\n source: z.string(),\n targets: z.array(z.string()),\n styles: z.record(z.string(), z.string()).optional(),\n }),\n provider: z.object({\n default: providerNameSchema,\n model: z.string().optional(),\n fallback: z.array(providerNameSchema).optional(),\n apiKeys: z.record(providerNameSchema, z.string()).optional(),\n }),\n quality: z.object({\n threshold: z.number().min(0).max(100),\n maxIterations: z.number().min(1).max(10),\n evaluationMethod: z.enum(['llm', 'embedding', 'hybrid']),\n }),\n chunking: z.object({\n maxTokens: z.number().min(100).max(8000),\n overlapTokens: z.number().min(0),\n preserveStructure: z.boolean(),\n }),\n glossary: z\n .object({\n path: z.string(),\n strict: z.boolean(),\n })\n .optional(),\n paths: z.object({\n output: z.string(),\n cache: z.string().optional(),\n }),\n ignore: z.array(z.string()).optional(),\n});\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst defaultConfig: TranslateConfig = {\n version: '1.0',\n languages: {\n source: 'en',\n targets: [],\n },\n provider: {\n default: 'claude',\n },\n quality: {\n threshold: 85,\n maxIterations: 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: {\n output: './{lang}',\n },\n};\n\n// ============================================================================\n// Config Loader\n// ============================================================================\n\nconst explorer = cosmiconfig('translate', {\n searchPlaces: [\n '.translaterc',\n '.translaterc.json',\n '.translaterc.yaml',\n '.translaterc.yml',\n 'translate.config.js',\n 'translate.config.mjs',\n ],\n});\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\nexport async function loadConfig(\n options: LoadConfigOptions = {}\n): Promise<TranslateConfig> {\n const { configPath, cwd = process.cwd() } = options;\n\n let result;\n\n try {\n if (configPath) {\n result = await explorer.load(configPath);\n } else {\n result = await explorer.search(cwd);\n }\n } catch (error) {\n throw new TranslationError(ErrorCode.CONFIG_NOT_FOUND, {\n path: configPath ?? cwd,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (!result || result.isEmpty) {\n // Return default config if no config file found\n return defaultConfig;\n }\n\n // Validate config\n const parseResult = configSchema.safeParse(result.config);\n\n if (!parseResult.success) {\n throw new TranslationError(ErrorCode.CONFIG_INVALID, {\n path: result.filepath,\n errors: parseResult.error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n }\n\n return parseResult.data as TranslateConfig;\n}\n\n// ============================================================================\n// Config Merger (CLI options override config file)\n// ============================================================================\n\nexport interface CLIOverrides {\n sourceLang?: string;\n targetLang?: string;\n provider?: ProviderName;\n model?: string;\n quality?: number;\n maxIterations?: number;\n chunkSize?: number;\n glossary?: string;\n output?: string;\n noCache?: boolean;\n}\n\nexport function mergeConfig(\n config: TranslateConfig,\n overrides: CLIOverrides\n): TranslateConfig {\n const merged = { ...config };\n\n if (overrides.sourceLang) {\n merged.languages = { ...merged.languages, source: overrides.sourceLang };\n }\n\n if (overrides.targetLang) {\n merged.languages = {\n ...merged.languages,\n targets: [overrides.targetLang],\n };\n }\n\n if (overrides.provider) {\n merged.provider = { ...merged.provider, default: overrides.provider };\n }\n\n if (overrides.model) {\n merged.provider = { ...merged.provider, model: overrides.model };\n }\n\n if (overrides.quality !== undefined) {\n merged.quality = { ...merged.quality, threshold: overrides.quality };\n }\n\n if (overrides.maxIterations !== undefined) {\n merged.quality = {\n ...merged.quality,\n maxIterations: overrides.maxIterations,\n };\n }\n\n if (overrides.chunkSize !== undefined) {\n merged.chunking = { ...merged.chunking, maxTokens: overrides.chunkSize };\n }\n\n if (overrides.glossary) {\n merged.glossary = {\n path: overrides.glossary,\n strict: merged.glossary?.strict ?? false,\n };\n }\n\n if (overrides.output) {\n merged.paths = { ...merged.paths, output: overrides.output };\n }\n\n if (overrides.noCache) {\n merged.paths = { ...merged.paths, cache: undefined };\n }\n\n return merged;\n}\n","/**\n * MQM (Multidimensional Quality Metrics) Types\n * Based on https://themqm.org/ framework used in WMT evaluations\n *\n * Reference: TEaR (Translate, Estimate, Refine) - NAACL 2025\n * https://arxiv.org/abs/2402.16379\n */\n\n/**\n * MQM Error Categories\n */\nexport type MQMErrorType =\n // Accuracy errors - meaning/content issues\n | 'accuracy/mistranslation' // Incorrect meaning\n | 'accuracy/omission' // Missing content from source\n | 'accuracy/addition' // Extra content not in source\n | 'accuracy/untranslated' // Source text left unchanged\n // Fluency errors - target language issues\n | 'fluency/grammar' // Grammatical errors\n | 'fluency/spelling' // Spelling/typos\n | 'fluency/register' // Inappropriate formality level\n | 'fluency/inconsistency' // Inconsistent terminology\n // Style errors - quality/naturalness issues\n | 'style/awkward' // Unnatural phrasing\n | 'style/unidiomatic'; // Non-native expressions\n\n/**\n * MQM Severity Levels\n */\nexport type MQMSeverity = 'minor' | 'major' | 'critical';\n\n/**\n * MQM Severity Weights for score calculation\n */\nexport const MQM_SEVERITY_WEIGHTS: Record<MQMSeverity, number> = {\n minor: 1, // Noticeable but doesn't affect understanding\n major: 5, // Affects understanding or usability\n critical: 25, // Completely wrong or unusable\n};\n\n/**\n * Individual MQM error annotation\n */\nexport interface MQMError {\n /** Error category */\n type: MQMErrorType;\n\n /** Error severity */\n severity: MQMSeverity;\n\n /** The affected text in translation */\n span: string;\n\n /** Suggested correction */\n suggestion: string;\n\n /** Brief reason for the error */\n explanation?: string;\n\n /** Corresponding source text (if applicable) */\n sourceSpan?: string;\n}\n\n/**\n * MQM evaluation result\n */\nexport interface MQMEvaluation {\n /** List of identified errors */\n errors: MQMError[];\n\n /** Quality score: 100 - sum(error weights), min 0 */\n score: number;\n\n /** Brief overall assessment */\n summary: string;\n\n /** Error count breakdown by category */\n breakdown: {\n accuracy: number;\n fluency: number;\n style: number;\n };\n}\n\n/**\n * Calculate MQM score from errors\n * Score = max(0, 100 - Σ(error_weight))\n */\nexport function calculateMQMScore(errors: MQMError[]): number {\n const totalPenalty = errors.reduce(\n (sum, err) => sum + MQM_SEVERITY_WEIGHTS[err.severity],\n 0\n );\n return Math.max(0, 100 - totalPenalty);\n}\n\n/**\n * Calculate error breakdown by category\n */\nexport function calculateMQMBreakdown(\n errors: MQMError[]\n): MQMEvaluation['breakdown'] {\n return {\n accuracy: errors.filter((e) => e.type.startsWith('accuracy/')).length,\n fluency: errors.filter((e) => e.type.startsWith('fluency/')).length,\n style: errors.filter((e) => e.type.startsWith('style/')).length,\n };\n}\n\n/**\n * Parse MQM evaluation JSON response from LLM\n */\nexport function parseMQMResponse(response: string): MQMEvaluation | null {\n try {\n // Extract JSON from response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as {\n errors?: MQMError[];\n score?: number;\n summary?: string;\n };\n\n const errors = parsed.errors ?? [];\n const score = parsed.score ?? calculateMQMScore(errors);\n\n return {\n errors,\n score,\n summary: parsed.summary ?? '',\n breakdown: calculateMQMBreakdown(errors),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format MQM errors for refinement prompt\n */\nexport function formatMQMErrorsForPrompt(errors: MQMError[]): string {\n if (errors.length === 0) {\n return 'No errors identified.';\n }\n\n return errors\n .map((err, i) => {\n const severity = err.severity.toUpperCase();\n return `${i + 1}. [${severity}] ${err.type}\n Text: \"${err.span}\"\n Fix: \"${err.suggestion}\"${err.explanation ? `\\n Reason: ${err.explanation}` : ''}`;\n })\n .join('\\n\\n');\n}\n","/**\n * Pre-Translation Analysis Types\n * Based on MAPS (Multi-Aspect Prompting and Selection) framework\n *\n * Reference: TACL 2024\n * https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00642/119992\n * https://github.com/zwhe99/MAPS-mt\n */\n\n/**\n * Key term identified during pre-analysis\n */\nexport interface AnalyzedTerm {\n /** The term in source language */\n term: string;\n\n /** Usage context */\n context: string;\n\n /** Suggested translation (if not in glossary) */\n suggestedTranslation?: string;\n\n /** Whether this term was found in the glossary */\n fromGlossary: boolean;\n}\n\n/**\n * Ambiguous phrase that needs clarification\n */\nexport interface AmbiguousPhrase {\n /** The ambiguous phrase */\n phrase: string;\n\n /** Possible interpretations */\n interpretations: string[];\n\n /** Recommended interpretation */\n recommendation: string;\n}\n\n/**\n * Domain classification for the content\n */\nexport type ContentDomain =\n | 'technical'\n | 'marketing'\n | 'legal'\n | 'medical'\n | 'general';\n\n/**\n * Register/formality recommendation\n */\nexport type RegisterLevel = 'formal' | 'informal' | 'neutral';\n\n/**\n * Pre-translation analysis result (MAPS-style)\n */\nexport interface PreTranslationAnalysis {\n /** Key domain-specific terms identified */\n keyTerms: AnalyzedTerm[];\n\n /** Phrases with multiple possible interpretations */\n ambiguousPhrases: AmbiguousPhrase[];\n\n /** Items that should NOT be translated (code, URLs, names) */\n preserveExact: string[];\n\n /** Identified translation challenges for this language pair */\n challenges: string[];\n\n /** Detected content domain */\n domain: ContentDomain;\n\n /** Recommended formality level */\n registerRecommendation: RegisterLevel;\n}\n\n/**\n * Parse pre-analysis JSON response from LLM\n */\nexport function parseAnalysisResponse(\n response: string\n): PreTranslationAnalysis | null {\n try {\n // Extract JSON from response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return null;\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as Partial<PreTranslationAnalysis>;\n\n return {\n keyTerms: parsed.keyTerms ?? [],\n ambiguousPhrases: parsed.ambiguousPhrases ?? [],\n preserveExact: parsed.preserveExact ?? [],\n challenges: parsed.challenges ?? [],\n domain: parsed.domain ?? 'general',\n registerRecommendation: parsed.registerRecommendation ?? 'neutral',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format analysis result for translation prompt\n */\nexport function formatAnalysisForPrompt(\n analysis: PreTranslationAnalysis\n): string {\n const sections: string[] = [];\n\n // Key terms section\n if (analysis.keyTerms.length > 0) {\n const terms = analysis.keyTerms\n .map((t) => {\n const translation = t.suggestedTranslation\n ? ` → ${t.suggestedTranslation}`\n : '';\n const source = t.fromGlossary ? ' (glossary)' : '';\n return `- \"${t.term}\"${translation}${source}: ${t.context}`;\n })\n .join('\\n');\n sections.push(`**Key Terms:**\\n${terms}`);\n }\n\n // Ambiguous phrases section\n if (analysis.ambiguousPhrases.length > 0) {\n const phrases = analysis.ambiguousPhrases\n .map((p) => `- \"${p.phrase}\": Use interpretation \"${p.recommendation}\"`)\n .join('\\n');\n sections.push(`**Ambiguous Phrases (use these interpretations):**\\n${phrases}`);\n }\n\n // Preserve exact section\n if (analysis.preserveExact.length > 0) {\n sections.push(\n `**Do NOT translate (keep exactly as-is):**\\n${analysis.preserveExact.map((s) => `- ${s}`).join('\\n')}`\n );\n }\n\n // Domain and register\n sections.push(\n `**Content Type:** ${analysis.domain}\\n**Tone:** ${analysis.registerRecommendation}`\n );\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Create empty analysis result (for fast mode)\n */\nexport function createEmptyAnalysis(): PreTranslationAnalysis {\n return {\n keyTerms: [],\n ambiguousPhrases: [],\n preserveExact: [],\n challenges: [],\n domain: 'general',\n registerRecommendation: 'neutral',\n };\n}\n","/**\n * Translation Mode Configurations\n *\n * Defines preset configurations for different translation quality/speed tradeoffs\n */\n\n/**\n * Available translation modes\n */\nexport type TranslationMode = 'fast' | 'balanced' | 'quality';\n\n/**\n * Configuration for a translation mode\n */\nexport interface ModeConfig {\n /** Enable pre-translation analysis (MAPS-style) */\n enableAnalysis: boolean;\n\n /** Use MQM-based evaluation instead of simple scoring */\n useMQMEvaluation: boolean;\n\n /** Maximum refinement iterations */\n maxIterations: number;\n\n /** Quality threshold (0 = skip threshold check) */\n qualityThreshold: number;\n}\n\n/**\n * Mode preset configurations\n */\nexport const MODE_PRESETS: Record<TranslationMode, ModeConfig> = {\n /**\n * Fast mode: Single pass, no evaluation\n * Best for: Quick drafts, large batches, local models\n * Speed: ~1x (fastest)\n */\n fast: {\n enableAnalysis: false,\n useMQMEvaluation: false,\n maxIterations: 1,\n qualityThreshold: 0, // Skip threshold check\n },\n\n /**\n * Balanced mode: TEaR with MQM evaluation\n * Best for: General use, good quality with reasonable speed\n * Speed: ~2-3x\n */\n balanced: {\n enableAnalysis: false,\n useMQMEvaluation: true,\n maxIterations: 2,\n qualityThreshold: 75,\n },\n\n /**\n * Quality mode: Full MAPS + TEaR pipeline\n * Best for: Production content, critical documents\n * Speed: ~4-5x\n */\n quality: {\n enableAnalysis: true,\n useMQMEvaluation: true,\n maxIterations: 4,\n qualityThreshold: 85,\n },\n};\n\n/**\n * Get mode configuration with optional overrides\n */\nexport function getModeConfig(\n mode: TranslationMode,\n overrides?: Partial<ModeConfig>\n): ModeConfig {\n const preset = MODE_PRESETS[mode];\n\n if (!overrides) {\n return preset;\n }\n\n return {\n enableAnalysis: overrides.enableAnalysis ?? preset.enableAnalysis,\n useMQMEvaluation: overrides.useMQMEvaluation ?? preset.useMQMEvaluation,\n maxIterations: overrides.maxIterations ?? preset.maxIterations,\n qualityThreshold: overrides.qualityThreshold ?? preset.qualityThreshold,\n };\n}\n\n/**\n * Determine effective mode from CLI options\n */\nexport function resolveMode(options: {\n mode?: TranslationMode;\n quality?: number;\n maxIterations?: number;\n noAnalysis?: boolean;\n noMqm?: boolean;\n}): ModeConfig {\n const baseMode = options.mode ?? 'balanced';\n const preset = MODE_PRESETS[baseMode];\n\n return {\n enableAnalysis:\n options.noAnalysis !== undefined\n ? !options.noAnalysis\n : preset.enableAnalysis,\n useMQMEvaluation:\n options.noMqm !== undefined ? !options.noMqm : preset.useMQMEvaluation,\n maxIterations: options.maxIterations ?? preset.maxIterations,\n qualityThreshold: options.quality ?? preset.qualityThreshold,\n };\n}\n\n/**\n * Check if mode allows skipping evaluation\n */\nexport function shouldSkipEvaluation(config: ModeConfig): boolean {\n return config.maxIterations <= 1 && config.qualityThreshold <= 0;\n}\n","import { readFile } from 'node:fs/promises';\nimport type {\n Glossary,\n GlossaryTerm,\n ResolvedGlossary,\n ResolvedGlossaryTerm,\n} from '../types/index.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\n\n// ============================================================================\n// Glossary Loading\n// ============================================================================\n\nexport async function loadGlossary(path: string): Promise<Glossary> {\n let content: string;\n\n try {\n content = await readFile(path, 'utf-8');\n } catch (error) {\n throw new TranslationError(ErrorCode.GLOSSARY_NOT_FOUND, {\n path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n return JSON.parse(content) as Glossary;\n } catch (error) {\n throw new TranslationError(ErrorCode.GLOSSARY_INVALID, {\n path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n// ============================================================================\n// Glossary Resolution\n// ============================================================================\n\nexport function resolveGlossary(\n glossary: Glossary,\n targetLang: string\n): ResolvedGlossary {\n return {\n metadata: {\n name: glossary.metadata.name,\n sourceLang: glossary.metadata.sourceLang,\n targetLang,\n version: glossary.metadata.version,\n domain: glossary.metadata.domain,\n },\n terms: glossary.terms\n .map((term) => resolveGlossaryTerm(term, targetLang))\n .filter((term): term is ResolvedGlossaryTerm => term !== null),\n };\n}\n\nfunction resolveGlossaryTerm(\n term: GlossaryTerm,\n targetLang: string\n): ResolvedGlossaryTerm | null {\n const target = resolveTarget(term, targetLang);\n\n // Skip if no translation available and not a doNotTranslate term\n if (target === undefined) {\n return null;\n }\n\n return {\n source: term.source,\n target,\n context: term.context,\n caseSensitive: term.caseSensitive ?? false,\n doNotTranslate: resolveDoNotTranslate(term, targetLang),\n };\n}\n\nfunction resolveTarget(term: GlossaryTerm, targetLang: string): string | undefined {\n if (term.doNotTranslate) {\n return term.source;\n }\n\n if (term.doNotTranslateFor?.includes(targetLang)) {\n return term.source;\n }\n\n const translation = term.targets[targetLang];\n if (translation) {\n return translation;\n }\n\n // No translation available for this language\n return undefined;\n}\n\nfunction resolveDoNotTranslate(term: GlossaryTerm, targetLang: string): boolean {\n return (\n term.doNotTranslate === true ||\n term.doNotTranslateFor?.includes(targetLang) === true\n );\n}\n\n// ============================================================================\n// Glossary Lookup\n// ============================================================================\n\nexport interface GlossaryLookup {\n /**\n * Find a term in the glossary\n */\n find(text: string): ResolvedGlossaryTerm | undefined;\n\n /**\n * Find all matching terms in a text\n */\n findAll(text: string): ResolvedGlossaryTerm[];\n\n /**\n * Get all terms\n */\n getTerms(): ResolvedGlossaryTerm[];\n\n /**\n * Format glossary for prompt injection\n */\n formatForPrompt(): string;\n}\n\nexport function createGlossaryLookup(glossary: ResolvedGlossary): GlossaryLookup {\n // Create a map for fast lookup\n const termMap = new Map<string, ResolvedGlossaryTerm>();\n const caseSensitiveTerms: ResolvedGlossaryTerm[] = [];\n const caseInsensitiveTerms: ResolvedGlossaryTerm[] = [];\n\n for (const term of glossary.terms) {\n if (term.caseSensitive) {\n termMap.set(term.source, term);\n caseSensitiveTerms.push(term);\n } else {\n termMap.set(term.source.toLowerCase(), term);\n caseInsensitiveTerms.push(term);\n }\n }\n\n return {\n find(text: string): ResolvedGlossaryTerm | undefined {\n // Try exact match first\n const exact = termMap.get(text);\n if (exact) return exact;\n\n // Try case-insensitive\n return termMap.get(text.toLowerCase());\n },\n\n findAll(text: string): ResolvedGlossaryTerm[] {\n const matches: ResolvedGlossaryTerm[] = [];\n\n // Check case-sensitive terms\n for (const term of caseSensitiveTerms) {\n if (text.includes(term.source)) {\n matches.push(term);\n }\n }\n\n // Check case-insensitive terms\n const lowerText = text.toLowerCase();\n for (const term of caseInsensitiveTerms) {\n if (lowerText.includes(term.source.toLowerCase())) {\n matches.push(term);\n }\n }\n\n return matches;\n },\n\n getTerms(): ResolvedGlossaryTerm[] {\n return glossary.terms;\n },\n\n formatForPrompt(): string {\n const lines: string[] = [];\n\n for (const term of glossary.terms) {\n const flags: string[] = [];\n\n if (term.caseSensitive) {\n flags.push('case-sensitive');\n } else {\n flags.push('case-insensitive');\n }\n\n if (term.context) {\n flags.push(`context: ${term.context}`);\n }\n\n const flagStr = flags.length > 0 ? ` (${flags.join(', ')})` : '';\n\n if (term.doNotTranslate) {\n lines.push(`- \"${term.source}\" → [DO NOT TRANSLATE, keep as-is]${flagStr}`);\n } else {\n lines.push(`- \"${term.source}\" → \"${term.target}\"${flagStr}`);\n }\n }\n\n return lines.join('\\n');\n },\n };\n}\n\n// ============================================================================\n// Glossary Compliance Check\n// ============================================================================\n\nexport interface ComplianceResult {\n applied: string[];\n missed: string[];\n score: number;\n}\n\nexport function checkGlossaryCompliance(\n sourceText: string,\n translatedText: string,\n glossary: ResolvedGlossary\n): ComplianceResult {\n const lookup = createGlossaryLookup(glossary);\n const sourceTerms = lookup.findAll(sourceText);\n\n const applied: string[] = [];\n const missed: string[] = [];\n\n for (const term of sourceTerms) {\n const targetInTranslation = term.caseSensitive\n ? translatedText.includes(term.target)\n : translatedText.toLowerCase().includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n const total = sourceTerms.length;\n const score = total > 0 ? (applied.length / total) * 100 : 100;\n\n return { applied, missed, score };\n}\n","import chalk from 'chalk';\n\n// ============================================================================\n// Log Levels\n// ============================================================================\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n// ============================================================================\n// Logger Configuration\n// ============================================================================\n\ninterface LoggerConfig {\n level: LogLevel;\n quiet: boolean;\n json: boolean;\n}\n\nlet config: LoggerConfig = {\n level: 'info',\n quiet: false,\n json: false,\n};\n\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n// ============================================================================\n// Logger Implementation\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n if (config.quiet && level !== 'error') {\n return false;\n }\n return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[config.level];\n}\n\nfunction formatMessage(\n level: LogLevel,\n message: string,\n data?: Record<string, unknown>\n): string {\n if (config.json) {\n return JSON.stringify({\n level,\n message,\n timestamp: new Date().toISOString(),\n ...data,\n });\n }\n\n const timestamp = new Date().toISOString().slice(11, 19);\n const prefix = `[${timestamp}]`;\n\n switch (level) {\n case 'debug':\n return chalk.gray(`${prefix} ${message}`);\n case 'info':\n return `${prefix} ${message}`;\n case 'warn':\n return chalk.yellow(`${prefix} ⚠ ${message}`);\n case 'error':\n return chalk.red(`${prefix} ✗ ${message}`);\n }\n}\n\nexport const logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message, data));\n }\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('info')) {\n console.log(formatMessage('info', message, data));\n }\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message, data));\n }\n },\n\n error(message: string, data?: Record<string, unknown>): void {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message, data));\n }\n },\n\n success(message: string): void {\n if (!config.quiet) {\n console.log(chalk.green(`✓ ${message}`));\n }\n },\n\n progress(current: number, total: number, message: string): void {\n if (!config.quiet && !config.json) {\n const percent = Math.round((current / total) * 100);\n const bar = '█'.repeat(Math.round(percent / 5)) + '░'.repeat(20 - Math.round(percent / 5));\n process.stdout.write(`\\r[${bar}] ${percent}% ${message}`);\n if (current === total) {\n console.log();\n }\n }\n },\n};\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\nexport function createTimer(): {\n elapsed: () => number;\n format: () => string;\n} {\n const start = performance.now();\n\n return {\n elapsed(): number {\n return performance.now() - start;\n },\n format(): string {\n const ms = this.elapsed();\n if (ms < 1000) {\n return `${ms.toFixed(0)}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n },\n };\n}\n","import type {\n TranslationRequest,\n TranslationResult,\n ResolvedGlossary,\n QualityEvaluation,\n MQMEvaluation,\n MQMError,\n PreTranslationAnalysis,\n TranslationMode,\n} from \"../types/index.js\";\nimport {\n parseMQMResponse,\n formatMQMErrorsForPrompt,\n} from \"../types/mqm.js\";\nimport {\n parseAnalysisResponse,\n formatAnalysisForPrompt,\n createEmptyAnalysis,\n} from \"../types/analysis.js\";\nimport { getModeConfig } from \"../types/modes.js\";\nimport type {\n LLMProvider,\n ChatMessage,\n CacheableTextPart,\n} from \"../providers/interface.js\";\nimport { createGlossaryLookup } from \"../services/glossary.js\";\nimport { logger, createTimer } from \"../utils/logger.js\";\nimport { TranslationError, ErrorCode } from \"../errors.js\";\n\n// ============================================================================\n// Prompt Templates (from RFC.md Section 7.2)\n// ============================================================================\n\n/**\n * Build cacheable system instructions for translation\n * This part is static and can be cached across multiple requests\n */\nfunction buildSystemInstructions(\n sourceLang: string,\n targetLang: string\n): string {\n return `You are a professional translator specializing in ${sourceLang} to ${targetLang} translation.\n\n## Rules:\n1. Apply glossary terms exactly as specified\n2. Preserve all formatting (markdown, HTML tags, code blocks)\n3. Maintain the same tone and style\n4. Do not translate content inside code blocks\n5. Keep URLs, file paths, and technical identifiers unchanged\n6. Keep placeholders like __CODE_BLOCK_0__ unchanged`;\n}\n\n/**\n * Build cacheable glossary section\n * This can be cached as it's reused across multiple chunks\n */\nfunction buildGlossarySection(glossaryText: string): string {\n return `## Glossary (MUST use these exact translations):\n${glossaryText || \"No glossary provided.\"}`;\n}\n\n/**\n * Build the dynamic part of the translation prompt (not cached)\n */\nfunction buildTranslationContent(\n sourceText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): string {\n const styleSection = context?.styleInstruction\n ? `Style: ${context.styleInstruction}\\n`\n : \"\";\n\n return `## Document Context:\nPurpose: ${context?.documentPurpose ?? \"General translation\"}\n${styleSection}Previous content: ${context?.previousContext ?? \"None\"}\n\n## Source Text:\n${sourceText}\n\nProvide ONLY the translated text below, with no additional commentary or headers:`;\n}\n\n/**\n * Build message with cacheable parts for initial translation\n * Uses prompt caching for system instructions and glossary\n */\nfunction buildCacheableTranslationMessage(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): ChatMessage {\n const systemInstructions = buildSystemInstructions(sourceLang, targetLang);\n const glossarySection = buildGlossarySection(glossaryText);\n const translationContent = buildTranslationContent(sourceText, context);\n\n // Structure content parts with cache control\n // System instructions + glossary are cached (static across chunks)\n // Translation content is dynamic (changes per chunk)\n const contentParts: CacheableTextPart[] = [\n {\n type: \"text\",\n text: systemInstructions,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: glossarySection,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: translationContent,\n // No cache control - this is dynamic per request\n },\n ];\n\n return {\n role: \"user\",\n content: contentParts,\n };\n}\n\nfunction buildInitialTranslationPrompt(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: { documentPurpose?: string; styleInstruction?: string; previousContext?: string }\n): string {\n const styleSection = context?.styleInstruction\n ? `Style: ${context.styleInstruction}\\n`\n : \"\";\n\n return `You are a professional translator. Translate the following ${sourceLang} text to ${targetLang}.\n\n## Glossary (MUST use these exact translations):\n${glossaryText || \"No glossary provided.\"}\n\n## Document Context:\nPurpose: ${context?.documentPurpose ?? \"General translation\"}\n${styleSection}Previous content: ${context?.previousContext ?? \"None\"}\n\n## Rules:\n1. Apply glossary terms exactly as specified\n2. Preserve all formatting (markdown, HTML tags, code blocks)\n3. Maintain the same tone and style\n4. Do not translate content inside code blocks\n5. Keep URLs, file paths, and technical identifiers unchanged\n6. Keep placeholders like __CODE_BLOCK_0__ unchanged\n\n## Source Text:\n${sourceText}\n\nProvide ONLY the translated text below, with no additional commentary or headers:`;\n}\n\nfunction buildReflectionPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Review this translation and provide specific improvement suggestions.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Glossary Requirements:\n${glossaryText || \"No glossary provided.\"}\n\n## Evaluate and suggest improvements for:\n1. **Accuracy**: Does the translation convey the exact meaning?\n2. **Glossary Compliance**: Are all glossary terms applied correctly?\n3. **Fluency**: Does it read naturally in ${targetLang}?\n4. **Formatting**: Is the structure preserved?\n5. **Consistency**: Are terms translated consistently?\n\nProvide a numbered list of specific, actionable suggestions:`;\n}\n\nfunction buildImprovementPrompt(\n sourceText: string,\n currentTranslation: string,\n suggestions: string,\n glossaryText: string\n): string {\n return `Improve this translation based on the following suggestions.\n\n## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Improvement Suggestions:\n${suggestions}\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}\n\nProvide ONLY the improved translation below, with no additional commentary or headers:`;\n}\n\nfunction buildQualityEvaluationPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string\n): string {\n return `Rate this translation's quality from 0 to 100.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Evaluation Criteria:\n- Semantic accuracy (40 points)\n- Fluency and naturalness (25 points)\n- Glossary compliance (20 points)\n- Format preservation (15 points)\n\nRespond with only a JSON object:\n{\"score\": <number>, \"breakdown\": {\"accuracy\": <n>, \"fluency\": <n>, \"glossary\": <n>, \"format\": <n>}, \"issues\": [\"issue1\", \"issue2\"]}`;\n}\n\n/**\n * Build MQM evaluation prompt (TEaR-style)\n * Based on https://arxiv.org/abs/2402.16379\n */\nfunction buildMQMEvaluationPrompt(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Evaluate this translation using MQM (Multidimensional Quality Metrics) framework.\n\n## Source (${sourceLang}):\n${sourceText}\n\n## Translation (${targetLang}):\n${translatedText}\n\n## Glossary Terms (must be applied exactly):\n${glossaryText || \"No glossary provided.\"}\n\n## MQM Error Categories:\n- accuracy/mistranslation: Incorrect meaning\n- accuracy/omission: Missing content from source\n- accuracy/addition: Extra content not in source\n- accuracy/untranslated: Source text left unchanged\n- fluency/grammar: Grammatical errors\n- fluency/spelling: Spelling/typos\n- fluency/register: Inappropriate formality\n- fluency/inconsistency: Inconsistent terminology\n- style/awkward: Unnatural phrasing\n- style/unidiomatic: Non-native expressions\n\n## Severity Weights:\n- \"minor\" (1 point): Noticeable but doesn't affect understanding\n- \"major\" (5 points): Affects understanding or usability\n- \"critical\" (25 points): Completely wrong or unusable\n\n## Instructions:\n1. Identify all translation errors\n2. Classify each by type and severity\n3. Provide the span and suggested fix\n4. Calculate score: 100 - sum(weights)\n\nRespond with only a JSON object:\n{\n \"errors\": [\n {\"type\": \"accuracy/mistranslation\", \"severity\": \"major\", \"span\": \"affected text\", \"suggestion\": \"corrected text\", \"explanation\": \"reason\"}\n ],\n \"score\": <100 - sum of weights>,\n \"summary\": \"brief overall assessment\"\n}`;\n}\n\n/**\n * Build MQM-based refinement prompt\n * Uses specific error annotations to guide improvements\n */\nfunction buildMQMRefinementPrompt(\n sourceText: string,\n currentTranslation: string,\n errors: MQMError[],\n glossaryText: string\n): string {\n const errorList = formatMQMErrorsForPrompt(errors);\n\n return `Fix the following translation errors.\n\n## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Errors to Fix:\n${errorList}\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}\n\nApply ONLY the fixes listed above. Do not make other changes.\nProvide ONLY the corrected translation, with no additional commentary:`;\n}\n\n/**\n * Build pre-translation analysis prompt (MAPS-style)\n * Based on https://github.com/zwhe99/MAPS-mt\n */\nfunction buildPreAnalysisPrompt(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n): string {\n return `Analyze this ${sourceLang} text before translating to ${targetLang}.\n\n## Source Text:\n${sourceText}\n\n## Available Glossary Terms:\n${glossaryText || \"No glossary provided.\"}\n\n## Analyze and extract:\n1. **Key Terms**: Important domain-specific terms needing careful translation\n2. **Ambiguous Phrases**: Phrases with multiple possible interpretations\n3. **Preserve Exact**: Code, URLs, names that should NOT be translated\n4. **Challenges**: Specific difficulties for ${sourceLang}→${targetLang}\n\nRespond with only a JSON object:\n{\n \"keyTerms\": [{\"term\": \"...\", \"context\": \"...\", \"suggestedTranslation\": \"...\", \"fromGlossary\": true/false}],\n \"ambiguousPhrases\": [{\"phrase\": \"...\", \"interpretations\": [\"...\"], \"recommendation\": \"...\"}],\n \"preserveExact\": [\"code snippets\", \"URLs\", \"names\"],\n \"challenges\": [\"challenge 1\", \"challenge 2\"],\n \"domain\": \"technical|marketing|legal|medical|general\",\n \"registerRecommendation\": \"formal|informal|neutral\"\n}`;\n}\n\n// ============================================================================\n// Translation Agent\n// ============================================================================\n\nexport interface TranslationAgentOptions {\n provider: LLMProvider;\n qualityThreshold?: number;\n maxIterations?: number;\n verbose?: boolean;\n /** If true, throw error when quality threshold is not met after max iterations */\n strictQuality?: boolean;\n /** Enable prompt caching for Claude provider (default: true) */\n enableCaching?: boolean;\n /** Translation mode: fast, balanced, quality (default: balanced) */\n mode?: TranslationMode;\n /** Enable pre-translation analysis (MAPS-style) - overrides mode setting */\n enableAnalysis?: boolean;\n /** Use MQM-based evaluation - overrides mode setting */\n useMQMEvaluation?: boolean;\n}\n\nexport class TranslationAgent {\n private provider: LLMProvider;\n private qualityThreshold: number;\n private maxIterations: number;\n private verbose: boolean;\n private strictQuality: boolean;\n private enableCaching: boolean;\n private enableAnalysis: boolean;\n private useMQMEvaluation: boolean;\n\n constructor(options: TranslationAgentOptions) {\n this.provider = options.provider;\n this.verbose = options.verbose ?? false;\n this.strictQuality = options.strictQuality ?? false;\n\n // Get mode configuration\n const modeConfig = getModeConfig(options.mode ?? \"balanced\");\n\n // Apply mode settings, allowing explicit overrides\n this.qualityThreshold = options.qualityThreshold ?? modeConfig.qualityThreshold;\n this.maxIterations = options.maxIterations ?? modeConfig.maxIterations;\n this.enableAnalysis = options.enableAnalysis ?? modeConfig.enableAnalysis;\n this.useMQMEvaluation = options.useMQMEvaluation ?? modeConfig.useMQMEvaluation;\n\n // Enable caching by default for Claude provider\n this.enableCaching =\n options.enableCaching ?? options.provider.name === \"claude\";\n\n if (this.verbose) {\n logger.info(`Translation mode: ${options.mode ?? \"balanced\"}`);\n logger.info(` - Analysis: ${this.enableAnalysis ? \"enabled\" : \"disabled\"}`);\n logger.info(` - MQM evaluation: ${this.useMQMEvaluation ? \"enabled\" : \"disabled\"}`);\n logger.info(` - Quality threshold: ${this.qualityThreshold}`);\n logger.info(` - Max iterations: ${this.maxIterations}`);\n }\n }\n\n /**\n * Translate content using Self-Refine loop with optional MAPS analysis and MQM evaluation\n */\n async translate(request: TranslationRequest): Promise<TranslationResult> {\n const timer = createTimer();\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCacheReadTokens = 0;\n let totalCacheWriteTokens = 0;\n let iterations = 0;\n\n // Prepare glossary text for prompts\n const glossaryText = request.glossary\n ? createGlossaryLookup(\n request.glossary as ResolvedGlossary\n ).formatForPrompt()\n : \"\";\n\n // Step 1: Pre-Translation Analysis (MAPS-style, optional)\n let analysis: PreTranslationAnalysis | null = null;\n if (this.enableAnalysis) {\n if (this.verbose) {\n logger.info(\"Analyzing source text (MAPS)...\");\n }\n analysis = await this.analyzeSource(\n request.content,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n if (this.verbose && analysis) {\n logger.info(` - Domain: ${analysis.domain}`);\n logger.info(` - Key terms: ${analysis.keyTerms.length}`);\n logger.info(` - Challenges: ${analysis.challenges.length}`);\n }\n }\n\n // Step 2: Initial Translation\n if (this.verbose) {\n logger.info(\"Starting initial translation...\");\n }\n\n const initialResult = await this.generateInitialTranslation(\n request.content,\n request.sourceLang,\n request.targetLang,\n glossaryText,\n request.context,\n analysis\n );\n let currentTranslation = initialResult.content;\n iterations++;\n\n totalInputTokens += initialResult.usage.inputTokens;\n totalOutputTokens += initialResult.usage.outputTokens;\n totalCacheReadTokens += initialResult.usage.cacheReadTokens ?? 0;\n totalCacheWriteTokens += initialResult.usage.cacheWriteTokens ?? 0;\n\n // Fast mode: Skip evaluation and refinement\n if (this.maxIterations <= 1 && this.qualityThreshold <= 0) {\n if (this.verbose) {\n logger.info(\"Fast mode: Skipping evaluation and refinement\");\n }\n return {\n content: currentTranslation,\n metadata: {\n qualityScore: 0,\n qualityThreshold: 0,\n thresholdMet: true,\n iterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n cacheRead: totalCacheReadTokens,\n cacheWrite: totalCacheWriteTokens,\n },\n duration: timer.elapsed(),\n provider: this.provider.name,\n model: \"default\",\n },\n glossaryCompliance: request.glossary\n ? this.checkGlossaryCompliance(\n request.content,\n currentTranslation,\n request.glossary as ResolvedGlossary\n )\n : undefined,\n };\n }\n\n // Step 3: Evaluate and Refine Loop\n let qualityScore = 0;\n let lastEvaluation: QualityEvaluation | null = null;\n let lastMQMEvaluation: MQMEvaluation | null = null;\n\n while (iterations < this.maxIterations) {\n // Evaluate quality (MQM or simple)\n if (this.verbose) {\n logger.info(\n `Evaluating translation quality (iteration ${iterations})...`\n );\n }\n\n if (this.useMQMEvaluation) {\n // MQM-based evaluation\n lastMQMEvaluation = await this.evaluateQualityMQM(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n qualityScore = lastMQMEvaluation.score;\n\n if (this.verbose) {\n logger.info(`MQM score: ${qualityScore}/${this.qualityThreshold}`);\n if (lastMQMEvaluation.errors.length > 0) {\n logger.info(` - Errors: ${lastMQMEvaluation.errors.length} (${lastMQMEvaluation.breakdown.accuracy} accuracy, ${lastMQMEvaluation.breakdown.fluency} fluency, ${lastMQMEvaluation.breakdown.style} style)`);\n }\n }\n } else {\n // Simple evaluation\n lastEvaluation = await this.evaluateQuality(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang\n );\n qualityScore = lastEvaluation.score;\n\n if (this.verbose) {\n logger.info(`Quality score: ${qualityScore}/${this.qualityThreshold}`);\n }\n }\n\n // Check if quality threshold is met\n if (qualityScore >= this.qualityThreshold) {\n if (this.verbose) {\n logger.success(\n `Quality threshold met after ${iterations} iterations`\n );\n }\n break;\n }\n\n // Step 4: Refine translation\n if (this.verbose) {\n logger.info(\"Refining translation...\");\n }\n\n let improveResult: {\n content: string;\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number };\n };\n\n if (this.useMQMEvaluation && lastMQMEvaluation && lastMQMEvaluation.errors.length > 0) {\n // MQM-based refinement: Apply specific error fixes\n improveResult = await this.refineWithMQM(\n request.content,\n currentTranslation,\n lastMQMEvaluation.errors,\n glossaryText\n );\n } else {\n // Legacy refinement: Generate suggestions then apply\n const suggestions = await this.generateReflection(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n\n improveResult = await this.improveTranslation(\n request.content,\n currentTranslation,\n suggestions,\n glossaryText\n );\n }\n\n currentTranslation = improveResult.content;\n iterations++;\n totalInputTokens += improveResult.usage.inputTokens;\n totalOutputTokens += improveResult.usage.outputTokens;\n totalCacheReadTokens += improveResult.usage.cacheReadTokens ?? 0;\n totalCacheWriteTokens += improveResult.usage.cacheWriteTokens ?? 0;\n }\n\n // Final evaluation if not done\n if (this.useMQMEvaluation) {\n if (!lastMQMEvaluation || iterations === this.maxIterations) {\n lastMQMEvaluation = await this.evaluateQualityMQM(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang,\n glossaryText\n );\n qualityScore = lastMQMEvaluation.score;\n }\n } else {\n if (!lastEvaluation || iterations === this.maxIterations) {\n lastEvaluation = await this.evaluateQuality(\n request.content,\n currentTranslation,\n request.sourceLang,\n request.targetLang\n );\n qualityScore = lastEvaluation.score;\n }\n }\n\n // Check if quality threshold was met\n const thresholdMet = qualityScore >= this.qualityThreshold;\n\n if (!thresholdMet && this.strictQuality) {\n throw new TranslationError(ErrorCode.QUALITY_THRESHOLD_NOT_MET, {\n score: qualityScore,\n threshold: this.qualityThreshold,\n iterations,\n maxIterations: this.maxIterations,\n issues: lastEvaluation?.issues ?? lastMQMEvaluation?.errors.map(e => `${e.type}: ${e.span}`) ?? [],\n });\n }\n\n if (!thresholdMet && this.verbose) {\n logger.warn(\n `Quality threshold not met: ${qualityScore}/${this.qualityThreshold} after ${iterations} iterations`\n );\n }\n\n // Log cache efficiency if verbose and caching was used\n if (this.verbose && (totalCacheReadTokens > 0 || totalCacheWriteTokens > 0)) {\n const cacheHitRate =\n totalCacheReadTokens > 0\n ? ((totalCacheReadTokens / (totalCacheReadTokens + totalInputTokens)) * 100).toFixed(1)\n : \"0\";\n logger.info(\n `Cache stats: ${totalCacheReadTokens} read, ${totalCacheWriteTokens} written (${cacheHitRate}% hit rate)`\n );\n }\n\n return {\n content: currentTranslation,\n metadata: {\n qualityScore,\n qualityThreshold: this.qualityThreshold,\n thresholdMet,\n iterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n cacheRead: totalCacheReadTokens,\n cacheWrite: totalCacheWriteTokens,\n },\n duration: timer.elapsed(),\n provider: this.provider.name,\n model: \"default\",\n },\n glossaryCompliance: request.glossary\n ? this.checkGlossaryCompliance(\n request.content,\n currentTranslation,\n request.glossary as ResolvedGlossary\n )\n : undefined,\n };\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private async generateInitialTranslation(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string,\n context?: {\n documentPurpose?: string;\n styleInstruction?: string;\n previousChunks?: string[];\n documentSummary?: string;\n },\n analysis?: PreTranslationAnalysis | null\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n let messages: ChatMessage[];\n\n // Build analysis context if available\n const analysisContext = analysis ? formatAnalysisForPrompt(analysis) : \"\";\n const enrichedContext = {\n documentPurpose: context?.documentPurpose,\n styleInstruction: context?.styleInstruction,\n previousContext: context?.previousChunks?.slice(-2).join(\"\\n\"),\n };\n\n if (this.enableCaching) {\n // Use cacheable message format for Claude\n const baseMessage = buildCacheableTranslationMessage(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText,\n enrichedContext\n );\n\n // Add analysis context if available\n if (analysisContext && Array.isArray(baseMessage.content)) {\n const contentParts = baseMessage.content as CacheableTextPart[];\n // Insert analysis after glossary, before translation content\n contentParts.splice(2, 0, {\n type: \"text\",\n text: `\\n## Pre-Translation Analysis:\\n${analysisContext}\\n`,\n });\n }\n\n messages = [baseMessage];\n } else {\n // Fallback to simple string format for other providers\n let prompt = buildInitialTranslationPrompt(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText,\n enrichedContext\n );\n\n // Inject analysis into prompt if available\n if (analysisContext) {\n prompt = prompt.replace(\n \"## Source Text:\",\n `## Pre-Translation Analysis:\\n${analysisContext}\\n\\n## Source Text:`\n );\n }\n\n messages = [{ role: \"user\", content: prompt }];\n }\n\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n private async generateReflection(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<string> {\n const prompt = buildReflectionPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n const response = await this.provider.chat({ messages });\n return response.content.trim();\n }\n\n private async improveTranslation(\n sourceText: string,\n currentTranslation: string,\n suggestions: string,\n glossaryText: string\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n let messages: ChatMessage[];\n\n if (this.enableCaching) {\n // Use cacheable format - glossary is cached\n const contentParts: CacheableTextPart[] = [\n {\n type: \"text\",\n text: `Improve this translation based on the following suggestions.\n\n## Glossary (MUST apply):\n${glossaryText || \"No glossary provided.\"}`,\n cacheControl: { type: \"ephemeral\" },\n },\n {\n type: \"text\",\n text: `## Source Text:\n${sourceText}\n\n## Current Translation:\n${currentTranslation}\n\n## Improvement Suggestions:\n${suggestions}\n\nProvide ONLY the improved translation below, with no additional commentary or headers:`,\n },\n ];\n messages = [{ role: \"user\", content: contentParts }];\n } else {\n const prompt = buildImprovementPrompt(\n sourceText,\n currentTranslation,\n suggestions,\n glossaryText\n );\n messages = [{ role: \"user\", content: prompt }];\n }\n\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n private async evaluateQuality(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string\n ): Promise<QualityEvaluation> {\n const prompt = buildQualityEvaluationPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n const response = await this.provider.chat({ messages });\n\n try {\n // Extract JSON from response\n const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(\"No JSON found in response\");\n }\n\n const evaluation = JSON.parse(jsonMatch[0]) as {\n score: number;\n breakdown: {\n accuracy: number;\n fluency: number;\n glossary: number;\n format: number;\n };\n issues: string[];\n };\n\n return {\n score: evaluation.score,\n breakdown: evaluation.breakdown,\n issues: evaluation.issues,\n };\n } catch {\n // Fallback if parsing fails\n return {\n score: 75, // Default score\n breakdown: {\n accuracy: 30,\n fluency: 20,\n glossary: 15,\n format: 10,\n },\n issues: [\"Failed to parse quality evaluation response\"],\n };\n }\n }\n\n /**\n * Pre-translation analysis using MAPS-style approach\n * Identifies key terms, ambiguous phrases, and translation challenges\n */\n private async analyzeSource(\n sourceText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<PreTranslationAnalysis | null> {\n const prompt = buildPreAnalysisPrompt(\n sourceText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n try {\n const response = await this.provider.chat({ messages });\n return parseAnalysisResponse(response.content);\n } catch (error) {\n if (this.verbose) {\n logger.warn(`Pre-analysis failed: ${error}`);\n }\n return createEmptyAnalysis();\n }\n }\n\n /**\n * Evaluate translation quality using MQM framework\n * Returns structured error annotations for targeted refinement\n */\n private async evaluateQualityMQM(\n sourceText: string,\n translatedText: string,\n sourceLang: string,\n targetLang: string,\n glossaryText: string\n ): Promise<MQMEvaluation> {\n const prompt = buildMQMEvaluationPrompt(\n sourceText,\n translatedText,\n sourceLang,\n targetLang,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n\n try {\n const response = await this.provider.chat({ messages });\n const evaluation = parseMQMResponse(response.content);\n\n if (evaluation) {\n return evaluation;\n }\n\n // Fallback if parsing fails\n return {\n errors: [],\n score: 75,\n summary: \"Failed to parse MQM evaluation\",\n breakdown: { accuracy: 0, fluency: 0, style: 0 },\n };\n } catch {\n return {\n errors: [],\n score: 75,\n summary: \"MQM evaluation failed\",\n breakdown: { accuracy: 0, fluency: 0, style: 0 },\n };\n }\n }\n\n /**\n * Refine translation based on MQM error annotations\n * Applies targeted fixes for identified errors\n */\n private async refineWithMQM(\n sourceText: string,\n currentTranslation: string,\n errors: MQMError[],\n glossaryText: string\n ): Promise<{\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n }> {\n const prompt = buildMQMRefinementPrompt(\n sourceText,\n currentTranslation,\n errors,\n glossaryText\n );\n\n const messages: ChatMessage[] = [{ role: \"user\", content: prompt }];\n const response = await this.provider.chat({ messages });\n const cleanedContent = this.cleanTranslationOutput(response.content);\n\n return {\n content: this.preserveWhitespace(sourceText, cleanedContent),\n usage: {\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cacheReadTokens: response.usage.cacheReadTokens,\n cacheWriteTokens: response.usage.cacheWriteTokens,\n },\n };\n }\n\n /**\n * Clean up translation output by removing prompt artifacts\n * Uses guardrails to detect and remove any trailing prompt-like content\n */\n private cleanTranslationOutput(text: string): string {\n let cleaned = text.trim();\n\n // Guardrail 1: Remove trailing markdown headers that look like prompt sections\n // These are likely prompt artifacts, not actual translation content\n const trailingHeaderPattern = /\\n+##\\s+[A-Z][^:\\n]*:\\s*$/;\n cleaned = cleaned.replace(trailingHeaderPattern, '');\n\n // Guardrail 2: If the text ends with a colon followed by optional whitespace,\n // it's likely an incomplete prompt artifact\n const incompletePromptPattern = /:\\s*$/;\n if (incompletePromptPattern.test(cleaned)) {\n // Find the last complete line/paragraph\n const lines = cleaned.split('\\n');\n while (lines.length > 0 && incompletePromptPattern.test(lines[lines.length - 1]?.trim() ?? '')) {\n lines.pop();\n }\n cleaned = lines.join('\\n');\n }\n\n // Guardrail 3: Remove any trailing numbered list items that look like evaluation criteria\n // (typically starts with \"1. **\" pattern for bold evaluation headers)\n const evaluationListPattern = /\\n+\\d+\\.\\s*\\*\\*[^*]+\\*\\*[\\s\\S]*$/;\n if (evaluationListPattern.test(cleaned)) {\n cleaned = cleaned.replace(evaluationListPattern, '');\n }\n\n return cleaned.trim();\n }\n\n /**\n * Preserve leading/trailing whitespace from source text in translated text\n * This ensures document structure (line breaks between sections) is maintained\n */\n private preserveWhitespace(\n sourceText: string,\n translatedText: string\n ): string {\n // Extract leading whitespace from source\n const leadingMatch = sourceText.match(/^(\\s*)/);\n const leadingWhitespace = leadingMatch ? leadingMatch[1] : \"\";\n\n // Extract trailing whitespace from source\n const trailingMatch = sourceText.match(/(\\s*)$/);\n const trailingWhitespace = trailingMatch ? trailingMatch[1] : \"\";\n\n return leadingWhitespace + translatedText + trailingWhitespace;\n }\n\n private checkGlossaryCompliance(\n sourceText: string,\n translatedText: string,\n glossary: ResolvedGlossary\n ): { applied: string[]; missed: string[] } {\n const lookup = createGlossaryLookup(glossary);\n const sourceTerms = lookup.findAll(sourceText);\n\n const applied: string[] = [];\n const missed: string[] = [];\n\n for (const term of sourceTerms) {\n const targetInTranslation = term.caseSensitive\n ? translatedText.includes(term.target)\n : translatedText.toLowerCase().includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n return { applied, missed };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createTranslationAgent(\n options: TranslationAgentOptions\n): TranslationAgent {\n return new TranslationAgent(options);\n}\n","// ============================================================================\n// Token Counting Utilities\n// ============================================================================\n\n/**\n * Approximate token count for a given text.\n * This is a rough estimate - actual token counts may vary by model.\n *\n * Rules of thumb:\n * - English: ~4 characters per token\n * - CJK (Korean, Japanese, Chinese): ~1.5 characters per token\n * - Code: ~3.5 characters per token\n */\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n\n // Count different character types\n let latinChars = 0;\n let cjkChars = 0;\n let otherChars = 0;\n\n for (const char of text) {\n const code = char.charCodeAt(0);\n\n // CJK Unified Ideographs and related ranges\n if (\n (code >= 0x4e00 && code <= 0x9fff) || // CJK Unified Ideographs\n (code >= 0x3400 && code <= 0x4dbf) || // CJK Extension A\n (code >= 0xac00 && code <= 0xd7af) || // Hangul Syllables\n (code >= 0x3040 && code <= 0x309f) || // Hiragana\n (code >= 0x30a0 && code <= 0x30ff) // Katakana\n ) {\n cjkChars++;\n } else if (\n (code >= 0x0041 && code <= 0x005a) || // A-Z\n (code >= 0x0061 && code <= 0x007a) || // a-z\n (code >= 0x0030 && code <= 0x0039) // 0-9\n ) {\n latinChars++;\n } else {\n otherChars++;\n }\n }\n\n // Calculate tokens based on character types\n const latinTokens = latinChars / 4;\n const cjkTokens = cjkChars / 1.5;\n const otherTokens = otherChars / 3;\n\n return Math.ceil(latinTokens + cjkTokens + otherTokens);\n}\n\n/**\n * Check if text exceeds a token limit\n */\nexport function exceedsTokenLimit(text: string, limit: number): boolean {\n return estimateTokens(text) > limit;\n}\n\n/**\n * Truncate text to approximately fit within a token limit\n */\nexport function truncateToTokenLimit(text: string, limit: number): string {\n const estimated = estimateTokens(text);\n\n if (estimated <= limit) {\n return text;\n }\n\n // Estimate character limit based on average token ratio\n const avgCharsPerToken = text.length / estimated;\n const targetChars = Math.floor(limit * avgCharsPerToken * 0.95); // 5% safety margin\n\n return text.slice(0, targetChars) + '...';\n}\n\n// ============================================================================\n// Token Budget Calculator\n// ============================================================================\n\nexport interface TokenBudget {\n total: number;\n system: number;\n glossary: number;\n context: number;\n content: number;\n reserved: number;\n}\n\nexport function calculateTokenBudget(\n maxTokens: number,\n glossarySize: number,\n contextSize: number\n): TokenBudget {\n // Reserve tokens for system prompt, formatting, etc.\n const reserved = 500;\n\n // Glossary and context have fixed sizes\n const glossary = glossarySize;\n const context = contextSize;\n\n // System prompt estimate\n const system = 300;\n\n // Content gets the remainder\n const content = maxTokens - reserved - glossary - context - system;\n\n return {\n total: maxTokens,\n system,\n glossary,\n context,\n content: Math.max(content, 100), // Ensure minimum content budget\n reserved,\n };\n}\n","import type { Chunk, ChunkingConfig } from \"../types/index.js\";\nimport { estimateTokens } from \"../utils/tokens.js\";\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst DEFAULT_CONFIG: ChunkingConfig = {\n maxTokens: 1024,\n overlapTokens: 150,\n separators: [\"\\n\\n\", \"\\n\", \". \", \" \"],\n preservePatterns: [\n /```[\\s\\S]*?```/g, // Code blocks\n /`[^`]+`/g, // Inline code\n /\\[.*?\\]\\(.*?\\)/g, // Links\n ],\n};\n\n// ============================================================================\n// Chunker Implementation\n// ============================================================================\n\nexport interface ChunkerOptions {\n maxTokens?: number;\n overlapTokens?: number;\n preserveCodeBlocks?: boolean;\n}\n\n/**\n * Split content into chunks that respect token limits\n */\nexport function chunkContent(\n content: string,\n options: ChunkerOptions = {}\n): Chunk[] {\n // Handle empty or whitespace-only content\n if (!content.trim()) {\n return [];\n }\n\n const config: ChunkingConfig = {\n ...DEFAULT_CONFIG,\n maxTokens: options.maxTokens ?? DEFAULT_CONFIG.maxTokens,\n overlapTokens: options.overlapTokens ?? DEFAULT_CONFIG.overlapTokens,\n };\n\n // Extract header hierarchy from the entire content\n const headerHierarchy = extractHeaderHierarchy(content);\n\n // First, identify and extract preserved sections (code blocks, etc.)\n const { segments } = extractPreservedSections(content);\n\n // Chunk the translatable segments\n const chunks: Chunk[] = [];\n let previousChunkContent: string | undefined;\n\n for (const segment of segments) {\n // Find relevant headers for this segment\n const segmentHeaders = getHeadersForPosition(\n headerHierarchy,\n segment.startOffset\n );\n\n if (segment.type === \"preserve\") {\n // Preserved content (code blocks) - don't chunk\n chunks.push({\n id: `chunk-${chunks.length}`,\n content: segment.content,\n type: \"preserve\",\n startOffset: segment.startOffset,\n endOffset: segment.endOffset,\n metadata: {\n headerHierarchy: segmentHeaders,\n },\n });\n } else {\n // Translatable content - split into chunks\n const textChunks = splitIntoChunks(\n segment.content,\n config,\n segment.startOffset\n );\n\n for (let idx = 0; idx < textChunks.length; idx++) {\n const chunk = textChunks[idx];\n if (!chunk) continue;\n\n // Find headers specific to this chunk's position\n const chunkHeaders = getHeadersForPosition(\n headerHierarchy,\n chunk.startOffset\n );\n\n chunks.push({\n ...chunk,\n id: `chunk-${chunks.length}`,\n metadata: {\n headerHierarchy:\n chunkHeaders.length > 0 ? chunkHeaders : segmentHeaders,\n previousContext: previousChunkContent,\n },\n });\n\n // Store current chunk content for next iteration (truncate if too long)\n previousChunkContent = truncateForContext(chunk.content, 200);\n }\n }\n }\n\n return chunks;\n}\n\n/**\n * Extract header hierarchy from markdown content\n */\nfunction extractHeaderHierarchy(\n content: string\n): Array<{ level: number; text: string; offset: number }> {\n const headers: Array<{ level: number; text: string; offset: number }> = [];\n const headerRegex = /^(#{1,6})\\s+(.+)$/gm;\n let match: RegExpExecArray | null;\n\n while ((match = headerRegex.exec(content)) !== null) {\n const hashMarks = match[1];\n if (hashMarks) {\n headers.push({\n level: hashMarks.length,\n text: match[0],\n offset: match.index,\n });\n }\n }\n\n return headers;\n}\n\n/**\n * Get relevant headers for a given position in the document\n */\nfunction getHeadersForPosition(\n headers: Array<{ level: number; text: string; offset: number }>,\n position: number\n): string[] {\n const relevantHeaders: string[] = [];\n const currentLevels: Map<number, string> = new Map();\n\n for (const header of headers) {\n if (header.offset > position) break;\n\n // Clear all lower level headers when we encounter a new header\n for (const [level] of currentLevels) {\n if (level >= header.level) {\n currentLevels.delete(level);\n }\n }\n currentLevels.set(header.level, header.text);\n }\n\n // Build hierarchy from level 1 to 6\n for (let level = 1; level <= 6; level++) {\n const headerText = currentLevels.get(level);\n if (headerText) {\n relevantHeaders.push(headerText);\n }\n }\n\n return relevantHeaders;\n}\n\n/**\n * Truncate content for context, preserving word boundaries\n */\nfunction truncateForContext(content: string, maxChars: number): string {\n if (content.length <= maxChars) return content;\n\n const truncated = content.slice(-maxChars);\n const firstSpace = truncated.indexOf(\" \");\n if (firstSpace > 0 && firstSpace < 50) {\n return \"...\" + truncated.slice(firstSpace + 1);\n }\n return \"...\" + truncated;\n}\n\n// ============================================================================\n// Preserved Section Extraction\n// ============================================================================\n\ninterface Segment {\n content: string;\n type: \"translatable\" | \"preserve\";\n startOffset: number;\n endOffset: number;\n headerHierarchy?: string[];\n}\n\nfunction extractPreservedSections(content: string): { segments: Segment[] } {\n const preservedRanges: Array<{\n start: number;\n end: number;\n content: string;\n }> = [];\n\n // Find all code blocks (fenced)\n const codeBlockRegex = /```[\\s\\S]*?```/g;\n let match: RegExpExecArray | null;\n\n while ((match = codeBlockRegex.exec(content)) !== null) {\n preservedRanges.push({\n start: match.index,\n end: match.index + match[0].length,\n content: match[0],\n });\n }\n\n // Sort by start position\n preservedRanges.sort((a, b) => a.start - b.start);\n\n // Build segments\n const segments: Segment[] = [];\n let lastEnd = 0;\n\n for (const range of preservedRanges) {\n // Add translatable segment before this preserved section\n if (range.start > lastEnd) {\n const translatableContent = content.slice(lastEnd, range.start);\n // Include segment even if it's only whitespace (to preserve line breaks)\n if (translatableContent.length > 0) {\n segments.push({\n content: translatableContent,\n type: translatableContent.trim() ? \"translatable\" : \"preserve\",\n startOffset: lastEnd,\n endOffset: range.start,\n });\n }\n }\n\n // Add preserved segment\n segments.push({\n content: range.content,\n type: \"preserve\",\n startOffset: range.start,\n endOffset: range.end,\n });\n\n lastEnd = range.end;\n }\n\n // Add remaining translatable content\n if (lastEnd < content.length) {\n const remainingContent = content.slice(lastEnd);\n // Include segment even if it's only whitespace (to preserve line breaks)\n if (remainingContent.length > 0) {\n segments.push({\n content: remainingContent,\n type: remainingContent.trim() ? \"translatable\" : \"preserve\",\n startOffset: lastEnd,\n endOffset: content.length,\n });\n }\n }\n\n // If no preserved sections, return whole content as translatable\n if (segments.length === 0) {\n segments.push({\n content,\n type: \"translatable\",\n startOffset: 0,\n endOffset: content.length,\n });\n }\n\n return { segments };\n}\n\n// ============================================================================\n// Text Chunking with Overlap\n// ============================================================================\n\nfunction splitIntoChunks(\n text: string,\n config: ChunkingConfig,\n baseOffset: number\n): Chunk[] {\n const chunks: Chunk[] = [];\n const tokenCount = estimateTokens(text);\n\n // If text fits in one chunk, return it as-is (preserve whitespace)\n if (tokenCount <= config.maxTokens) {\n return [\n {\n id: \"\",\n content: text,\n type: \"translatable\",\n startOffset: baseOffset,\n endOffset: baseOffset + text.length,\n },\n ];\n }\n\n // Split by paragraph boundaries while preserving the separators\n // Use a regex that captures the separator so we can preserve exact whitespace\n const parts = text.split(/(\\n\\n+)/);\n\n let currentChunk = \"\";\n let chunkStartOffset = baseOffset;\n let textOffset = baseOffset;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === undefined) continue;\n\n const potentialChunk = currentChunk + part;\n const potentialTokens = estimateTokens(potentialChunk);\n\n if (potentialTokens > config.maxTokens && currentChunk) {\n // Save current chunk - preserve content as-is without trimming\n chunks.push({\n id: \"\",\n content: currentChunk,\n type: \"translatable\",\n startOffset: chunkStartOffset,\n endOffset: textOffset,\n });\n\n // Start new chunk\n currentChunk = part;\n chunkStartOffset = textOffset;\n } else {\n currentChunk = potentialChunk;\n }\n\n textOffset += part.length;\n }\n\n // Add remaining content (preserve as-is)\n if (currentChunk.length > 0) {\n chunks.push({\n id: \"\",\n content: currentChunk,\n type: \"translatable\",\n startOffset: chunkStartOffset,\n endOffset: baseOffset + text.length,\n });\n }\n\n return chunks;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Reassemble chunks back into a document\n * Note: Chunks should not have overlapping content - overlap is only used for context metadata\n */\nexport function reassembleChunks(chunks: Chunk[]): string {\n // Sort chunks by startOffset\n const sorted = [...chunks].sort((a, b) => a.startOffset - b.startOffset);\n\n // Simply concatenate - no overlap handling needed since content doesn't overlap\n return sorted.map((chunk) => chunk.content).join(\"\");\n}\n\n/**\n * Get chunk statistics\n */\nexport function getChunkStats(chunks: Chunk[]): {\n totalChunks: number;\n translatableChunks: number;\n preservedChunks: number;\n totalTokens: number;\n averageTokens: number;\n} {\n const translatableChunks = chunks.filter((c) => c.type === \"translatable\");\n const preservedChunks = chunks.filter((c) => c.type === \"preserve\");\n\n const totalTokens = chunks.reduce(\n (sum, chunk) => sum + estimateTokens(chunk.content),\n 0\n );\n\n return {\n totalChunks: chunks.length,\n translatableChunks: translatableChunks.length,\n preservedChunks: preservedChunks.length,\n totalTokens,\n averageTokens:\n chunks.length > 0 ? Math.round(totalTokens / chunks.length) : 0,\n };\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkStringify from 'remark-stringify';\nimport remarkGfm from 'remark-gfm';\nimport type { Root, RootContent, Text, Code, InlineCode } from 'mdast';\nimport { visit } from 'unist-util-visit';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ParsedDocument {\n /** Original markdown content */\n original: string;\n /** AST representation */\n ast: Root;\n /** Extracted text nodes for translation */\n textNodes: TextNode[];\n}\n\nexport interface TextNode {\n /** Unique identifier for this node */\n id: string;\n /** Text content to translate */\n content: string;\n /** Node type in AST */\n type: string;\n /** Position in source document */\n position?: {\n start: { line: number; column: number; offset?: number };\n end: { line: number; column: number; offset?: number };\n };\n /** Path to node in AST (for restoration) */\n path: number[];\n /** Whether this node should be translated */\n translatable: boolean;\n}\n\nexport interface TranslationMap {\n [nodeId: string]: string;\n}\n\n// ============================================================================\n// Parser Implementation\n// ============================================================================\n\n/**\n * Parse markdown content and extract translatable text nodes\n */\nexport async function parseMarkdown(content: string): Promise<ParsedDocument> {\n const processor = unified()\n .use(remarkParse)\n .use(remarkGfm);\n\n const ast = processor.parse(content) as Root;\n const textNodes = extractTextNodes(ast);\n\n return {\n original: content,\n ast,\n textNodes,\n };\n}\n\n/**\n * Apply translations to AST and stringify back to markdown\n */\nexport async function applyTranslations(\n document: ParsedDocument,\n translations: TranslationMap\n): Promise<string> {\n // Clone the AST to avoid mutating original\n const ast = structuredClone(document.ast);\n\n // Apply translations to each text node\n for (const textNode of document.textNodes) {\n if (!textNode.translatable) continue;\n\n const translation = translations[textNode.id];\n if (!translation) continue;\n\n // Navigate to the node in AST and update its value\n const node = getNodeAtPath(ast, textNode.path);\n if (node && 'value' in node) {\n (node as Text).value = translation;\n }\n }\n\n // Stringify back to markdown\n const processor = unified()\n .use(remarkGfm)\n .use(remarkStringify, {\n bullet: '-',\n emphasis: '*',\n strong: '*',\n fence: '`',\n fences: true,\n listItemIndent: 'one',\n });\n\n const result = processor.stringify(ast);\n return String(result);\n}\n\n// ============================================================================\n// Text Node Extraction\n// ============================================================================\n\nfunction extractTextNodes(ast: Root): TextNode[] {\n const textNodes: TextNode[] = [];\n let nodeId = 0;\n\n visit(ast, (node, index, parent) => {\n // Skip code blocks - they should not be translated\n if (node.type === 'code' || node.type === 'inlineCode') {\n textNodes.push({\n id: `node-${nodeId++}`,\n content: (node as Code | InlineCode).value,\n type: node.type,\n position: node.position,\n path: getNodePath(ast, node, index, parent),\n translatable: false,\n });\n return;\n }\n\n // Extract text nodes\n if (node.type === 'text') {\n const textContent = (node as Text).value;\n\n // Skip empty or whitespace-only text\n if (!textContent.trim()) return;\n\n textNodes.push({\n id: `node-${nodeId++}`,\n content: textContent,\n type: node.type,\n position: node.position,\n path: getNodePath(ast, node, index, parent),\n translatable: true,\n });\n }\n });\n\n return textNodes;\n}\n\n// ============================================================================\n// AST Navigation Helpers\n// ============================================================================\n\nfunction getNodePath(\n _root: Root,\n _node: unknown,\n index: number | undefined,\n parent: unknown\n): number[] {\n const path: number[] = [];\n\n // Build path by traversing up to root\n let currentParent = parent as { children?: unknown[] } | null;\n let currentIndex = index;\n\n while (currentParent && currentIndex !== undefined) {\n path.unshift(currentIndex);\n // Note: This is a simplified path - for full implementation,\n // we'd need to track parent references during traversal\n break;\n }\n\n if (index !== undefined) {\n path.push(index);\n }\n\n return path;\n}\n\nfunction getNodeAtPath(ast: Root, path: number[]): RootContent | null {\n let current: Root | RootContent = ast;\n\n for (const index of path) {\n if ('children' in current && Array.isArray(current.children)) {\n const child: RootContent | undefined = current.children[index];\n if (!child) return null;\n current = child;\n } else {\n return null;\n }\n }\n\n return current as RootContent;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get only translatable text from a parsed document\n */\nexport function getTranslatableText(document: ParsedDocument): string[] {\n return document.textNodes\n .filter((node) => node.translatable)\n .map((node) => node.content);\n}\n\n/**\n * Create a translation map from an array of translations\n * (in same order as getTranslatableText output)\n */\nexport function createTranslationMap(\n document: ParsedDocument,\n translations: string[]\n): TranslationMap {\n const translatableNodes = document.textNodes.filter((node) => node.translatable);\n const map: TranslationMap = {};\n\n for (let i = 0; i < translatableNodes.length && i < translations.length; i++) {\n const node = translatableNodes[i];\n if (node) {\n map[node.id] = translations[i] ?? node.content;\n }\n }\n\n return map;\n}\n\n/**\n * Extract full text content for translation (preserving structure markers)\n *\n * Processing order is important:\n * 1. First, handle fenced code blocks (must be at line start with newline after opener)\n * 2. Then, handle multi-backtick inline code (for examples like ` ```js...``` `)\n * 3. Then, handle single-backtick inline code\n * 4. Finally, handle link URLs\n */\nexport function extractTextForTranslation(content: string): {\n text: string;\n preservedSections: Map<string, string>;\n} {\n const preservedSections = new Map<string, string>();\n let placeholderIndex = 0;\n\n // Step 1: Replace fenced code blocks FIRST (must start at beginning of line with newline)\n // This ensures proper code blocks are captured before multi-backtick inline code\n let text = content.replace(/^[ \\t]*```[^\\n]*\\n[\\s\\S]*?^[ \\t]*```[ \\t]*$/gm, (match) => {\n const placeholder = `__CODE_BLOCK_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 2: Replace multi-backtick inline code (2+ backticks on same line)\n // This catches examples like `` `variable` `` or ` ```js...``` ` in tables\n // Only matches within a single line to avoid matching across paragraphs\n text = text.replace(/(`{2,})(?:[^`\\n]|`(?!\\1))*?\\1/g, (match) => {\n const placeholder = `__INLINE_CODE_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 3: Replace remaining single-backtick inline code\n text = text.replace(/`[^`\\n]+`/g, (match) => {\n const placeholder = `__INLINE_CODE_${placeholderIndex++}__`;\n preservedSections.set(placeholder, match);\n return placeholder;\n });\n\n // Step 4: Replace URLs in links with placeholders\n text = text.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, linkText, url) => {\n const placeholder = `__LINK_URL_${placeholderIndex++}__`;\n preservedSections.set(placeholder, url as string);\n return `[${linkText}](${placeholder})`;\n });\n\n return { text, preservedSections };\n}\n\n/**\n * Restore preserved sections after translation\n *\n * Uses flexible regex matching to handle cases where LLM may have:\n * - Added spaces around placeholders\n * - Changed case\n * - Added extra underscores\n */\nexport function restorePreservedSections(\n translatedText: string,\n preservedSections: Map<string, string>\n): string {\n let result = translatedText;\n\n // Sort by key length descending to handle CODE_BLOCK_12 before CODE_BLOCK_1\n const sortedEntries = [...preservedSections.entries()].sort(\n (a, b) => b[0].length - a[0].length\n );\n\n for (const [placeholder, original] of sortedEntries) {\n // Extract the core identifier (e.g., \"CODE_BLOCK_12\" from \"__CODE_BLOCK_12__\")\n const match = placeholder.match(/^__(.+)__$/);\n if (match && match[1]) {\n const identifier = match[1];\n // Escape any regex special characters in identifier\n const escapedId = identifier.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Create flexible regex that handles:\n // - Optional surrounding spaces (but NOT newlines - use [ \\t]* instead of \\s*)\n // - Extra underscores\n // - Case insensitivity\n // - (?!\\d) ensures CODE_BLOCK_1 doesn't match part of CODE_BLOCK_12\n const flexiblePattern = new RegExp(\n `[ \\\\t]*_*_*[ \\\\t]*${escapedId}(?!\\\\d)[ \\\\t]*_*_*[ \\\\t]*`,\n 'gi'\n );\n // Use function replacement to avoid special character interpretation ($&, $', etc.)\n result = result.replace(flexiblePattern, () => original);\n } else {\n // Fallback to exact replacement - also use function to avoid special chars\n result = result.split(placeholder).join(original);\n }\n }\n\n // Post-process: Ensure proper spacing around inline code\n // This fixes cases where LLM removed spaces around placeholders during translation\n result = ensureInlineCodeSpacing(result);\n\n return result;\n}\n\n/**\n * Ensure proper spacing around inline code backticks.\n * LLMs often remove spaces around placeholders, causing markdown formatting issues.\n *\n * Rules:\n * - Add space before ` if preceded by word char (letter/number/CJK)\n * - Add space before ` if preceded by number+period (markdown list like \"1.\")\n * - Add space after ` if followed by word char/CJK\n * - Don't add spaces at line start/end\n */\nfunction ensureInlineCodeSpacing(text: string): string {\n // Match inline code: backtick(s) + content + same backticks\n // We need to add spaces where they're missing around inline code\n\n // CJK Unicode ranges: \\u3000-\\u9fff\\uac00-\\ud7af (Chinese, Japanese, Korean)\n\n // Add space before inline code if preceded by:\n // - word/CJK character\n // - number followed by period (markdown numbered list: \"1.\")\n let result = text.replace(\n /([\\w\\u3000-\\u9fff\\uac00-\\ud7af])(`+[^`\\n]+`+)/g,\n '$1 $2'\n );\n\n // Handle markdown numbered list case: \"1.`code`\" → \"1. `code`\"\n result = result.replace(\n /(\\d+\\.)(`+[^`\\n]+`+)/g,\n '$1 $2'\n );\n\n // Add space after inline code if followed by word/CJK character\n result = result.replace(\n /(`+[^`\\n]+`+)([\\w\\u3000-\\u9fff\\uac00-\\ud7af])/g,\n '$1 $2'\n );\n\n return result;\n}\n\n/**\n * Simple markdown translation that preserves structure\n * This is the main function to use for translating markdown content\n */\nexport async function translateMarkdownContent(\n content: string,\n translateFn: (text: string) => Promise<string>\n): Promise<string> {\n // Extract text for translation with preserved sections\n const { text, preservedSections } = extractTextForTranslation(content);\n\n // Translate the text\n const translatedText = await translateFn(text);\n\n // Restore preserved sections\n return restorePreservedSections(translatedText, preservedSections);\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n CacheableTextPart,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // Latest Claude 4.5 models\n 'claude-sonnet-4-5-20250929': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.015,\n },\n 'claude-opus-4-5-20251101': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.075,\n },\n 'claude-haiku-4-5-20251001': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.001,\n costPer1kOutput: 0.005,\n },\n // Claude 4 models (previous generation)\n 'claude-sonnet-4-20250514': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.015,\n },\n 'claude-opus-4-20250514': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.075,\n },\n // Claude 3.5 models\n 'claude-3-5-haiku-20241022': {\n maxContextTokens: 200000,\n supportsStreaming: true,\n costPer1kInput: 0.001,\n costPer1kOutput: 0.005,\n },\n};\n\n// Use Claude Haiku 4.5 as default for cost-efficiency\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\n\n// ============================================================================\n// Claude Provider Implementation\n// ============================================================================\n\nexport class ClaudeProvider implements LLMProvider {\n readonly name: ProviderName = 'claude';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createAnthropic>;\n\n constructor(config: ProviderConfig = {}) {\n const apiKey = config.apiKey ?? process.env['ANTHROPIC_API_KEY'];\n\n if (!apiKey) {\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'claude',\n message: 'ANTHROPIC_API_KEY environment variable is not set',\n });\n }\n\n this.client = createAnthropic({\n apiKey,\n baseURL: config.baseUrl,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const messages = this.convertMessages(request.messages) as any;\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n // Extract cache token usage from provider metadata\n const anthropicMeta = result.providerMetadata?.anthropic as\n | {\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n }\n | undefined;\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n cacheReadTokens: anthropicMeta?.cacheReadInputTokens,\n cacheWriteTokens: anthropicMeta?.cacheCreationInputTokens,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format with cache control support\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | CacheableTextPart[];\n }>\n ) {\n return messages.map((msg) => {\n // Simple string content - no caching\n if (typeof msg.content === 'string') {\n return { role: msg.role, content: msg.content };\n }\n\n // Array of parts with potential cache control\n const parts = msg.content.map((part) => ({\n type: 'text' as const,\n text: part.text,\n ...(part.cacheControl && {\n providerOptions: {\n anthropic: { cacheControl: part.cacheControl },\n },\n }),\n }));\n\n return { role: msg.role, content: parts };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const messages = this.convertMessages(request.messages) as any;\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation since exact counting requires API call\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n return (\n MODEL_INFO[modelName] ?? {\n maxContextTokens: 200000,\n supportsStreaming: true,\n }\n );\n }\n\n private handleError(error: unknown): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for rate limiting\n if (\n errorMessage.includes('rate_limit') ||\n errorMessage.includes('429')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_RATE_LIMITED, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n\n // Check for auth errors\n if (\n errorMessage.includes('authentication') ||\n errorMessage.includes('401') ||\n errorMessage.includes('invalid_api_key')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'claude',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n case 'end_turn':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createClaudeProvider(config: ProviderConfig = {}): LLMProvider {\n return new ClaudeProvider(config);\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // GPT-4o models (latest)\n 'gpt-4o': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n 'gpt-4o-2024-11-20': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n 'gpt-4o-2024-08-06': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.0025,\n costPer1kOutput: 0.01,\n },\n // GPT-4o mini (cost-effective)\n 'gpt-4o-mini': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.00015,\n costPer1kOutput: 0.0006,\n },\n 'gpt-4o-mini-2024-07-18': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.00015,\n costPer1kOutput: 0.0006,\n },\n // GPT-4 Turbo\n 'gpt-4-turbo': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.01,\n costPer1kOutput: 0.03,\n },\n 'gpt-4-turbo-2024-04-09': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n costPer1kInput: 0.01,\n costPer1kOutput: 0.03,\n },\n // GPT-4 (original)\n 'gpt-4': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n costPer1kInput: 0.03,\n costPer1kOutput: 0.06,\n },\n // GPT-3.5 Turbo\n 'gpt-3.5-turbo': {\n maxContextTokens: 16385,\n supportsStreaming: true,\n costPer1kInput: 0.0005,\n costPer1kOutput: 0.0015,\n },\n // o1 models (reasoning)\n 'o1': {\n maxContextTokens: 200000,\n supportsStreaming: false,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.06,\n },\n 'o1-preview': {\n maxContextTokens: 128000,\n supportsStreaming: false,\n costPer1kInput: 0.015,\n costPer1kOutput: 0.06,\n },\n 'o1-mini': {\n maxContextTokens: 128000,\n supportsStreaming: false,\n costPer1kInput: 0.003,\n costPer1kOutput: 0.012,\n },\n};\n\n// Use GPT-4o mini as default for cost-efficiency\nconst DEFAULT_MODEL = 'gpt-4o-mini';\n\n// ============================================================================\n// OpenAI Provider Implementation\n// ============================================================================\n\nexport class OpenAIProvider implements LLMProvider {\n readonly name: ProviderName = 'openai';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createOpenAI>;\n\n constructor(config: ProviderConfig = {}) {\n const apiKey = config.apiKey ?? process.env['OPENAI_API_KEY'];\n\n if (!apiKey) {\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'openai',\n message: 'OPENAI_API_KEY environment variable is not set',\n });\n }\n\n this.client = createOpenAI({\n apiKey,\n baseURL: config.baseUrl,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n const messages = this.convertMessages(request.messages);\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format\n * OpenAI doesn't support cache control like Claude, so we simplify content\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>\n ) {\n return messages.map((msg) => {\n // If content is an array of parts, concatenate text\n if (Array.isArray(msg.content)) {\n return {\n role: msg.role,\n content: msg.content.map((part) => part.text).join(''),\n };\n }\n return { role: msg.role, content: msg.content };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n const modelInfo = this.getModelInfo(model);\n\n // o1 models don't support streaming\n if (!modelInfo.supportsStreaming) {\n const response = await this.chat(request);\n yield response.content;\n return;\n }\n\n try {\n const messages = this.convertMessages(request.messages);\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation since exact counting requires tiktoken\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n return (\n MODEL_INFO[modelName] ?? {\n maxContextTokens: 128000,\n supportsStreaming: true,\n }\n );\n }\n\n private handleError(error: unknown): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for rate limiting\n if (\n errorMessage.includes('rate_limit') ||\n errorMessage.includes('429') ||\n errorMessage.includes('Rate limit')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_RATE_LIMITED, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n // Check for auth errors\n if (\n errorMessage.includes('authentication') ||\n errorMessage.includes('401') ||\n errorMessage.includes('invalid_api_key') ||\n errorMessage.includes('Incorrect API key')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n // Check for quota exceeded\n if (\n errorMessage.includes('quota') ||\n errorMessage.includes('insufficient_quota')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'openai',\n message: 'API quota exceeded. Please check your billing settings.',\n });\n }\n\n // Check for context length errors\n if (\n errorMessage.includes('context_length_exceeded') ||\n errorMessage.includes('maximum context length')\n ) {\n return new TranslationError(ErrorCode.CHUNK_TOO_LARGE, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'openai',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createOpenAIProvider(config: ProviderConfig = {}): LLMProvider {\n return new OpenAIProvider(config);\n}\n","import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport type { ProviderName } from '../types/index.js';\nimport type {\n LLMProvider,\n ProviderConfig,\n ChatRequest,\n ChatResponse,\n ModelInfo,\n} from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { estimateTokens } from '../utils/tokens.js';\n\n// ============================================================================\n// Model Information\n// ============================================================================\n\n// Common Ollama models with their context sizes\n// Note: These are estimates - actual limits depend on model variant and system memory\nconst MODEL_INFO: Record<string, ModelInfo> = {\n // Llama 3.x models\n 'llama3.3': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3.2': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3.1': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'llama3': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n // Llama 2 models\n llama2: {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n 'llama2:13b': {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n 'llama2:70b': {\n maxContextTokens: 4096,\n supportsStreaming: true,\n },\n // Mistral models\n mistral: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n 'mistral-nemo': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n mixtral: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n // Qwen models\n qwen2: {\n maxContextTokens: 32768,\n supportsStreaming: true,\n },\n 'qwen2.5': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'qwen2.5-coder': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n // Gemma models\n gemma2: {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n gemma: {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n // Phi models\n phi3: {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n 'phi3:mini': {\n maxContextTokens: 128000,\n supportsStreaming: true,\n },\n // Code models\n codellama: {\n maxContextTokens: 16384,\n supportsStreaming: true,\n },\n 'deepseek-coder': {\n maxContextTokens: 16384,\n supportsStreaming: true,\n },\n // Other popular models\n 'neural-chat': {\n maxContextTokens: 8192,\n supportsStreaming: true,\n },\n vicuna: {\n maxContextTokens: 2048,\n supportsStreaming: true,\n },\n};\n\n// Default to llama3.2 for better multilingual support\nconst DEFAULT_MODEL = 'llama3.2';\nconst DEFAULT_BASE_URL = 'http://localhost:11434';\n\n// ============================================================================\n// Ollama Provider Implementation\n// ============================================================================\n\nexport class OllamaProvider implements LLMProvider {\n readonly name: ProviderName = 'ollama';\n readonly defaultModel: string;\n private readonly client: ReturnType<typeof createOpenAI>;\n private readonly baseUrl: string;\n\n constructor(config: ProviderConfig = {}) {\n this.baseUrl =\n config.baseUrl ??\n process.env['OLLAMA_BASE_URL'] ??\n DEFAULT_BASE_URL;\n\n // Ollama uses OpenAI-compatible API at /v1 endpoint\n this.client = createOpenAI({\n apiKey: 'ollama', // Ollama doesn't require an API key\n baseURL: `${this.baseUrl}/v1`,\n });\n\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const model = request.model ?? this.defaultModel;\n\n try {\n await this.ensureModelAvailable(model);\n\n const messages = this.convertMessages(request.messages);\n\n const result = await generateText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n return {\n content: result.text,\n usage: {\n inputTokens: result.usage?.promptTokens ?? 0,\n outputTokens: result.usage?.completionTokens ?? 0,\n },\n model,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error) {\n throw this.handleError(error, model);\n }\n }\n\n /**\n * Convert messages to Vercel AI SDK format\n * Ollama doesn't support cache control, so we simplify content\n */\n private convertMessages(\n messages: Array<{\n role: 'system' | 'user' | 'assistant';\n content: string | Array<{ type: 'text'; text: string }>;\n }>\n ) {\n return messages.map((msg) => {\n // If content is an array of parts, concatenate text\n if (Array.isArray(msg.content)) {\n return {\n role: msg.role,\n content: msg.content.map((part) => part.text).join(''),\n };\n }\n return { role: msg.role, content: msg.content };\n });\n }\n\n async *stream(request: ChatRequest): AsyncIterable<string> {\n const model = request.model ?? this.defaultModel;\n\n try {\n await this.ensureModelAvailable(model);\n\n const messages = this.convertMessages(request.messages);\n\n const result = streamText({\n model: this.client(model),\n messages,\n temperature: request.temperature ?? 0,\n maxTokens: request.maxTokens ?? 4096,\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n } catch (error) {\n throw this.handleError(error, model);\n }\n }\n\n countTokens(text: string): number {\n // Use estimation for Ollama models\n return estimateTokens(text);\n }\n\n getModelInfo(model?: string): ModelInfo {\n const modelName = model ?? this.defaultModel;\n\n // Try exact match first\n if (MODEL_INFO[modelName]) {\n return MODEL_INFO[modelName];\n }\n\n // Try base model name (e.g., \"llama3.2:7b\" -> \"llama3.2\")\n const baseModel = modelName.split(':')[0] ?? modelName;\n if (baseModel && MODEL_INFO[baseModel]) {\n return MODEL_INFO[baseModel];\n }\n\n // Default fallback\n return {\n maxContextTokens: 4096,\n supportsStreaming: true,\n };\n }\n\n /**\n * Check if the Ollama server is running and the model is available\n */\n private async ensureModelAvailable(model: string): Promise<void> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`);\n\n if (!response.ok) {\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n message: `Ollama server not responding at ${this.baseUrl}`,\n });\n }\n\n const data = (await response.json()) as {\n models?: Array<{ name: string }>;\n };\n const models = data.models ?? [];\n const modelNames = models.map((m) => m.name);\n\n // Check for exact match or base model match\n const modelExists = modelNames.some(\n (name) => name === model || name.startsWith(`${model}:`)\n );\n\n if (!modelExists) {\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n availableModels: modelNames.slice(0, 10), // Show first 10\n message: `Model \"${model}\" not found. Pull it with: ollama pull ${model}`,\n });\n }\n } catch (error) {\n if (error instanceof TranslationError) {\n throw error;\n }\n\n // Connection refused or other network error\n throw new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n baseUrl: this.baseUrl,\n message: `Cannot connect to Ollama server at ${this.baseUrl}. Is Ollama running?`,\n });\n }\n }\n\n private handleError(error: unknown, model?: string): TranslationError {\n if (error instanceof TranslationError) {\n return error;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Check for connection errors\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('fetch failed') ||\n errorMessage.includes('network')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n baseUrl: this.baseUrl,\n message: `Cannot connect to Ollama server at ${this.baseUrl}. Is Ollama running?`,\n });\n }\n\n // Check for model not found\n if (\n errorMessage.includes('model') &&\n errorMessage.includes('not found')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n message: `Model \"${model}\" not found. Pull it with: ollama pull ${model}`,\n });\n }\n\n // Check for context length errors\n if (\n errorMessage.includes('context') ||\n errorMessage.includes('too long')\n ) {\n return new TranslationError(ErrorCode.CHUNK_TOO_LARGE, {\n provider: 'ollama',\n model,\n message: errorMessage,\n });\n }\n\n // Check for out of memory\n if (\n errorMessage.includes('out of memory') ||\n errorMessage.includes('OOM')\n ) {\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n model,\n message: 'Out of memory. Try a smaller model or reduce chunk size.',\n });\n }\n\n return new TranslationError(ErrorCode.PROVIDER_ERROR, {\n provider: 'ollama',\n message: errorMessage,\n });\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction mapFinishReason(\n reason: string | null | undefined\n): 'stop' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'length':\n case 'max_tokens':\n return 'length';\n default:\n return 'error';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createOllamaProvider(config: ProviderConfig = {}): LLMProvider {\n return new OllamaProvider(config);\n}\n","import type { ProviderName } from '../types/index.js';\nimport type { LLMProvider, ProviderConfig, ProviderFactory } from './interface.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport { createClaudeProvider } from './claude.js';\nimport { createOpenAIProvider } from './openai.js';\nimport { createOllamaProvider } from './ollama.js';\n\n// ============================================================================\n// Provider Registry\n// ============================================================================\n\nconst providers = new Map<ProviderName, ProviderFactory>();\n\nexport function registerProvider(\n name: ProviderName,\n factory: ProviderFactory\n): void {\n providers.set(name, factory);\n}\n\nexport function getProvider(\n name: ProviderName,\n config: ProviderConfig = {}\n): LLMProvider {\n const factory = providers.get(name);\n\n if (!factory) {\n throw new TranslationError(ErrorCode.PROVIDER_NOT_FOUND, {\n provider: name,\n available: Array.from(providers.keys()),\n });\n }\n\n return factory(config);\n}\n\nexport function hasProvider(name: ProviderName): boolean {\n return providers.has(name);\n}\n\nexport function getAvailableProviders(): ProviderName[] {\n return Array.from(providers.keys());\n}\n\n// ============================================================================\n// Provider Configuration from Environment\n// ============================================================================\n\nexport function getProviderConfigFromEnv(name: ProviderName): ProviderConfig {\n switch (name) {\n case 'claude':\n return {\n apiKey: process.env['ANTHROPIC_API_KEY'],\n // defaultModel is handled by the provider itself\n };\n\n case 'openai':\n return {\n apiKey: process.env['OPENAI_API_KEY'],\n defaultModel: 'gpt-4o',\n };\n\n case 'ollama':\n return {\n baseUrl: process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434',\n defaultModel: 'llama3.2', // Better multilingual support than llama2\n };\n\n case 'custom':\n return {\n apiKey: process.env['LLM_API_KEY'],\n baseUrl: process.env['LLM_BASE_URL'],\n };\n\n default:\n return {};\n }\n}\n\n// ============================================================================\n// Create Provider with Fallback\n// ============================================================================\n\nexport interface CreateProviderOptions {\n primary: ProviderName;\n fallback?: ProviderName[];\n config?: Partial<Record<ProviderName, ProviderConfig>>;\n}\n\n// ============================================================================\n// Auto-register Built-in Providers\n// ============================================================================\n\nregisterProvider('claude', createClaudeProvider);\nregisterProvider('openai', createOpenAIProvider);\nregisterProvider('ollama', createOllamaProvider);\n\n// ============================================================================\n// Create Provider with Fallback\n// ============================================================================\n\n/**\n * Check if a provider can be used (has required credentials)\n * Ollama doesn't require an API key, only a running server\n */\nfunction canUseProvider(name: ProviderName, config: ProviderConfig): boolean {\n if (!hasProvider(name)) {\n return false;\n }\n\n // Ollama doesn't require an API key\n if (name === 'ollama') {\n return true;\n }\n\n // Other providers require an API key\n return !!config.apiKey;\n}\n\nexport function createProviderWithFallback(\n options: CreateProviderOptions\n): LLMProvider {\n const { primary, fallback = [], config = {} } = options;\n\n // Try primary provider\n const primaryConfig = {\n ...getProviderConfigFromEnv(primary),\n ...config[primary],\n };\n\n if (canUseProvider(primary, primaryConfig)) {\n return getProvider(primary, primaryConfig);\n }\n\n // Try fallback providers\n for (const fallbackName of fallback) {\n const fallbackConfig = {\n ...getProviderConfigFromEnv(fallbackName),\n ...config[fallbackName],\n };\n\n if (canUseProvider(fallbackName, fallbackConfig)) {\n return getProvider(fallbackName, fallbackConfig);\n }\n }\n\n // No provider available\n throw new TranslationError(ErrorCode.PROVIDER_AUTH_FAILED, {\n primary,\n fallback,\n message: 'No API key found for any configured provider',\n });\n}\n","/**\n * Translation Cache Service\n *\n * File-based caching using content hashes to avoid re-translating unchanged content.\n * Cache entries are indexed by a composite key of content hash, target language,\n * glossary hash, provider, and model.\n */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync, readdirSync, statSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { CacheEntry, CacheIndex } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst CACHE_VERSION = '1.0';\nconst INDEX_FILE = 'index.json';\nconst ENTRIES_DIR = 'entries';\n\n// ============================================================================\n// Invalidation Policy Types\n// ============================================================================\n\n/**\n * Context provided to invalidation policies for evaluation\n */\nexport interface InvalidationContext {\n /** Current glossary hash (if glossary is used) */\n glossaryHash?: string;\n /** Previous glossary hash (stored in cache metadata) */\n previousGlossaryHash?: string;\n /** Provider name */\n provider?: string;\n /** Model name */\n model?: string;\n /** Cache entry creation timestamp */\n entryCreatedAt?: string;\n /** Current timestamp */\n currentTime?: Date;\n /** Custom metadata for policy-specific checks */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result of an invalidation check\n */\nexport interface InvalidationResult {\n /** Whether invalidation should occur */\n shouldInvalidate: boolean;\n /** Reason for invalidation (for logging) */\n reason?: string;\n /** Scope of invalidation */\n scope: 'all' | 'matching' | 'none';\n /** Filter function for 'matching' scope - returns true if entry should be invalidated */\n filter?: (entry: CacheEntry, key: string) => boolean;\n}\n\n/**\n * Abstract invalidation policy interface\n */\nexport interface InvalidationPolicy {\n /** Policy name for logging */\n readonly name: string;\n /** Check if cache should be invalidated */\n check(context: InvalidationContext): InvalidationResult;\n}\n\n// ============================================================================\n// Built-in Invalidation Policies\n// ============================================================================\n\n/**\n * Invalidates all cache entries when glossary changes\n */\nexport class GlossaryChangePolicy implements InvalidationPolicy {\n readonly name = 'GlossaryChangePolicy';\n\n private readonly mode: 'all' | 'matching';\n\n /**\n * @param mode - 'all' invalidates entire cache, 'matching' only entries with old glossary hash\n */\n constructor(mode: 'all' | 'matching' = 'all') {\n this.mode = mode;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const { glossaryHash, previousGlossaryHash } = context;\n\n // No glossary or no previous hash - no invalidation needed\n if (!glossaryHash || !previousGlossaryHash) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Glossary hasn't changed\n if (glossaryHash === previousGlossaryHash) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Glossary changed\n if (this.mode === 'all') {\n return {\n shouldInvalidate: true,\n reason: `Glossary changed (${previousGlossaryHash.slice(0, 8)} → ${glossaryHash.slice(0, 8)})`,\n scope: 'all',\n };\n }\n\n // Matching mode - only invalidate entries with old glossary hash\n return {\n shouldInvalidate: true,\n reason: `Glossary changed, invalidating matching entries`,\n scope: 'matching',\n filter: (entry) => entry.glossaryHash === previousGlossaryHash,\n };\n }\n}\n\n/**\n * Invalidates cache entries older than specified TTL\n */\nexport class TTLPolicy implements InvalidationPolicy {\n readonly name = 'TTLPolicy';\n\n private readonly ttlMs: number;\n\n /**\n * @param ttlMs - Time-to-live in milliseconds\n */\n constructor(ttlMs: number) {\n this.ttlMs = ttlMs;\n }\n\n /**\n * Create policy with TTL in hours\n */\n static hours(hours: number): TTLPolicy {\n return new TTLPolicy(hours * 60 * 60 * 1000);\n }\n\n /**\n * Create policy with TTL in days\n */\n static days(days: number): TTLPolicy {\n return new TTLPolicy(days * 24 * 60 * 60 * 1000);\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const currentTime = context.currentTime ?? new Date();\n const ttlMs = this.ttlMs;\n\n return {\n shouldInvalidate: true,\n reason: `TTL check (${this.ttlMs}ms)`,\n scope: 'matching',\n filter: (entry) => {\n const createdAt = new Date(entry.createdAt);\n const age = currentTime.getTime() - createdAt.getTime();\n return age > ttlMs;\n },\n };\n }\n}\n\n/**\n * Invalidates cache entries when provider or model changes\n */\nexport class ProviderChangePolicy implements InvalidationPolicy {\n readonly name = 'ProviderChangePolicy';\n\n private readonly checkModel: boolean;\n\n /**\n * @param checkModel - If true, also invalidate when model changes within same provider\n */\n constructor(checkModel: boolean = true) {\n this.checkModel = checkModel;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const { provider, model } = context;\n\n if (!provider) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n return {\n shouldInvalidate: true,\n reason: `Provider/model mismatch check`,\n scope: 'matching',\n filter: (entry) => {\n if (entry.provider !== provider) return true;\n if (this.checkModel && model && entry.model !== model) return true;\n return false;\n },\n };\n }\n}\n\n/**\n * Invalidates cache entries below a quality threshold\n */\nexport class QualityThresholdPolicy implements InvalidationPolicy {\n readonly name = 'QualityThresholdPolicy';\n\n private readonly threshold: number;\n\n /**\n * @param threshold - Minimum quality score (0-100)\n */\n constructor(threshold: number) {\n this.threshold = threshold;\n }\n\n check(_context: InvalidationContext): InvalidationResult {\n const threshold = this.threshold;\n\n return {\n shouldInvalidate: true,\n reason: `Quality below threshold (${threshold})`,\n scope: 'matching',\n filter: (entry) => entry.qualityScore < threshold,\n };\n }\n}\n\n/**\n * Combines multiple policies - invalidates if ANY policy triggers\n */\nexport class CompositePolicy implements InvalidationPolicy {\n readonly name = 'CompositePolicy';\n\n private readonly policies: InvalidationPolicy[];\n private readonly mode: 'any' | 'all';\n\n /**\n * @param policies - Array of policies to combine\n * @param mode - 'any' triggers if any policy matches, 'all' requires all policies to match\n */\n constructor(policies: InvalidationPolicy[], mode: 'any' | 'all' = 'any') {\n this.policies = policies;\n this.mode = mode;\n }\n\n check(context: InvalidationContext): InvalidationResult {\n const results = this.policies.map((p) => ({\n policy: p,\n result: p.check(context),\n }));\n\n // Collect all filters that want to invalidate\n const activeResults = results.filter((r) => r.result.shouldInvalidate);\n\n if (activeResults.length === 0) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n // Check for 'all' scope - takes priority\n const allScope = activeResults.find((r) => r.result.scope === 'all');\n if (allScope) {\n return {\n shouldInvalidate: true,\n reason: `${allScope.policy.name}: ${allScope.result.reason}`,\n scope: 'all',\n };\n }\n\n // Combine matching filters\n const filters = activeResults\n .filter((r) => r.result.filter)\n .map((r) => r.result.filter!);\n\n if (filters.length === 0) {\n return { shouldInvalidate: false, scope: 'none' };\n }\n\n const reasons = activeResults.map((r) => `${r.policy.name}`).join(', ');\n\n if (this.mode === 'any') {\n return {\n shouldInvalidate: true,\n reason: `Composite (any): ${reasons}`,\n scope: 'matching',\n filter: (entry, key) => filters.some((f) => f(entry, key)),\n };\n } else {\n return {\n shouldInvalidate: true,\n reason: `Composite (all): ${reasons}`,\n scope: 'matching',\n filter: (entry, key) => filters.every((f) => f(entry, key)),\n };\n }\n }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CacheOptions {\n /** Cache directory path */\n cacheDir: string;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Invalidation policies to apply */\n invalidationPolicies?: InvalidationPolicy[];\n}\n\nexport interface CacheKey {\n /** Source content (will be hashed) */\n content: string;\n /** Source language */\n sourceLang: string;\n /** Target language */\n targetLang: string;\n /** Glossary content or hash (will be hashed if string) */\n glossary?: string;\n /** Provider name */\n provider: string;\n /** Model name */\n model: string;\n}\n\nexport interface CacheStats {\n /** Total number of cached entries */\n entries: number;\n /** Total cache size in bytes */\n sizeBytes: number;\n /** Cache version */\n version: string;\n /** Number of entries invalidated by policies */\n invalidated?: number;\n}\n\n/**\n * Cache metadata stored separately for tracking state across sessions\n */\nexport interface CacheMetadata {\n /** Last known glossary hash */\n glossaryHash?: string;\n /** Last known provider */\n provider?: string;\n /** Last known model */\n model?: string;\n /** Last invalidation timestamp */\n lastInvalidation?: string;\n /** Custom metadata */\n custom?: Record<string, unknown>;\n}\n\nexport interface CacheResult {\n /** Whether the entry was found in cache */\n hit: boolean;\n /** The cached entry if found */\n entry?: CacheEntry;\n}\n\n// ============================================================================\n// Hash Utilities\n// ============================================================================\n\n/**\n * Generate SHA-256 hash of content\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 16);\n}\n\n/**\n * Generate cache key from components\n */\nexport function generateCacheKey(key: CacheKey): string {\n const contentHash = hashContent(key.content);\n const glossaryHash = key.glossary ? hashContent(key.glossary) : 'none';\n\n // Create composite key: content_source_target_glossary_provider_model\n return `${contentHash}_${key.sourceLang}_${key.targetLang}_${glossaryHash}_${key.provider}_${key.model}`;\n}\n\n// ============================================================================\n// Cache Manager\n// ============================================================================\n\nexport class CacheManager {\n private cacheDir: string;\n private indexPath: string;\n private entriesDir: string;\n private metadataPath: string;\n private verbose: boolean;\n private index: CacheIndex | null = null;\n private policies: InvalidationPolicy[];\n private metadata: CacheMetadata | null = null;\n\n constructor(options: CacheOptions) {\n this.cacheDir = options.cacheDir;\n this.indexPath = join(this.cacheDir, INDEX_FILE);\n this.entriesDir = join(this.cacheDir, ENTRIES_DIR);\n this.metadataPath = join(this.cacheDir, 'metadata.json');\n this.verbose = options.verbose ?? false;\n this.policies = options.invalidationPolicies ?? [];\n }\n\n /**\n * Initialize cache directory and load index\n */\n private ensureInitialized(): void {\n if (this.index !== null) return;\n\n // Create cache directories if needed\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n if (!existsSync(this.entriesDir)) {\n mkdirSync(this.entriesDir, { recursive: true });\n }\n\n // Load or create index\n if (existsSync(this.indexPath)) {\n try {\n const data = readFileSync(this.indexPath, 'utf-8');\n this.index = JSON.parse(data) as CacheIndex;\n\n // Check version compatibility\n if (this.index.version !== CACHE_VERSION) {\n if (this.verbose) {\n logger.warn(`Cache version mismatch (${this.index.version} vs ${CACHE_VERSION}), clearing cache`);\n }\n this.clearSync();\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n } catch {\n if (this.verbose) {\n logger.warn('Failed to load cache index, creating new one');\n }\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n } else {\n this.index = { version: CACHE_VERSION, entries: {} };\n }\n\n // Load metadata\n this.loadMetadata();\n }\n\n /**\n * Load cache metadata from disk\n */\n private loadMetadata(): void {\n if (existsSync(this.metadataPath)) {\n try {\n const data = readFileSync(this.metadataPath, 'utf-8');\n this.metadata = JSON.parse(data) as CacheMetadata;\n } catch {\n this.metadata = {};\n }\n } else {\n this.metadata = {};\n }\n }\n\n /**\n * Save cache metadata to disk\n */\n private saveMetadata(): void {\n if (!this.metadata) return;\n\n try {\n writeFileSync(this.metadataPath, JSON.stringify(this.metadata, null, 2), 'utf-8');\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to save cache metadata: ${error}`);\n }\n }\n }\n\n /**\n * Update cache metadata\n */\n updateMetadata(updates: Partial<CacheMetadata>): void {\n this.ensureInitialized();\n this.metadata = { ...this.metadata, ...updates };\n this.saveMetadata();\n }\n\n /**\n * Get current cache metadata\n */\n getMetadata(): CacheMetadata {\n this.ensureInitialized();\n return { ...this.metadata! };\n }\n\n /**\n * Apply all configured invalidation policies\n * @returns Number of entries invalidated\n */\n applyPolicies(context: InvalidationContext): number {\n this.ensureInitialized();\n\n if (this.policies.length === 0) {\n return 0;\n }\n\n let totalInvalidated = 0;\n\n for (const policy of this.policies) {\n const result = policy.check({\n ...context,\n previousGlossaryHash: this.metadata?.glossaryHash,\n currentTime: context.currentTime ?? new Date(),\n });\n\n if (!result.shouldInvalidate) {\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Applying ${policy.name}: ${result.reason}`);\n }\n\n if (result.scope === 'all') {\n const count = Object.keys(this.index!.entries).length;\n this.clear();\n totalInvalidated += count;\n break; // No need to check other policies after full clear\n }\n\n if (result.scope === 'matching' && result.filter) {\n const invalidated = this.invalidateMatching(result.filter);\n totalInvalidated += invalidated;\n }\n }\n\n // Update metadata after applying policies\n if (context.glossaryHash) {\n this.metadata!.glossaryHash = context.glossaryHash;\n }\n if (context.provider) {\n this.metadata!.provider = context.provider;\n }\n if (context.model) {\n this.metadata!.model = context.model;\n }\n if (totalInvalidated > 0) {\n this.metadata!.lastInvalidation = new Date().toISOString();\n }\n this.saveMetadata();\n\n return totalInvalidated;\n }\n\n /**\n * Invalidate entries matching a filter function\n * @returns Number of entries invalidated\n */\n invalidateMatching(filter: (entry: CacheEntry, key: string) => boolean): number {\n this.ensureInitialized();\n\n const keysToDelete: string[] = [];\n\n for (const [key, entry] of Object.entries(this.index!.entries)) {\n if (filter(entry, key)) {\n keysToDelete.push(key);\n }\n }\n\n for (const key of keysToDelete) {\n // Remove entry file\n const entryPath = join(this.entriesDir, `${key}.json`);\n try {\n if (existsSync(entryPath)) {\n rmSync(entryPath);\n }\n } catch {\n // Ignore file deletion errors\n }\n\n // Remove from index\n delete this.index!.entries[key];\n }\n\n if (keysToDelete.length > 0) {\n this.saveIndex();\n if (this.verbose) {\n logger.info(`Invalidated ${keysToDelete.length} cache entries`);\n }\n }\n\n return keysToDelete.length;\n }\n\n /**\n * Add an invalidation policy at runtime\n */\n addPolicy(policy: InvalidationPolicy): void {\n this.policies.push(policy);\n }\n\n /**\n * Remove an invalidation policy by name\n */\n removePolicy(name: string): boolean {\n const index = this.policies.findIndex((p) => p.name === name);\n if (index !== -1) {\n this.policies.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get all configured policies\n */\n getPolicies(): InvalidationPolicy[] {\n return [...this.policies];\n }\n\n /**\n * Save index to disk\n */\n private saveIndex(): void {\n if (!this.index) return;\n\n try {\n const dir = dirname(this.indexPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.indexPath, JSON.stringify(this.index, null, 2), 'utf-8');\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to save cache index: ${error}`);\n }\n }\n }\n\n /**\n * Get cached translation if available\n */\n get(key: CacheKey): CacheResult {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n const entry = this.index!.entries[cacheKey];\n\n if (entry) {\n // Verify the entry file exists\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n if (existsSync(entryPath)) {\n if (this.verbose) {\n logger.info(`Cache hit: ${cacheKey.slice(0, 20)}...`);\n }\n return { hit: true, entry };\n } else {\n // Entry in index but file missing, remove from index\n delete this.index!.entries[cacheKey];\n this.saveIndex();\n }\n }\n\n if (this.verbose) {\n logger.debug(`Cache miss: ${cacheKey.slice(0, 20)}...`);\n }\n return { hit: false };\n }\n\n /**\n * Store translation in cache\n */\n set(key: CacheKey, translation: string, qualityScore: number): void {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n const contentHash = hashContent(key.content);\n const glossaryHash = key.glossary ? hashContent(key.glossary) : '';\n\n const entry: CacheEntry = {\n sourceHash: contentHash,\n sourceLang: key.sourceLang,\n targetLang: key.targetLang,\n glossaryHash,\n translation,\n qualityScore,\n createdAt: new Date().toISOString(),\n provider: key.provider,\n model: key.model,\n };\n\n // Save entry file\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n try {\n writeFileSync(entryPath, JSON.stringify(entry, null, 2), 'utf-8');\n\n // Update index\n this.index!.entries[cacheKey] = entry;\n this.saveIndex();\n\n if (this.verbose) {\n logger.info(`Cached: ${cacheKey.slice(0, 20)}...`);\n }\n } catch (error) {\n if (this.verbose) {\n logger.error(`Failed to cache entry: ${error}`);\n }\n }\n }\n\n /**\n * Check if entry exists in cache\n */\n has(key: CacheKey): boolean {\n return this.get(key).hit;\n }\n\n /**\n * Remove entry from cache\n */\n delete(key: CacheKey): boolean {\n this.ensureInitialized();\n\n const cacheKey = generateCacheKey(key);\n\n if (this.index!.entries[cacheKey]) {\n // Remove entry file\n const entryPath = join(this.entriesDir, `${cacheKey}.json`);\n try {\n if (existsSync(entryPath)) {\n rmSync(entryPath);\n }\n } catch {\n // Ignore file deletion errors\n }\n\n // Remove from index\n delete this.index!.entries[cacheKey];\n this.saveIndex();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Clear entire cache (synchronous)\n */\n private clearSync(): void {\n try {\n if (existsSync(this.entriesDir)) {\n rmSync(this.entriesDir, { recursive: true, force: true });\n }\n if (existsSync(this.indexPath)) {\n rmSync(this.indexPath);\n }\n mkdirSync(this.entriesDir, { recursive: true });\n } catch {\n // Ignore errors during clear\n }\n }\n\n /**\n * Clear entire cache\n */\n clear(): void {\n this.clearSync();\n this.index = { version: CACHE_VERSION, entries: {} };\n this.saveIndex();\n\n if (this.verbose) {\n logger.info('Cache cleared');\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n this.ensureInitialized();\n\n let sizeBytes = 0;\n\n // Calculate size of all entry files\n if (existsSync(this.entriesDir)) {\n try {\n const files = readdirSync(this.entriesDir);\n for (const file of files) {\n const filePath = join(this.entriesDir, file);\n try {\n const stat = statSync(filePath);\n sizeBytes += stat.size;\n } catch {\n // Ignore stat errors\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Add index file size\n if (existsSync(this.indexPath)) {\n try {\n const stat = statSync(this.indexPath);\n sizeBytes += stat.size;\n } catch {\n // Ignore stat errors\n }\n }\n\n return {\n entries: Object.keys(this.index?.entries ?? {}).length,\n sizeBytes,\n version: CACHE_VERSION,\n };\n }\n\n /**\n * Get all cached entries (for debugging)\n */\n getAllEntries(): Record<string, CacheEntry> {\n this.ensureInitialized();\n return { ...this.index!.entries };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a cache manager instance\n */\nexport function createCacheManager(options: CacheOptions): CacheManager {\n return new CacheManager(options);\n}\n\n/**\n * Create a no-op cache manager that never caches (for --no-cache mode)\n */\nexport function createNullCacheManager(): CacheManager & { isNull: true } {\n const nullManager = {\n isNull: true as const,\n get: () => ({ hit: false }),\n set: () => {},\n has: () => false,\n delete: () => false,\n clear: () => {},\n getStats: () => ({ entries: 0, sizeBytes: 0, version: CACHE_VERSION }),\n getAllEntries: () => ({}),\n updateMetadata: () => {},\n getMetadata: () => ({}),\n applyPolicies: () => 0,\n invalidateMatching: () => 0,\n addPolicy: () => {},\n removePolicy: () => false,\n getPolicies: () => [],\n };\n\n return nullManager as unknown as CacheManager & { isNull: true };\n}\n\n// ============================================================================\n// Preset Policy Configurations\n// ============================================================================\n\n/**\n * Create default invalidation policies for typical translation workflow\n */\nexport function createDefaultPolicies(): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('all'),\n TTLPolicy.days(30),\n ];\n}\n\n/**\n * Create strict invalidation policies (more aggressive invalidation)\n */\nexport function createStrictPolicies(qualityThreshold: number = 85): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('all'),\n new ProviderChangePolicy(true),\n new QualityThresholdPolicy(qualityThreshold),\n TTLPolicy.days(7),\n ];\n}\n\n/**\n * Create minimal invalidation policies (only glossary changes)\n */\nexport function createMinimalPolicies(): InvalidationPolicy[] {\n return [\n new GlossaryChangePolicy('matching'),\n ];\n}\n","import type {\n TranslateConfig,\n TranslationRequest,\n DocumentResult,\n ChunkResult,\n Chunk,\n DocumentFormat,\n ResolvedGlossary,\n} from '../types/index.js';\nimport type { LLMProvider } from '../providers/interface.js';\nimport { TranslationAgent, createTranslationAgent } from './agent.js';\nimport { chunkContent, getChunkStats } from './chunker.js';\nimport {\n extractTextForTranslation,\n restorePreservedSections,\n} from '../parsers/markdown.js';\nimport { loadGlossary, resolveGlossary } from '../services/glossary.js';\nimport { getProvider, getProviderConfigFromEnv } from '../providers/registry.js';\nimport { logger, createTimer } from '../utils/logger.js';\nimport { TranslationError, ErrorCode } from '../errors.js';\nimport {\n CacheManager,\n createCacheManager,\n createNullCacheManager,\n type CacheKey,\n} from '../services/cache.js';\n\n// ============================================================================\n// Engine Options\n// ============================================================================\n\nexport interface TranslationEngineOptions {\n config: TranslateConfig;\n provider?: LLMProvider;\n verbose?: boolean;\n /** Disable caching (--no-cache mode) */\n noCache?: boolean;\n /** External CacheManager instance (for server mode shared cache) */\n cacheManager?: CacheManager;\n}\n\nexport interface TranslateFileOptions {\n content: string;\n sourceLang: string;\n targetLang: string;\n format?: DocumentFormat;\n glossaryPath?: string;\n qualityThreshold?: number;\n maxIterations?: number;\n context?: string;\n /** Per-language style instruction (e.g., \"경어체\", \"です・ます調\"). Falls back to config.languages.styles[targetLang] if not specified. */\n styleInstruction?: string;\n /** If true, throw error when quality threshold is not met */\n strictQuality?: boolean;\n /** If true, throw error when glossary terms are missed */\n strictGlossary?: boolean;\n}\n\n// ============================================================================\n// Translation Engine\n// ============================================================================\n\nexport class TranslationEngine {\n private config: TranslateConfig;\n private provider: LLMProvider;\n private verbose: boolean;\n private cache: CacheManager;\n private cacheHits = 0;\n private cacheMisses = 0;\n\n constructor(options: TranslationEngineOptions) {\n this.config = options.config;\n this.verbose = options.verbose ?? false;\n\n // Initialize provider\n if (options.provider) {\n this.provider = options.provider;\n } else {\n const providerConfig = getProviderConfigFromEnv(this.config.provider.default);\n // Use model from config if specified (CLI --model option)\n if (this.config.provider.model) {\n providerConfig.defaultModel = this.config.provider.model;\n }\n this.provider = getProvider(this.config.provider.default, providerConfig);\n }\n\n // Initialize cache\n if (options.cacheManager) {\n // Use externally provided cache manager (e.g., server mode)\n this.cache = options.cacheManager;\n if (this.verbose) {\n const stats = this.cache.getStats();\n logger.info(`Using shared cache: ${stats.entries} entries`);\n }\n } else {\n const cacheDisabled = options.noCache || !this.config.paths?.cache;\n if (cacheDisabled) {\n this.cache = createNullCacheManager();\n if (this.verbose && options.noCache) {\n logger.info('Cache disabled (--no-cache)');\n }\n } else {\n this.cache = createCacheManager({\n cacheDir: this.config.paths.cache!,\n verbose: this.verbose,\n });\n if (this.verbose) {\n const stats = this.cache.getStats();\n logger.info(`Cache initialized: ${stats.entries} entries`);\n }\n }\n }\n }\n\n /**\n * Translate a single file/content\n */\n async translateContent(options: TranslateFileOptions): Promise<DocumentResult> {\n const timer = createTimer();\n const format = options.format ?? this.detectFormat(options.content);\n\n if (this.verbose) {\n logger.info(`Translating content (${format} format)`);\n logger.info(`Source: ${options.sourceLang} → Target: ${options.targetLang}`);\n }\n\n // Load glossary if provided\n let glossary: ResolvedGlossary | undefined;\n if (options.glossaryPath) {\n try {\n const rawGlossary = await loadGlossary(options.glossaryPath);\n glossary = resolveGlossary(rawGlossary, options.targetLang);\n if (this.verbose) {\n logger.info(`Loaded glossary: ${glossary.terms.length} terms`);\n }\n } catch (error) {\n if (this.verbose) {\n logger.warn(`Failed to load glossary: ${error}`);\n }\n }\n } else if (this.config.glossary?.path) {\n try {\n const rawGlossary = await loadGlossary(this.config.glossary.path);\n glossary = resolveGlossary(rawGlossary, options.targetLang);\n if (this.verbose) {\n logger.info(`Loaded glossary from config: ${glossary.terms.length} terms`);\n }\n } catch {\n // Glossary is optional\n }\n }\n\n // Process based on format\n let result: DocumentResult;\n\n switch (format) {\n case 'markdown':\n result = await this.translateMarkdown(options, glossary);\n break;\n case 'html':\n // For now, treat HTML as plain text (Phase 2 will add proper HTML support)\n result = await this.translatePlainText(options, glossary);\n break;\n case 'text':\n default:\n result = await this.translatePlainText(options, glossary);\n break;\n }\n\n result.metadata.totalDuration = timer.elapsed();\n\n // Check glossary compliance if glossary is provided\n if (glossary && glossary.terms.length > 0) {\n const compliance = this.checkDocumentGlossaryCompliance(\n options.content,\n result.content,\n glossary\n );\n result.glossaryCompliance = compliance;\n\n if (this.verbose) {\n logger.info(`Glossary compliance: ${compliance.applied.length}/${compliance.applied.length + compliance.missed.length} terms applied`);\n if (compliance.missed.length > 0) {\n logger.warn(`Missed glossary terms: ${compliance.missed.join(', ')}`);\n }\n }\n\n // Strict glossary mode - fail if any terms are missed\n if (options.strictGlossary && !compliance.compliant) {\n throw new TranslationError(ErrorCode.GLOSSARY_COMPLIANCE_FAILED, {\n missed: compliance.missed.join(', '),\n applied: compliance.applied,\n total: glossary.terms.length,\n });\n }\n }\n\n if (this.verbose) {\n logger.success(`Translation complete in ${timer.format()}`);\n logger.info(`Average quality: ${result.metadata.averageQuality.toFixed(1)}/100`);\n }\n\n return result;\n }\n\n /**\n * Check glossary compliance for the entire document\n */\n private checkDocumentGlossaryCompliance(\n sourceContent: string,\n translatedContent: string,\n glossary: ResolvedGlossary\n ): { applied: string[]; missed: string[]; compliant: boolean } {\n const applied: string[] = [];\n const missed: string[] = [];\n const sourceLower = sourceContent.toLowerCase();\n const translatedLower = translatedContent.toLowerCase();\n\n for (const term of glossary.terms) {\n // Check if source term exists in original content\n const sourceInContent = term.caseSensitive\n ? sourceContent.includes(term.source)\n : sourceLower.includes(term.source.toLowerCase());\n\n if (!sourceInContent) {\n // Term not in source, skip\n continue;\n }\n\n // Check if target term exists in translated content\n const targetInTranslation = term.caseSensitive\n ? translatedContent.includes(term.target)\n : translatedLower.includes(term.target.toLowerCase());\n\n if (targetInTranslation) {\n applied.push(term.source);\n } else {\n missed.push(term.source);\n }\n }\n\n return {\n applied,\n missed,\n compliant: missed.length === 0,\n };\n }\n\n // ============================================================================\n // Format-Specific Translation\n // ============================================================================\n\n private async translateMarkdown(\n options: TranslateFileOptions,\n glossary?: ResolvedGlossary\n ): Promise<DocumentResult> {\n // Extract text for translation, preserving code blocks etc.\n const { text, preservedSections } = extractTextForTranslation(options.content);\n\n // Chunk the content\n const chunks = chunkContent(text, {\n maxTokens: this.config.chunking.maxTokens,\n overlapTokens: this.config.chunking.overlapTokens,\n });\n\n if (this.verbose) {\n const stats = getChunkStats(chunks);\n logger.info(`Chunked into ${stats.translatableChunks} translatable sections`);\n }\n\n // Create translation agent\n const agent = createTranslationAgent({\n provider: this.provider,\n qualityThreshold: options.qualityThreshold ?? this.config.quality.threshold,\n maxIterations: options.maxIterations ?? this.config.quality.maxIterations,\n verbose: this.verbose,\n strictQuality: options.strictQuality,\n });\n\n // Translate each chunk\n const chunkResults: ChunkResult[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalIterations = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n if (!chunk) continue;\n\n if (chunk.type === 'preserve') {\n // Keep preserved content as-is\n chunkResults.push({\n original: chunk.content,\n translated: chunk.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 100,\n });\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Translating chunk ${i + 1}/${chunks.length}...`);\n }\n\n const result = await this.translateChunk(chunk, options, glossary, agent);\n chunkResults.push(result);\n\n // Accumulate token and iteration counts\n if (result.tokensUsed) {\n totalInputTokens += result.tokensUsed.input;\n totalOutputTokens += result.tokensUsed.output;\n }\n if (result.iterations) {\n totalIterations += result.iterations;\n }\n }\n\n // Reassemble translated content\n const translatedText = chunkResults.map((r) => r.translated).join('');\n\n // Restore preserved sections\n const finalContent = restorePreservedSections(translatedText, preservedSections);\n\n // Calculate average quality\n const qualityScores = chunkResults\n .filter((r) => r.qualityScore > 0)\n .map((r) => r.qualityScore);\n const averageQuality =\n qualityScores.length > 0\n ? qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length\n : 0;\n\n // Calculate cache statistics from chunk results\n const cacheHits = chunkResults.filter((r) => r.cached).length;\n const cacheMisses = chunkResults.filter((r) => !r.cached && r.qualityScore > 0).length;\n\n return {\n content: finalContent,\n chunks: chunkResults,\n metadata: {\n totalTokensUsed: totalInputTokens + totalOutputTokens,\n totalDuration: 0, // Will be set by caller\n averageQuality,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n totalIterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n },\n },\n };\n }\n\n private async translatePlainText(\n options: TranslateFileOptions,\n glossary?: ResolvedGlossary\n ): Promise<DocumentResult> {\n // Chunk the content\n const chunks = chunkContent(options.content, {\n maxTokens: this.config.chunking.maxTokens,\n overlapTokens: this.config.chunking.overlapTokens,\n });\n\n // Create translation agent\n const agent = createTranslationAgent({\n provider: this.provider,\n qualityThreshold: options.qualityThreshold ?? this.config.quality.threshold,\n maxIterations: options.maxIterations ?? this.config.quality.maxIterations,\n verbose: this.verbose,\n strictQuality: options.strictQuality,\n });\n\n // Translate each chunk\n const chunkResults: ChunkResult[] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalIterations = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n if (!chunk) continue;\n\n if (chunk.type === 'preserve') {\n chunkResults.push({\n original: chunk.content,\n translated: chunk.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 100,\n });\n continue;\n }\n\n if (this.verbose) {\n logger.info(`Translating chunk ${i + 1}/${chunks.length}...`);\n }\n\n const result = await this.translateChunk(chunk, options, glossary, agent);\n chunkResults.push(result);\n\n // Accumulate token and iteration counts\n if (result.tokensUsed) {\n totalInputTokens += result.tokensUsed.input;\n totalOutputTokens += result.tokensUsed.output;\n }\n if (result.iterations) {\n totalIterations += result.iterations;\n }\n }\n\n // Reassemble\n const translatedContent = chunkResults.map((r) => r.translated).join('');\n\n // Calculate average quality\n const qualityScores = chunkResults\n .filter((r) => r.qualityScore > 0)\n .map((r) => r.qualityScore);\n const averageQuality =\n qualityScores.length > 0\n ? qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length\n : 0;\n\n // Calculate cache statistics from chunk results\n const cacheHits = chunkResults.filter((r) => r.cached).length;\n const cacheMisses = chunkResults.filter((r) => !r.cached && r.qualityScore > 0).length;\n\n return {\n content: translatedContent,\n chunks: chunkResults,\n metadata: {\n totalTokensUsed: totalInputTokens + totalOutputTokens,\n totalDuration: 0,\n averageQuality,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n totalIterations,\n tokensUsed: {\n input: totalInputTokens,\n output: totalOutputTokens,\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n },\n },\n };\n }\n\n private async translateChunk(\n chunk: Chunk,\n options: TranslateFileOptions,\n glossary: ResolvedGlossary | undefined,\n agent: TranslationAgent\n ): Promise<ChunkResult> {\n // Build cache key\n const glossaryString = glossary\n ? JSON.stringify(glossary.terms.map((t) => ({ s: t.source, t: t.target })))\n : undefined;\n\n const cacheKey: CacheKey = {\n content: chunk.content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n glossary: glossaryString,\n provider: this.provider.name,\n model: this.config.provider.model ?? this.provider.defaultModel,\n };\n\n // Check cache first\n const cacheResult = this.cache.get(cacheKey);\n if (cacheResult.hit && cacheResult.entry) {\n this.cacheHits++;\n if (this.verbose) {\n logger.info(` ↳ Cache hit (quality: ${cacheResult.entry.qualityScore})`);\n }\n return {\n original: chunk.content,\n translated: cacheResult.entry.translation,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: cacheResult.entry.qualityScore,\n iterations: 0,\n tokensUsed: { input: 0, output: 0, cacheRead: 1 },\n cached: true,\n };\n }\n\n this.cacheMisses++;\n\n // Build context from chunk metadata and options\n // Resolve style instruction: CLI option > config.languages.styles[targetLang]\n const resolvedStyleInstruction =\n options.styleInstruction ?? this.config.languages.styles?.[options.targetLang];\n\n const context: TranslationRequest['context'] = {\n documentPurpose: options.context,\n styleInstruction: resolvedStyleInstruction,\n };\n\n // Add header hierarchy context if available\n if (chunk.metadata?.headerHierarchy && chunk.metadata.headerHierarchy.length > 0) {\n context.documentSummary = `Current section: ${chunk.metadata.headerHierarchy.join(' > ')}`;\n }\n\n // Add previous context if available\n if (chunk.metadata?.previousContext) {\n context.previousChunks = [chunk.metadata.previousContext];\n }\n\n const request: TranslationRequest = {\n content: chunk.content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: options.format ?? 'text',\n glossary,\n context,\n };\n\n try {\n const result = await agent.translate(request);\n\n // Store in cache\n this.cache.set(cacheKey, result.content, result.metadata.qualityScore);\n\n return {\n original: chunk.content,\n translated: result.content,\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: result.metadata.qualityScore,\n iterations: result.metadata.iterations,\n tokensUsed: result.metadata.tokensUsed,\n };\n } catch (error) {\n // Log error but continue with original content\n logger.error(`Failed to translate chunk: ${error}`);\n\n return {\n original: chunk.content,\n translated: chunk.content, // Fallback to original\n startOffset: chunk.startOffset,\n endOffset: chunk.endOffset,\n qualityScore: 0,\n iterations: 0,\n tokensUsed: { input: 0, output: 0 },\n };\n }\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n private detectFormat(content: string): DocumentFormat {\n // Check for markdown indicators\n if (\n content.includes('# ') ||\n content.includes('## ') ||\n content.includes('```') ||\n content.includes('- ') ||\n content.match(/\\[.+\\]\\(.+\\)/)\n ) {\n return 'markdown';\n }\n\n // Check for HTML indicators\n if (\n content.includes('<html') ||\n content.includes('<body') ||\n content.includes('<div') ||\n content.includes('<p>')\n ) {\n return 'html';\n }\n\n return 'text';\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createTranslationEngine(\n options: TranslationEngineOptions\n): TranslationEngine {\n return new TranslationEngine(options);\n}\n\n// ============================================================================\n// Simple Translation Function (for direct use)\n// ============================================================================\n\nexport async function translateText(\n content: string,\n sourceLang: string,\n targetLang: string,\n options?: {\n provider?: LLMProvider;\n glossaryPath?: string;\n qualityThreshold?: number;\n maxIterations?: number;\n verbose?: boolean;\n }\n): Promise<string> {\n const defaultConfig: TranslateConfig = {\n version: '1.0',\n languages: { source: sourceLang, targets: [targetLang] },\n provider: { default: 'claude' },\n quality: {\n threshold: options?.qualityThreshold ?? 85,\n maxIterations: options?.maxIterations ?? 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: { output: './' },\n };\n\n const engine = createTranslationEngine({\n config: defaultConfig,\n provider: options?.provider,\n verbose: options?.verbose,\n });\n\n const result = await engine.translateContent({\n content,\n sourceLang,\n targetLang,\n glossaryPath: options?.glossaryPath,\n qualityThreshold: options?.qualityThreshold,\n maxIterations: options?.maxIterations,\n });\n\n return result.content;\n}\n","import { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { resolve, dirname, basename, extname } from 'node:path';\nimport { mkdir } from 'node:fs/promises';\nimport type { FileCommandOptions } from '../options.js';\nimport { defaults } from '../options.js';\nimport { loadConfig, mergeConfig } from '../../services/config.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { logger, configureLogger } from '../../utils/logger.js';\nimport { TranslationError, getExitCode } from '../../errors.js';\nimport type { DocumentFormat } from '../../types/index.js';\n\nexport const fileCommand = new Command('file')\n .description('Translate a single file')\n .argument('<input>', 'Input file path')\n .argument('[output]', 'Output file path (optional)')\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option('-g, --glossary <path>', 'Path to glossary file')\n .option(\n '-p, --provider <name>',\n 'LLM provider (claude|openai|ollama)',\n defaults.provider\n )\n .option('-m, --model <name>', 'Model name')\n .option(\n '--quality <0-100>',\n 'Quality threshold',\n String(defaults.quality)\n )\n .option(\n '--max-iterations <n>',\n 'Max refinement iterations',\n String(defaults.maxIterations)\n )\n .option('-o, --output <path>', 'Output path')\n .option('-f, --format <fmt>', 'Force output format (md|html|txt)')\n .option('--dry-run', 'Show what would be translated')\n .option('--json', 'Output results as JSON')\n .option(\n '--chunk-size <tokens>',\n 'Max tokens per chunk',\n String(defaults.chunkSize)\n )\n .option('--no-cache', 'Disable translation cache')\n .option('--context <text>', 'Additional context for translation')\n .option('--strict-quality', 'Fail if quality threshold is not met')\n .option('--strict-glossary', 'Fail if glossary terms are not applied')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output')\n .action(async (input: string, output: string | undefined, options: FileCommandOptions) => {\n try {\n // Configure logger\n configureLogger({\n level: options.verbose ? 'debug' : 'info',\n quiet: options.quiet ?? false,\n json: options.json ?? false,\n });\n\n // Validate required options\n if (!options.sourceLang) {\n console.error('Error: Source language (-s, --source-lang) is required');\n process.exit(2);\n }\n\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n chunkSize: options.chunkSize ? parseInt(options.chunkSize, 10) : undefined,\n glossary: options.glossary,\n noCache: options.cache === false,\n });\n\n // Read input file\n const inputPath = resolve(input);\n let content: string;\n\n try {\n content = await readFile(inputPath, 'utf-8');\n } catch (error) {\n console.error(`Error: Could not read file '${inputPath}'`);\n process.exit(3);\n }\n\n if (!options.quiet) {\n logger.info(`Reading: ${inputPath}`);\n logger.info(`Translating: ${options.sourceLang} → ${options.targetLang}`);\n if (options.glossary) {\n logger.info(`Glossary: ${resolve(options.glossary)}`);\n }\n }\n\n // Dry run - just show what would be done\n if (options.dryRun) {\n console.log('Dry run mode - no translation will be performed');\n console.log(`Input: ${inputPath}`);\n console.log(`Output: ${output ?? determineOutputPath(inputPath, options.targetLang)}`);\n console.log(`Source language: ${options.sourceLang}`);\n console.log(`Target language: ${options.targetLang}`);\n console.log(`Content length: ${content.length} characters`);\n return;\n }\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: options.verbose,\n noCache: options.cache === false,\n });\n\n // Translate content\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n strictQuality: options.strictQuality,\n strictGlossary: options.strictGlossary,\n });\n\n // Determine output path\n const outputPath = output ?? options.output ?? determineOutputPath(inputPath, options.targetLang);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write output\n await writeFile(outputPath, result.content, 'utf-8');\n\n // Output results\n if (options.json) {\n console.log(JSON.stringify({\n success: true,\n input: inputPath,\n output: outputPath,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n quality: result.metadata.averageQuality,\n duration: result.metadata.totalDuration,\n chunks: result.chunks.length,\n provider: result.metadata.provider,\n model: result.metadata.model,\n iterations: result.metadata.totalIterations,\n tokensUsed: result.metadata.tokensUsed,\n }, null, 2));\n } else if (!options.quiet) {\n logger.success(`Written to ${outputPath}`);\n console.log('');\n console.log(' Translation Summary:');\n console.log(` - Model: ${result.metadata.provider}/${result.metadata.model}`);\n console.log(` - Quality: ${result.metadata.averageQuality.toFixed(0)}/100`);\n console.log(` - Chunks: ${result.chunks.length}`);\n console.log(` - Iterations: ${result.metadata.totalIterations}`);\n console.log(` - Tokens: ${result.metadata.tokensUsed.input.toLocaleString()} input / ${result.metadata.tokensUsed.output.toLocaleString()} output`);\n console.log(` - Duration: ${(result.metadata.totalDuration / 1000).toFixed(1)}s`);\n }\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n/**\n * Handle stdin/stdout translation mode\n */\nexport async function handleStdinTranslation(\n options: FileCommandOptions\n): Promise<void> {\n try {\n // Configure logger for quiet mode (stdout is for translation output)\n configureLogger({\n level: 'error',\n quiet: true,\n json: false,\n });\n\n // Validate required options\n if (!options.sourceLang) {\n console.error('Error: Source language (-s, --source-lang) is required');\n process.exit(2);\n }\n\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Read from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n const content = Buffer.concat(chunks).toString('utf-8');\n\n if (!content.trim()) {\n console.error('Error: No input provided');\n process.exit(2);\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n glossary: options.glossary,\n });\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: false,\n noCache: options.cache === false,\n });\n\n // Translate content\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n });\n\n // Output to stdout\n process.stdout.write(result.content);\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction determineOutputPath(inputPath: string, targetLang: string): string {\n const dir = dirname(inputPath);\n const ext = extname(inputPath);\n const base = basename(inputPath, ext);\n\n return resolve(dir, `${base}.${targetLang}${ext}`);\n}\n\nfunction mapFormat(format: string | undefined): DocumentFormat | undefined {\n if (!format) return undefined;\n\n switch (format.toLowerCase()) {\n case 'md':\n case 'markdown':\n return 'markdown';\n case 'html':\n return 'html';\n case 'txt':\n case 'text':\n return 'text';\n default:\n return undefined;\n }\n}\n","import { Command } from 'commander';\nimport { fileCommand } from './commands/file.js';\nimport { dirCommand } from './commands/dir.js';\nimport { initCommand } from './commands/init.js';\nimport { glossaryCommand } from './commands/glossary.js';\nimport { serveCommand } from './commands/serve.js';\n\nconst program = new Command();\n\nprogram\n .name('llm-translate')\n .description(\n 'CLI-based document translation tool powered by LLMs with glossary enforcement'\n )\n .version('0.1.0')\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ============================================================================\n// Global Options (for stdin/stdout mode)\n// ============================================================================\n\nprogram\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option(\n '-c, --config <path>',\n 'Path to config file (default: .translaterc.json)'\n )\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output');\n\n// ============================================================================\n// Commands\n// ============================================================================\n\nprogram.addCommand(fileCommand);\nprogram.addCommand(dirCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(glossaryCommand);\nprogram.addCommand(serveCommand);\n\n// ============================================================================\n// Stdin/Stdout Mode (default when no command specified)\n// ============================================================================\n\nprogram.action(async (options) => {\n // Handle stdin/stdout translation when piped\n if (!process.stdin.isTTY) {\n const { handleStdinTranslation } = await import('./commands/file.js');\n await handleStdinTranslation(options);\n } else {\n program.help();\n }\n});\n\n// ============================================================================\n// Parse and Execute\n// ============================================================================\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","import { Command } from 'commander';\nimport { readFile, writeFile, readdir, mkdir } from 'node:fs/promises';\nimport { resolve, dirname, relative, join } from 'node:path';\nimport type { DirCommandOptions } from '../options.js';\nimport { defaults } from '../options.js';\nimport { loadConfig, mergeConfig } from '../../services/config.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { logger, configureLogger } from '../../utils/logger.js';\nimport { TranslationError, getExitCode } from '../../errors.js';\nimport type { DocumentFormat, DocumentResult } from '../../types/index.js';\n\nexport const dirCommand = new Command('dir')\n .description('Translate all files in a directory')\n .argument('<input>', 'Input directory path')\n .argument('<output>', 'Output directory path')\n .option('-s, --source-lang <lang>', 'Source language code')\n .option('-t, --target-lang <lang>', 'Target language code')\n .option('-g, --glossary <path>', 'Path to glossary file')\n .option(\n '-p, --provider <name>',\n 'LLM provider (claude|openai|ollama)',\n defaults.provider\n )\n .option('-m, --model <name>', 'Model name')\n .option(\n '--quality <0-100>',\n 'Quality threshold',\n String(defaults.quality)\n )\n .option(\n '--max-iterations <n>',\n 'Max refinement iterations',\n String(defaults.maxIterations)\n )\n .option('-f, --format <fmt>', 'Force output format (md|html|txt)')\n .option('--dry-run', 'Show what would be translated')\n .option('--json', 'Output results as JSON')\n .option(\n '--chunk-size <tokens>',\n 'Max tokens per chunk',\n String(defaults.chunkSize)\n )\n .option(\n '--parallel <n>',\n 'Parallel file processing',\n String(defaults.parallel)\n )\n .option('--no-cache', 'Disable translation cache')\n .option('--context <text>', 'Additional context for translation')\n .option('--include <patterns>', 'File patterns to include (comma-separated)', '*.md,*.markdown')\n .option('--exclude <patterns>', 'File patterns to exclude (comma-separated)')\n .option('-v, --verbose', 'Enable verbose logging')\n .option('-q, --quiet', 'Suppress non-error output')\n .action(async (input: string, output: string, options: DirCommandOptions & { include?: string; exclude?: string }) => {\n try {\n // Configure logger\n configureLogger({\n level: options.verbose ? 'debug' : 'info',\n quiet: options.quiet ?? false,\n json: options.json ?? false,\n });\n\n // Validate required options\n if (!options.targetLang) {\n console.error('Error: Target language (-t, --target-lang) is required');\n process.exit(2);\n }\n\n // Resolve paths\n const inputDir = resolve(input);\n const outputDir = resolve(output);\n\n // Parse include/exclude patterns\n const includePatterns = options.include?.split(',').map(p => p.trim()) ?? ['*.md', '*.markdown'];\n const excludePatterns = options.exclude?.split(',').map(p => p.trim()) ?? [];\n\n // Find all matching files (exclude output directory and locale directories)\n const files = await findFiles(inputDir, includePatterns, excludePatterns, outputDir);\n\n if (files.length === 0) {\n console.log('No files found matching the specified patterns');\n return;\n }\n\n if (!options.quiet) {\n logger.info(`Found ${files.length} file(s) to translate`);\n logger.info(`Input: ${inputDir}`);\n logger.info(`Output: ${outputDir}`);\n logger.info(`Target language: ${options.targetLang}`);\n if (options.glossary) {\n logger.info(`Glossary: ${resolve(options.glossary)}`);\n }\n }\n\n // Dry run - just show what would be done\n if (options.dryRun) {\n console.log('\\nDry run mode - no translation will be performed\\n');\n console.log('Files to translate:');\n for (const file of files) {\n const relativePath = relative(inputDir, file);\n const outputPath = join(outputDir, relativePath);\n console.log(` ${relativePath} → ${relative(process.cwd(), outputPath)}`);\n }\n console.log(`\\nTotal: ${files.length} file(s)`);\n return;\n }\n\n // Load configuration\n const baseConfig = await loadConfig({ configPath: options.config });\n const config = mergeConfig(baseConfig, {\n sourceLang: options.sourceLang,\n targetLang: options.targetLang,\n provider: options.provider,\n model: options.model,\n quality: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n chunkSize: options.chunkSize ? parseInt(options.chunkSize, 10) : undefined,\n glossary: options.glossary,\n noCache: options.cache === false,\n });\n\n // Create translation engine\n const engine = createTranslationEngine({\n config,\n verbose: options.verbose,\n noCache: options.cache === false,\n });\n\n // Process files\n const parallelCount = typeof options.parallel === 'string'\n ? parseInt(options.parallel, 10)\n : (options.parallel ?? defaults.parallel);\n\n if (!options.quiet) {\n logger.info(`Parallel processing: ${parallelCount} file(s) at a time`);\n }\n\n const results = await processFiles(\n files,\n inputDir,\n outputDir,\n engine,\n options,\n parallelCount\n );\n\n // Output results\n outputResults(results, options);\n\n } catch (error) {\n if (error instanceof TranslationError) {\n console.error(`Error: ${error.message}`);\n process.exit(getExitCode(error));\n }\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FileResult {\n inputPath: string;\n outputPath: string;\n relativePath: string;\n success: boolean;\n error?: string;\n result?: DocumentResult;\n duration: number;\n}\n\ninterface DirResults {\n files: FileResult[];\n totalDuration: number;\n successCount: number;\n failCount: number;\n totalTokensInput: number;\n totalTokensOutput: number;\n totalCacheRead: number;\n totalCacheWrite: number;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Find all files matching the include patterns and not matching exclude patterns\n */\nasync function findFiles(\n dir: string,\n includePatterns: string[],\n excludePatterns: string[],\n outputDir?: string\n): Promise<string[]> {\n const files: string[] = [];\n\n // If output is inside input dir, exclude it\n const outputRelative = outputDir ? relative(dir, outputDir) : null;\n const isOutputInsideInput = outputRelative && !outputRelative.startsWith('..');\n\n async function scan(currentDir: string): Promise<void> {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n const relativePath = relative(dir, fullPath);\n\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n if (entry.isDirectory()) {\n // Skip output directory if it's inside input directory\n if (isOutputInsideInput && relativePath === outputRelative) {\n continue;\n }\n\n // Also skip common locale directories (2-letter codes like ko, ja, zh)\n if (/^[a-z]{2}(-[A-Z]{2})?$/.test(entry.name)) {\n continue;\n }\n\n // Check if directory should be excluded\n if (!matchesPatterns(relativePath + '/', excludePatterns)) {\n await scan(fullPath);\n }\n } else if (entry.isFile()) {\n // Check if file matches include patterns and not exclude patterns\n if (\n matchesPatterns(entry.name, includePatterns) &&\n !matchesPatterns(relativePath, excludePatterns)\n ) {\n files.push(fullPath);\n }\n }\n }\n }\n\n await scan(dir);\n return files.sort();\n}\n\n/**\n * Check if a path matches any of the given glob patterns\n */\nfunction matchesPatterns(path: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (matchGlob(path, pattern)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Simple glob matching (supports * and **)\n */\nfunction matchGlob(path: string, pattern: string): boolean {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*\\*/g, '{{DOUBLESTAR}}') // Temp placeholder for **\n .replace(/\\*/g, '[^/]*') // * matches anything except /\n .replace(/{{DOUBLESTAR}}/g, '.*') // ** matches anything including /\n .replace(/\\?/g, '.'); // ? matches single char\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n}\n\n/**\n * Process files with parallel execution using worker pool pattern.\n * As soon as one file completes, the next file starts immediately.\n */\nasync function processFiles(\n files: string[],\n inputDir: string,\n outputDir: string,\n engine: ReturnType<typeof createTranslationEngine>,\n options: DirCommandOptions & { include?: string; exclude?: string },\n parallelCount: number\n): Promise<DirResults> {\n const startTime = Date.now();\n const results: FileResult[] = new Array(files.length);\n let completed = 0;\n let nextIndex = 0;\n\n // Process a single file and return the result\n const processFile = async (inputPath: string, _index: number): Promise<FileResult> => {\n const relativePath = relative(inputDir, inputPath);\n const outputPath = join(outputDir, relativePath);\n const fileStartTime = Date.now();\n\n try {\n // Read input file\n const content = await readFile(inputPath, 'utf-8');\n\n // Translate\n const result = await engine.translateContent({\n content,\n sourceLang: options.sourceLang,\n targetLang: options.targetLang!,\n format: mapFormat(options.format),\n glossaryPath: options.glossary,\n qualityThreshold: options.quality ? parseInt(options.quality, 10) : undefined,\n maxIterations: options.maxIterations ? parseInt(options.maxIterations, 10) : undefined,\n context: options.context,\n });\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n // Write output\n await writeFile(outputPath, result.content, 'utf-8');\n\n completed++;\n if (!options.quiet && !options.json) {\n const progress = `[${completed}/${files.length}]`;\n logger.success(`${progress} ${relativePath}`);\n }\n\n return {\n inputPath,\n outputPath,\n relativePath,\n success: true,\n result,\n duration: Date.now() - fileStartTime,\n };\n } catch (error) {\n completed++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (!options.quiet && !options.json) {\n const progress = `[${completed}/${files.length}]`;\n logger.error(`${progress} ${relativePath}: ${errorMessage}`);\n }\n\n return {\n inputPath,\n outputPath,\n relativePath,\n success: false,\n error: errorMessage,\n duration: Date.now() - fileStartTime,\n };\n }\n };\n\n // Worker function: continuously process files until none remain\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= files.length) break;\n\n const inputPath = files[index];\n if (!inputPath) break;\n\n const result = await processFile(inputPath, index);\n results[index] = result;\n }\n };\n\n // Start workers (up to parallelCount or file count, whichever is smaller)\n const workerCount = Math.min(parallelCount, files.length);\n const workers = Array.from({ length: workerCount }, () => worker());\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // Calculate totals\n const successResults = results.filter(r => r.success && r.result);\n const totalTokensInput = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.input ?? 0), 0);\n const totalTokensOutput = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.output ?? 0), 0);\n const totalCacheRead = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.cacheRead ?? 0), 0);\n const totalCacheWrite = successResults.reduce((sum, r) => sum + (r.result?.metadata.tokensUsed.cacheWrite ?? 0), 0);\n\n return {\n files: results,\n totalDuration: Date.now() - startTime,\n successCount: results.filter(r => r.success).length,\n failCount: results.filter(r => !r.success).length,\n totalTokensInput,\n totalTokensOutput,\n totalCacheRead,\n totalCacheWrite,\n };\n}\n\n/**\n * Output results summary\n */\nfunction outputResults(results: DirResults, options: DirCommandOptions): void {\n if (options.json) {\n console.log(JSON.stringify({\n success: results.failCount === 0,\n totalFiles: results.files.length,\n successCount: results.successCount,\n failCount: results.failCount,\n totalDuration: results.totalDuration,\n tokensUsed: {\n input: results.totalTokensInput,\n output: results.totalTokensOutput,\n cacheRead: results.totalCacheRead,\n cacheWrite: results.totalCacheWrite,\n },\n files: results.files.map(f => ({\n input: f.relativePath,\n output: f.outputPath,\n success: f.success,\n error: f.error,\n duration: f.duration,\n quality: f.result?.metadata.averageQuality ?? 0,\n tokens: f.result ? {\n input: f.result.metadata.tokensUsed.input,\n output: f.result.metadata.tokensUsed.output,\n } : undefined,\n })),\n }, null, 2));\n return;\n }\n\n if (options.quiet) {\n return;\n }\n\n console.log('');\n console.log('─'.repeat(60));\n console.log(' Translation Summary');\n console.log('─'.repeat(60));\n console.log(` Files: ${results.successCount} succeeded, ${results.failCount} failed`);\n console.log(` Duration: ${(results.totalDuration / 1000).toFixed(1)}s`);\n console.log(` Tokens: ${results.totalTokensInput.toLocaleString()} input / ${results.totalTokensOutput.toLocaleString()} output`);\n\n if (results.totalCacheRead > 0 || results.totalCacheWrite > 0) {\n console.log(` Cache: ${results.totalCacheRead.toLocaleString()} read / ${results.totalCacheWrite.toLocaleString()} write`);\n }\n\n if (results.failCount > 0) {\n console.log('');\n console.log(' Failed files:');\n for (const file of results.files.filter(f => !f.success)) {\n console.log(` - ${file.relativePath}: ${file.error}`);\n }\n }\n\n console.log('─'.repeat(60));\n}\n\nfunction mapFormat(format: string | undefined): DocumentFormat | undefined {\n if (!format) return undefined;\n\n switch (format.toLowerCase()) {\n case 'md':\n case 'markdown':\n return 'markdown';\n case 'html':\n return 'html';\n case 'txt':\n case 'text':\n return 'text';\n default:\n return undefined;\n }\n}\n","import { Command } from 'commander';\nimport { writeFile, access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { TranslateConfig } from '../../types/index.js';\n\nconst defaultConfig: TranslateConfig = {\n version: '1.0',\n project: {\n name: 'My Project',\n description: 'Project description',\n purpose: 'Technical documentation translation',\n },\n languages: {\n source: 'en',\n targets: ['ko'],\n },\n provider: {\n default: 'claude',\n model: 'claude-sonnet-4-20250514',\n },\n quality: {\n threshold: 85,\n maxIterations: 4,\n evaluationMethod: 'llm',\n },\n chunking: {\n maxTokens: 1024,\n overlapTokens: 150,\n preserveStructure: true,\n },\n paths: {\n output: './docs/{lang}',\n cache: './.translate-cache',\n },\n ignore: ['**/node_modules/**', '**/*.test.md'],\n};\n\nexport const initCommand = new Command('init')\n .description('Initialize project configuration')\n .option('-f, --force', 'Overwrite existing configuration')\n .action(async (options: { force?: boolean }) => {\n const configPath = join(process.cwd(), '.translaterc.json');\n\n // Check if config already exists\n if (!options.force) {\n try {\n await access(configPath);\n console.error(\n 'Configuration file already exists. Use --force to overwrite.'\n );\n process.exit(1);\n } catch {\n // File doesn't exist, continue\n }\n }\n\n try {\n await writeFile(configPath, JSON.stringify(defaultConfig, null, 2));\n console.log('Created .translaterc.json');\n console.log('\\nNext steps:');\n console.log('1. Edit .translaterc.json to configure your project');\n console.log('2. Set your API key: export ANTHROPIC_API_KEY=your-key');\n console.log('3. Run: llm-translate file <input> -s en -t ko');\n } catch (error) {\n console.error('Failed to create configuration file:', error);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport type { Glossary, GlossaryTerm } from '../../types/index.js';\n\nexport const glossaryCommand = new Command('glossary')\n .description('Manage glossary (add, remove, list, validate)');\n\n// ============================================================================\n// Subcommands\n// ============================================================================\n\nglossaryCommand\n .command('list')\n .description('List all terms in a glossary')\n .argument('<path>', 'Path to glossary file')\n .option('--lang <lang>', 'Filter by target language')\n .action(async (path: string, options: { lang?: string }) => {\n try {\n const glossary = await loadGlossary(path);\n console.log(`Glossary: ${glossary.metadata.name}`);\n console.log(`Source: ${glossary.metadata.sourceLang}`);\n console.log(`Targets: ${glossary.metadata.targetLangs.join(', ')}`);\n console.log(`Terms: ${glossary.terms.length}`);\n console.log('---');\n\n for (const term of glossary.terms) {\n if (term.doNotTranslate) {\n console.log(` ${term.source} → [do not translate]`);\n } else if (options.lang && term.targets[options.lang]) {\n console.log(` ${term.source} → ${term.targets[options.lang]}`);\n } else if (!options.lang) {\n const translations = Object.entries(term.targets)\n .map(([lang, val]) => `${lang}: ${val}`)\n .join(', ');\n console.log(` ${term.source} → ${translations || '[no translations]'}`);\n }\n }\n } catch (error) {\n console.error('Failed to load glossary:', error);\n process.exit(1);\n }\n });\n\nglossaryCommand\n .command('validate')\n .description('Validate a glossary file')\n .argument('<path>', 'Path to glossary file')\n .action(async (path: string) => {\n try {\n const glossary = await loadGlossary(path);\n const errors = validateGlossary(glossary);\n\n if (errors.length === 0) {\n console.log('Glossary is valid!');\n console.log(` Name: ${glossary.metadata.name}`);\n console.log(` Terms: ${glossary.terms.length}`);\n console.log(` Source: ${glossary.metadata.sourceLang}`);\n console.log(` Targets: ${glossary.metadata.targetLangs.join(', ')}`);\n } else {\n console.error('Glossary validation failed:');\n for (const error of errors) {\n console.error(` - ${error}`);\n }\n process.exit(6); // GLOSSARY_VALIDATION_FAILED\n }\n } catch (error) {\n console.error('Failed to load glossary:', error);\n process.exit(1);\n }\n });\n\nglossaryCommand\n .command('add')\n .description('Add a term to the glossary')\n .argument('<path>', 'Path to glossary file')\n .argument('<source>', 'Source term')\n .option('--target <lang:value...>', 'Target translations (e.g., ko:번역)')\n .option('--context <text>', 'Usage context')\n .option('--do-not-translate', 'Mark as do not translate')\n .action(\n async (\n path: string,\n source: string,\n options: {\n target?: string[];\n context?: string;\n doNotTranslate?: boolean;\n }\n ) => {\n try {\n const glossary = await loadGlossary(path);\n\n // Check if term already exists\n const existing = glossary.terms.find(\n (t) => t.source.toLowerCase() === source.toLowerCase()\n );\n if (existing) {\n console.error(`Term \"${source}\" already exists in glossary.`);\n process.exit(1);\n }\n\n // Parse targets\n const targets: Record<string, string> = {};\n if (options.target) {\n for (const t of options.target) {\n const [lang, ...rest] = t.split(':');\n if (lang && rest.length > 0) {\n targets[lang] = rest.join(':');\n }\n }\n }\n\n const newTerm: GlossaryTerm = {\n source,\n targets,\n context: options.context,\n doNotTranslate: options.doNotTranslate,\n };\n\n glossary.terms.push(newTerm);\n await writeFile(path, JSON.stringify(glossary, null, 2));\n console.log(`Added term: ${source}`);\n } catch (error) {\n console.error('Failed to add term:', error);\n process.exit(1);\n }\n }\n );\n\nglossaryCommand\n .command('remove')\n .description('Remove a term from the glossary')\n .argument('<path>', 'Path to glossary file')\n .argument('<source>', 'Source term to remove')\n .action(async (path: string, source: string) => {\n try {\n const glossary = await loadGlossary(path);\n const index = glossary.terms.findIndex(\n (t) => t.source.toLowerCase() === source.toLowerCase()\n );\n\n if (index === -1) {\n console.error(`Term \"${source}\" not found in glossary.`);\n process.exit(1);\n }\n\n glossary.terms.splice(index, 1);\n await writeFile(path, JSON.stringify(glossary, null, 2));\n console.log(`Removed term: ${source}`);\n } catch (error) {\n console.error('Failed to remove term:', error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function loadGlossary(path: string): Promise<Glossary> {\n const content = await readFile(path, 'utf-8');\n return JSON.parse(content) as Glossary;\n}\n\nfunction validateGlossary(glossary: Glossary): string[] {\n const errors: string[] = [];\n\n // Check metadata\n if (!glossary.metadata) {\n errors.push('Missing metadata section');\n } else {\n if (!glossary.metadata.name) {\n errors.push('Missing metadata.name');\n }\n if (!glossary.metadata.sourceLang) {\n errors.push('Missing metadata.sourceLang');\n }\n if (\n !glossary.metadata.targetLangs ||\n glossary.metadata.targetLangs.length === 0\n ) {\n errors.push('Missing or empty metadata.targetLangs');\n }\n }\n\n // Check terms\n if (!glossary.terms || !Array.isArray(glossary.terms)) {\n errors.push('Missing or invalid terms array');\n } else {\n const seenSources = new Set<string>();\n\n for (let i = 0; i < glossary.terms.length; i++) {\n const term = glossary.terms[i];\n if (!term) continue;\n\n if (!term.source) {\n errors.push(`Term at index ${i}: missing source`);\n continue;\n }\n\n // Check for duplicates\n const normalizedSource = term.source.toLowerCase();\n if (seenSources.has(normalizedSource)) {\n errors.push(`Duplicate term: \"${term.source}\"`);\n }\n seenSources.add(normalizedSource);\n\n // Check targets if not doNotTranslate\n if (!term.doNotTranslate && Object.keys(term.targets).length === 0) {\n // This is a warning, not an error - term might have doNotTranslateFor\n if (!term.doNotTranslateFor || term.doNotTranslateFor.length === 0) {\n errors.push(\n `Term \"${term.source}\": no translations and not marked as do-not-translate`\n );\n }\n }\n }\n }\n\n return errors;\n}\n","import { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Context, Next } from 'hono';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AuthConfig {\n enabled: boolean;\n apiKey?: string;\n}\n\n// ============================================================================\n// Authentication Middleware\n// ============================================================================\n\n/**\n * API Key authentication middleware\n * Supports both X-API-Key header and Authorization: Bearer token\n */\nexport function createAuthMiddleware(config: AuthConfig) {\n return createMiddleware(async (c: Context, next: Next) => {\n // Skip auth if disabled\n if (!config.enabled) {\n return next();\n }\n\n // Get API key from config or environment\n const expectedKey = config.apiKey ?? process.env.TRANSLATE_API_KEY;\n\n if (!expectedKey) {\n // No API key configured, skip auth (warning should be logged at startup)\n return next();\n }\n\n // Check X-API-Key header first\n let providedKey = c.req.header('X-API-Key');\n\n // Fall back to Authorization: Bearer <token>\n if (!providedKey) {\n const authHeader = c.req.header('Authorization');\n if (authHeader?.startsWith('Bearer ')) {\n providedKey = authHeader.slice(7);\n }\n }\n\n if (!providedKey) {\n throw new HTTPException(401, {\n message:\n 'API key required. Provide via X-API-Key header or Authorization: Bearer <token>',\n });\n }\n\n // Constant-time comparison to prevent timing attacks\n if (!timingSafeEqual(providedKey, expectedKey)) {\n throw new HTTPException(401, {\n message: 'Invalid API key',\n });\n }\n\n return next();\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Timing-safe string comparison to prevent timing attacks\n * @param a First string\n * @param b Second string\n * @returns true if strings are equal\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n // Still perform comparison to maintain constant time\n // even when lengths differ\n let result = 1;\n const maxLen = Math.max(a.length, b.length);\n for (let i = 0; i < maxLen; i++) {\n result |= (a.charCodeAt(i % a.length) || 0) ^ (b.charCodeAt(i % b.length) || 0);\n }\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n}\n","import { createMiddleware } from 'hono/factory';\nimport type { Context, Next } from 'hono';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LoggerConfig {\n json: boolean;\n}\n\ninterface LogEntry {\n timestamp: string;\n requestId: string;\n method: string;\n path: string;\n status: number;\n duration: number;\n userAgent?: string;\n}\n\n// ============================================================================\n// Logger Middleware\n// ============================================================================\n\n/**\n * Request logging middleware with structured JSON output for containers\n */\nexport function createLoggerMiddleware(config: LoggerConfig) {\n return createMiddleware(async (c: Context, next: Next) => {\n const start = Date.now();\n const requestId = generateRequestId();\n\n // Store request ID for correlation in other middleware/handlers\n c.set('requestId', requestId);\n\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n\n if (config.json) {\n // Structured JSON logging for container environments\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n requestId,\n method,\n path,\n status,\n duration,\n userAgent: c.req.header('User-Agent'),\n };\n console.log(JSON.stringify(entry));\n } else {\n // Human-readable logging for development\n const statusColor = getStatusColor(status);\n console.log(`${statusColor}${status}\\x1b[0m ${method} ${path} - ${duration}ms`);\n }\n });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a short unique request ID\n */\nfunction generateRequestId(): string {\n return Math.random().toString(36).substring(2, 10);\n}\n\n/**\n * Get ANSI color code based on HTTP status\n */\nfunction getStatusColor(status: number): string {\n if (status >= 500) {\n return '\\x1b[31m'; // Red for server errors\n }\n if (status >= 400) {\n return '\\x1b[33m'; // Yellow for client errors\n }\n if (status >= 300) {\n return '\\x1b[36m'; // Cyan for redirects\n }\n return '\\x1b[32m'; // Green for success\n}\n","import { Hono } from 'hono';\nimport type { HealthResponse } from '../types.js';\nimport {\n getAvailableProviders,\n getProviderConfigFromEnv,\n} from '../../providers/registry.js';\nimport type { ProviderName } from '../../types/index.js';\n\n// ============================================================================\n// Health Router\n// ============================================================================\n\nconst healthRouter = new Hono();\n\n// Track server start time for uptime calculation\nconst startTime = Date.now();\n\n/**\n * GET /health - Comprehensive health check endpoint\n * Suitable for k8s liveness/readiness probes\n */\nhealthRouter.get('/', async (c) => {\n const providers = getAvailableProviders();\n\n const providerStatus = providers.map((name: ProviderName) => {\n const config = getProviderConfigFromEnv(name);\n\n // Check if provider has required configuration\n let available = false;\n if (name === 'ollama') {\n // Ollama doesn't require API key, just assumes server is running\n available = true;\n } else {\n available = !!config.apiKey;\n }\n\n return { name, available };\n });\n\n const anyProviderAvailable = providerStatus.some((p) => p.available);\n\n const response: HealthResponse = {\n status: anyProviderAvailable ? 'healthy' : 'degraded',\n version: process.env['npm_package_version'] ?? '0.1.0',\n uptime: Math.floor((Date.now() - startTime) / 1000),\n providers: providerStatus,\n };\n\n // Return 503 if no providers available (for k8s readiness probe)\n const status = anyProviderAvailable ? 200 : 503;\n\n return c.json(response, status);\n});\n\n/**\n * GET /health/live - Simple liveness probe\n * Returns 200 as long as the server is running\n */\nhealthRouter.get('/live', (c) => {\n return c.json({ status: 'ok' });\n});\n\n/**\n * GET /health/ready - Readiness probe\n * Returns 200 if the server is ready to accept requests\n */\nhealthRouter.get('/ready', async (c) => {\n const providers = getAvailableProviders();\n\n // Check if at least one provider is configured\n const hasConfiguredProvider = providers.some((name: ProviderName) => {\n if (name === 'ollama') return true;\n const config = getProviderConfigFromEnv(name);\n return !!config.apiKey;\n });\n\n if (hasConfiguredProvider) {\n return c.json({ status: 'ready' });\n }\n\n return c.json({ status: 'not_ready', reason: 'No providers configured' }, 503);\n});\n\nexport { healthRouter };\n","import { z } from 'zod';\n\n// ============================================================================\n// Request Validation Schemas\n// ============================================================================\n\n/**\n * Translation mode enum\n */\nexport const TranslationModeSchema = z.enum(['fast', 'balanced', 'quality']);\nexport type TranslationMode = z.infer<typeof TranslationModeSchema>;\n\n/**\n * Inline glossary term schema (simplified for API)\n */\nexport const InlineGlossaryTermSchema = z.object({\n source: z.string().min(1, 'Source term is required'),\n target: z.string().min(1, 'Target term is required'),\n context: z.string().optional(),\n caseSensitive: z.boolean().optional(),\n doNotTranslate: z.boolean().optional(),\n});\n\nexport type InlineGlossaryTerm = z.infer<typeof InlineGlossaryTermSchema>;\n\n/**\n * POST /translate request body schema\n */\nexport const TranslateRequestSchema = z.object({\n content: z.string().min(1, 'Content is required'),\n sourceLang: z\n .string()\n .min(2, 'Source language code must be at least 2 characters')\n .max(10, 'Source language code must be at most 10 characters'),\n targetLang: z\n .string()\n .min(2, 'Target language code must be at least 2 characters')\n .max(10, 'Target language code must be at most 10 characters'),\n format: z.enum(['markdown', 'html', 'text']).optional().default('text'),\n glossary: z.array(InlineGlossaryTermSchema).optional(),\n provider: z.enum(['claude', 'openai', 'ollama']).optional(),\n model: z.string().optional(),\n mode: TranslationModeSchema.optional().default('balanced'),\n qualityThreshold: z.number().min(0).max(100).optional(),\n maxIterations: z.number().min(1).max(10).optional(),\n context: z.string().optional(),\n});\n\nexport type TranslateRequest = z.infer<typeof TranslateRequestSchema>;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * POST /translate response\n */\nexport interface TranslateResponse {\n translated: string;\n quality: number;\n iterations: number;\n tokensUsed: {\n input: number;\n output: number;\n };\n glossaryCompliance?: {\n applied: string[];\n missed: string[];\n };\n duration: number;\n provider: string;\n model: string;\n}\n\n/**\n * GET /health response\n */\nexport interface HealthResponse {\n status: 'healthy' | 'degraded';\n version: string;\n uptime: number;\n providers: {\n name: string;\n available: boolean;\n }[];\n}\n\n/**\n * Error response format\n */\nexport interface ErrorResponse {\n error: string;\n code: string;\n details?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Server Configuration\n// ============================================================================\n\n/**\n * Server configuration options\n */\nexport interface ServerConfig {\n port: number;\n host: string;\n enableAuth: boolean;\n enableCors: boolean;\n apiKey?: string;\n jsonLogging?: boolean;\n cachePath?: string;\n}\n\n// ============================================================================\n// Hono Context Variables\n// ============================================================================\n\n/**\n * Custom variables stored in Hono context\n */\nexport interface HonoVariables {\n requestId: string;\n cachePath?: string;\n}\n\n// ============================================================================\n// Mode Presets\n// ============================================================================\n\n/**\n * Mode configuration presets\n */\nexport const MODE_PRESETS: Record<\n TranslationMode,\n { qualityThreshold: number; maxIterations: number }\n> = {\n fast: { qualityThreshold: 0, maxIterations: 1 },\n balanced: { qualityThreshold: 75, maxIterations: 2 },\n quality: { qualityThreshold: 85, maxIterations: 4 },\n};\n","import { Hono, type Context } from 'hono';\nimport { zValidator } from '@hono/zod-validator';\nimport {\n TranslateRequestSchema,\n MODE_PRESETS,\n type TranslateResponse,\n type ErrorResponse,\n type InlineGlossaryTerm,\n type HonoVariables,\n} from '../types.js';\nimport { createTranslationEngine } from '../../core/engine.js';\nimport { loadConfig } from '../../services/config.js';\nimport { TranslationError, ErrorCode } from '../../errors.js';\nimport type { ResolvedGlossary, ResolvedGlossaryTerm } from '../../types/index.js';\n\n// ============================================================================\n// Translate Router\n// ============================================================================\n\nconst translateRouter = new Hono<{ Variables: HonoVariables }>();\n\n/**\n * POST /translate - Main translation endpoint\n */\ntranslateRouter.post(\n '/',\n zValidator('json', TranslateRequestSchema, (result, c) => {\n if (!result.success) {\n const errors = result.error.errors.map((e) => ({\n field: e.path.join('.'),\n message: e.message,\n }));\n\n return c.json<ErrorResponse>(\n {\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: { errors },\n },\n 400\n );\n }\n // Validation successful - continue to handler\n return undefined;\n }),\n async (c) => {\n const body = c.req.valid('json');\n const requestId = c.get('requestId') ?? 'unknown';\n const startTime = Date.now();\n\n try {\n // Load base config\n const baseConfig = await loadConfig();\n\n // Get mode presets\n const modeConfig = MODE_PRESETS[body.mode ?? 'balanced'];\n\n // Get cache path from context (if configured via --cache-dir)\n const cachePath = c.get('cachePath');\n\n // Build config with overrides\n const config = {\n ...baseConfig,\n languages: {\n ...baseConfig.languages,\n source: body.sourceLang,\n targets: [body.targetLang],\n },\n provider: {\n ...baseConfig.provider,\n default: body.provider ?? baseConfig.provider.default,\n model: body.model ?? baseConfig.provider.model,\n },\n quality: {\n ...baseConfig.quality,\n threshold: body.qualityThreshold ?? modeConfig.qualityThreshold,\n maxIterations: body.maxIterations ?? modeConfig.maxIterations,\n },\n paths: {\n ...baseConfig.paths,\n cache: cachePath,\n },\n };\n\n // Create engine\n const engine = createTranslationEngine({\n config,\n verbose: false,\n noCache: !cachePath,\n });\n\n // Convert inline glossary to resolved format if provided\n // Note: glossary support via inline terms will be implemented\n // when TranslationEngine supports passing glossary directly\n if (body.glossary && body.glossary.length > 0) {\n // TODO: Pass glossary to engine when supported\n convertInlineGlossary(body.glossary, body.sourceLang, body.targetLang);\n }\n\n // Translate content\n const result = await engine.translateContent({\n content: body.content,\n sourceLang: body.sourceLang,\n targetLang: body.targetLang,\n format: body.format,\n qualityThreshold: config.quality.threshold,\n maxIterations: config.quality.maxIterations,\n context: body.context,\n });\n\n const duration = Date.now() - startTime;\n\n const response: TranslateResponse = {\n translated: result.content,\n quality: result.metadata.averageQuality,\n iterations: result.metadata.totalIterations,\n tokensUsed: {\n input: result.metadata.tokensUsed.input,\n output: result.metadata.tokensUsed.output,\n },\n glossaryCompliance: result.glossaryCompliance\n ? {\n applied: result.glossaryCompliance.applied,\n missed: result.glossaryCompliance.missed,\n }\n : undefined,\n duration,\n provider: result.metadata.provider,\n model: result.metadata.model,\n };\n\n return c.json(response, 200);\n } catch (error) {\n return handleTranslationError(c, error, requestId);\n }\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert inline glossary terms to resolved glossary format\n */\nfunction convertInlineGlossary(\n terms: InlineGlossaryTerm[],\n sourceLang: string,\n targetLang: string\n): ResolvedGlossary {\n return {\n metadata: {\n name: 'inline',\n sourceLang,\n targetLang,\n version: '1.0',\n },\n terms: terms.map(\n (term): ResolvedGlossaryTerm => ({\n source: term.source,\n target: term.doNotTranslate ? term.source : term.target,\n context: term.context,\n caseSensitive: term.caseSensitive ?? false,\n doNotTranslate: term.doNotTranslate ?? false,\n })\n ),\n };\n}\n\n/**\n * Handle translation errors and return appropriate HTTP response\n */\ntype StatusCode = 200 | 400 | 401 | 422 | 429 | 500 | 502;\n\nfunction handleTranslationError(\n c: Context<{ Variables: HonoVariables }>,\n error: unknown,\n requestId: string\n): Response {\n if (error instanceof TranslationError) {\n const statusMap: Record<string, StatusCode> = {\n [ErrorCode.PROVIDER_AUTH_FAILED]: 401,\n [ErrorCode.PROVIDER_RATE_LIMITED]: 429,\n [ErrorCode.PROVIDER_ERROR]: 502,\n [ErrorCode.PROVIDER_NOT_FOUND]: 400,\n [ErrorCode.QUALITY_THRESHOLD_NOT_MET]: 422,\n [ErrorCode.GLOSSARY_INVALID]: 400,\n [ErrorCode.GLOSSARY_NOT_FOUND]: 400,\n [ErrorCode.CONFIG_INVALID]: 400,\n [ErrorCode.UNSUPPORTED_FORMAT]: 400,\n };\n\n const status: StatusCode = statusMap[error.code] ?? 500;\n\n return c.json<ErrorResponse>(\n {\n error: error.message,\n code: error.code,\n details: error.details,\n },\n status\n );\n }\n\n // Unknown error\n console.error(`[${requestId}] Translation error:`, error);\n\n return c.json<ErrorResponse>(\n {\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n}\n\nexport { translateRouter };\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { serve, type ServerType } from '@hono/node-server';\nimport { HTTPException } from 'hono/http-exception';\n\nimport { createAuthMiddleware } from './middleware/auth.js';\nimport { createLoggerMiddleware } from './middleware/logger.js';\nimport { healthRouter } from './routes/health.js';\nimport { translateRouter } from './routes/translate.js';\nimport type { ServerConfig, ErrorResponse, HonoVariables } from './types.js';\n\n// ============================================================================\n// Server Factory\n// ============================================================================\n\n/**\n * Create and configure the Hono application\n */\nexport function createApp(options: ServerConfig) {\n const app = new Hono<{ Variables: HonoVariables }>();\n\n // Inject cachePath into context for all routes\n if (options.cachePath) {\n app.use('*', async (c, next) => {\n c.set('cachePath', options.cachePath);\n await next();\n });\n }\n\n // Request logging (first middleware)\n app.use('*', createLoggerMiddleware({\n json: options.jsonLogging ?? false,\n }));\n\n // CORS middleware (before auth)\n if (options.enableCors) {\n app.use('*', cors({\n origin: '*',\n allowMethods: ['GET', 'POST', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'X-API-Key'],\n exposeHeaders: ['X-Request-Id'],\n maxAge: 86400,\n }));\n }\n\n // Health endpoints (no auth required)\n app.route('/health', healthRouter);\n\n // Authentication middleware for /translate\n app.use('/translate/*', createAuthMiddleware({\n enabled: options.enableAuth,\n apiKey: options.apiKey,\n }));\n\n // Also apply auth to the base /translate endpoint\n app.use('/translate', createAuthMiddleware({\n enabled: options.enableAuth,\n apiKey: options.apiKey,\n }));\n\n // Translation endpoint\n app.route('/translate', translateRouter);\n\n // Global error handler\n app.onError((error, c) => {\n if (error instanceof HTTPException) {\n return c.json<ErrorResponse>(\n {\n error: error.message,\n code: 'HTTP_ERROR',\n },\n error.status\n );\n }\n\n console.error('Unhandled error:', error);\n\n return c.json<ErrorResponse>(\n {\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n },\n 500\n );\n });\n\n // 404 handler\n app.notFound((c) => {\n return c.json<ErrorResponse>(\n {\n error: 'Not found',\n code: 'NOT_FOUND',\n },\n 404\n );\n });\n\n return app;\n}\n\n// ============================================================================\n// Server Startup\n// ============================================================================\n\n/**\n * Start the HTTP server with graceful shutdown\n */\nexport function startServer(options: ServerConfig): ServerType {\n const app = createApp(options);\n\n const server = serve({\n fetch: app.fetch,\n port: options.port,\n hostname: options.host,\n });\n\n // Log startup information\n console.log(`\\nllm-translate server started`);\n console.log(` - Address: http://${options.host}:${options.port}`);\n console.log(` - Health: http://${options.host}:${options.port}/health`);\n console.log(` - Translate: http://${options.host}:${options.port}/translate`);\n console.log(` - Auth: ${options.enableAuth ? 'enabled' : 'disabled'}`);\n console.log(` - CORS: ${options.enableCors ? 'enabled' : 'disabled'}`);\n console.log(` - Cache: ${options.cachePath ?? 'disabled'}`);\n console.log('');\n\n // Graceful shutdown handlers\n const shutdown = (signal: string) => {\n console.log(`\\nReceived ${signal}, shutting down gracefully...`);\n\n server.close((err) => {\n if (err) {\n console.error('Error during shutdown:', err);\n process.exit(1);\n }\n console.log('Server closed');\n process.exit(0);\n });\n\n // Force exit after timeout\n setTimeout(() => {\n console.error('Forced shutdown after timeout');\n process.exit(1);\n }, 10000);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n return server;\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport type { ServerConfig } from './types.js';\nexport { createAuthMiddleware } from './middleware/auth.js';\nexport { createLoggerMiddleware } from './middleware/logger.js';\nexport { healthRouter } from './routes/health.js';\nexport { translateRouter } from './routes/translate.js';\n","import { Command } from 'commander';\nimport { startServer } from '../../server/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ServeCommandOptions {\n port?: string;\n host?: string;\n auth?: boolean; // Commander's --no-auth sets this to false\n cors?: boolean;\n json?: boolean;\n cacheDir?: string;\n}\n\n// ============================================================================\n// Serve Command\n// ============================================================================\n\nexport const serveCommand = new Command('serve')\n .description('Start the translation API server')\n .option(\n '-p, --port <number>',\n 'Server port (env: TRANSLATE_PORT)',\n process.env['TRANSLATE_PORT'] ?? '3000'\n )\n .option('-H, --host <string>', 'Host to bind', '0.0.0.0')\n .option('--no-auth', 'Disable API key authentication')\n .option('--cors', 'Enable CORS for browser clients')\n .option('--json', 'Use JSON logging format (for containers)')\n .option(\n '--cache-dir <path>',\n 'Cache directory path (env: TRANSLATE_CACHE_DIR)',\n process.env['TRANSLATE_CACHE_DIR']\n )\n .action((options: ServeCommandOptions) => {\n const port = parseInt(options.port ?? '3000', 10);\n const host = options.host ?? '0.0.0.0';\n\n // Validate port\n if (isNaN(port) || port < 1 || port > 65535) {\n console.error('Error: Invalid port number. Must be between 1 and 65535.');\n process.exit(2);\n }\n\n // Check for API key if auth is enabled\n const enableAuth = options.auth !== false;\n if (enableAuth && !process.env['TRANSLATE_API_KEY']) {\n console.warn(\n 'Warning: TRANSLATE_API_KEY not set. API key authentication is disabled.'\n );\n console.warn(\n 'Set TRANSLATE_API_KEY environment variable to enable authentication.\\n'\n );\n }\n\n startServer({\n port,\n host,\n enableAuth,\n enableCors: options.cors ?? false,\n apiKey: process.env['TRANSLATE_API_KEY'],\n jsonLogging: options.json ?? false,\n cachePath: options.cacheDir,\n });\n });\n"]}
|