500e133bee
Two remaining halves of #89184 (Desktop Settings saves rewriting unrelated config): - The `fallback_providers` structured editor normalized every entry down to `{provider, model}`, so any edit (remove a row, pick a model) re-emitted a hand-written local-gateway chain without its `base_url` / `api_key` / `key_env` / `api_mode` — the next autosave persisted bare pairs and the fallbacks silently routed to the public provider. Entries now carry every key through; the editor only owns the two selects. - `PUT /api/model/moa` did `cfg = load_config(); cfg["moa"].update(...); save_config(cfg)`: the whole default-expanded snapshot went back to disk, so a Desktop MoA autosave re-persisted every other section too (the 2026-09-10 repro: `fallback_providers: []` written alongside the MoA block the user had just edited). It now saves `{"moa": ...}` with `merge_existing=True`, the same section-scoped write every other sparse writer uses since #110535. Hand-edited moa keys (#58819) still survive. The `model.default not persisted / base_url cleared` symptom from the 0.20.4 report no longer reproduces on main through the real REST path (Config page diffs against a baseline since 5361867c6d32; `_denormalize_config_from_web` keeps the on-disk `model:` block).