* fix(chat): meter flashes stale window on mid-chat model swap (issue #817) session.info updates the model label as soon as the backend applies a swap, but the context meter's denominator kept the old model's window until the next fetch — the chip briefly rendered the new label over the old window (e.g. 1M flashing before settling on 262k). - session.info with a DIFFERENT model now blanks the denominator (chip hides while resolving) and immediately re-fires fetchContextUsage() - fetchContextUsage writes the denominator ONCE, atomically: RPC context_max wins, REST model/info is the fallback — a stale pre-swap response can never override a fresh one - regression tests: swap re-fires the fetch and lands the new window; an identical session.info leaves the meter untouched * fix(chat): don't fall back to profile REST window on model swap (issue #817) After a session-scoped swap the live agent's context_breakdown can return empty (context_max 0) while the runtime warms up. The refetch then fell back to GET /api/model/info — PROFILE-scoped — which reports the profile's main-model window (e.g. 1M), resurrecting the stale window under the new label. The swap-triggered refetch now trusts only the RPC's live context_max; the chip stays hidden until the real window lands. --------- Co-authored-by: M57 <hy4ri@users.noreply.github.com>