@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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/services/config.ts","../src/services/glossary.ts","../src/utils/logger.ts","../src/services/cache.ts","../src/utils/tokens.ts","../src/providers/claude.ts","../src/providers/openai.ts","../src/providers/ollama.ts","../src/providers/registry.ts","../src/core/chunker.ts","../src/types/mqm.ts","../src/types/analysis.ts","../src/types/modes.ts","../src/core/agent.ts","../src/parsers/markdown.ts","../src/core/engine.ts","../src/integrations/vitepress.ts"],"names":["ErrorCode","config","MODEL_INFO","DEFAULT_MODEL","generateText","mapFinishReason","streamText","createOpenAI","defaultConfig","statSync","existsSync","readdirSync","join","readFileSync"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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","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","/**\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","// ============================================================================\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 { 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","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","/**\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 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","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 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","/**\n * VitePress Integration Helpers\n *\n * Helper functions to auto-generate VitePress i18n configuration\n * based on translated document structure.\n *\n * @example\n * ```typescript\n * // docs/.vitepress/config.ts\n * import { defineConfig } from 'vitepress';\n * import { generateLocaleConfig } from 'llm-translate/vitepress';\n *\n * const locales = await generateLocaleConfig('./docs', {\n * defaultLocale: 'en',\n * locales: ['ko', 'ja'],\n * });\n *\n * export default defineConfig({ locales });\n * ```\n */\n\nimport { readdirSync, statSync, existsSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n// ============================================================================\n// Types - Compatible with VitePress DefaultTheme\n// ============================================================================\n\n/**\n * Navigation item with a link\n * Compatible with VitePress DefaultTheme.NavItemWithLink\n */\nexport interface NavItemWithLink {\n text: string;\n link: string;\n activeMatch?: string;\n rel?: string;\n target?: string;\n noIcon?: boolean;\n}\n\n/**\n * Navigation item with children\n * Compatible with VitePress DefaultTheme.NavItemWithChildren\n */\nexport interface NavItemWithChildren {\n text?: string;\n items: NavItemWithLink[];\n activeMatch?: string;\n}\n\n/**\n * Navigation item type\n * Compatible with VitePress DefaultTheme.NavItem\n */\nexport type NavItem = NavItemWithLink | NavItemWithChildren;\n\n/**\n * Sidebar item\n * Compatible with VitePress DefaultTheme.SidebarItem\n */\nexport interface SidebarItem {\n text?: string;\n link?: string;\n items?: SidebarItem[];\n collapsed?: boolean;\n base?: string;\n docFooterText?: string;\n rel?: string;\n target?: string;\n}\n\n/**\n * Theme configuration\n * Compatible with VitePress DefaultTheme.Config\n */\nexport interface ThemeConfig {\n nav?: NavItem[];\n sidebar?: SidebarItem[] | Record<string, SidebarItem[]>;\n editLink?: {\n pattern: string;\n text?: string;\n };\n docFooter?: {\n prev?: string | false;\n next?: string | false;\n };\n outline?: {\n level?: number | [number, number] | 'deep';\n label?: string;\n };\n lastUpdated?: {\n text?: string;\n formatOptions?: Intl.DateTimeFormatOptions;\n };\n returnToTopLabel?: string;\n sidebarMenuLabel?: string;\n darkModeSwitchLabel?: string;\n langMenuLabel?: string;\n}\n\n/**\n * Locale configuration\n * Compatible with VitePress LocaleConfig\n */\nexport interface LocaleConfig {\n label: string;\n lang?: string;\n link?: string;\n description?: string;\n themeConfig?: ThemeConfig;\n}\n\n/**\n * Options for generating locale configuration\n */\nexport interface GenerateOptions {\n /** Default locale code (e.g., 'en') */\n defaultLocale?: string;\n\n /** List of locale codes to generate (e.g., ['ko', 'ja']) */\n locales?: string[];\n\n /** Locale display labels */\n labels?: Record<string, string>;\n\n /** Locale lang codes for HTML */\n langCodes?: Record<string, string>;\n\n /** Locale descriptions */\n descriptions?: Record<string, string>;\n\n /** Directories to include in sidebar (default: auto-detect) */\n sidebarDirs?: string[];\n\n /** Use title from file's first heading */\n useTitleFromHeading?: boolean;\n\n /** Custom locale translations */\n translations?: Record<string, LocaleTranslations>;\n}\n\nexport interface LocaleTranslations {\n editLinkText?: string;\n docFooter?: { prev: string; next: string };\n outline?: { label: string };\n lastUpdated?: { text: string };\n returnToTopLabel?: string;\n sidebarMenuLabel?: string;\n darkModeSwitchLabel?: string;\n}\n\n// ============================================================================\n// Default Translations\n// ============================================================================\n\nconst DEFAULT_LABELS: Record<string, string> = {\n en: 'English',\n ko: '한국어',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n pt: 'Português',\n ru: 'Русский',\n it: 'Italiano',\n};\n\nconst DEFAULT_LANG_CODES: Record<string, string> = {\n en: 'en-US',\n ko: 'ko-KR',\n ja: 'ja-JP',\n zh: 'zh-CN',\n es: 'es-ES',\n fr: 'fr-FR',\n de: 'de-DE',\n pt: 'pt-BR',\n ru: 'ru-RU',\n it: 'it-IT',\n};\n\nconst DEFAULT_TRANSLATIONS: Record<string, LocaleTranslations> = {\n ko: {\n editLinkText: 'GitHub에서 이 페이지 편집하기',\n docFooter: { prev: '이전 페이지', next: '다음 페이지' },\n outline: { label: '목차' },\n lastUpdated: { text: '최종 업데이트' },\n returnToTopLabel: '맨 위로',\n sidebarMenuLabel: '메뉴',\n darkModeSwitchLabel: '다크 모드',\n },\n ja: {\n editLinkText: 'GitHubでこのページを編集する',\n docFooter: { prev: '前のページ', next: '次のページ' },\n outline: { label: '目次' },\n lastUpdated: { text: '最終更新' },\n returnToTopLabel: 'トップへ戻る',\n sidebarMenuLabel: 'メニュー',\n darkModeSwitchLabel: 'ダークモード',\n },\n zh: {\n editLinkText: '在 GitHub 上编辑此页',\n docFooter: { prev: '上一页', next: '下一页' },\n outline: { label: '目录' },\n lastUpdated: { text: '最后更新' },\n returnToTopLabel: '返回顶部',\n sidebarMenuLabel: '菜单',\n darkModeSwitchLabel: '深色模式',\n },\n};\n\n// ============================================================================\n// File System Utilities\n// ============================================================================\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction getSubdirectories(dir: string): string[] {\n if (!existsSync(dir)) return [];\n\n return readdirSync(dir)\n .filter((entry) => isDirectory(join(dir, entry)))\n .filter((entry) => !entry.startsWith('.') && !entry.startsWith('_'));\n}\n\nfunction getTitleFromFile(filePath: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check frontmatter title first\n const frontmatterMatch = content.match(/^---\\s*\\n[\\s\\S]*?title:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*\\n[\\s\\S]*?---/);\n if (frontmatterMatch?.[1]) {\n return frontmatterMatch[1].trim();\n }\n\n // Check first heading\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch?.[1]) {\n return headingMatch[1].trim();\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction fileNameToTitle(fileName: string): string {\n // Remove .md extension and convert kebab-case to Title Case\n return fileName\n .replace(/\\.md$/, '')\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n// ============================================================================\n// Sidebar Generation\n// ============================================================================\n\ninterface SidebarGeneratorOptions {\n basePath: string;\n localePrefix: string;\n useTitleFromHeading: boolean;\n}\n\nfunction generateSidebarItems(dir: string, options: SidebarGeneratorOptions): SidebarItem[] {\n const { basePath, localePrefix, useTitleFromHeading } = options;\n const items: SidebarItem[] = [];\n\n if (!existsSync(dir)) return items;\n\n const entries = readdirSync(dir).sort((a, b) => {\n // index.md comes first\n if (a === 'index.md') return -1;\n if (b === 'index.md') return 1;\n return a.localeCompare(b);\n });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = relative(basePath, fullPath);\n\n if (isDirectory(fullPath)) {\n // Recursively process subdirectories\n const subItems = generateSidebarItems(fullPath, options);\n if (subItems.length > 0) {\n const indexFile = join(fullPath, 'index.md');\n const title = existsSync(indexFile) && useTitleFromHeading\n ? getTitleFromFile(indexFile) || fileNameToTitle(entry)\n : fileNameToTitle(entry);\n\n items.push({\n text: title,\n items: subItems,\n });\n }\n } else if (entry.endsWith('.md')) {\n const title = useTitleFromHeading\n ? getTitleFromFile(fullPath) || fileNameToTitle(entry)\n : fileNameToTitle(entry);\n\n const link = `${localePrefix}/${relativePath.replace(/\\.md$/, '').replace(/\\/index$/, '/')}`;\n\n items.push({\n text: title,\n link,\n });\n }\n }\n\n return items;\n}\n\nfunction generateSidebar(\n docsDir: string,\n sidebarDirs: string[],\n localePrefix: string,\n useTitleFromHeading: boolean\n): Record<string, SidebarItem[]> {\n const sidebar: Record<string, SidebarItem[]> = {};\n\n for (const dir of sidebarDirs) {\n const fullDir = join(docsDir, dir);\n if (!existsSync(fullDir)) continue;\n\n const items = generateSidebarItems(fullDir, {\n basePath: docsDir,\n localePrefix,\n useTitleFromHeading,\n });\n\n if (items.length > 0) {\n const sidebarPath = `${localePrefix}/${dir}/`;\n sidebar[sidebarPath] = [\n {\n text: fileNameToTitle(dir),\n items,\n },\n ];\n }\n }\n\n return sidebar;\n}\n\n// ============================================================================\n// Nav Generation\n// ============================================================================\n\nfunction generateNav(\n docsDir: string,\n sidebarDirs: string[],\n localePrefix: string,\n useTitleFromHeading: boolean\n): NavItemWithLink[] {\n const nav: NavItemWithLink[] = [];\n\n for (const dir of sidebarDirs) {\n const fullDir = join(docsDir, dir);\n if (!existsSync(fullDir)) continue;\n\n const indexFile = join(fullDir, 'index.md');\n const title = existsSync(indexFile) && useTitleFromHeading\n ? getTitleFromFile(indexFile) || fileNameToTitle(dir)\n : fileNameToTitle(dir);\n\n nav.push({\n text: title,\n link: `${localePrefix}/${dir}/`,\n activeMatch: `${localePrefix}/${dir}/`,\n });\n }\n\n return nav;\n}\n\n// ============================================================================\n// Main Export Functions\n// ============================================================================\n\n/**\n * Auto-detect available locales by scanning for locale directories\n */\nexport function detectLocales(docsDir: string, defaultLocale: string = 'en'): string[] {\n const subdirs = getSubdirectories(docsDir);\n\n // Filter to only locale-like directories (2-letter codes)\n const localeDirs = subdirs.filter(\n (dir) => /^[a-z]{2}(-[A-Z]{2})?$/.test(dir) && dir !== defaultLocale\n );\n\n return localeDirs;\n}\n\n/**\n * Auto-detect sidebar directories by looking at root structure\n */\nexport function detectSidebarDirs(docsDir: string): string[] {\n const subdirs = getSubdirectories(docsDir);\n\n // Exclude locale directories and common non-sidebar dirs\n const excludePatterns = [\n /^[a-z]{2}(-[A-Z]{2})?$/, // locale dirs\n /^public$/,\n /^\\.vitepress$/,\n /^assets?$/,\n /^images?$/,\n ];\n\n return subdirs.filter((dir) => !excludePatterns.some((pattern) => pattern.test(dir)));\n}\n\n/**\n * Generate locale configuration for a specific locale\n */\nexport function generateLocale(\n docsDir: string,\n locale: string,\n options: GenerateOptions = {}\n): LocaleConfig {\n const {\n defaultLocale = 'en',\n labels = DEFAULT_LABELS,\n langCodes = DEFAULT_LANG_CODES,\n descriptions = {},\n sidebarDirs = detectSidebarDirs(docsDir),\n useTitleFromHeading = true,\n translations = DEFAULT_TRANSLATIONS,\n } = options;\n\n const isDefault = locale === defaultLocale;\n const localeDir = isDefault ? docsDir : join(docsDir, locale);\n const localePrefix = isDefault ? '' : `/${locale}`;\n\n // Generate nav and sidebar\n const nav = generateNav(localeDir, sidebarDirs, localePrefix, useTitleFromHeading);\n const sidebar = generateSidebar(localeDir, sidebarDirs, localePrefix, useTitleFromHeading);\n\n const localeTranslations = translations[locale] || {};\n\n const config: LocaleConfig = {\n label: labels[locale] || locale,\n lang: langCodes[locale] || locale,\n description: descriptions[locale],\n themeConfig: {\n nav,\n sidebar,\n },\n };\n\n // Add translations for non-default locales\n if (!isDefault && localeTranslations && config.themeConfig) {\n if (localeTranslations.docFooter) {\n config.themeConfig.docFooter = localeTranslations.docFooter;\n }\n if (localeTranslations.outline) {\n config.themeConfig.outline = localeTranslations.outline;\n }\n if (localeTranslations.lastUpdated) {\n config.themeConfig.lastUpdated = localeTranslations.lastUpdated;\n }\n if (localeTranslations.returnToTopLabel) {\n config.themeConfig.returnToTopLabel = localeTranslations.returnToTopLabel;\n }\n if (localeTranslations.sidebarMenuLabel) {\n config.themeConfig.sidebarMenuLabel = localeTranslations.sidebarMenuLabel;\n }\n if (localeTranslations.darkModeSwitchLabel) {\n config.themeConfig.darkModeSwitchLabel = localeTranslations.darkModeSwitchLabel;\n }\n }\n\n return config;\n}\n\n/**\n * Generate complete locale configuration for VitePress\n *\n * @example\n * ```typescript\n * import { defineConfig } from 'vitepress';\n * import { generateLocaleConfig } from 'llm-translate';\n *\n * const locales = generateLocaleConfig('./docs', {\n * defaultLocale: 'en',\n * locales: ['ko', 'ja'],\n * });\n *\n * export default defineConfig({\n * locales,\n * // ... other config\n * });\n * ```\n */\nexport function generateLocaleConfig(\n docsDir: string,\n options: GenerateOptions = {}\n): Record<string, LocaleConfig> {\n const { defaultLocale = 'en', locales = detectLocales(docsDir, defaultLocale) } = options;\n\n const config: Record<string, LocaleConfig> = {};\n\n // Generate default locale (root)\n config.root = generateLocale(docsDir, defaultLocale, options);\n\n // Generate other locales\n for (const locale of locales) {\n config[locale] = generateLocale(docsDir, locale, options);\n }\n\n return config;\n}\n\n/**\n * Generate sidebar configuration only\n *\n * Useful when you want to manually configure nav but auto-generate sidebar.\n */\nexport function generateSidebarConfig(\n docsDir: string,\n options: Omit<GenerateOptions, 'descriptions' | 'translations'> = {}\n): Record<string, Record<string, SidebarItem[]>> {\n const {\n defaultLocale = 'en',\n locales = detectLocales(docsDir, defaultLocale),\n sidebarDirs = detectSidebarDirs(docsDir),\n useTitleFromHeading = true,\n } = options;\n\n const config: Record<string, Record<string, SidebarItem[]>> = {};\n\n // Default locale\n config.root = generateSidebar(docsDir, sidebarDirs, '', useTitleFromHeading);\n\n // Other locales\n for (const locale of locales) {\n const localeDir = join(docsDir, locale);\n config[locale] = generateSidebar(localeDir, sidebarDirs, `/${locale}`, useTitleFromHeading);\n }\n\n return config;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/services/config.ts","../src/services/glossary.ts","../src/utils/logger.ts","../src/services/cache.ts","../src/utils/tokens.ts","../src/providers/claude.ts","../src/providers/openai.ts","../src/providers/ollama.ts","../src/providers/registry.ts","../src/core/chunker.ts","../src/types/mqm.ts","../src/types/analysis.ts","../src/types/modes.ts","../src/core/agent.ts","../src/parsers/markdown.ts","../src/core/engine.ts","../src/integrations/vitepress.ts"],"names":["ErrorCode","config","MODEL_INFO","DEFAULT_MODEL","generateText","mapFinishReason","streamText","createOpenAI","defaultConfig","statSync","existsSync","readdirSync","join","readFileSync"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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","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","/**\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","// ============================================================================\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 { 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","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","/**\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 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","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 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","/**\n * VitePress Integration Helpers\n *\n * Helper functions to auto-generate VitePress i18n configuration\n * based on translated document structure.\n *\n * @example\n * ```typescript\n * // docs/.vitepress/config.ts\n * import { defineConfig } from 'vitepress';\n * import { generateLocaleConfig } from 'llm-translate/vitepress';\n *\n * const locales = await generateLocaleConfig('./docs', {\n * defaultLocale: 'en',\n * locales: ['ko', 'ja'],\n * });\n *\n * export default defineConfig({ locales });\n * ```\n */\n\nimport { readdirSync, statSync, existsSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n// ============================================================================\n// Types - Compatible with VitePress DefaultTheme\n// ============================================================================\n\n/**\n * Navigation item with a link\n * Compatible with VitePress DefaultTheme.NavItemWithLink\n */\nexport interface NavItemWithLink {\n text: string;\n link: string;\n activeMatch?: string;\n rel?: string;\n target?: string;\n noIcon?: boolean;\n}\n\n/**\n * Navigation item with children\n * Compatible with VitePress DefaultTheme.NavItemWithChildren\n */\nexport interface NavItemWithChildren {\n text?: string;\n items: NavItemWithLink[];\n activeMatch?: string;\n}\n\n/**\n * Navigation item type\n * Compatible with VitePress DefaultTheme.NavItem\n */\nexport type NavItem = NavItemWithLink | NavItemWithChildren;\n\n/**\n * Sidebar item\n * Compatible with VitePress DefaultTheme.SidebarItem\n */\nexport interface SidebarItem {\n text?: string;\n link?: string;\n items?: SidebarItem[];\n collapsed?: boolean;\n base?: string;\n docFooterText?: string;\n rel?: string;\n target?: string;\n}\n\n/**\n * Theme configuration\n * Compatible with VitePress DefaultTheme.Config\n */\nexport interface ThemeConfig {\n nav?: NavItem[];\n sidebar?: SidebarItem[] | Record<string, SidebarItem[]>;\n editLink?: {\n pattern: string;\n text?: string;\n };\n docFooter?: {\n prev?: string | false;\n next?: string | false;\n };\n outline?: {\n level?: number | [number, number] | 'deep';\n label?: string;\n };\n lastUpdated?: {\n text?: string;\n formatOptions?: Intl.DateTimeFormatOptions;\n };\n returnToTopLabel?: string;\n sidebarMenuLabel?: string;\n darkModeSwitchLabel?: string;\n langMenuLabel?: string;\n}\n\n/**\n * Locale configuration\n * Compatible with VitePress LocaleConfig\n */\nexport interface LocaleConfig {\n label: string;\n lang?: string;\n link?: string;\n description?: string;\n themeConfig?: ThemeConfig;\n}\n\n/**\n * Options for generating locale configuration\n */\nexport interface GenerateOptions {\n /** Default locale code (e.g., 'en') */\n defaultLocale?: string;\n\n /** List of locale codes to generate (e.g., ['ko', 'ja']) */\n locales?: string[];\n\n /** Locale display labels */\n labels?: Record<string, string>;\n\n /** Locale lang codes for HTML */\n langCodes?: Record<string, string>;\n\n /** Locale descriptions */\n descriptions?: Record<string, string>;\n\n /** Directories to include in sidebar (default: auto-detect) */\n sidebarDirs?: string[];\n\n /** Use title from file's first heading */\n useTitleFromHeading?: boolean;\n\n /** Custom locale translations */\n translations?: Record<string, LocaleTranslations>;\n}\n\nexport interface LocaleTranslations {\n editLinkText?: string;\n docFooter?: { prev: string; next: string };\n outline?: { label: string };\n lastUpdated?: { text: string };\n returnToTopLabel?: string;\n sidebarMenuLabel?: string;\n darkModeSwitchLabel?: string;\n}\n\n// ============================================================================\n// Default Translations\n// ============================================================================\n\nconst DEFAULT_LABELS: Record<string, string> = {\n en: 'English',\n ko: '한국어',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n pt: 'Português',\n ru: 'Русский',\n it: 'Italiano',\n};\n\nconst DEFAULT_LANG_CODES: Record<string, string> = {\n en: 'en-US',\n ko: 'ko-KR',\n ja: 'ja-JP',\n zh: 'zh-CN',\n es: 'es-ES',\n fr: 'fr-FR',\n de: 'de-DE',\n pt: 'pt-BR',\n ru: 'ru-RU',\n it: 'it-IT',\n};\n\nconst DEFAULT_TRANSLATIONS: Record<string, LocaleTranslations> = {\n ko: {\n editLinkText: 'GitHub에서 이 페이지 편집하기',\n docFooter: { prev: '이전 페이지', next: '다음 페이지' },\n outline: { label: '목차' },\n lastUpdated: { text: '최종 업데이트' },\n returnToTopLabel: '맨 위로',\n sidebarMenuLabel: '메뉴',\n darkModeSwitchLabel: '다크 모드',\n },\n ja: {\n editLinkText: 'GitHubでこのページを編集する',\n docFooter: { prev: '前のページ', next: '次のページ' },\n outline: { label: '目次' },\n lastUpdated: { text: '最終更新' },\n returnToTopLabel: 'トップへ戻る',\n sidebarMenuLabel: 'メニュー',\n darkModeSwitchLabel: 'ダークモード',\n },\n zh: {\n editLinkText: '在 GitHub 上编辑此页',\n docFooter: { prev: '上一页', next: '下一页' },\n outline: { label: '目录' },\n lastUpdated: { text: '最后更新' },\n returnToTopLabel: '返回顶部',\n sidebarMenuLabel: '菜单',\n darkModeSwitchLabel: '深色模式',\n },\n};\n\n// ============================================================================\n// File System Utilities\n// ============================================================================\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction getSubdirectories(dir: string): string[] {\n if (!existsSync(dir)) return [];\n\n return readdirSync(dir)\n .filter((entry) => isDirectory(join(dir, entry)))\n .filter((entry) => !entry.startsWith('.') && !entry.startsWith('_'));\n}\n\nfunction getTitleFromFile(filePath: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n\n // Check frontmatter title first\n const frontmatterMatch = content.match(/^---\\s*\\n[\\s\\S]*?title:\\s*['\"]?([^'\"\\n]+)['\"]?\\s*\\n[\\s\\S]*?---/);\n if (frontmatterMatch?.[1]) {\n return frontmatterMatch[1].trim();\n }\n\n // Check first heading\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch?.[1]) {\n return headingMatch[1].trim();\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction fileNameToTitle(fileName: string): string {\n // Remove .md extension and convert kebab-case to Title Case\n return fileName\n .replace(/\\.md$/, '')\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n// ============================================================================\n// Sidebar Generation\n// ============================================================================\n\ninterface SidebarGeneratorOptions {\n basePath: string;\n localePrefix: string;\n useTitleFromHeading: boolean;\n}\n\nfunction generateSidebarItems(dir: string, options: SidebarGeneratorOptions): SidebarItem[] {\n const { basePath, localePrefix, useTitleFromHeading } = options;\n const items: SidebarItem[] = [];\n\n if (!existsSync(dir)) return items;\n\n const entries = readdirSync(dir).sort((a, b) => {\n // index.md comes first\n if (a === 'index.md') return -1;\n if (b === 'index.md') return 1;\n return a.localeCompare(b);\n });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = relative(basePath, fullPath);\n\n if (isDirectory(fullPath)) {\n // Recursively process subdirectories\n const subItems = generateSidebarItems(fullPath, options);\n if (subItems.length > 0) {\n const indexFile = join(fullPath, 'index.md');\n const title = existsSync(indexFile) && useTitleFromHeading\n ? getTitleFromFile(indexFile) || fileNameToTitle(entry)\n : fileNameToTitle(entry);\n\n items.push({\n text: title,\n items: subItems,\n });\n }\n } else if (entry.endsWith('.md')) {\n const title = useTitleFromHeading\n ? getTitleFromFile(fullPath) || fileNameToTitle(entry)\n : fileNameToTitle(entry);\n\n const link = `${localePrefix}/${relativePath.replace(/\\.md$/, '').replace(/\\/index$/, '/')}`;\n\n items.push({\n text: title,\n link,\n });\n }\n }\n\n return items;\n}\n\nfunction generateSidebar(\n docsDir: string,\n sidebarDirs: string[],\n localePrefix: string,\n useTitleFromHeading: boolean\n): Record<string, SidebarItem[]> {\n const sidebar: Record<string, SidebarItem[]> = {};\n\n for (const dir of sidebarDirs) {\n const fullDir = join(docsDir, dir);\n if (!existsSync(fullDir)) continue;\n\n const items = generateSidebarItems(fullDir, {\n basePath: docsDir,\n localePrefix,\n useTitleFromHeading,\n });\n\n if (items.length > 0) {\n const sidebarPath = `${localePrefix}/${dir}/`;\n sidebar[sidebarPath] = [\n {\n text: fileNameToTitle(dir),\n items,\n },\n ];\n }\n }\n\n return sidebar;\n}\n\n// ============================================================================\n// Nav Generation\n// ============================================================================\n\nfunction generateNav(\n docsDir: string,\n sidebarDirs: string[],\n localePrefix: string,\n useTitleFromHeading: boolean\n): NavItemWithLink[] {\n const nav: NavItemWithLink[] = [];\n\n for (const dir of sidebarDirs) {\n const fullDir = join(docsDir, dir);\n if (!existsSync(fullDir)) continue;\n\n const indexFile = join(fullDir, 'index.md');\n const title = existsSync(indexFile) && useTitleFromHeading\n ? getTitleFromFile(indexFile) || fileNameToTitle(dir)\n : fileNameToTitle(dir);\n\n nav.push({\n text: title,\n link: `${localePrefix}/${dir}/`,\n activeMatch: `${localePrefix}/${dir}/`,\n });\n }\n\n return nav;\n}\n\n// ============================================================================\n// Main Export Functions\n// ============================================================================\n\n/**\n * Auto-detect available locales by scanning for locale directories\n */\nexport function detectLocales(docsDir: string, defaultLocale: string = 'en'): string[] {\n const subdirs = getSubdirectories(docsDir);\n\n // Filter to only locale-like directories (2-letter codes)\n const localeDirs = subdirs.filter(\n (dir) => /^[a-z]{2}(-[A-Z]{2})?$/.test(dir) && dir !== defaultLocale\n );\n\n return localeDirs;\n}\n\n/**\n * Auto-detect sidebar directories by looking at root structure\n */\nexport function detectSidebarDirs(docsDir: string): string[] {\n const subdirs = getSubdirectories(docsDir);\n\n // Exclude locale directories and common non-sidebar dirs\n const excludePatterns = [\n /^[a-z]{2}(-[A-Z]{2})?$/, // locale dirs\n /^public$/,\n /^\\.vitepress$/,\n /^assets?$/,\n /^images?$/,\n ];\n\n return subdirs.filter((dir) => !excludePatterns.some((pattern) => pattern.test(dir)));\n}\n\n/**\n * Generate locale configuration for a specific locale\n */\nexport function generateLocale(\n docsDir: string,\n locale: string,\n options: GenerateOptions = {}\n): LocaleConfig {\n const {\n defaultLocale = 'en',\n labels = DEFAULT_LABELS,\n langCodes = DEFAULT_LANG_CODES,\n descriptions = {},\n sidebarDirs = detectSidebarDirs(docsDir),\n useTitleFromHeading = true,\n translations = DEFAULT_TRANSLATIONS,\n } = options;\n\n const isDefault = locale === defaultLocale;\n const localeDir = isDefault ? docsDir : join(docsDir, locale);\n const localePrefix = isDefault ? '' : `/${locale}`;\n\n // Generate nav and sidebar\n const nav = generateNav(localeDir, sidebarDirs, localePrefix, useTitleFromHeading);\n const sidebar = generateSidebar(localeDir, sidebarDirs, localePrefix, useTitleFromHeading);\n\n const localeTranslations = translations[locale] || {};\n\n const config: LocaleConfig = {\n label: labels[locale] || locale,\n lang: langCodes[locale] || locale,\n description: descriptions[locale],\n themeConfig: {\n nav,\n sidebar,\n },\n };\n\n // Add translations for non-default locales\n if (!isDefault && localeTranslations && config.themeConfig) {\n if (localeTranslations.docFooter) {\n config.themeConfig.docFooter = localeTranslations.docFooter;\n }\n if (localeTranslations.outline) {\n config.themeConfig.outline = localeTranslations.outline;\n }\n if (localeTranslations.lastUpdated) {\n config.themeConfig.lastUpdated = localeTranslations.lastUpdated;\n }\n if (localeTranslations.returnToTopLabel) {\n config.themeConfig.returnToTopLabel = localeTranslations.returnToTopLabel;\n }\n if (localeTranslations.sidebarMenuLabel) {\n config.themeConfig.sidebarMenuLabel = localeTranslations.sidebarMenuLabel;\n }\n if (localeTranslations.darkModeSwitchLabel) {\n config.themeConfig.darkModeSwitchLabel = localeTranslations.darkModeSwitchLabel;\n }\n }\n\n return config;\n}\n\n/**\n * Generate complete locale configuration for VitePress\n *\n * @example\n * ```typescript\n * import { defineConfig } from 'vitepress';\n * import { generateLocaleConfig } from 'llm-translate';\n *\n * const locales = generateLocaleConfig('./docs', {\n * defaultLocale: 'en',\n * locales: ['ko', 'ja'],\n * });\n *\n * export default defineConfig({\n * locales,\n * // ... other config\n * });\n * ```\n */\nexport function generateLocaleConfig(\n docsDir: string,\n options: GenerateOptions = {}\n): Record<string, LocaleConfig> {\n const { defaultLocale = 'en', locales = detectLocales(docsDir, defaultLocale) } = options;\n\n const config: Record<string, LocaleConfig> = {};\n\n // Generate default locale (root)\n config.root = generateLocale(docsDir, defaultLocale, options);\n\n // Generate other locales\n for (const locale of locales) {\n config[locale] = generateLocale(docsDir, locale, options);\n }\n\n return config;\n}\n\n/**\n * Generate sidebar configuration only\n *\n * Useful when you want to manually configure nav but auto-generate sidebar.\n */\nexport function generateSidebarConfig(\n docsDir: string,\n options: Omit<GenerateOptions, 'descriptions' | 'translations'> = {}\n): Record<string, Record<string, SidebarItem[]>> {\n const {\n defaultLocale = 'en',\n locales = detectLocales(docsDir, defaultLocale),\n sidebarDirs = detectSidebarDirs(docsDir),\n useTitleFromHeading = true,\n } = options;\n\n const config: Record<string, Record<string, SidebarItem[]>> = {};\n\n // Default locale\n config.root = generateSidebar(docsDir, sidebarDirs, '', useTitleFromHeading);\n\n // Other locales\n for (const locale of locales) {\n const localeDir = join(docsDir, locale);\n config[locale] = generateSidebar(localeDir, sidebarDirs, `/${locale}`, useTitleFromHeading);\n }\n\n return config;\n}\n"]}
|