| Markup strip, entities, SDH cleaning, sentence ends | packages/core/src/subtitles.js (stripTags, decodeEntities, cleanCaption, isSoundCue, endsSentence, continuesEllipsis) |
| Cue → sentence groups, roll-up merge, group ids | packages/core/src/grouping.js (buildGroups, mergeRollup) |
| Provider chain: order, timeouts, cooldowns | packages/core/src/translation.js (createTranslatorChain) |
| Term protection + user glossary (placeholders ⟦n⟧) | packages/core/src/glossary.js (protectTerms, restoreTerms, compileGlossary) |
| Speech rate estimate (CJK-aware) | packages/core/src/pacing.js |
Settings schema + validation (incl. glossary) | packages/core/src/settings.js |
| Provider adapters (thin, per-platform) | packages/webext/src/providers/{builtin,gtx,deepl,googlev2,pro}.js |
| Orchestration: caches, prefetch, batch, speak | apps/chrome/src/content.js (translate, pretranslate, proBatchTranslate, speak*) |
| Network: gtx/BYO fetches, Pro relay + cooldowns | apps/chrome/src/background.js (translateFallback, translatePro, translateProBatch, proRefusal) |
| Server: providers, prompts, batch, TTS | site/src/lib/pro.ts (contextualTranslate, batchContextualTranslate, DUB_RULES) |
| Server: auth, quota, metering | site/src/app/api/pro/translate/route.ts |