From 4cc58c59cce4939d0350b1decad4408a7f71ba7f Mon Sep 17 00:00:00 2001 From: Aljosa Asanovic Date: Wed, 30 Apr 2025 14:54:22 -0400 Subject: [PATCH 1/2] fix: migrate and persist missing modeApiConfigs for per-mode API profiles - Backfill `modeApiConfigs` on initialize if absent, seeding with the current profile - Ensure `setModeConfig()` always mutates and persists the real modeApiConfigs map - Addresses regression introduced in PR #1997 --- src/core/config/ProviderSettingsManager.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index 7df34e7844a..27ebc6593f4 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -77,6 +77,18 @@ export class ProviderSettingsManager { let isDirty = false + // Migrate existing installs to have per-mode API config map + if (!providerProfiles.modeApiConfigs) { + // Use the currently selected config for all modes initially + const currentName = providerProfiles.currentApiConfigName + const seedId = + providerProfiles.apiConfigs[currentName]?.id ?? + Object.values(providerProfiles.apiConfigs)[0]?.id ?? + this.defaultConfigId + providerProfiles.modeApiConfigs = Object.fromEntries(modes.map((m) => [m.slug, seedId])) + isDirty = true + } + // Ensure all configs have IDs. for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { if (!apiConfig.id) { @@ -307,8 +319,12 @@ export class ProviderSettingsManager { try { return await this.lock(async () => { const providerProfiles = await this.load() - const { modeApiConfigs = {} } = providerProfiles - modeApiConfigs[mode] = configId + // Ensure the per-mode config map exists + if (!providerProfiles.modeApiConfigs) { + providerProfiles.modeApiConfigs = {} + } + // Assign the chosen config ID to this mode + providerProfiles.modeApiConfigs[mode] = configId await this.store(providerProfiles) }) } catch (error) { From e88fbd60fd5908db81d4c22154c573d81f54edbc Mon Sep 17 00:00:00 2001 From: Aljosa Asanovic Date: Wed, 30 Apr 2025 16:05:12 -0400 Subject: [PATCH 2/2] =?UTF-8?q?test:=20include=20empty=20modeApiConfigs=20?= =?UTF-8?q?in=20=E2=80=9Calready-migrated=E2=80=9D=20test=20fixture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure that the ProviderSettingsManager.initialize() test which verifies no storage write when migrations are complete includes an empty modeApiConfigs field. Without this, the new per-mode API profile migration always fires and breaks the assertion. --- src/core/config/__tests__/ProviderSettingsManager.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/config/__tests__/ProviderSettingsManager.test.ts b/src/core/config/__tests__/ProviderSettingsManager.test.ts index ade40c29d38..d705e5f9c08 100644 --- a/src/core/config/__tests__/ProviderSettingsManager.test.ts +++ b/src/core/config/__tests__/ProviderSettingsManager.test.ts @@ -53,6 +53,7 @@ describe("ProviderSettingsManager", () => { fuzzyMatchThreshold: 1.0, }, }, + modeApiConfigs: {}, migrations: { rateLimitSecondsMigrated: true, diffSettingsMigrated: true,