diff --git a/v2/src/lib/components/Workspace/SettingsTab.svelte b/v2/src/lib/components/Workspace/SettingsTab.svelte index e36bdef..edb3b68 100644 --- a/v2/src/lib/components/Workspace/SettingsTab.svelte +++ b/v2/src/lib/components/Workspace/SettingsTab.svelte @@ -18,6 +18,8 @@ import { THEME_LIST, getPalette, type ThemeId } from '../../styles/themes'; import { listProfiles, type ClaudeProfile } from '../../adapters/claude-bridge'; import { invoke } from '@tauri-apps/api/core'; + import { getProviders } from '../../providers/registry.svelte'; + import type { ProviderId, ProviderSettings } from '../../providers/types'; const PROJECT_ICONS = [ '📁', '🚀', '🤖', '🌐', '🔧', '🎮', '📱', '💻', @@ -28,6 +30,12 @@ // Claude profiles for account selector let profiles = $state([]); + // Provider settings (keyed by ProviderId) + let providerSettings = $state>({}); + let expandedProvider = $state(null); + let registeredProviders = $derived(getProviders()); + let providerDropdownOpenFor = $state(null); + let activeGroupId = $derived(getActiveGroupId()); let activeGroup = $derived(getActiveGroup()); let activeProjectId = $derived(getActiveProjectId()); @@ -131,6 +139,14 @@ } catch { profiles = []; } + + // Load provider settings + try { + const raw = await getSetting('provider_settings'); + if (raw) providerSettings = JSON.parse(raw); + } catch { + providerSettings = {}; + } }); function applyCssProp(prop: string, value: string) { @@ -201,12 +217,35 @@ await setTheme(themeId); } + async function saveProviderSettings() { + await saveGlobalSetting('provider_settings', JSON.stringify(providerSettings)); + } + + function toggleProviderEnabled(providerId: string) { + const current = providerSettings[providerId] ?? { enabled: true, config: {} }; + providerSettings[providerId] = { ...current, enabled: !current.enabled }; + providerSettings = { ...providerSettings }; + saveProviderSettings(); + } + + function setProviderModel(providerId: string, model: string) { + const current = providerSettings[providerId] ?? { enabled: true, config: {} }; + providerSettings[providerId] = { ...current, defaultModel: model || undefined }; + providerSettings = { ...providerSettings }; + saveProviderSettings(); + } + + function isProviderEnabled(providerId: string): boolean { + return providerSettings[providerId]?.enabled ?? true; + } + function handleClickOutside(e: MouseEvent) { const target = e.target as HTMLElement; if (!target.closest('.custom-dropdown')) { themeDropdownOpen = false; uiFontDropdownOpen = false; termFontDropdownOpen = false; + providerDropdownOpenFor = null; } if (!target.closest('.icon-field')) { iconPickerOpenFor = null; @@ -504,6 +543,63 @@ +
+

Providers

+
+ {#each registeredProviders as provider} +
+ + {#if expandedProvider === provider.id} +
+
+ +
+ {#if provider.capabilities.hasModelSelection} +
+ Default model + setProviderModel(provider.id, (e.target as HTMLInputElement).value)} + /> +
+ {/if} +
+ Capabilities +
+ {#if provider.capabilities.hasProfiles}Profiles{/if} + {#if provider.capabilities.hasSkills}Skills{/if} + {#if provider.capabilities.supportsSubagents}Subagents{/if} + {#if provider.capabilities.supportsCost}Cost tracking{/if} + {#if provider.capabilities.supportsResume}Resume{/if} + {#if provider.capabilities.hasSandbox}Sandbox{/if} +
+
+
+ {/if} +
+ {/each} +
+
+

Groups

@@ -637,6 +733,44 @@ {/if}
+ {#if registeredProviders.length > 1} +
+ + + Provider + +
+ + {#if providerDropdownOpenFor === project.id} + + {/if} +
+
+ {/if} +