Lightweight theme preference coercion shared by config providers and the UI.
Resolve a user-supplied theme name to a canonical registry key.
Accepts the registry key or the human-readable label, case-insensitive on
both, with surrounding whitespace stripped - config values (especially
[ui.terminal_themes]) and the DEEPAGENTS_CODE_THEME env var are commonly
hand-edited. Also applies the legacy textual-ansi to ansi-light
migration, which predates Textual 8.2.5 and can be dropped once no
supported config can still carry the old name.
Return value as a TOML table when it has the expected runtime shape.
tomllib parses TOML tables as string-keyed dicts, which ty cannot infer
from a runtime dict check. Keep the cast at this boundary so it does not
become a general-purpose escape hatch - now more important, not less, since
the helper became importable from a shared module.
Resolve [ui.terminal_themes][TERM_PROGRAM] to a registered theme.
Centralizes both the lookup and the misconfiguration warnings, which are logged exactly once per call. Three callers now share that contract: the managed and user TOML tiers and the UI.