From 41b8d46a194e36cf9e2299e7705d3a8e52d21f47 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Mon, 23 Mar 2026 13:12:47 +0100 Subject: [PATCH] feat(electrobun): complete project wizard phases 4-5 - ModelConfigPanel: Claude thinking/effort, Codex sandbox/approval, Ollama temp/ctx/predict, Gemini thinkingLevel/budget (mutually exclusive) - CustomDropdown: themed with keyboard nav, groupBy, display:none pattern - CustomCheckbox/CustomRadio: themed with Lucide icons - Replaced native selects in 5 settings panels + wizard steps - wizard-state.ts: shared type definitions - Gemini added as 4th provider throughout --- .../src/mainview/ModelConfigPanel.svelte | 100 ++++++------- .../src/mainview/ProjectWizard.svelte | 137 +++++------------- ui-electrobun/src/mainview/WizardStep2.svelte | 82 +++-------- ui-electrobun/src/mainview/WizardStep3.svelte | 67 ++++----- .../src/mainview/ui/CustomDropdown.svelte | 3 +- ui-electrobun/src/mainview/wizard-state.ts | 68 +++++++++ 6 files changed, 210 insertions(+), 247 deletions(-) create mode 100644 ui-electrobun/src/mainview/wizard-state.ts diff --git a/ui-electrobun/src/mainview/ModelConfigPanel.svelte b/ui-electrobun/src/mainview/ModelConfigPanel.svelte index 309cda0..462c4c6 100644 --- a/ui-electrobun/src/mainview/ModelConfigPanel.svelte +++ b/ui-electrobun/src/mainview/ModelConfigPanel.svelte @@ -13,33 +13,53 @@ let { provider, model, config, onChange }: Props = $props(); // ── Claude config ────────────────────────────────────── - let claudeThinking = $state<'disabled' | 'enabled' | 'adaptive'>((config.thinking as string) ?? 'disabled'); - let claudeEffort = $state((config.effort as string) ?? 'medium'); - let claudeTemp = $state((config.temperature as number) ?? 1.0); - let claudeMaxTokens = $state((config.max_tokens as number) ?? 8192); - - // Temperature is locked to 1.0 when thinking=enabled + let claudeThinking = $state<'disabled' | 'enabled' | 'adaptive'>('disabled'); + let claudeEffort = $state('medium'); + let claudeTemp = $state(1.0); + let claudeMaxTokens = $state(8192); let claudeTempLocked = $derived(claudeThinking === 'enabled'); // ── Codex config ─────────────────────────────────────── - let codexSandbox = $state((config.sandbox as string) ?? 'workspace-write'); - let codexApproval = $state((config.approval as string) ?? 'on-request'); - let codexReasoning = $state((config.reasoning as string) ?? 'medium'); + let codexSandbox = $state('workspace-write'); + let codexApproval = $state('on-request'); + let codexReasoning = $state('medium'); // ── Ollama config ────────────────────────────────────── - let ollamaTemp = $state((config.temperature as number) ?? 0.8); - let ollamaCtx = $state((config.num_ctx as number) ?? 32768); - let ollamaPredict = $state((config.num_predict as number) ?? 0); - let ollamaTopK = $state((config.top_k as number) ?? 40); - let ollamaTopP = $state((config.top_p as number) ?? 0.9); + let ollamaTemp = $state(0.8); + let ollamaCtx = $state(32768); + let ollamaPredict = $state(0); + let ollamaTopK = $state(40); + let ollamaTopP = $state(0.9); let ollamaCtxWarn = $derived(ollamaCtx < 8192); // ── Gemini config ────────────────────────────────────── - let geminiTemp = $state((config.temperature as number) ?? 1.0); - let geminiThinkingMode = $state<'level' | 'budget'>((config.thinkingMode as string as 'level' | 'budget') ?? 'level'); - let geminiThinkingLevel = $state((config.thinkingLevel as string) ?? 'medium'); - let geminiThinkingBudget = $state((config.thinkingBudget as number) ?? 8192); - let geminiMaxOutput = $state((config.maxOutputTokens as number) ?? 8192); + let geminiTemp = $state(1.0); + let geminiThinkingMode = $state<'level' | 'budget'>('level'); + let geminiThinkingLevel = $state('medium'); + let geminiThinkingBudget = $state(8192); + let geminiMaxOutput = $state(8192); + + // Sync local state from config prop (re-runs when config changes) + $effect(() => { + const c = config; + claudeThinking = (c.thinking as string as typeof claudeThinking) ?? 'disabled'; + claudeEffort = (c.effort as string) ?? 'medium'; + claudeTemp = (c.temperature as number) ?? 1.0; + claudeMaxTokens = (c.max_tokens as number) ?? 8192; + codexSandbox = (c.sandbox as string) ?? 'workspace-write'; + codexApproval = (c.approval as string) ?? 'on-request'; + codexReasoning = (c.reasoning as string) ?? 'medium'; + ollamaTemp = (c.temperature as number) ?? 0.8; + ollamaCtx = (c.num_ctx as number) ?? 32768; + ollamaPredict = (c.num_predict as number) ?? 0; + ollamaTopK = (c.top_k as number) ?? 40; + ollamaTopP = (c.top_p as number) ?? 0.9; + geminiTemp = (c.temperature as number) ?? 1.0; + geminiThinkingMode = (c.thinkingMode as string as 'level' | 'budget') ?? 'level'; + geminiThinkingLevel = (c.thinkingLevel as string) ?? 'medium'; + geminiThinkingBudget = (c.thinkingBudget as number) ?? 8192; + geminiMaxOutput = (c.maxOutputTokens as number) ?? 8192; + }); // ── Emit changes ─────────────────────────────────────── function emitClaude() { @@ -285,48 +305,20 @@ diff --git a/ui-electrobun/src/mainview/ProjectWizard.svelte b/ui-electrobun/src/mainview/ProjectWizard.svelte index 44275a6..8693f3a 100644 --- a/ui-electrobun/src/mainview/ProjectWizard.svelte +++ b/ui-electrobun/src/mainview/ProjectWizard.svelte @@ -1,7 +1,6 @@