v2.20.0
Features
- aiaccept a BYOK model tier on the generation path (rollout-tolerant) 82bca3a
- aiextract shared @structura/model-catalog with tier-based resolution daf3de4
- campaignspersist + thread the BYOK model tier through generation c9c7a11
- clientmove GSC prompt to a dismissable dashboard banner; scroll the property picker 8f00a5c
- clientTop/Standard tier picker on campaign create/edit 6c325d6
- clientTop/Standard tier picker on single-post-gen + create steps 308da8f
- functionsprime inputSnapshot on portal single-post runs 4019d47
- model-catalogadd live provider model-sync script c86178b
- model-catalogbump models to live-confirmed ids 57db590
- pluginforward model tier (top|mid) on campaign + single-gen 49e13ba
- runs,webadd provider/model rows to the Run-again modal 972e41b
- runsconfirm before "Run again" with a run summary 8f71ccd
- runsrebuild the Run-again modal to the design handoff fc5bf36
- Top/Standard tier picker for image regeneration c6242f3
- web"Run again" on the portal run receipt 4af6030
- webtier-based BYOK model picker (Top/Standard) on campaigns 2041e8e
Fixes
- billingguard against a duplicate active product shadowing a plan afcd195
- campaignsstop "Run again" crashing on a schedule-less snapshot a741783
- clientcorrect the wp.element JSX-runtime shim (React [#130](https://github.com/yuriy-vasilyev/structura-core/issues/130) crash) f9ea0f7
- clientscope the wp-admin Personas page to this site's bound voices 2301075
- clienttier badge shows the plan only, not the retired audience suffix af00e17
- onboardingbind seeded House voice for non-AI tiers + workspace-aware seed flag 495c58d
- onboardingdurable server-backed onboarding-dismissed flag 9dc0353
- pluginself-heal a revoked anonymous bearer instead of 401-looping forever 5537d73
- runsshow draft-aware label on the single-post run header 633502e
- webdraft-aware run receipt label for WP posts a7f7e6f