Skip to content

Commit a71884a

Browse files
committed
Stop leaking other provider settings
1 parent ee2033c commit a71884a

File tree

5 files changed

+286
-49
lines changed

5 files changed

+286
-49
lines changed

src/core/config/ProviderSettingsManager.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ExtensionContext } from "vscode"
22
import { z, ZodError } from "zod"
33

4-
import { providerSettingsSchema, ApiConfigMeta } from "../../schemas"
4+
import { providerSettingsSchema, ApiConfigMeta, providerSettingsSchemaDiscriminated } from "../../schemas"
55
import { Mode, modes } from "../../shared/modes"
66
import { telemetryService } from "../../services/telemetry/TelemetryService"
77

@@ -250,7 +250,11 @@ export class ProviderSettingsManager {
250250
const providerProfiles = await this.load()
251251
// Preserve the existing ID if this is an update to an existing config.
252252
const existingId = providerProfiles.apiConfigs[name]?.id
253-
providerProfiles.apiConfigs[name] = { ...config, id: config.id || existingId || this.generateId() }
253+
const id = config.id || existingId || this.generateId()
254+
255+
// Filter out settings from other providers.
256+
const filteredConfig = providerSettingsSchemaDiscriminated.parse(config)
257+
providerProfiles.apiConfigs[name] = { ...filteredConfig, id }
254258
await this.store(providerProfiles)
255259
})
256260
} catch (error) {

src/core/config/__tests__/ProviderSettingsManager.test.ts

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,58 @@ describe("ProviderSettingsManager", () => {
247247
},
248248
}
249249

250-
expect(mockSecrets.store).toHaveBeenCalledWith(
251-
"roo_cline_config_api_config",
252-
JSON.stringify(expectedConfig, null, 2),
250+
expect(mockSecrets.store.mock.calls[0][0]).toEqual("roo_cline_config_api_config")
251+
expect(storedConfig).toEqual(expectedConfig)
252+
})
253+
254+
it("should only save provider relevant settings", async () => {
255+
mockSecrets.get.mockResolvedValue(
256+
JSON.stringify({
257+
currentApiConfigName: "default",
258+
apiConfigs: {
259+
default: {},
260+
},
261+
modeApiConfigs: {
262+
code: "default",
263+
architect: "default",
264+
ask: "default",
265+
},
266+
}),
253267
)
268+
269+
const newConfig: ProviderSettings = {
270+
apiProvider: "anthropic",
271+
apiKey: "test-key",
272+
}
273+
const newConfigWithExtra: ProviderSettings = {
274+
...newConfig,
275+
openRouterApiKey: "another-key",
276+
}
277+
278+
await providerSettingsManager.saveConfig("test", newConfigWithExtra)
279+
280+
// Get the actual stored config to check the generated ID
281+
const storedConfig = JSON.parse(mockSecrets.store.mock.lastCall[1])
282+
const testConfigId = storedConfig.apiConfigs.test.id
283+
284+
const expectedConfig = {
285+
currentApiConfigName: "default",
286+
apiConfigs: {
287+
default: {},
288+
test: {
289+
...newConfig,
290+
id: testConfigId,
291+
},
292+
},
293+
modeApiConfigs: {
294+
code: "default",
295+
architect: "default",
296+
ask: "default",
297+
},
298+
}
299+
300+
expect(mockSecrets.store.mock.calls[0][0]).toEqual("roo_cline_config_api_config")
301+
expect(storedConfig).toEqual(expectedConfig)
254302
})
255303

256304
it("should update existing config", async () => {
@@ -291,10 +339,9 @@ describe("ProviderSettingsManager", () => {
291339
},
292340
}
293341

294-
expect(mockSecrets.store).toHaveBeenCalledWith(
295-
"roo_cline_config_api_config",
296-
JSON.stringify(expectedConfig, null, 2),
297-
)
342+
const storedConfig = JSON.parse(mockSecrets.store.mock.lastCall[1])
343+
expect(mockSecrets.store.mock.lastCall[0]).toEqual("roo_cline_config_api_config")
344+
expect(storedConfig).toEqual(expectedConfig)
298345
})
299346

300347
it("should throw error if secrets storage fails", async () => {

src/exports/roo-code.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,22 +121,22 @@ type ProviderSettings = {
121121
unboundModelId?: string | undefined
122122
requestyApiKey?: string | undefined
123123
requestyModelId?: string | undefined
124+
fakeAi?: unknown | undefined
124125
xaiApiKey?: string | undefined
125126
groqApiKey?: string | undefined
126127
chutesApiKey?: string | undefined
127128
litellmBaseUrl?: string | undefined
128129
litellmApiKey?: string | undefined
129130
litellmModelId?: string | undefined
130-
modelMaxTokens?: number | undefined
131-
modelMaxThinkingTokens?: number | undefined
132131
includeMaxTokens?: boolean | undefined
133132
reasoningEffort?: ("low" | "medium" | "high") | undefined
134133
promptCachingDisabled?: boolean | undefined
135134
diffEnabled?: boolean | undefined
136135
fuzzyMatchThreshold?: number | undefined
137136
modelTemperature?: (number | null) | undefined
138137
rateLimitSeconds?: number | undefined
139-
fakeAi?: unknown | undefined
138+
modelMaxTokens?: number | undefined
139+
modelMaxThinkingTokens?: number | undefined
140140
}
141141

142142
type GlobalSettings = {

src/exports/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,22 +122,22 @@ type ProviderSettings = {
122122
unboundModelId?: string | undefined
123123
requestyApiKey?: string | undefined
124124
requestyModelId?: string | undefined
125+
fakeAi?: unknown | undefined
125126
xaiApiKey?: string | undefined
126127
groqApiKey?: string | undefined
127128
chutesApiKey?: string | undefined
128129
litellmBaseUrl?: string | undefined
129130
litellmApiKey?: string | undefined
130131
litellmModelId?: string | undefined
131-
modelMaxTokens?: number | undefined
132-
modelMaxThinkingTokens?: number | undefined
133132
includeMaxTokens?: boolean | undefined
134133
reasoningEffort?: ("low" | "medium" | "high") | undefined
135134
promptCachingDisabled?: boolean | undefined
136135
diffEnabled?: boolean | undefined
137136
fuzzyMatchThreshold?: number | undefined
138137
modelTemperature?: (number | null) | undefined
139138
rateLimitSeconds?: number | undefined
140-
fakeAi?: unknown | undefined
139+
modelMaxTokens?: number | undefined
140+
modelMaxThinkingTokens?: number | undefined
141141
}
142142

143143
export type { ProviderSettings }

0 commit comments

Comments
 (0)