Setting a show theme after the caller lineup was loaded caused every
caller button to keep its pre-theme label while the LLM dialog used
the post-theme bg names — host says "Hi Phil", caller replies "it's
Cody, actually". Three underlying bugs, all fixed here:
- _regenerate_backgrounds_for_keys ignored its keys parameter and
replaced the entire caller_backgrounds dict, clobbering used slots
along with unused ones. Now only the listed slots are touched.
- set_show_theme's used_keys detection compared record.caller_name
(the slim bg name) against CALLER_BASES[k]["name"] (the randomized
fallback name) — two different namespaces that never match, so
every slot was flagged unused. Now it matches against
session.caller_backgrounds[k]["name"].
- set_show_theme fired the regeneration as a detached asyncio task,
so the POST returned before bg was consistent. Even if the frontend
did reload /api/callers, it would race the regen. Now awaited.
Frontend setShowTheme/clearShowTheme now call loadCallers() after
the theme POST resolves so the button list actually refreshes, with
a "Regenerating..." button state during the ~30-60s wait.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>