desktop: fix provider switch model selector real-time update
When switching providers via CliLoginProviderSettings login panels
(NVIDIA, OpenRouter, OpenAI, OpenCode, Local), the settingsStore's
activeProviderId/activeProviderName were never updated, causing the
conversation model's provider badge to stay stale until a full app
restart.
Fixes:
- cliAuthStore: call settingsStore.syncFromConfig() after every save
(saveNvidiaApiKey, saveOpenRouterApiKey, saveOpenAIApiKey,
saveOpenCodeApiKey, saveLocalModelConfig, setAuthProvider,
clearAuth)
- settingsStore: add syncFromConfig() action that re-reads
~/.claude.json and syncs activeProviderId/activeProviderName
- settingsStore: add setActiveProvider() for optimistic UI updates
- settingsStore.fetchAll(): fallback to deriving provider info from
config.authProvider when both direct API fetch and sidecar fail
- ModelSelector: add fallback path when availableModels is empty
(local provider, fetch f…
Redesign the companion (视频通话) page to match Doubao's video calling experience:
- Scenario Selection: 6 scenarios (模拟面试, 英语陪练, 唱歌, 同声传译, 成语接龙, 心情树洞) in a floating grid
- Fullscreen camera mode: camera feed replaces AI avatar as background
- Screen sharing: getDisplayMedia capture with permission dialog & privacy notice
- Subtitle mode: camera shrinks to corner, transcript takes center stage
- Warm orange theme matching Doubao's brand color
- Bottom controls: camera → screen share → mic → speaker → call/hang up
- Camera/mic toggles work independently of WebSocket connection
- No auto-reconnect on connection failure (prevents button flashing)
- Cyberpunk-to-orange redesign: cleaner aesthetic with frosted glass elements
New files: CompanionTopBar, ScenarioSelector, ScreenShareDialog,
useScreenShare, useCameraDevices
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>