export const AI_PROMPT_MAX_CHARS = 1800; export function normalizeAiModel(model) { const m = String(model || '').trim(); return m ? m : 'auto'; } export function makePromptKey(lang, model) { const l = String(lang || '').trim() || 'en'; const m = normalizeAiModel(model); return `${l}::${m}`; } export function normalizePrompt(text, maxChars = AI_PROMPT_MAX_CHARS) { let s = String(text ?? ''); s = s.replace(/\r\n?/g, '\n').trim(); if (s.length > maxChars) s = s.slice(0, maxChars).trimEnd(); return s; } export function migratePromptMap(input) { if (!input || typeof input !== 'object') return { map: {}, changed: false }; const out = {}; let changed = false; for (const [k, v] of Object.entries(input)) { if (typeof v !== 'string') continue; const raw = v; const val = normalizePrompt(raw); if (!val && !raw) continue; if (k.includes('::')) { out[k] = val; if (val !== raw) changed = true; continue; } const nk = makePromptKey(k, 'auto'); out[nk] = val; changed = true; } return { map: out, changed }; }