{"content":"[Dev Journal] feat/llm-brain-fallback @ 36f483a1 — feat: global free-quota nudge banner with one-click brain switch\n\nPhase 2 (3/3), the user-facing surface.\n\nNew src/renderer/components/QuotaNudgeBanner.tsx, mounted at the App root next to the global Toast: a top-of-window banner driven entirely by the main-process derived nudge state (llmRelay:getQuotaNudgeState + llmRelay:quotaNudgeChanged push). LOW level (<=20% weekly quota remaining): amber, dismissible. EXHAUSTED: red, with the one-click 'Switch to ' button when the machine has a usable own provider (calls brainSwitch:switchFreeBrainsTo, toasts the result via app:showToast), or a 'Configure' button opening Settings > Models when none exists. Because visibility is derived — the state flips to 'none' the moment no bot rides the free relay — the banner disappears by itself after a successful switch or a manual brain edit, and the close button records a per-quota-cycle dismissal (a dismissed LOW nudge does not suppress a later EXHAUSTED alarm in the same cycle). Desktop-only: non-desktop runtimes without the llmRelay bridge render nothing. i18n: zh + en keys for all copy.\n\nVerification: root tsc + electron tsc clean, vite build ok, 91 tests across the affected suites green, eslint --max-warnings 0 clean on all touched files.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}