From fb9c4471d5f2b173d4efb1947365133117a726c0 Mon Sep 17 00:00:00 2001 From: guenhter Date: Tue, 12 May 2026 14:28:16 +0200 Subject: [PATCH 1/4] chore: bump @biomejs/biome from 2.4.13 to 2.4.15 Updates Biome across all sub-projects (docs, frontend/omni, e2e_tests/tests_omni_full) and refreshes pnpm-lock.yaml. --- docs/biome.json | 2 +- docs/package.json | 2 +- docs/pnpm-lock.yaml | 76 ++++++++++++++-------------- e2e_tests/tests_omni_full/biome.json | 2 +- frontend/omni/biome.json | 2 +- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/biome.json b/docs/biome.json index 1583625..b977a65 100644 --- a/docs/biome.json +++ b/docs/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json", "root": true, "vcs": { "enabled": true, diff --git a/docs/package.json b/docs/package.json index a7420f1..41d37e3 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "mermaid": "^11.14.0" }, "devDependencies": { - "@biomejs/biome": "^2.4.13", + "@biomejs/biome": "^2.4.15", "@rspress/core": "^2.0.9", "typescript": "^6.0.3" } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 236654a..6733933 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -13,8 +13,8 @@ importers: version: 11.14.0 devDependencies: '@biomejs/biome': - specifier: ^2.4.13 - version: 2.4.13 + specifier: ^2.4.15 + version: 2.4.15 '@rspress/core': specifier: ^2.0.9 version: 2.0.9(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/mdast@4.0.4)(@types/react@19.2.14)(micromark-util-types@2.0.2)(micromark@4.0.2) @@ -27,59 +27,59 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@biomejs/biome@2.4.13': - resolution: {integrity: sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA==} + '@biomejs/biome@2.4.15': + resolution: {integrity: sha512-j5VH3a/h/HXTKBM50MDMxRCzkeLv9S2XJcW2WgnZT1+xyisi+0bISrXR82gCX+8S9lvK0skEvHJRN+3Ktr2hlw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.13': - resolution: {integrity: sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==} + '@biomejs/cli-darwin-arm64@2.4.15': + resolution: {integrity: sha512-rF3PPqLq1yoST79zaQbDjVJwsuIeci/O+9bgNmC5QpgOqz6aqYuzA4abyAGx+mgyiDXn4A049xAN8gijbuR1Qg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.13': - resolution: {integrity: sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg==} + '@biomejs/cli-darwin-x64@2.4.15': + resolution: {integrity: sha512-/5KHXYMfSJs1fNXiX30xFtI8JcCFV6zaVVLxOa0M2sfqBKHkpQhRTv94yxQWxeTY2lzo2OuTlNvPC+hDQt2wcQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.13': - resolution: {integrity: sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg==} + '@biomejs/cli-linux-arm64-musl@2.4.15': + resolution: {integrity: sha512-ZPcxznxm0pogHBLZhYntyR3sR+MrZjqJIKEr7ZqVen0Rl+P/4upVmfYXjftizi9RoqZntg33fv/1fbdhbYXpEQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.13': - resolution: {integrity: sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ==} + '@biomejs/cli-linux-arm64@2.4.15': + resolution: {integrity: sha512-owaAMZD/T4LrD0ELNCk0Km3qrRHuM0X6EAyVE1FSqGY0rbLoiDLrO4Us2tllm6cAeB2Ioa9C2C08NZPdr8+0Ug==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.13': - resolution: {integrity: sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ==} + '@biomejs/cli-linux-x64-musl@2.4.15': + resolution: {integrity: sha512-CNq/9W38SYSH023lfcQ4KKU8K0YX8T//FZUhcgtMMRABDojx5XsMV7jlweAvGSl389wJQB29Qo6Zb/a+jdvt+w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.13': - resolution: {integrity: sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ==} + '@biomejs/cli-linux-x64@2.4.15': + resolution: {integrity: sha512-0jj7THz12GbUOLmMibktK6DZjqz2zV64KFxyBtcFTKPiiOIY0a7vns1elpO1dERvxpsZ5ik0oFfz0oGwFde1+g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.13': - resolution: {integrity: sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A==} + '@biomejs/cli-win32-arm64@2.4.15': + resolution: {integrity: sha512-ouhkYdlhp/1GghEJPdWwD/Vi3gQ1nFxuSpMolWsbq3Lsq3QUR4jl6UdhhscdCugKU5vOEuMiJhvKj66O0OCq+w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.13': - resolution: {integrity: sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ==} + '@biomejs/cli-win32-x64@2.4.15': + resolution: {integrity: sha512-zBrGq5mx5wwpnow4+2BxUvleDM+GNd4sLbPaMapsSLQLD0NGRCquqPBTgN+7XkUteHvj7M+BstuI8tmnV7+HgQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1341,39 +1341,39 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.1.1 - '@biomejs/biome@2.4.13': + '@biomejs/biome@2.4.15': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.13 - '@biomejs/cli-darwin-x64': 2.4.13 - '@biomejs/cli-linux-arm64': 2.4.13 - '@biomejs/cli-linux-arm64-musl': 2.4.13 - '@biomejs/cli-linux-x64': 2.4.13 - '@biomejs/cli-linux-x64-musl': 2.4.13 - '@biomejs/cli-win32-arm64': 2.4.13 - '@biomejs/cli-win32-x64': 2.4.13 - - '@biomejs/cli-darwin-arm64@2.4.13': + '@biomejs/cli-darwin-arm64': 2.4.15 + '@biomejs/cli-darwin-x64': 2.4.15 + '@biomejs/cli-linux-arm64': 2.4.15 + '@biomejs/cli-linux-arm64-musl': 2.4.15 + '@biomejs/cli-linux-x64': 2.4.15 + '@biomejs/cli-linux-x64-musl': 2.4.15 + '@biomejs/cli-win32-arm64': 2.4.15 + '@biomejs/cli-win32-x64': 2.4.15 + + '@biomejs/cli-darwin-arm64@2.4.15': optional: true - '@biomejs/cli-darwin-x64@2.4.13': + '@biomejs/cli-darwin-x64@2.4.15': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.13': + '@biomejs/cli-linux-arm64-musl@2.4.15': optional: true - '@biomejs/cli-linux-arm64@2.4.13': + '@biomejs/cli-linux-arm64@2.4.15': optional: true - '@biomejs/cli-linux-x64-musl@2.4.13': + '@biomejs/cli-linux-x64-musl@2.4.15': optional: true - '@biomejs/cli-linux-x64@2.4.13': + '@biomejs/cli-linux-x64@2.4.15': optional: true - '@biomejs/cli-win32-arm64@2.4.13': + '@biomejs/cli-win32-arm64@2.4.15': optional: true - '@biomejs/cli-win32-x64@2.4.13': + '@biomejs/cli-win32-x64@2.4.15': optional: true '@braintree/sanitize-url@7.1.2': {} diff --git a/e2e_tests/tests_omni_full/biome.json b/e2e_tests/tests_omni_full/biome.json index 35d8998..48dffb4 100644 --- a/e2e_tests/tests_omni_full/biome.json +++ b/e2e_tests/tests_omni_full/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json", "root": true, "vcs": { "enabled": true, diff --git a/frontend/omni/biome.json b/frontend/omni/biome.json index f2e3db6..3396f3a 100644 --- a/frontend/omni/biome.json +++ b/frontend/omni/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.15/schema.json", "root": true, "vcs": { "enabled": true, From 4ba50ef266c10da371c51223ec624e9a732c3b10 Mon Sep 17 00:00:00 2001 From: guenhter Date: Tue, 12 May 2026 14:28:24 +0200 Subject: [PATCH 2/4] feat(frontend): replace always-visible add-provider form with New button The add provider form was always visible, making provider creation too prominent. Now a 'New' button sits below the provider list. Clicking it reveals an inline form with Save and Cancel actions; on save or cancel the form dismisses itself. --- frontend/omni/CHANGELOG.md | 1 + .../AddProviderForm.svelte | 28 ++++++++++------- .../LLMProviderManagementComponent.svelte | 30 ++++++++++++------- .../llm-provider-management/locales/de.json | 2 ++ 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/frontend/omni/CHANGELOG.md b/frontend/omni/CHANGELOG.md index 5cfcf10..0cf21e4 100644 --- a/frontend/omni/CHANGELOG.md +++ b/frontend/omni/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The sidebar is now resizable. - Chat sidebar entry is now a collapsible menu. +- LLM provider management: replaced the always-visible "Add Provider" form with a "New" button. Clicking it reveals an inline form with Save and Cancel actions. ### Fixed diff --git a/frontend/omni/src/modules/llm-provider-management/AddProviderForm.svelte b/frontend/omni/src/modules/llm-provider-management/AddProviderForm.svelte index d2b8b8b..47a1e81 100644 --- a/frontend/omni/src/modules/llm-provider-management/AddProviderForm.svelte +++ b/frontend/omni/src/modules/llm-provider-management/AddProviderForm.svelte @@ -1,5 +1,5 @@
-
-

{t("title", { defaultValue: "LLM Providers" })}

-

- {t("subtitle", { defaultValue: "Manage your OpenAI-compatible LLM providers." })} -

+
+
+

{t("title", { defaultValue: "LLM Providers" })}

+

+ {t("subtitle", { defaultValue: "Manage your OpenAI-compatible LLM providers." })} +

+
{ onDeleteProvider={handleDeleteProvider} onCheckProviderHealth={handleCheckProviderHealth} /> - - + {#if showAddForm} + (showAddForm = false)} + /> + {:else} + + {/if}
diff --git a/frontend/omni/src/modules/llm-provider-management/locales/de.json b/frontend/omni/src/modules/llm-provider-management/locales/de.json index d11aa2a..f611251 100644 --- a/frontend/omni/src/modules/llm-provider-management/locales/de.json +++ b/frontend/omni/src/modules/llm-provider-management/locales/de.json @@ -1,6 +1,8 @@ { "title": "LLM-Anbieter", "subtitle": "Verwalten Sie Ihre OpenAI-kompatiblen LLM-Anbieter.", + "new": "Neu", + "newProvider": "Neuer Anbieter", "addProvider": "Anbieter hinzufügen", "providerName": "Anbieter-Name", "providerNamePlaceholder": "Mein Anbieter", From 1359838795fb6cf9b3c1dffb49ae297c033d394b Mon Sep 17 00:00:00 2001 From: guenhter Date: Tue, 12 May 2026 14:50:07 +0200 Subject: [PATCH 3/4] feat(frontend): make provider card clickable to edit, remove gear button Clicking the name/URL area of a provider card now opens the edit form inline. The dedicated settings icon button is removed. Health check and delete buttons remain unchanged. --- .../ProviderList.svelte | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/frontend/omni/src/modules/llm-provider-management/ProviderList.svelte b/frontend/omni/src/modules/llm-provider-management/ProviderList.svelte index 4d83c2f..e2b7456 100644 --- a/frontend/omni/src/modules/llm-provider-management/ProviderList.svelte +++ b/frontend/omni/src/modules/llm-provider-management/ProviderList.svelte @@ -4,7 +4,6 @@ import { CircleX, HeartPulse, LoaderCircle, - Settings2, Trash2, } from "lucide-svelte"; import { getT } from "@/modules/i18n/index.svelte.js"; @@ -84,8 +83,8 @@ async function checkHealth(provider: Provider) {
{#each providers as provider (provider.id)} {@const healthState = healthByProviderId[provider.id] ?? "idle"} - - + + {#if editingId === provider.id}
@@ -106,19 +105,22 @@ async function checkHealth(provider: Provider) {
{:else}
-
+
+
- -
+
+ + e.stopPropagation()} role="presentation"> + void toggleEnabled(provider)} + /> +
{/if} diff --git a/frontend/omni/src/modules/llm-provider-management/locales/de.json b/frontend/omni/src/modules/llm-provider-management/locales/de.json index f611251..0a7218c 100644 --- a/frontend/omni/src/modules/llm-provider-management/locales/de.json +++ b/frontend/omni/src/modules/llm-provider-management/locales/de.json @@ -15,5 +15,7 @@ "save": "Speichern", "cancel": "Abbrechen", "checkHealth": "Anbieterstatus prüfen", + "enableProvider": "Anbieter aktivieren", + "disableProvider": "Anbieter deaktivieren", "navLabel": "Anbieter" } diff --git a/frontend/omni/src/modules/llm-provider-service/index.svelte.test.ts b/frontend/omni/src/modules/llm-provider-service/index.svelte.test.ts index f4fda86..5b1ddbd 100644 --- a/frontend/omni/src/modules/llm-provider-service/index.svelte.test.ts +++ b/frontend/omni/src/modules/llm-provider-service/index.svelte.test.ts @@ -15,6 +15,7 @@ describe("LocalStorageLLMProviderService", () => { name: "provider-a", base_url: "https://example.test/", api_key: "secret", + enabled: true, }); const fetchMock = vi.fn( async () => diff --git a/frontend/omni/src/modules/llm-provider-service/index.svelte.ts b/frontend/omni/src/modules/llm-provider-service/index.svelte.ts index 48a2208..554c079 100644 --- a/frontend/omni/src/modules/llm-provider-service/index.svelte.ts +++ b/frontend/omni/src/modules/llm-provider-service/index.svelte.ts @@ -3,6 +3,7 @@ export interface Provider { name: string; base_url: string; api_key: string; + enabled: boolean; created_at: string; updated_at: string; } @@ -20,6 +21,7 @@ export interface CreateProviderRequest { name: string; base_url: string; api_key: string; + enabled?: boolean; } /** diff --git a/frontend/omni/src/modules/llm-provider-service/localStorageLLMProviderService.svelte.ts b/frontend/omni/src/modules/llm-provider-service/localStorageLLMProviderService.svelte.ts index b5191c2..cd1c55d 100644 --- a/frontend/omni/src/modules/llm-provider-service/localStorageLLMProviderService.svelte.ts +++ b/frontend/omni/src/modules/llm-provider-service/localStorageLLMProviderService.svelte.ts @@ -31,6 +31,7 @@ export class LocalStorageLLMProviderService implements LLMProviderService { * Returns an empty array if the provider is unreachable or returns an error. */ async fetchModels(provider: Provider): Promise { + if (provider.enabled === false) return []; try { const response = await fetch( `${trimTrailingSlash(provider.base_url)}/models`, @@ -68,6 +69,7 @@ export class LocalStorageLLMProviderService implements LLMProviderService { name: data.name, base_url: data.base_url, api_key: data.api_key, + enabled: data.enabled ?? false, created_at: now, updated_at: now, }; @@ -91,6 +93,10 @@ export class LocalStorageLLMProviderService implements LLMProviderService { const updated: Provider = { ...providers[idx], ...data, + enabled: + data.enabled !== undefined + ? data.enabled + : providers[idx].enabled, updated_at: new Date().toISOString(), }; this.#save(providers.map((p, i) => (i === idx ? updated : p))); diff --git a/frontend/omni/src/modules/llm-provider-service/modaiBackendLLMProviderService.svelte.ts b/frontend/omni/src/modules/llm-provider-service/modaiBackendLLMProviderService.svelte.ts index 3008e10..6bdac26 100644 --- a/frontend/omni/src/modules/llm-provider-service/modaiBackendLLMProviderService.svelte.ts +++ b/frontend/omni/src/modules/llm-provider-service/modaiBackendLLMProviderService.svelte.ts @@ -17,6 +17,7 @@ type BackendProvider = { name: string; base_url: string; api_key: string; + enabled: boolean; properties: Record; created_at: string | null; updated_at: string | null; @@ -40,6 +41,7 @@ function mapProvider(p: BackendProvider): Provider { name: p.name, base_url: p.base_url, api_key: p.api_key, + enabled: p.enabled, created_at: p.created_at ?? new Date().toISOString(), updated_at: p.updated_at ?? new Date().toISOString(), }; @@ -100,6 +102,8 @@ export class ModaiBackendLLMProviderService implements LLMProviderService { name: data.name ?? current.name, base_url: data.base_url ?? current.base_url, api_key: data.api_key ?? current.api_key, + enabled: + data.enabled !== undefined ? data.enabled : current.enabled, properties: current.properties, };