Skip to content

Commit 6931cc9

Browse files
authored
Fix global settings export (#3890)
1 parent b9d3331 commit 6931cc9

File tree

8 files changed

+74
-37
lines changed

8 files changed

+74
-37
lines changed

.changeset/young-buckets-fold.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"roo-cline": patch
3+
---
4+
5+
Fix global settings export

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

Lines changed: 59 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -282,41 +282,41 @@ describe("importExport", () => {
282282
expect(result.providerProfiles?.apiConfigs["default"]).toBeDefined()
283283
expect(result.providerProfiles?.apiConfigs["default"].apiProvider).toBe("anthropic")
284284
})
285-
})
286285

287-
it("should call updateCustomMode for each custom mode in config", async () => {
288-
;(vscode.window.showOpenDialog as jest.Mock).mockResolvedValue([{ fsPath: "/mock/path/settings.json" }])
286+
it("should call updateCustomMode for each custom mode in config", async () => {
287+
;(vscode.window.showOpenDialog as jest.Mock).mockResolvedValue([{ fsPath: "/mock/path/settings.json" }])
289288

290-
const customModes = [
291-
{ slug: "mode1", name: "Mode One", roleDefinition: "Custom role one", groups: [] },
292-
{ slug: "mode2", name: "Mode Two", roleDefinition: "Custom role two", groups: [] },
293-
]
289+
const customModes = [
290+
{ slug: "mode1", name: "Mode One", roleDefinition: "Custom role one", groups: [] },
291+
{ slug: "mode2", name: "Mode Two", roleDefinition: "Custom role two", groups: [] },
292+
]
294293

295-
const mockFileContent = JSON.stringify({
296-
providerProfiles: { currentApiConfigName: "test", apiConfigs: {} },
297-
globalSettings: { mode: "code", customModes },
298-
})
294+
const mockFileContent = JSON.stringify({
295+
providerProfiles: { currentApiConfigName: "test", apiConfigs: {} },
296+
globalSettings: { mode: "code", customModes },
297+
})
299298

300-
;(fs.readFile as jest.Mock).mockResolvedValue(mockFileContent)
299+
;(fs.readFile as jest.Mock).mockResolvedValue(mockFileContent)
301300

302-
mockProviderSettingsManager.export.mockResolvedValue({
303-
currentApiConfigName: "test",
304-
apiConfigs: {},
305-
})
301+
mockProviderSettingsManager.export.mockResolvedValue({
302+
currentApiConfigName: "test",
303+
apiConfigs: {},
304+
})
306305

307-
mockProviderSettingsManager.listConfig.mockResolvedValue([])
306+
mockProviderSettingsManager.listConfig.mockResolvedValue([])
308307

309-
const result = await importSettings({
310-
providerSettingsManager: mockProviderSettingsManager,
311-
contextProxy: mockContextProxy,
312-
customModesManager: mockCustomModesManager,
313-
})
308+
const result = await importSettings({
309+
providerSettingsManager: mockProviderSettingsManager,
310+
contextProxy: mockContextProxy,
311+
customModesManager: mockCustomModesManager,
312+
})
314313

315-
expect(result.success).toBe(true)
316-
expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledTimes(customModes.length)
314+
expect(result.success).toBe(true)
315+
expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledTimes(customModes.length)
317316

318-
customModes.forEach((mode) => {
319-
expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledWith(mode.slug, mode)
317+
customModes.forEach((mode) => {
318+
expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledWith(mode.slug, mode)
319+
})
320320
})
321321
})
322322

@@ -375,6 +375,39 @@ describe("importExport", () => {
375375
)
376376
})
377377

378+
it("should include globalSettings when allowedMaxRequests is null", async () => {
379+
;(vscode.window.showSaveDialog as jest.Mock).mockResolvedValue({
380+
fsPath: "/mock/path/roo-code-settings.json",
381+
})
382+
383+
const mockProviderProfiles = {
384+
currentApiConfigName: "test",
385+
apiConfigs: { test: { apiProvider: "openai" as ProviderName, id: "test-id" } },
386+
migrations: { rateLimitSecondsMigrated: false },
387+
}
388+
389+
mockProviderSettingsManager.export.mockResolvedValue(mockProviderProfiles)
390+
391+
const mockGlobalSettings = {
392+
mode: "code",
393+
autoApprovalEnabled: true,
394+
allowedMaxRequests: null,
395+
}
396+
397+
mockContextProxy.export.mockResolvedValue(mockGlobalSettings)
398+
399+
await exportSettings({
400+
providerSettingsManager: mockProviderSettingsManager,
401+
contextProxy: mockContextProxy,
402+
})
403+
404+
expect(fs.writeFile).toHaveBeenCalledWith(
405+
"/mock/path/roo-code-settings.json",
406+
JSON.stringify({ providerProfiles: mockProviderProfiles, globalSettings: mockGlobalSettings }, null, 2),
407+
"utf-8",
408+
)
409+
})
410+
378411
it("should handle errors during the export process", async () => {
379412
;(vscode.window.showSaveDialog as jest.Mock).mockResolvedValue({
380413
fsPath: "/mock/path/roo-code-settings.json",

src/core/webview/ClineProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
12631263
alwaysAllowMcp: alwaysAllowMcp ?? false,
12641264
alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? false,
12651265
alwaysAllowSubtasks: alwaysAllowSubtasks ?? false,
1266-
allowedMaxRequests: allowedMaxRequests ?? Infinity,
1266+
allowedMaxRequests,
12671267
autoCondenseContextPercent: autoCondenseContextPercent ?? 100,
12681268
uriScheme: vscode.env.uriScheme,
12691269
currentTaskItem: this.getCurrentCline()?.taskId
@@ -1369,7 +1369,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
13691369
alwaysAllowMcp: stateValues.alwaysAllowMcp ?? false,
13701370
alwaysAllowModeSwitch: stateValues.alwaysAllowModeSwitch ?? false,
13711371
alwaysAllowSubtasks: stateValues.alwaysAllowSubtasks ?? false,
1372-
allowedMaxRequests: stateValues.allowedMaxRequests ?? Infinity,
1372+
allowedMaxRequests: stateValues.allowedMaxRequests,
13731373
autoCondenseContextPercent: stateValues.autoCondenseContextPercent ?? 100,
13741374
taskHistory: stateValues.taskHistory,
13751375
allowedCommands: stateValues.allowedCommands,

src/exports/roo-code.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ type GlobalSettings = {
7272
alwaysAllowSubtasks?: boolean | undefined
7373
alwaysAllowExecute?: boolean | undefined
7474
allowedCommands?: string[] | undefined
75-
allowedMaxRequests?: number | undefined
75+
allowedMaxRequests?: (number | null) | undefined
7676
autoCondenseContextPercent?: number | undefined
7777
browserToolEnabled?: boolean | undefined
7878
browserViewportSize?: string | undefined
@@ -809,7 +809,7 @@ type IpcMessage =
809809
alwaysAllowSubtasks?: boolean | undefined
810810
alwaysAllowExecute?: boolean | undefined
811811
allowedCommands?: string[] | undefined
812-
allowedMaxRequests?: number | undefined
812+
allowedMaxRequests?: (number | null) | undefined
813813
autoCondenseContextPercent?: number | undefined
814814
browserToolEnabled?: boolean | undefined
815815
browserViewportSize?: string | undefined
@@ -1286,7 +1286,7 @@ type TaskCommand =
12861286
alwaysAllowSubtasks?: boolean | undefined
12871287
alwaysAllowExecute?: boolean | undefined
12881288
allowedCommands?: string[] | undefined
1289-
allowedMaxRequests?: number | undefined
1289+
allowedMaxRequests?: (number | null) | undefined
12901290
autoCondenseContextPercent?: number | undefined
12911291
browserToolEnabled?: boolean | undefined
12921292
browserViewportSize?: string | undefined

src/exports/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ type GlobalSettings = {
7272
alwaysAllowSubtasks?: boolean | undefined
7373
alwaysAllowExecute?: boolean | undefined
7474
allowedCommands?: string[] | undefined
75-
allowedMaxRequests?: number | undefined
75+
allowedMaxRequests?: (number | null) | undefined
7676
autoCondenseContextPercent?: number | undefined
7777
browserToolEnabled?: boolean | undefined
7878
browserViewportSize?: string | undefined
@@ -823,7 +823,7 @@ type IpcMessage =
823823
alwaysAllowSubtasks?: boolean | undefined
824824
alwaysAllowExecute?: boolean | undefined
825825
allowedCommands?: string[] | undefined
826-
allowedMaxRequests?: number | undefined
826+
allowedMaxRequests?: (number | null) | undefined
827827
autoCondenseContextPercent?: number | undefined
828828
browserToolEnabled?: boolean | undefined
829829
browserViewportSize?: string | undefined
@@ -1302,7 +1302,7 @@ type TaskCommand =
13021302
alwaysAllowSubtasks?: boolean | undefined
13031303
alwaysAllowExecute?: boolean | undefined
13041304
allowedCommands?: string[] | undefined
1305-
allowedMaxRequests?: number | undefined
1305+
allowedMaxRequests?: (number | null) | undefined
13061306
autoCondenseContextPercent?: number | undefined
13071307
browserToolEnabled?: boolean | undefined
13081308
browserViewportSize?: string | undefined

src/schemas/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,7 @@ export const globalSettingsSchema = z.object({
752752
alwaysAllowSubtasks: z.boolean().optional(),
753753
alwaysAllowExecute: z.boolean().optional(),
754754
allowedCommands: z.array(z.string()).optional(),
755-
allowedMaxRequests: z.number().optional(),
755+
allowedMaxRequests: z.number().nullish(),
756756
autoCondenseContextPercent: z.number().optional(),
757757

758758
browserToolEnabled: z.boolean().optional(),

webview-ui/src/components/settings/SettingsView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
250250
vscode.postMessage({ type: "alwaysAllowBrowser", bool: alwaysAllowBrowser })
251251
vscode.postMessage({ type: "alwaysAllowMcp", bool: alwaysAllowMcp })
252252
vscode.postMessage({ type: "allowedCommands", commands: allowedCommands ?? [] })
253-
vscode.postMessage({ type: "allowedMaxRequests", value: allowedMaxRequests })
253+
vscode.postMessage({ type: "allowedMaxRequests", value: allowedMaxRequests ?? undefined })
254254
vscode.postMessage({ type: "autoCondenseContextPercent", value: autoCondenseContextPercent })
255255
vscode.postMessage({ type: "browserToolEnabled", bool: browserToolEnabled })
256256
vscode.postMessage({ type: "soundEnabled", bool: soundEnabled })

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
140140
taskHistory: [],
141141
shouldShowAnnouncement: false,
142142
allowedCommands: [],
143-
allowedMaxRequests: Infinity,
144143
soundEnabled: false,
145144
soundVolume: 0.5,
146145
ttsEnabled: false,

0 commit comments

Comments
 (0)