translatronx 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1121 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1599 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +444 -0
- package/dist/index.js +1441 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/ledger/index.ts","../src/utils/hash.ts","../src/extractors/json-extractor.ts","../src/planner/index.ts","../src/providers/base-provider.ts","../src/providers/openai-provider.ts","../src/providers/anthropic-provider.ts","../src/providers/groq-provider.ts","../src/providers/index.ts","../src/validation/index.ts","../src/file-writer/index.ts","../src/prompts/index.ts","../src/compiler/index.ts","../src/reporting/index.ts","../src/cli.ts"],"names":["chalk","dirname","existsSync","mkdirSync","readFileSync","targetLangObj","writeFileSync"],"mappings":"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","file":"cli.js","sourcesContent":["import { z } from 'zod';\n\n/**\n * Provider type definitions\n */\nexport const ProviderTypeSchema = z.enum([\n 'openai',\n 'anthropic',\n 'groq',\n 'local',\n 'azure-openai',\n 'openrouter',\n]);\n\nexport type ProviderType = z.infer<typeof ProviderTypeSchema>;\n\n/**\n * Provider configuration schema\n */\nexport const ProviderConfigSchema = z.object({\n name: z.string().min(1, 'Provider name is required'),\n type: ProviderTypeSchema,\n apiKey: z.string().optional(),\n baseUrl: z.string().url().optional(),\n model: z.string().min(1, 'Model name is required'),\n temperature: z.number().min(0).max(2).default(0.3),\n maxRetries: z.number().int().min(0).default(3),\n fallback: z.string().optional(),\n});\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\n\n/**\n * Extractor configuration schema\n */\nexport const ExtractorConfigSchema = z.object({\n type: z.enum(['json', 'typescript', 'custom']),\n pattern: z.string().or(z.array(z.string())),\n keyPrefix: z.string().optional(),\n exclude: z.array(z.string()).optional(),\n});\n\nexport type ExtractorConfig = z.infer<typeof ExtractorConfigSchema>;\n\n/**\n * Prompt configuration schema\n */\nexport const PromptConfigSchema = z.object({\n /** @deprecated Use customContext instead. This field will be removed in v2.0 */\n systemPrompt: z.string().optional(),\n /** User-configurable prompt content (array for better readability, will be joined with newlines) */\n userPrompt: z.array(z.string()).optional(),\n customContext: z.string().optional(),\n formatting: z.enum(['formal', 'casual', 'technical']).optional(),\n glossary: z.record(z.string(), z.string()).optional(),\n brandVoice: z.string().optional(),\n}).optional();\n\nexport type PromptConfig = z.infer<typeof PromptConfigSchema>;\n\n/**\n * Validation rules schema\n */\nexport const ValidationConfigSchema = z.object({\n preservePlaceholders: z.boolean().default(true),\n maxLengthRatio: z.number().min(0).default(3),\n preventSourceLeakage: z.boolean().default(true),\n brandNames: z.array(z.string()).optional(),\n customRules: z.array(z.any()).optional(),\n});\n\nexport type ValidationConfig = z.infer<typeof ValidationConfigSchema>;\n\n/**\n * Output configuration schema\n */\nexport const OutputConfigSchema = z.object({\n dir: z.string().default('./locales'),\n format: z.enum(['json', 'yaml', 'typescript']).default('json'),\n flat: z.boolean().default(false),\n indent: z.number().int().min(0).max(8).default(2),\n // File naming pattern: {shortCode}.json, {language}.translation.json, or custom\n fileNaming: z.string().default('{shortCode}.json'),\n // Allow source and target files in same directory\n allowSameFolder: z.boolean().default(false),\n});\n\nexport type OutputConfig = z.infer<typeof OutputConfigSchema>;\n\n/**\n * Advanced configuration schema\n */\nexport const AdvancedConfigSchema = z.object({\n batchSize: z.number().int().min(1).default(20),\n concurrency: z.number().int().min(1).max(10).default(3),\n cacheDir: z.string().default('./.translatronx'),\n ledgerPath: z.string().default('./.translatronx/ledger.sqlite'),\n verbose: z.boolean().default(false),\n}).optional();\n\nexport type AdvancedConfig = z.infer<typeof AdvancedConfigSchema>;\n\n/**\n * Target language definition\n */\nexport const TargetLanguageSchema = z.object({\n language: z.string().min(1, 'Language name is required'),\n shortCode: z.string().min(2, 'Language short code is required'),\n});\n\nexport type TargetLanguage = z.infer<typeof TargetLanguageSchema>;\n\n/**\n * Main translatronx configuration schema\n */\nexport const translatronxConfigSchema = z.object({\n sourceLanguage: z.string().min(2, 'Source language code is required'),\n targetLanguages: z.array(TargetLanguageSchema).min(1, 'At least one target language is required'),\n extractors: z.array(ExtractorConfigSchema).min(1, 'At least one extractor is required'),\n providers: z.array(ProviderConfigSchema).min(1, 'At least one provider is required'),\n validation: ValidationConfigSchema.default({}),\n output: OutputConfigSchema.default({}),\n prompts: PromptConfigSchema,\n advanced: AdvancedConfigSchema,\n});\n\nexport type translatronxConfig = z.infer<typeof translatronxConfigSchema>;\n\n/**\n * Validate configuration and return typed result\n */\nexport function validateConfig(config: unknown): translatronxConfig {\n return translatronxConfigSchema.parse(config);\n}\n\n/**\n * Safe validate configuration without throwing\n */\nexport function safeValidateConfig(config: unknown): { success: true; data: translatronxConfig } | { success: false; error: z.ZodError } {\n const result = translatronxConfigSchema.safeParse(config);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { type translatronxConfig } from './schema';\nimport { validateConfig } from './schema';\nimport chalk from 'chalk';\nimport { pathToFileURL } from 'url';\n\nconst MODULE_NAME = 'translatronx';\n\n/**\n * Load and validate translatronx configuration\n */\nexport async function loadConfig(searchFrom?: string): Promise<translatronxConfig> {\n const explorer = cosmiconfig(MODULE_NAME, {\n searchPlaces: [\n 'translatronx.config.ts',\n 'translatronx.config.js',\n 'translatronx.config.json',\n `.${MODULE_NAME}rc`,\n `.${MODULE_NAME}rc.json`,\n `.${MODULE_NAME}rc.ts`,\n `.${MODULE_NAME}rc.js`,\n ],\n loaders: {\n '.ts': async (filepath: string) => {\n // Use dynamic import for TypeScript files\n try {\n const fileUrl = pathToFileURL(filepath).href;\n const module = await import(fileUrl);\n return module.default || module;\n } catch (error) {\n throw new Error(`Failed to load TypeScript config from ${filepath}: ${error}`);\n }\n },\n },\n });\n\n try {\n const result = await explorer.search(searchFrom);\n\n if (!result || !result.config) {\n throw new Error(\n `No ${MODULE_NAME} configuration found. Run 'translatronx init' to create one.`\n );\n }\n\n // Validate configuration\n try {\n const config = validateConfig(result.config);\n return config;\n } catch (error: any) {\n console.error(chalk.red('❌ Configuration validation failed:'));\n if (error.errors) {\n error.errors.forEach((err: any) => {\n console.error(chalk.yellow(` - ${err.path.join('.')}: ${err.message}`));\n });\n } else {\n console.error(chalk.yellow(` ${error.message}`));\n }\n throw new Error('Invalid configuration');\n }\n } catch (error: any) {\n if (error.message.includes('No translatronx configuration found')) {\n throw error;\n }\n console.error(chalk.red('❌ Failed to load configuration:'));\n console.error(chalk.yellow(` ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Get default configuration template\n */\nexport function getDefaultConfig(): Partial<translatronxConfig> {\n return {\n sourceLanguage: 'en',\n targetLanguages: [\n { language: 'Spanish', shortCode: 'es' },\n { language: 'French', shortCode: 'fr' },\n { language: 'German', shortCode: 'de' }\n ],\n extractors: [\n {\n type: 'json',\n pattern: 'src/locales/en/**/*.json',\n },\n ],\n providers: [\n {\n name: 'primary',\n type: 'openai',\n model: 'gpt-4-turbo-preview',\n temperature: 0.3,\n maxRetries: 3,\n },\n ],\n validation: {\n preservePlaceholders: true,\n maxLengthRatio: 3,\n preventSourceLeakage: true,\n },\n output: {\n dir: './locales',\n format: 'json',\n flat: false,\n indent: 2,\n fileNaming: '{shortCode}.json',\n allowSameFolder: false,\n },\n // Optional: Customize translation prompts\n // prompts: {\n // userPrompt: [\n // 'Please translate the following strings.',\n // 'Maintain a professional and friendly tone.',\n // 'Use gender-neutral language where possible.',\n // ],\n // customContext: 'This is a mobile banking application.',\n // formatting: 'formal',\n // brandVoice: 'Professional, trustworthy, and approachable',\n // glossary: {\n // 'Account': 'Cuenta',\n // 'Balance': 'Saldo',\n // },\n // },\n advanced: {\n batchSize: 20,\n concurrency: 3,\n cacheDir: './.translatronx',\n ledgerPath: './.translatronx/ledger.sqlite',\n verbose: false,\n },\n };\n}\n\n/**\n * Configuration helper for better IDE support\n */\nexport function defineConfig(config: translatronxConfig): translatronxConfig {\n return config;\n}\n","import Database from 'better-sqlite3';\nimport { existsSync, mkdirSync } from 'fs';\nimport { dirname } from 'path';\n\n/**\n * SQLite ledger for tracking translation state and change detection\n */\nexport class translatronxLedger {\n private db: Database.Database;\n\n constructor(ledgerPath: string) {\n // Ensure directory exists\n const dir = dirname(ledgerPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Initialize database\n this.db = new Database(ledgerPath);\n this.initializeSchema();\n }\n\n /**\n * Initialize database schema\n */\n private initializeSchema(): void {\n this.db.exec(`\n -- Source hashes table for change detection\n CREATE TABLE IF NOT EXISTS source_hashes (\n key_path TEXT PRIMARY KEY,\n value_hash TEXT NOT NULL,\n context_sig TEXT,\n last_seen_run TEXT,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n );\n\n CREATE INDEX IF NOT EXISTS idx_hash_lookup \n ON source_hashes(value_hash, context_sig);\n\n -- Sync status table for tracking translation state\n CREATE TABLE IF NOT EXISTS sync_status (\n key_path TEXT,\n lang_code TEXT,\n target_hash TEXT,\n status TEXT CHECK(status IN ('CLEAN','DIRTY','FAILED','MANUAL','SKIPPED')),\n model_fingerprint TEXT,\n prompt_version INTEGER,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (key_path, lang_code)\n );\n\n CREATE INDEX IF NOT EXISTS idx_status_lookup \n ON sync_status(status, lang_code);\n\n -- Run history table for audit trail\n CREATE TABLE IF NOT EXISTS run_history (\n run_id TEXT PRIMARY KEY,\n started_at TIMESTAMP,\n finished_at TIMESTAMP,\n model_used TEXT,\n tokens_in INTEGER,\n tokens_out INTEGER,\n cost_estimate_usd REAL,\n config_hash TEXT\n );\n `);\n }\n\n /**\n * Get source hash for a key path\n */\n getSourceHash(keyPath: string): string | null {\n const stmt = this.db.prepare(`\n SELECT value_hash FROM source_hashes WHERE key_path = ?\n `);\n const row = stmt.get(keyPath) as { value_hash: string } | undefined;\n return row?.value_hash || null;\n }\n\n /**\n * Update source hash for a key path\n */\n updateSourceHash(keyPath: string, valueHash: string, contextSig?: string, runId?: string): void {\n const stmt = this.db.prepare(`\n INSERT INTO source_hashes (key_path, value_hash, context_sig, last_seen_run)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key_path) DO UPDATE SET\n value_hash = excluded.value_hash,\n context_sig = excluded.context_sig,\n last_seen_run = excluded.last_seen_run,\n updated_at = CURRENT_TIMESTAMP\n `);\n stmt.run(keyPath, valueHash, contextSig || null, runId || null);\n }\n\n /**\n * Get sync status for a key-language pair\n */\n getSyncStatus(keyPath: string, langCode: string): SyncStatus | null {\n const stmt = this.db.prepare(`\n SELECT * FROM sync_status WHERE key_path = ? AND lang_code = ?\n `);\n const row = stmt.get(keyPath, langCode) as SyncStatus | undefined;\n return row || null;\n }\n\n /**\n * Update sync status for a key-language pair\n */\n updateSyncStatus(\n keyPath: string,\n langCode: string,\n targetHash: string,\n status: SyncStatusType,\n modelFingerprint?: string,\n promptVersion?: number\n ): void {\n const stmt = this.db.prepare(`\n INSERT INTO sync_status (key_path, lang_code, target_hash, status, model_fingerprint, prompt_version)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(key_path, lang_code) DO UPDATE SET\n target_hash = excluded.target_hash,\n status = excluded.status,\n model_fingerprint = excluded.model_fingerprint,\n prompt_version = excluded.prompt_version,\n updated_at = CURRENT_TIMESTAMP\n `);\n stmt.run(keyPath, langCode, targetHash, status, modelFingerprint || null, promptVersion || null);\n }\n\n /**\n * Begin a new run and return run ID\n */\n startRun(modelUsed: string, configHash: string): string {\n const runId = `run_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const stmt = this.db.prepare(`\n INSERT INTO run_history (run_id, started_at, model_used, config_hash)\n VALUES (?, CURRENT_TIMESTAMP, ?, ?)\n `);\n stmt.run(runId, modelUsed, configHash);\n return runId;\n }\n\n /**\n * Complete a run with stats\n */\n completeRun(runId: string, tokensIn: number, tokensOut: number, costEstimate: number): void {\n const stmt = this.db.prepare(`\n UPDATE run_history\n SET finished_at = CURRENT_TIMESTAMP,\n tokens_in = ?,\n tokens_out = ?,\n cost_estimate_usd = ?\n WHERE run_id = ?\n `);\n stmt.run(tokensIn, tokensOut, costEstimate, runId);\n }\n\n /**\n * Get all dirty/new translations for a language\n */\n getDirtyKeys(langCode: string): string[] {\n const stmt = this.db.prepare(`\n SELECT key_path FROM sync_status \n WHERE lang_code = ? AND status IN ('DIRTY', 'FAILED')\n `);\n const rows = stmt.all(langCode) as { key_path: string }[];\n return rows.map(r => r.key_path);\n }\n\n /**\n * Clean up old run history (keep last N runs)\n */\n cleanupHistory(keepLast: number = 100): void {\n this.db.exec(`\n DELETE FROM run_history \n WHERE run_id NOT IN (\n SELECT run_id FROM run_history \n ORDER BY started_at DESC \n LIMIT ${keepLast}\n )\n `);\n }\n\n /**\n * Get the most recent run record\n */\n getLatestRun(): any | null {\n const stmt = this.db.prepare(`\n SELECT * FROM run_history ORDER BY started_at DESC LIMIT 1\n `);\n return stmt.get() || null;\n }\n\n /**\n * Get aggregate statistics for the project\n */\n getProjectStats(): { total_keys: number; manual_count: number } {\n const totalKeys = this.db.prepare(`SELECT COUNT(DISTINCT key_path) as count FROM source_hashes`).get() as { count: number };\n const manualCount = this.db.prepare(`SELECT COUNT(*) as count FROM sync_status WHERE status = 'MANUAL'`).get() as { count: number };\n\n return {\n total_keys: totalKeys.count,\n manual_count: manualCount.count\n };\n }\n\n /**\n * Get status counts per language\n */\n getLanguageStats(langCode: string): { translated: number; failed: number } {\n const translated = this.db.prepare(`\n SELECT COUNT(*) as count FROM sync_status \n WHERE lang_code = ? AND status = 'CLEAN'\n `).get(langCode) as { count: number };\n\n const failed = this.db.prepare(`\n SELECT COUNT(*) as count FROM sync_status \n WHERE lang_code = ? AND status IN ('FAILED', 'DIRTY')\n `).get(langCode) as { count: number };\n\n return {\n translated: translated.count,\n failed: failed.count\n };\n }\n\n /**\n * Get failed translation items for retry\n */\n getFailedItems(langCode?: string, _batchId?: string): FailedItem[] {\n let query = `\n SELECT ss.*, sh.value_hash \n FROM sync_status ss \n LEFT JOIN source_hashes sh ON ss.key_path = sh.key_path\n WHERE ss.status = 'FAILED'\n `;\n const params: string[] = [];\n\n if (langCode) {\n query += ` AND ss.lang_code = ?`;\n params.push(langCode);\n }\n\n const stmt = this.db.prepare(query);\n return stmt.all(...params) as FailedItem[];\n }\n\n\n /**\n * Close database connection\n */\n close(): void {\n this.db.close();\n }\n\n /**\n * Execute a transaction\n */\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n}\n\n/**\n * Type definitions\n */\nexport type SyncStatusType = 'CLEAN' | 'DIRTY' | 'FAILED' | 'MANUAL' | 'SKIPPED';\n\nexport interface SyncStatus {\n key_path: string;\n lang_code: string;\n target_hash: string;\n status: SyncStatusType;\n model_fingerprint: string | null;\n prompt_version: number | null;\n updated_at: string;\n}\n\nexport interface FailedItem {\n key_path: string;\n lang_code: string;\n target_hash: string;\n status: SyncStatusType;\n model_fingerprint: string | null;\n prompt_version: number | null;\n updated_at: string;\n value_hash: string | null;\n}\n\n","import { createHash } from 'crypto';\n\n/**\n * Compute SHA-256 hash of content for change detection\n */\nexport function computeHash(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex');\n}\n\n/**\n * Compute context signature from context metadata\n */\nexport function computeContextSignature(context?: string): string | undefined {\n if (!context) return undefined;\n return createHash('sha256').update(context, 'utf8').digest('hex').substring(0, 16);\n}\n\n/**\n * Extract placeholders from a string\n * Supports common placeholder formats: {var}, {{var}}, %s, %d, $1, ${var}\n */\nexport function extractPlaceholders(text: string): string[] {\n const patterns = [\n /\\{([^}]+)\\}/g, // {var}\n /\\{\\{([^}]+)\\}\\}/g, // {{var}}\n /%[sdif]/g, // %s, %d, %i, %f\n /\\$\\{([^}]+)\\}/g, // ${var}\n /\\$\\d+/g, // $1, $2, etc.\n ];\n\n const placeholders = new Set<string>();\n\n for (const pattern of patterns) {\n const matches = text.matchAll(pattern);\n for (const match of matches) {\n placeholders.add(match[0]);\n }\n }\n\n return Array.from(placeholders).sort();\n}\n\n/**\n * Generate a unique unit ID from key path and source file\n */\nexport function generateUnitId(keyPath: string, sourceFile: string): string {\n const combined = `${sourceFile}:${keyPath}`;\n return computeHash(combined).substring(0, 16);\n}\n","import { readFileSync } from 'fs';\nimport fg from 'fast-glob';\nimport { type Extractor, type SourceUnit } from '../types/index';\nimport { type ExtractorConfig } from '../config/schema';\nimport { computeHash, extractPlaceholders, generateUnitId } from '../utils/hash';\n\n/**\n * JSON file extractor for translatable strings\n */\nexport class JsonExtractor implements Extractor {\n private schemaVersion = 1;\n\n /**\n * Extract translatable strings from JSON files\n */\n async extract(_sourceFiles: string[], config: ExtractorConfig): Promise<SourceUnit[]> {\n const units: SourceUnit[] = [];\n\n // Find all matching files\n const patterns = Array.isArray(config.pattern) ? config.pattern : [config.pattern];\n const files = await fg(patterns, {\n ignore: config.exclude || ['**/node_modules/**', '**/dist/**'],\n absolute: true,\n });\n\n // Extract from each file\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content);\n\n // Recursively extract all string values\n const fileUnits = this.extractFromObject(data, [], filePath, config.keyPrefix);\n units.push(...fileUnits);\n } catch (error) {\n console.error(`Failed to extract from ${filePath}:`, error);\n // Continue with other files\n }\n }\n\n return units;\n }\n\n /**\n * Recursively extract strings from a JSON object\n */\n private extractFromObject(\n obj: any,\n keyPath: string[],\n sourceFile: string,\n keyPrefix?: string\n ): SourceUnit[] {\n const units: SourceUnit[] = [];\n\n if (typeof obj === 'string') {\n // This is a translatable string\n const fullKeyPath = keyPrefix\n ? `${keyPrefix}.${keyPath.join('.')}`\n : keyPath.join('.');\n\n units.push(this.createSourceUnit(fullKeyPath, obj, sourceFile));\n } else if (Array.isArray(obj)) {\n // Handle arrays\n obj.forEach((item, index) => {\n units.push(...this.extractFromObject(item, [...keyPath, index.toString()], sourceFile, keyPrefix));\n });\n } else if (obj && typeof obj === 'object') {\n // Handle nested objects\n for (const [key, value] of Object.entries(obj)) {\n units.push(...this.extractFromObject(value, [...keyPath, key], sourceFile, keyPrefix));\n }\n }\n\n return units;\n }\n\n /**\n * Create a source unit from extracted string\n */\n private createSourceUnit(keyPath: string, sourceText: string, sourceFile: string): SourceUnit {\n const placeholders = extractPlaceholders(sourceText);\n const sourceHash = computeHash(sourceText);\n const unitId = generateUnitId(keyPath, sourceFile);\n\n return {\n unitId,\n keyPath,\n sourceText,\n sourceHash,\n placeholders,\n sourceFile,\n schemaVersion: this.schemaVersion,\n };\n }\n}\n","import { type SourceUnit, type TranslationPlan, type TranslationBatch, type TranslationPlanner, type TargetLanguage } from '../types/index';\nimport { translatronxLedger } from '../ledger/index';\nimport { computeHash } from '../utils/hash';\n\n/**\n * Translation planner that implements incremental processing\n */\nexport class IncrementalTranslationPlanner implements TranslationPlanner {\n constructor(private ledger: translatronxLedger) { }\n\n /**\n * Create a translation plan based on change detection\n */\n async createPlan(sourceUnits: SourceUnit[], targetLanguages: TargetLanguage[]): Promise<TranslationPlan> {\n const batches: TranslationBatch[] = [];\n let totalUnits = 0;\n\n for (const lang of targetLanguages) {\n const unitsNeedingTranslation = this.detectChanges(sourceUnits, lang.shortCode);\n\n if (unitsNeedingTranslation.length === 0) {\n continue; // No changes for this language\n }\n\n // Create batches for this language\n const langBatches = this.createBatches(unitsNeedingTranslation, lang.shortCode);\n batches.push(...langBatches);\n totalUnits += unitsNeedingTranslation.length;\n }\n\n // Estimate cost (rough estimate: ~50 tokens per translation)\n const estimatedCost = this.estimateCost(totalUnits);\n\n return {\n batches,\n totalUnits,\n estimatedCost,\n };\n }\n\n /**\n * Detect which source units have changed and need translation\n */\n private detectChanges(sourceUnits: SourceUnit[], targetLang: string): SourceUnit[] {\n const needsTranslation: SourceUnit[] = [];\n\n for (const unit of sourceUnits) {\n // Check if source hash has changed\n const storedHash = this.ledger.getSourceHash(unit.keyPath);\n const sourceChanged = storedHash !== unit.sourceHash;\n\n // Check sync status\n const syncStatus = this.ledger.getSyncStatus(unit.keyPath, targetLang);\n\n // Determine if translation is needed\n if (!syncStatus) {\n // New key - needs translation\n needsTranslation.push(unit);\n } else if (syncStatus.status === 'MANUAL') {\n // Manual override - skip unless forced\n continue;\n } else if (sourceChanged) {\n // Source changed - needs re-translation\n needsTranslation.push(unit);\n } else if (syncStatus.status === 'FAILED' || syncStatus.status === 'DIRTY') {\n // Previously failed or dirty - retry\n needsTranslation.push(unit);\n }\n // else: CLEAN and unchanged - skip\n }\n\n return needsTranslation;\n }\n\n /**\n * Create batches from units for efficient LLM processing\n */\n private createBatches(units: SourceUnit[], targetLang: string, batchSize: number = 20): TranslationBatch[] {\n const batches: TranslationBatch[] = [];\n\n for (let i = 0; i < units.length; i += batchSize) {\n const batchUnits = units.slice(i, i + batchSize);\n const batchId = `batch_${targetLang}_${Date.now()}_${i}`;\n\n // Compute deduplication key from content\n const contentHash = computeHash(\n batchUnits.map(u => u.sourceHash).join('_')\n );\n\n batches.push({\n batchId,\n sourceUnits: batchUnits,\n targetLanguage: targetLang,\n deduplicationKey: contentHash,\n });\n }\n\n return batches;\n }\n\n /**\n * Estimate cost for translation\n * Rough estimate: 50 input tokens + 50 output tokens per unit\n * OpenAI pricing: ~$0.01 per 1K tokens\n */\n private estimateCost(totalUnits: number): number {\n const tokensPerUnit = 100; // 50 input + 50 output (rough estimate)\n const totalTokens = totalUnits * tokensPerUnit;\n const costPer1kTokens = 0.01; // Average across providers\n return (totalTokens / 1000) * costPer1kTokens;\n }\n}\n\n/**\n * Manual override detector\n */\nexport class ManualOverrideDetector {\n constructor(private ledger: translatronxLedger) { }\n\n /**\n * Detect if a translation has been manually overridden\n */\n isManualOverride(keyPath: string, langCode: string, currentHash: string): boolean {\n const syncStatus = this.ledger.getSyncStatus(keyPath, langCode);\n\n if (!syncStatus) {\n return false; // New translation, not an override\n }\n\n // If status is MANUAL, it's been manually overridden\n if (syncStatus.status === 'MANUAL') {\n return true;\n }\n\n // If target hash doesn't match and status is CLEAN, it was manually edited\n if (syncStatus.status === 'CLEAN' && syncStatus.target_hash !== currentHash) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Mark a translation as manually overridden\n */\n markAsManualOverride(keyPath: string, langCode: string, targetHash: string): void {\n this.ledger.updateSyncStatus(keyPath, langCode, targetHash, 'MANUAL');\n }\n}\n","import { type LLMProvider, type TranslationBatch, type TranslationResult, type PromptTemplate } from '../types/index';\n\n/**\n * Base provider with common functionality\n */\nexport abstract class BaseLLMProvider implements LLMProvider {\n protected maxRetries: number;\n protected temperature: number;\n\n constructor(\n protected config: {\n model: string;\n temperature?: number;\n maxRetries?: number;\n }\n ) {\n this.maxRetries = config.maxRetries ?? 3;\n this.temperature = config.temperature ?? 0.3;\n }\n\n abstract translate(batch: TranslationBatch, prompt: PromptTemplate): Promise<TranslationResult[]>;\n abstract getModelFingerprint(): string;\n abstract estimateCost(batch: TranslationBatch): number;\n\n /**\n * Retry logic with exponential backoff\n */\n protected async retryWithBackoff<T>(\n fn: () => Promise<T>,\n attempt: number = 0\n ): Promise<T> {\n try {\n return await fn();\n } catch (error: any) {\n if (attempt >= this.maxRetries) {\n throw error;\n }\n\n // Exponential backoff: 1s, 2s, 4s, etc.\n const delay = Math.pow(2, attempt) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n\n return this.retryWithBackoff(fn, attempt + 1);\n }\n }\n\n /**\n * Build prompt for translation batch\n */\n protected buildTranslationPrompt(batch: TranslationBatch): string {\n const items = batch.sourceUnits.map((unit, idx) => {\n return `${idx + 1}. [${unit.keyPath}]: \"${unit.sourceText}\"`;\n }).join('\\n');\n\n return `Translate the following strings to ${batch.targetLanguage}. Preserve all placeholders exactly as they appear. Return a JSON array with the same order.\\n\\n${items}`;\n }\n\n /**\n * Clean LLM output to extract just the JSON part\n * Handles <think> tags, markdown, and extra text\n */\n protected cleanJsonOutput(text: string): string {\n // Remove <think> tags (common in reasoning models)\n let clean = text.replace(/<think>[\\s\\S]*?<\\/think>/g, '').trim();\n\n // Extract from markdown code blocks if present\n const codeBlockMatch = clean.match(/```(?:json)?\\s*(\\[[\\s\\S]*?\\])\\s*```/);\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n\n // Find outer JSON array extraction\n // This regex looks for the first '[' and the last ']'\n const start = clean.indexOf('[');\n const end = clean.lastIndexOf(']');\n\n if (start !== -1 && end !== -1 && end > start) {\n return clean.substring(start, end + 1);\n }\n\n return clean;\n }\n\n /**\n * Parse translation response into results\n */\n protected parseTranslationResponse(\n batch: TranslationBatch,\n responseText: string\n ): TranslationResult[] {\n try {\n // Clean the output first\n const jsonString = this.cleanJsonOutput(responseText);\n\n // Try to parse as JSON array\n const translations = JSON.parse(jsonString);\n\n if (!Array.isArray(translations)) {\n throw new Error('Response is not an array');\n }\n\n return batch.sourceUnits.map((unit, idx) => ({\n unitId: unit.unitId,\n translatedText: translations[idx] || '',\n confidence: 1.0,\n }));\n } catch (error) {\n // Fallback: try to extract individual translations if JSON parsing failed\n console.error('Failed to parse response as JSON array:', error);\n console.debug('Raw response:', responseText);\n throw new Error('Invalid translation response format');\n }\n }\n}\n","import OpenAI from 'openai';\nimport { BaseLLMProvider } from './base-provider';\nimport { type TranslationBatch, type TranslationResult, type PromptTemplate } from '../types/index';\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider extends BaseLLMProvider {\n private client: OpenAI;\n\n constructor(config: {\n apiKey: string;\n model: string;\n temperature?: number;\n maxRetries?: number;\n baseUrl?: string;\n }) {\n super(config);\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n }\n\n async translate(batch: TranslationBatch, prompt: PromptTemplate): Promise<TranslationResult[]> {\n return this.retryWithBackoff(async () => {\n const userPrompt = this.buildTranslationPrompt(batch);\n\n const response = await this.client.chat.completions.create({\n model: this.config.model,\n temperature: this.temperature,\n messages: [\n { role: 'system', content: prompt.system },\n { role: 'user', content: userPrompt },\n ],\n response_format: { type: 'json_object' },\n });\n\n const content = response.choices[0]?.message?.content || '[]';\n\n // Extract JSON array from response\n const jsonMatch = content.match(/\\[[\\s\\S]*\\]/);\n const jsonString = jsonMatch ? jsonMatch[0] : content;\n\n return this.parseTranslationResponse(batch, jsonString);\n });\n }\n\n getModelFingerprint(): string {\n return `openai:${this.config.model}`;\n }\n\n estimateCost(batch: TranslationBatch): number {\n // OpenAI GPT-4 pricing (approximate)\n // Input: $0.03 per 1K tokens, Output: $0.06 per 1K tokens\n const avgCharsPerUnit = batch.sourceUnits.reduce((sum, u) => sum + u.sourceText.length, 0) / batch.sourceUnits.length;\n const estimatedInputTokens = batch.sourceUnits.length * (avgCharsPerUnit / 4); // ~4 chars per token\n const estimatedOutputTokens = estimatedInputTokens; // Assume similar output size\n\n const inputCost = (estimatedInputTokens / 1000) * 0.03;\n const outputCost = (estimatedOutputTokens / 1000) * 0.06;\n\n return inputCost + outputCost;\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport { BaseLLMProvider } from './base-provider';\nimport { type TranslationBatch, type TranslationResult, type PromptTemplate } from '../types/index';\n\n/**\n * Anthropic (Claude) provider implementation\n */\nexport class AnthropicProvider extends BaseLLMProvider {\n private client: Anthropic;\n\n constructor(config: {\n apiKey: string;\n model: string;\n temperature?: number;\n maxRetries?: number;\n }) {\n super(config);\n this.client = new Anthropic({\n apiKey: config.apiKey,\n });\n }\n\n async translate(batch: TranslationBatch, prompt: PromptTemplate): Promise<TranslationResult[]> {\n return this.retryWithBackoff(async () => {\n const userPrompt = this.buildTranslationPrompt(batch);\n\n const response = await this.client.messages.create({\n model: this.config.model,\n max_tokens: prompt.maxTokens || 4096,\n temperature: this.temperature,\n system: prompt.system,\n messages: [\n { role: 'user', content: userPrompt },\n ],\n });\n\n const content = response.content[0];\n if (content.type !== 'text') {\n throw new Error('Expected text response from Anthropic');\n }\n\n // Extract JSON array from response\n const jsonMatch = content.text.match(/\\[[\\s\\S]*\\]/);\n const jsonString = jsonMatch ? jsonMatch[0] : content.text;\n\n return this.parseTranslationResponse(batch, jsonString);\n });\n }\n\n getModelFingerprint(): string {\n return `anthropic:${this.config.model}`;\n }\n\n estimateCost(batch: TranslationBatch): number {\n // Anthropic Claude pricing (approximate)\n // Input: $0.015 per 1K tokens, Output: $0.075 per 1K tokens (Claude 3 Sonnet)\n const avgCharsPerUnit = batch.sourceUnits.reduce((sum, u) => sum + u.sourceText.length, 0) / batch.sourceUnits.length;\n const estimatedInputTokens = batch.sourceUnits.length * (avgCharsPerUnit / 4);\n const estimatedOutputTokens = estimatedInputTokens;\n\n const inputCost = (estimatedInputTokens / 1000) * 0.015;\n const outputCost = (estimatedOutputTokens / 1000) * 0.075;\n\n return inputCost + outputCost;\n }\n}\n","import { Groq } from 'groq-sdk';\nimport { BaseLLMProvider } from './base-provider';\nimport { type TranslationBatch, type TranslationResult, type PromptTemplate } from '../types/index';\n\n/**\n * Groq provider implementation\n */\nexport class GroqProvider extends BaseLLMProvider {\n private client: Groq;\n\n constructor(config: {\n apiKey: string;\n model: string;\n temperature?: number;\n maxRetries?: number;\n }) {\n super(config);\n this.client = new Groq({\n apiKey: config.apiKey,\n });\n }\n\n async translate(batch: TranslationBatch, prompt: PromptTemplate): Promise<TranslationResult[]> {\n return this.retryWithBackoff(async () => {\n const userPrompt = this.buildTranslationPrompt(batch);\n\n const response = await this.client.chat.completions.create({\n model: this.config.model,\n temperature: this.temperature,\n messages: [\n { role: 'system', content: prompt.system },\n { role: 'user', content: userPrompt },\n ],\n response_format: { type: 'json_object' },\n });\n\n const content = response.choices[0]?.message?.content || '[]';\n\n // Extract JSON array from response\n const jsonMatch = content.match(/\\[[\\s\\S]*\\]/);\n const jsonString = jsonMatch ? jsonMatch[0] : content;\n\n return this.parseTranslationResponse(batch, jsonString);\n });\n }\n\n getModelFingerprint(): string {\n return `groq:${this.config.model}`;\n }\n\n estimateCost(batch: TranslationBatch): number {\n // Groq pricing (very low cost, approximate)\n // Input: $0.0001 per 1K tokens, Output: $0.0002 per 1K tokens\n const avgCharsPerUnit = batch.sourceUnits.reduce((sum, u) => sum + u.sourceText.length, 0) / batch.sourceUnits.length;\n const estimatedInputTokens = batch.sourceUnits.length * (avgCharsPerUnit / 4);\n const estimatedOutputTokens = estimatedInputTokens;\n\n const inputCost = (estimatedInputTokens / 1000) * 0.0001;\n const outputCost = (estimatedOutputTokens / 1000) * 0.0002;\n\n return inputCost + outputCost;\n }\n}\n","import { type ProviderConfig } from '../config/schema';\nimport { type LLMProvider } from '../types/index';\nimport { OpenAIProvider } from './openai-provider';\nimport { AnthropicProvider } from './anthropic-provider';\nimport { GroqProvider } from './groq-provider';\n\n/**\n * Provider factory to create LLM providers from configuration\n */\nexport class ProviderFactory {\n /**\n * Create an LLM provider from configuration\n */\n static createProvider(config: ProviderConfig): LLMProvider {\n switch (config.type) {\n case 'openai':\n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n return new OpenAIProvider({\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n baseUrl: config.baseUrl,\n });\n\n case 'anthropic':\n if (!config.apiKey) {\n throw new Error('Anthropic API key is required');\n }\n return new AnthropicProvider({\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n });\n\n case 'groq':\n if (!config.apiKey) {\n throw new Error('Groq API key is required');\n }\n return new GroqProvider({\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n });\n\n case 'local':\n // Use OpenAI-compatible interface for local models (Ollama, etc.)\n return new OpenAIProvider({\n apiKey: config.apiKey || 'not-needed',\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n baseUrl: config.baseUrl || 'http://localhost:11434/v1',\n });\n\n case 'azure-openai':\n if (!config.apiKey) {\n throw new Error('Azure OpenAI API key is required');\n }\n return new OpenAIProvider({\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n baseUrl: config.baseUrl, // Azure endpoint\n });\n\n case 'openrouter':\n if (!config.apiKey) {\n throw new Error('OpenRouter API key is required');\n }\n return new OpenAIProvider({\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxRetries: config.maxRetries,\n baseUrl: config.baseUrl || 'https://openrouter.ai/api/v1',\n });\n\n default:\n throw new Error(`Unknown provider type: ${config.type}`);\n }\n }\n}\n\nexport * from './openai-provider.js';\nexport * from './anthropic-provider.js';\nexport * from './groq-provider.js';\n","import { type ValidationPipeline, type ValidationResult, type ValidationError, type ValidationWarning, type TranslationResult, type SourceUnit } from '../types/index';\nimport { extractPlaceholders } from '../utils/hash';\n\n/**\n * Multi-stage validation pipeline for translation quality\n */\nexport class TranslationValidationPipeline implements ValidationPipeline {\n constructor(\n private config: {\n preservePlaceholders?: boolean;\n maxLengthRatio?: number;\n preventSourceLeakage?: boolean;\n brandNames?: string[];\n } = {}\n ) { }\n\n async validate(result: TranslationResult, sourceUnit: SourceUnit): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n let confidence = 1.0;\n\n // Stage 1: Structural validation\n if (!result.translatedText || result.translatedText.trim().length === 0) {\n errors.push({\n type: 'EMPTY_TRANSLATION',\n message: 'Translation is empty',\n });\n return { isValid: false, errors, warnings, confidence: 0 };\n }\n\n // Stage 2: Placeholder preservation\n if (this.config.preservePlaceholders !== false) {\n const placeholderErrors = this.validatePlaceholders(sourceUnit, result);\n errors.push(...placeholderErrors);\n if (placeholderErrors.length > 0) {\n confidence *= 0.5;\n }\n }\n\n // Stage 3: Semantic validation\n const semanticWarnings = this.validateSemantics(sourceUnit, result);\n warnings.push(...semanticWarnings);\n if (semanticWarnings.length > 0) {\n confidence *= 0.8;\n }\n\n // Stage 4: Source leakage detection\n if (this.config.preventSourceLeakage !== false) {\n const leakageDetected = this.detectSourceLeakage(sourceUnit, result);\n if (leakageDetected) {\n errors.push({\n type: 'SOURCE_LEAKAGE',\n message: 'Translation appears to be in source language',\n });\n confidence *= 0.3;\n }\n }\n\n // Stage 5: Brand name protection\n if (this.config.brandNames && this.config.brandNames.length > 0) {\n const brandWarnings = this.validateBrandNames(sourceUnit, result);\n warnings.push(...brandWarnings);\n }\n\n const isValid = errors.length === 0;\n return { isValid, errors, warnings, confidence };\n }\n\n /**\n * Validate that all placeholders are preserved\n */\n private validatePlaceholders(sourceUnit: SourceUnit, result: TranslationResult): ValidationError[] {\n const errors: ValidationError[] = [];\n const sourcePlaceholders = new Set(sourceUnit.placeholders);\n const translatedPlaceholders = new Set(extractPlaceholders(result.translatedText));\n\n // Check for missing placeholders\n for (const placeholder of sourcePlaceholders) {\n if (!translatedPlaceholders.has(placeholder)) {\n errors.push({\n type: 'MISSING_PLACEHOLDER',\n message: `Missing placeholder: ${placeholder}`,\n field: placeholder,\n });\n }\n }\n\n // Check for extra placeholders\n for (const placeholder of translatedPlaceholders) {\n if (!sourcePlaceholders.has(placeholder)) {\n errors.push({\n type: 'EXTRA_PLACEHOLDER',\n message: `Unexpected placeholder: ${placeholder}`,\n field: placeholder,\n });\n }\n }\n\n return errors;\n }\n\n /**\n * Validate semantic properties like length ratio\n */\n private validateSemantics(sourceUnit: SourceUnit, result: TranslationResult): ValidationWarning[] {\n const warnings: ValidationWarning[] = [];\n const maxLengthRatio = this.config.maxLengthRatio || 3;\n\n const sourceLength = sourceUnit.sourceText.length;\n const translatedLength = result.translatedText.length;\n const ratio = translatedLength / sourceLength;\n\n if (ratio > maxLengthRatio) {\n warnings.push({\n type: 'LENGTH_RATIO_EXCEEDED',\n message: `Translation is ${ratio.toFixed(1)}x longer than source (max: ${maxLengthRatio}x)`,\n });\n }\n\n return warnings;\n }\n\n /**\n * Detect if translation leaked source language\n */\n private detectSourceLeakage(sourceUnit: SourceUnit, result: TranslationResult): boolean {\n // Simple heuristic: check if translation is identical or very similar to source\n const normalizedSource = sourceUnit.sourceText.toLowerCase().trim();\n const normalizedTranslation = result.translatedText.toLowerCase().trim();\n\n if (normalizedSource === normalizedTranslation) {\n return true;\n }\n\n // Check for high similarity (>80% of words match)\n const sourceWords = new Set(normalizedSource.split(/\\s+/));\n const translationWords = new Set(normalizedTranslation.split(/\\s+/));\n\n let matchCount = 0;\n for (const word of sourceWords) {\n if (translationWords.has(word)) {\n matchCount++;\n }\n }\n\n const similarity = matchCount / sourceWords.size;\n return similarity > 0.8;\n }\n\n /**\n * Validate that brand names are preserved\n */\n private validateBrandNames(sourceUnit: SourceUnit, result: TranslationResult): ValidationWarning[] {\n const warnings: ValidationWarning[] = [];\n const brandNames = this.config.brandNames || [];\n\n for (const brandName of brandNames) {\n const sourceHasBrand = sourceUnit.sourceText.includes(brandName);\n const translationHasBrand = result.translatedText.includes(brandName);\n\n if (sourceHasBrand && !translationHasBrand) {\n warnings.push({\n type: 'MISSING_BRAND_NAME',\n message: `Brand name \"${brandName}\" not preserved in translation`,\n field: brandName,\n });\n }\n }\n\n return warnings;\n }\n}\n","import { writeFileSync, mkdirSync, renameSync, existsSync, readFileSync, unlinkSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { type AtomicWriter } from '../types/index';\nimport { type TargetLanguage } from '../config/schema';\nimport { type OutputConfig } from '../config/schema';\n\n/**\n * Atomic file writer using temp file + rename pattern\n */\nexport class AtomicFileWriter implements AtomicWriter {\n /**\n * Get output file path based on configuration\n */\n static getOutputPath(targetLanguage: TargetLanguage, outputConfig: OutputConfig): string {\n const pattern = outputConfig.fileNaming || '{shortCode}.json';\n const filename = pattern\n .replace(/\\{shortCode\\}/g, targetLanguage.shortCode)\n .replace(/\\{language\\}/g, targetLanguage.language);\n\n return join(outputConfig.dir, filename);\n }\n\n /**\n * Write translations to a file atomically\n */\n async writeTranslations(filePath: string, translations: Record<string, string>): Promise<void> {\n // Ensure directory exists\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Read existing content for merging\n let existing: Record<string, any> = {};\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n existing = JSON.parse(content);\n } catch (error) {\n console.warn(`Failed to read existing file ${filePath}, starting fresh:`, error);\n }\n }\n\n // Deep merge translations\n const merged = this.deepMerge(existing, translations);\n\n // Write to temporary file first\n const tempPath = `${filePath}.tmp`;\n try {\n writeFileSync(tempPath, JSON.stringify(merged, null, 2), 'utf-8');\n\n // Atomic rename\n renameSync(tempPath, filePath);\n } catch (error) {\n // Cleanup temp file if failed\n if (existsSync(tempPath)) {\n unlinkSync(tempPath);\n }\n throw error;\n }\n }\n\n /**\n * Deep merge two objects, preserving existing values not being updated\n */\n private deepMerge(target: any, source: any): any {\n if (!source || typeof source !== 'object') {\n return source;\n }\n\n if (Array.isArray(source)) {\n return source;\n }\n\n const result = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = this.deepMerge(result[key] || {}, value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Convert flat key-value pairs to nested object structure\n */\n static flatToNested(flat: Record<string, string>): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [keyPath, value] of Object.entries(flat)) {\n const keys = keyPath.split('.');\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n current[key] = {};\n }\n current = current[key];\n }\n\n current[keys[keys.length - 1]] = value;\n }\n\n return result;\n }\n}\n","/**\n * Prompt management system for translation quality and customization\n */\n\nexport interface PromptConfig {\n /** @deprecated Use customContext instead. This field will be removed in v2.0 */\n systemPrompt?: string;\n /** User-configurable prompt content (array for better readability, will be joined with newlines) */\n userPrompt?: string[];\n customContext?: string;\n formatting?: 'formal' | 'casual' | 'technical';\n glossary?: Record<string, string>;\n brandVoice?: string;\n}\n\nexport interface PromptContext {\n targetLanguage: string;\n targetCode: string;\n sourceUnits?: any[];\n contextInfo?: string;\n}\n\n/**\n * Manages translation prompts with defaults and customization\n */\nexport class PromptManager {\n private config: PromptConfig;\n\n constructor(config?: PromptConfig) {\n this.config = config || {};\n }\n\n /**\n * Get the system prompt for translation\n * Always returns the core SDK system prompt with optional customizations\n */\n getSystemPrompt(context: PromptContext): string {\n // Always start with core SDK system prompt\n let prompt = this.getCoreSystemPrompt(context);\n\n // Add formatting instructions\n if (this.config.formatting) {\n prompt += `\\n\\n${this.getFormattingInstructions(this.config.formatting)}`;\n }\n\n // Add glossary terms\n if (this.config.glossary && Object.keys(this.config.glossary).length > 0) {\n prompt += `\\n\\n${this.getGlossaryInstructions(this.config.glossary)}`;\n }\n\n // Add brand voice\n if (this.config.brandVoice) {\n prompt += `\\n\\nBrand voice: ${this.config.brandVoice}`;\n }\n\n // Add custom context\n if (this.config.customContext) {\n prompt += `\\n\\n${this.config.customContext}`;\n }\n\n // Backward compatibility: append deprecated systemPrompt as custom context\n if (this.config.systemPrompt) {\n prompt += `\\n\\n${this.config.systemPrompt}`;\n }\n\n return prompt;\n }\n\n /**\n * Get core SDK system prompt (always used as base)\n */\n private getCoreSystemPrompt(context: PromptContext): string {\n return `You are a professional translator specializing in software localization.\n\nYour task is to translate the provided strings accurately into ${context.targetLanguage} (${context.targetCode}).\n\nCRITICAL RULES:\n1. **Preserve all placeholders exactly as they appear** - This includes {variable}, {{variable}}, $variable, %s, %d, and any other template syntax\n2. **Maintain the same structure** - Return translations in the exact same JSON array format and order\n3. **Context awareness** - Consider the context of UI strings, messages, and technical terms\n4. **Natural language** - Produce natural, idiomatic translations that native speakers would use\n5. **Consistency** - Maintain consistent terminology throughout all translations\n6. **No additions or omissions** - Translate only what is provided, nothing more, nothing less\n\nOUTPUT FORMAT:\nReturn ONLY a valid JSON array of translated strings in the same order as the input.\nDo not include any explanations, comments, or markdown formatting.`;\n }\n\n /**\n * Get formatting instructions based on style\n */\n private getFormattingInstructions(formatting: 'formal' | 'casual' | 'technical'): string {\n const styles = {\n formal: 'Use formal language and respectful address. Suitable for professional, business, or official contexts.',\n casual: 'Use casual, friendly language. Suitable for consumer apps and informal communication.',\n technical: 'Use precise technical terminology. Prioritize accuracy over naturalness. Keep technical terms in English when appropriate.',\n };\n\n return `Tone and style: ${styles[formatting]}`;\n }\n\n /**\n * Get glossary instructions\n */\n private getGlossaryInstructions(glossary: Record<string, string>): string {\n const terms = Object.entries(glossary)\n .map(([source, target]) => `- \"${source}\" → \"${target}\"`)\n .join('\\n');\n\n return `GLOSSARY - Use these exact translations for the following terms:\\n${terms}`;\n }\n\n /**\n * Get the current prompt version for tracking\n */\n getPromptVersion(): number {\n // Version 1 is the default system prompt\n // Custom prompts get version 2+\n return this.config.userPrompt || this.config.customContext ? 2 : 1;\n }\n\n /**\n * Build user prompt from source units\n * Uses custom userPrompt if provided, otherwise defaults to JSON array of source texts\n */\n getUserPrompt(sourceTexts: string[]): string {\n // If custom user prompt is provided, use it\n if (this.config.userPrompt && this.config.userPrompt.length > 0) {\n // Join array with newlines for better readability\n const customPrompt = this.config.userPrompt.join('\\n');\n // Append source texts as JSON array\n return `${customPrompt}\\n\\n${JSON.stringify(sourceTexts, null, 0)}`;\n }\n\n // Default: just return source texts as JSON array\n return JSON.stringify(sourceTexts, null, 0);\n }\n}\n","import { type translatronxConfig } from '../config/schema';\nimport { translatronxLedger } from '../ledger/index';\nimport { JsonExtractor } from '../extractors/json-extractor';\nimport { IncrementalTranslationPlanner } from '../planner/index';\nimport { ProviderFactory } from '../providers/index';\nimport { TranslationValidationPipeline } from '../validation/index';\nimport { AtomicFileWriter } from '../file-writer/index';\nimport { type RunStatistics, type RetryStatistics, type TranslationBatch } from '../types/index';\nimport { computeHash } from '../utils/hash.js';\nimport { PromptManager } from '../prompts/index';\nimport ora from 'ora';\nimport chalk from 'chalk';\n\n/**\n * Main orchestrator for translation compilation\n */\nexport class TranslationCompiler {\n private ledger: translatronxLedger;\n private planner: IncrementalTranslationPlanner;\n private writer: AtomicFileWriter;\n private promptManager: PromptManager;\n\n constructor(private config: translatronxConfig) {\n const ledgerPath = config.advanced?.ledgerPath || './.translatronx/ledger.sqlite';\n this.ledger = new translatronxLedger(ledgerPath);\n this.planner = new IncrementalTranslationPlanner(this.ledger);\n this.writer = new AtomicFileWriter();\n this.promptManager = new PromptManager(this.config.prompts);\n }\n\n /**\n * Synchronize translations (main compilation step)\n */\n async sync(_options: { force?: boolean; verbose?: boolean } = {}): Promise<RunStatistics> {\n const startTime = new Date();\n const spinner = ora('Extracting source strings...').start();\n\n // TODO: Implement force flag to regenerate manual overrides\n // When _options.force is true, mark all MANUAL status translations as DIRTY\n\n\n try {\n // Step 1: Extract source strings\n const extractor = new JsonExtractor();\n const extractorConfig = this.config.extractors[0]; // Use first extractor for now\n const sourceUnits = await extractor.extract([], extractorConfig);\n\n spinner.succeed(`Extracted ${sourceUnits.length} translatable strings`);\n\n // Step 2: Update source hashes in ledger\n spinner.start('Updating source hashes...');\n const configHash = computeHash(JSON.stringify(this.config));\n const runId = this.ledger.startRun(this.config.providers[0].model, configHash);\n\n for (const unit of sourceUnits) {\n this.ledger.updateSourceHash(unit.keyPath, unit.sourceHash, undefined, runId);\n }\n spinner.succeed('Source hashes updated');\n\n // Step 3: Create translation plan\n spinner.start('Creating translation plan...');\n const plan = await this.planner.createPlan(sourceUnits, this.config.targetLanguages);\n\n if (plan.batches.length === 0) {\n spinner.succeed(chalk.green('✓ All translations are up to date!'));\n this.ledger.completeRun(runId, 0, 0, 0);\n return {\n runId,\n startedAt: startTime,\n finishedAt: new Date(),\n totalUnits: sourceUnits.length,\n translatedUnits: 0,\n failedUnits: 0,\n skippedUnits: sourceUnits.length,\n tokensIn: 0,\n tokensOut: 0,\n costEstimateUsd: 0,\n model: this.config.providers[0].model,\n };\n }\n\n spinner.succeed(`Created plan: ${plan.batches.length} batches, ~$${plan.estimatedCost.toFixed(4)} estimated cost`);\n\n // Step 4: Process batches\n const provider = ProviderFactory.createProvider(this.config.providers[0]);\n const validator = new TranslationValidationPipeline(this.config.validation);\n\n let translatedUnits = 0;\n let failedUnits = 0;\n let totalTokensIn = 0;\n let totalTokensOut = 0;\n\n spinner.start(`Translating ${plan.totalUnits} strings...`);\n\n for (const batch of plan.batches) {\n try {\n // Find the full language name for better context\n const targetLangObj = this.config.targetLanguages.find(l => l.shortCode === batch.targetLanguage);\n if (!targetLangObj) continue;\n\n const langName = targetLangObj.language;\n\n // Get system prompt from prompt manager\n const systemPrompt = this.promptManager.getSystemPrompt({\n targetLanguage: langName,\n targetCode: batch.targetLanguage,\n sourceUnits: batch.sourceUnits,\n });\n\n // Get user prompt with source texts\n const sourceTexts = batch.sourceUnits.map(unit => unit.sourceText);\n const userPrompt = this.promptManager.getUserPrompt(sourceTexts);\n\n // Translate batch\n const results = await provider.translate(batch, {\n system: systemPrompt,\n user: userPrompt,\n temperature: this.config.providers[0].temperature,\n });\n\n // Validate and write results\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const sourceUnit = batch.sourceUnits[i];\n\n // Validate\n const validation = await validator.validate(result, sourceUnit);\n\n if (!validation.isValid) {\n console.error(chalk.red(`✗ Validation failed for ${sourceUnit.keyPath}:`), validation.errors);\n failedUnits++;\n this.ledger.updateSyncStatus(sourceUnit.keyPath, batch.targetLanguage, '', 'FAILED');\n continue;\n }\n\n // Write translation using flexible filename\n const outputFile = AtomicFileWriter.getOutputPath(targetLangObj, this.config.output);\n const translations = AtomicFileWriter.flatToNested({ [sourceUnit.keyPath]: result.translatedText });\n\n await this.writer.writeTranslations(outputFile, translations);\n\n // Update ledger\n const targetHash = computeHash(result.translatedText);\n this.ledger.updateSyncStatus(\n sourceUnit.keyPath,\n batch.targetLanguage,\n targetHash,\n 'CLEAN',\n provider.getModelFingerprint(),\n this.promptManager.getPromptVersion()\n );\n\n translatedUnits++;\n }\n\n // Update token counts (rough estimate)\n totalTokensIn += batch.sourceUnits.length * 50;\n totalTokensOut += batch.sourceUnits.length * 50;\n\n } catch (error) {\n console.error(chalk.red(`✗ Failed to translate batch ${batch.batchId}:`), error);\n failedUnits += batch.sourceUnits.length;\n }\n }\n\n spinner.succeed(chalk.green(`✓ Translated ${translatedUnits} strings, ${failedUnits} failed`));\n\n // Step 5: Complete run\n const actualCost = provider.estimateCost({ ...plan.batches[0], sourceUnits: sourceUnits.slice(0, translatedUnits) });\n this.ledger.completeRun(runId, totalTokensIn, totalTokensOut, actualCost);\n\n return {\n runId,\n startedAt: startTime,\n finishedAt: new Date(),\n totalUnits: sourceUnits.length,\n translatedUnits,\n failedUnits,\n skippedUnits: sourceUnits.length - translatedUnits - failedUnits,\n tokensIn: totalTokensIn,\n tokensOut: totalTokensOut,\n costEstimateUsd: actualCost,\n model: this.config.providers[0].model,\n };\n\n } catch (error) {\n spinner.fail('Translation failed');\n throw error;\n }\n }\n\n /**\n * Close ledger connection\n */\n close(): void {\n this.ledger.close();\n }\n\n /**\n * Retry failed translation batches\n */\n async retryFailed(options: { batch?: string; lang?: string; dryRun?: boolean }): Promise<RetryStatistics> {\n const spinner = ora('Identifying failed translations...').start();\n\n try {\n // Get all failed items from ledger\n const failedItems = this.ledger.getFailedItems(options.lang, options.batch);\n\n if (failedItems.length === 0) {\n spinner.succeed(chalk.green('✓ No failed translations found'));\n return {\n recoveredUnits: 0,\n remainingFailed: 0,\n tokensIn: 0,\n tokensOut: 0\n };\n }\n\n spinner.succeed(`Found ${failedItems.length} failed translations to retry`);\n\n if (options.dryRun) {\n console.log(chalk.blue('\\nDry-run mode - showing what would be retried:'));\n failedItems.forEach(item => {\n console.log(chalk.gray(` - ${item.key_path} (${item.lang_code})`));\n });\n\n return {\n recoveredUnits: 0,\n remainingFailed: failedItems.length,\n tokensIn: 0,\n tokensOut: 0\n };\n }\n\n // Group by language for batch processing\n const byLanguage = new Map<string, any[]>();\n failedItems.forEach(item => {\n if (!byLanguage.has(item.lang_code)) {\n byLanguage.set(item.lang_code, []);\n }\n byLanguage.get(item.lang_code)?.push(item);\n });\n\n let recoveredUnits = 0;\n let remainingFailed = failedItems.length;\n let totalTokensIn = 0;\n let totalTokensOut = 0;\n\n // Process each language\n for (const [langCode, items] of byLanguage) {\n const targetLangObj = this.config.targetLanguages.find(l => l.shortCode === langCode);\n const langName = targetLangObj?.language || langCode;\n\n spinner.start(`Retrying ${items.length} strings for ${langName}...`);\n\n // Create batch for this language\n const batch: TranslationBatch = {\n batchId: `retry_${Date.now()}`,\n sourceUnits: items.map(item => ({\n unitId: item.key_path,\n keyPath: item.key_path,\n sourceText: '', // Would need to load from source\n sourceHash: item.value_hash,\n placeholders: [],\n sourceFile: '',\n schemaVersion: 1\n })),\n targetLanguage: langCode,\n deduplicationKey: ''\n };\n\n try {\n const provider = ProviderFactory.createProvider(this.config.providers[0]);\n const validator = new TranslationValidationPipeline(this.config.validation);\n\n // Get language object for output path\n const targetLangObj = this.config.targetLanguages.find(l => l.shortCode === langCode);\n if (!targetLangObj) continue;\n\n // Get system prompt\n const systemPrompt = this.promptManager.getSystemPrompt({\n targetLanguage: langName,\n targetCode: langCode,\n sourceUnits: batch.sourceUnits,\n });\n\n // Get user prompt with source texts\n const sourceTexts = batch.sourceUnits.map(unit => unit.sourceText);\n const userPrompt = this.promptManager.getUserPrompt(sourceTexts);\n\n // Translate batch\n const results = await provider.translate(batch, {\n system: systemPrompt,\n user: userPrompt,\n temperature: this.config.providers[0].temperature,\n });\n\n // Process results\n for (let i = 0; i < results.length; i++) {\n const translationResult = results[i];\n const sourceUnit = batch.sourceUnits[i];\n\n // Validate\n const validation = await validator.validate(translationResult, sourceUnit);\n\n if (validation.isValid) {\n // Write translation using flexible filename\n const outputFile = AtomicFileWriter.getOutputPath(targetLangObj, this.config.output);\n const translations = AtomicFileWriter.flatToNested({ [sourceUnit.keyPath]: translationResult.translatedText });\n\n await this.writer.writeTranslations(outputFile, translations);\n\n // Update ledger\n const targetHash = computeHash(translationResult.translatedText);\n this.ledger.updateSyncStatus(\n sourceUnit.keyPath,\n langCode,\n targetHash,\n 'CLEAN',\n provider.getModelFingerprint(),\n this.promptManager.getPromptVersion()\n );\n\n recoveredUnits++;\n remainingFailed--;\n }\n }\n\n // Update token counts (rough estimate)\n totalTokensIn += batch.sourceUnits.length * 50;\n totalTokensOut += batch.sourceUnits.length * 50;\n\n spinner.succeed(chalk.green(`✓ Retried ${recoveredUnits} strings for ${langName}`));\n\n } catch (error) {\n console.error(chalk.red(`✗ Failed to retry batch for ${langName}:`), error);\n }\n }\n\n return {\n recoveredUnits,\n remainingFailed,\n tokensIn: totalTokensIn,\n tokensOut: totalTokensOut\n };\n\n } catch (error) {\n spinner.fail('Retry operation failed');\n throw error;\n }\n }\n}\n","import { translatronxLedger } from '../ledger/index';\nimport { type TargetLanguage } from '../types/index';\nimport chalk from 'chalk';\n\nexport interface RunSummary {\n runId: string;\n startedAt: string;\n finishedAt: string | null;\n modelUsed: string;\n tokensIn: number;\n tokensOut: number;\n costEstimateUsd: number;\n configHash: string;\n}\n\nexport interface StatsSummary {\n totalStrings: number;\n translatedStrings: number;\n failedStrings: number;\n manualOverrides: number;\n languageCoverage: Record<string, number>;\n}\n\n/**\n * Audit and Reporting System\n * Generates summaries and audit trails from the SQLite ledger\n */\nexport class ReportingSystem {\n constructor(private ledger: translatronxLedger) { }\n\n /**\n * Get a summary of the latest run\n */\n async getLatestRunSummary(): Promise<RunSummary | null> {\n const run = this.ledger.getLatestRun();\n if (!run) return null;\n\n return {\n runId: run.run_id,\n startedAt: run.started_at,\n finishedAt: run.finished_at,\n modelUsed: run.model_used,\n tokensIn: run.tokens_in || 0,\n tokensOut: run.tokens_out || 0,\n costEstimateUsd: run.cost_estimate_usd || 0,\n configHash: run.config_hash,\n };\n }\n\n /**\n * Get overall statistics for the project\n */\n async getProjectStats(targetLanguages: TargetLanguage[]): Promise<StatsSummary> {\n const baseStats = this.ledger.getProjectStats();\n const coverage: Record<string, number> = {};\n let translatedCount = 0;\n let failedTotal = 0;\n\n for (const lang of targetLanguages) {\n const langStats = this.ledger.getLanguageStats(lang.shortCode);\n const label = `${lang.language} (${lang.shortCode})`;\n coverage[label] = langStats.translated;\n translatedCount += langStats.translated;\n failedTotal += langStats.failed;\n }\n\n return {\n totalStrings: baseStats.total_keys,\n translatedStrings: translatedCount,\n failedStrings: failedTotal,\n manualOverrides: baseStats.manual_count,\n languageCoverage: coverage,\n };\n }\n\n /**\n * Format a report as a string for CLI output\n */\n formatReport(stats: StatsSummary): string {\n let output = chalk.bold('\\n📊 Project Translation Status\\n');\n output += chalk.gray('-----------------------------------\\n');\n output += `Total unique keys: ${stats.totalStrings}\\n`;\n output += `Translated: ${chalk.green(stats.translatedStrings)}\\n`;\n output += `Failed/Dirty: ${chalk.red(stats.failedStrings)}\\n`;\n output += `Manual Overrides: ${chalk.yellow(stats.manualOverrides)}\\n\\n`;\n\n output += chalk.bold('Language Coverage:\\n');\n for (const [lang, count] of Object.entries(stats.languageCoverage)) {\n const percentage = stats.totalStrings > 0\n ? ((count / stats.totalStrings) * 100).toFixed(1)\n : '0.0';\n const color = count === stats.totalStrings ? chalk.green : chalk.yellow;\n output += ` ${lang.padEnd(5)}: ${color(`${count}/${stats.totalStrings}`)} (${percentage}%)\\n`;\n }\n\n return output;\n }\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { loadConfig, getDefaultConfig } from './config/index';\nimport { TranslationCompiler } from './compiler/index';\nimport { ReportingSystem } from './reporting/index';\nimport { translatronxLedger } from './ledger/index';\nimport { writeFileSync } from 'fs';\n\nconst program = new Command();\n\nprogram\n .name('translatronx')\n .description('Deterministic, incremental, build-time translation compiler using LLMs')\n\nprogram\n .command('sync')\n .description('Synchronize translations (incremental processing)')\n .option('-f, --force', 'Force regeneration of manual overrides')\n .option('-v, --verbose', 'Enable verbose output with streaming')\n .action(async (options) => {\n try {\n console.log(chalk.blue('🔄 Syncing translations...\\n'));\n\n // Load configuration\n const config = await loadConfig();\n\n // Run compilation\n const compiler = new TranslationCompiler(config);\n const stats = await compiler.sync(options);\n compiler.close();\n\n // Display results\n console.log(chalk.green('\\n✅ Translation sync complete!\\n'));\n console.log(chalk.white('Statistics:'));\n console.log(chalk.gray(` Total strings: ${stats.totalUnits}`));\n console.log(chalk.green(` Translated: ${stats.translatedUnits}`));\n console.log(chalk.red(` Failed: ${stats.failedUnits}`));\n console.log(chalk.yellow(` Skipped: ${stats.skippedUnits}`));\n console.log(chalk.gray(` Tokens used: ${stats.tokensIn} (input) + ${stats.tokensOut} (output)`));\n console.log(chalk.gray(` Duration: ${((stats.finishedAt!.getTime() - stats.startedAt.getTime()) / 1000).toFixed(2)}s\\n`));\n\n process.exit(0);\n } catch (error: any) {\n console.error(chalk.red('❌ Sync failed:'), error.message);\n process.exit(1);\n }\n });\n\nprogram\n .command('init')\n .description('Initialize translatronx configuration')\n .action(async () => {\n try {\n console.log(chalk.blue('🚀 Initializing translatronx...\\n'));\n\n // Create default configuration\n const config = getDefaultConfig();\n const configContent = `import { defineConfig } from 'translatronx';\n\nexport default defineConfig(${JSON.stringify(config, null, 2)});\n`;\n\n // Write configuration file\n writeFileSync('translatronx.config.ts', configContent, 'utf-8');\n\n console.log(chalk.green('✅ Created translatronx.config.ts'));\n console.log(chalk.gray('\\nNext steps:'));\n console.log(chalk.gray(' 1. Edit translatronx.config.ts to configure your project'));\n console.log(chalk.gray(' 2. Set API key: export OPENAI_API_KEY=your-key'));\n console.log(chalk.gray(' 3. Run: translatronx sync\\n'));\n\n process.exit(0);\n } catch (error: any) {\n console.error(chalk.red('❌ Init failed:'), error.message);\n process.exit(1);\n }\n });\n\nprogram\n .command('status')\n .description('Display coverage statistics and system state')\n .action(async () => {\n try {\n console.log(chalk.blue('📊 Checking status...\\n'));\n\n const config = await loadConfig();\n const ledgerPath = config.advanced?.ledgerPath || './.translatronx/ledger.sqlite';\n const ledger = new translatronxLedger(ledgerPath);\n const reporting = new ReportingSystem(ledger);\n\n const stats = await reporting.getProjectStats(config.targetLanguages);\n const latestRun = await reporting.getLatestRunSummary();\n\n console.log(reporting.formatReport(stats));\n\n if (latestRun) {\n console.log(chalk.bold('Latest Run:'));\n console.log(chalk.gray(` Run ID: ${latestRun.runId}`));\n console.log(chalk.gray(` Model: ${latestRun.modelUsed}`));\n console.log(chalk.gray(` Cost: $${latestRun.costEstimateUsd.toFixed(4)}`));\n console.log(chalk.gray(` Duration: ${latestRun.finishedAt ? 'Completed' : 'Interrupted'}\\n`));\n }\n\n ledger.close();\n process.exit(0);\n } catch (error: any) {\n console.error(chalk.red('❌ Status check failed:'), error.message);\n process.exit(1);\n }\n });\n\nprogram\n .command('check')\n .description('Validate target files without making changes')\n .action(async () => {\n try {\n console.log(chalk.blue('✓ Checking translations...\\n'));\n console.log(chalk.yellow('⚠️ Check command not fully implemented yet'));\n console.log(chalk.gray(' This would validate all target files without making changes\\n'));\n\n process.exit(0);\n } catch (error: any) {\n console.error(chalk.red('❌ Check failed:'), error.message);\n process.exit(1);\n }\n });\n\nprogram\n .command('retry')\n .description('Retry failed translation batches')\n .option('--batch <id>', 'Specific batch ID to retry')\n .option('--lang <code>', 'Specific language to retry')\n .option('--dry-run', 'Show what would be retried without making changes')\n .action(async (options) => {\n try {\n console.log(chalk.blue('🔄 Retrying failed translations...\\n'));\n\n const config = await loadConfig();\n const compiler = new TranslationCompiler(config);\n const stats = await compiler.retryFailed(options);\n compiler.close();\n\n console.log(chalk.green('\\n✅ Retry operation complete!\\n'));\n console.log(chalk.white('Retry Statistics:'));\n console.log(chalk.green(` Successfully retried: ${stats.recoveredUnits}`));\n console.log(chalk.red(` Still failed: ${stats.remainingFailed}`));\n console.log(chalk.gray(` Tokens used: ${stats.tokensIn} (input) + ${stats.tokensOut} (output)\\n`));\n\n process.exit(0);\n } catch (error: any) {\n console.error(chalk.red('❌ Retry failed:'), error.message);\n process.exit(1);\n }\n });\n\nprogram.parse();\n"]}
|