- translateText/translateTexts call OpenRouter chat-completions; glossary
terms are prompt-injected from config/glossaries.ts, generated from the
translation repo's TSVs by scripts/build-glossaries.ts
- model resolution: per-language override in config/languages.ts →
translation.model site setting (new admin field) → TRANSLATION_MODEL env
→ anthropic/claude-opus-5, at low reasoning effort
- blank fragments are held back from the model, which drops them and breaks
the one-translation-per-fragment count the caller maps results back on
- OpenRouter failures map to a typed error with a human-readable message;
an unrecoverable one (no credits, bad key, rejected model) stops the run
instead of repeating the same call for every remaining locale
- machine translations record source 'auto-translate'; 'deepl' stays
readable for snapshots written before the switch
add framework-agnostic vimeo tiptap node (id-only src, renders player iframe)
register vimeo in shared extension set for editor and server renderer
replace youtube prompt with generic insert-video modal (detects platform)
allowlist vimeo in validator with digits-only src check
track vimeo as a lossy node for markdown round-trip detection