From 4f92965a7bfa9e8eb6519908ff962e23c2cb7b93 Mon Sep 17 00:00:00 2001 From: Simon Sudarushkin <68971770+simonether@users.noreply.github.com> Date: Thu, 8 Oct 2026 18:08:22 +0500 Subject: [PATCH] ui: apply ui_settings on first visit in router mode (#29668) --- .../ui/src/lib/stores/settings/index.svelte.ts | 8 +++++--- .../client/ui-settings-sync.svelte.test.ts | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/ui/src/lib/stores/settings/index.svelte.ts b/tools/ui/src/lib/stores/settings/index.svelte.ts index a583a1423..90e2ea2c3 100644 --- a/tools/ui/src/lib/stores/settings/index.svelte.ts +++ b/tools/ui/src/lib/stores/settings/index.svelte.ts @@ -283,10 +283,12 @@ class SettingsStore { */ syncWithServerDefaults(): void { const propsDefaults = this.getServerDefaults(); - - if (Object.keys(propsDefaults).length === 0) return; - const uiSettings = serverStore.uiSettings; + + // a router main instance reports no sampling defaults, but its + // ui_settings still need the first visit pass below + if (Object.keys(propsDefaults).length === 0 && !(uiSettings && this.isFirstVisit)) return; + const uiSettingsKeys = new Set(uiSettings ? Object.keys(uiSettings) : []); for (const [key, propsValue] of Object.entries(propsDefaults)) { diff --git a/tools/ui/tests/client/ui-settings-sync.svelte.test.ts b/tools/ui/tests/client/ui-settings-sync.svelte.test.ts index ca9268e2e..46144499e 100644 --- a/tools/ui/tests/client/ui-settings-sync.svelte.test.ts +++ b/tools/ui/tests/client/ui-settings-sync.svelte.test.ts @@ -3,12 +3,15 @@ import { serverStore } from '$lib/stores/server.svelte'; import { settingsStore } from '$lib/stores/settings/index.svelte'; import { beforeEach, describe, expect, it } from 'vitest'; -function mockProps(uiSettings: Record) { +function mockProps( + uiSettings: Record, + params: Record = { temperature: 0.8 } +) { Object.defineProperty(serverStore, 'props', { configurable: true, get: () => ({ - default_generation_settings: { params: { temperature: 0.8 } }, + default_generation_settings: { params }, ui_settings: uiSettings }) as unknown as typeof serverStore.props }); @@ -28,6 +31,16 @@ describe('server ui_settings application semantics', () => { expect(settingsStore.config.theme).toBe('dark'); }); + it('applies the admin defaults when /props carries no sampling defaults', () => { + settingsStore.initialize(); + // router mode: the main instance answers /props with empty params + mockProps({ theme: 'dark' }, {}); + + settingsStore.syncWithServerDefaults(); + + expect(settingsStore.config.theme).toBe('dark'); + }); + it('never reapplies on later loads: the user config diverges freely', () => { settingsStore.initialize(); settingsStore.updateConfig('theme', 'light');