v1.7.130
Cumulative release since 1.7.128 — bundles the generic AI-translation pipeline (PR #582), the per-user Etcher color palette (PR #581), and follow-up security/quality fixes. No new migration (still V128).
Added
- Generic AI-driven translation pipeline in core, so feature modules plug in via a small adapter instead of re-implementing the whole stack:
PhoenixKit.Modules.AI.Translatablebehaviour (fetch/2,source_fields/2,put_translation/4, optionalpubsub_topics/1), exposed via the optionalai_translatables/0callback onPhoenixKit.Moduleand discovered throughPhoenixKit.ModuleRegistry.PhoenixKit.Modules.AI.Translationsorchestration — availability, endpoint/prompt defaults, idempotent shared prompt,enqueue/1+enqueue_all_missing/2, per-resource + global PubSub topics,missing_languages/3.PhoenixKit.Modules.AI.TranslateWorker— generic one-job-per-language Oban worker with retry classification,{:snooze, 30}on rate-limit, and anai.translation_addedaudit entry.
- Shared AI-translate UI —
PhoenixKitWeb.Components.AITranslate(button/modal/progress/stall hint) +AITranslate.{FormGlue,FormBinding}LiveView glue behind a 3-callback binding.
Changed
- AI-translation broadcasts keep translated content off broad topics: the full payload (with
:fields) goes only to the per-resource topic; the global + adapter topics receive a content-free summary.
Fixed
- Sanitize the per-user Etcher color palette on both write and read.
MediaCanvasViewerfilters the client-suppliedetcher:colors-changedpayload to short, color-shaped strings (deduped, capped at 24) before persisting, andload_user_colors/1re-sanitizes on read — so a palette stored before the guard shipped, or written by any other path, never reaches<Etcher.layer colors={…}>untrusted.
📦 https://hex.pm/packages/phoenix_kit/1.7.130 · 📖 https://hexdocs.pm/phoenix_kit/1.7.130