NVIDIA API blocks browser CORS so needs server-side proxy (sidecar).
OpenRouter/OpenCode allow browser fetch so can use direct API calls
via fetchProviderModels(). This restores OpenRouter/OpenCode model
lists while keeping NVIDIA working via sidecar proxy.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
fix: desktop model list uses sidecar proxy (no CORS) and correct provider names
- Replace fetchProviderModels() (browser CORS block) with modelsApi.list()
(server-side sidecar proxy) to fetch NVIDIA/OpenRouter models
- Derive provider names from ~/.claude.json authProvider field, avoiding
sidecar's stale/corrupted names like "TUI: NVIDIA NIM"
- Fall back to buildDefaultCliModels() when sidecar returns empty
- Remove clearProviderModelCache() since we no longer use providerModels.ts
in settings/provider stores
- Fix ApiFormat type comparison ('openai' -> 'openai_chat'/'openai_responses')
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>
fix: sync settingsStore when cliAuthStore saves provider config
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>
fix: desktop server CLI spawn and model listing for CLI auth
- Fix CLI process startup failure: resolveCliArgs now prefers the standalone
dist/cli binary (which has the real runHeadless implementation) over the
OSS sidecar binary (which has a stub print.ts without runHeadless).
Uses CLAUDE_APP_ROOT for real filesystem path resolution inside compiled
sidecar where import.meta.dir is a virtual bunfs path.
Fallback changed from broken bin/claude-haha path to PATH lookup.
- Fix desktop /api/models to recognize CLI auth state: added
fetchCliProviderModels() that reads ~/.claude.json directly and fetches
OpenCode models from models.dev/api.json or OpenRouter models from
openrouter.ai/api/v1/models, with 5-minute caching. This makes OpenCode
and OpenRouter models visible in the desktop UI after CLI /login.
Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>