From 97ce197f386d2404c996f2227e38ca82fdf1163d Mon Sep 17 00:00:00 2001 From: shrutip90 Date: Mon, 25 Aug 2025 19:57:57 -0700 Subject: [PATCH] Treat undefined same as true for isTrustedFolder (#7073) --- .../messages/ToolConfirmationMessage.test.tsx | 18 ++++++++++++++++++ .../messages/ToolConfirmationMessage.tsx | 10 ++++++---- packages/core/src/config/config.test.ts | 14 ++++++++++++++ packages/core/src/config/config.ts | 2 +- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx index 94cffff329..fceb86b6cf 100644 --- a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx +++ b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx @@ -136,6 +136,24 @@ describe('ToolConfirmationMessage', () => { expect(lastFrame()).toContain(alwaysAllowText); }); + it('should show "allow always" when folder trust is undefined', () => { + const mockConfig = { + isTrustedFolder: () => undefined, + getIdeMode: () => false, + } as unknown as Config; + + const { lastFrame } = renderWithProviders( + , + ); + + expect(lastFrame()).toContain(alwaysAllowText); + }); + it('should NOT show "allow always" when folder is untrusted', () => { const mockConfig = { isTrustedFolder: () => false, diff --git a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx index 8cd7756ed8..bec6666a31 100644 --- a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx @@ -56,6 +56,8 @@ export const ToolConfirmationMessage: React.FC< onConfirm(outcome); }; + const isTrustedFolder = config?.isTrustedFolder() !== false; + useKeypress( (key) => { if (!isFocused) return; @@ -129,7 +131,7 @@ export const ToolConfirmationMessage: React.FC< label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }); - if (config?.isTrustedFolder()) { + if (isTrustedFolder) { options.push({ label: 'Yes, allow always', value: ToolConfirmationOutcome.ProceedAlways, @@ -168,7 +170,7 @@ export const ToolConfirmationMessage: React.FC< label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }); - if (config?.isTrustedFolder()) { + if (isTrustedFolder) { options.push({ label: `Yes, allow always ...`, value: ToolConfirmationOutcome.ProceedAlways, @@ -208,7 +210,7 @@ export const ToolConfirmationMessage: React.FC< label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }); - if (config?.isTrustedFolder()) { + if (isTrustedFolder) { options.push({ label: 'Yes, allow always', value: ToolConfirmationOutcome.ProceedAlways, @@ -253,7 +255,7 @@ export const ToolConfirmationMessage: React.FC< label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }); - if (config?.isTrustedFolder()) { + if (isTrustedFolder) { options.push({ label: `Yes, always allow tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"`, value: ToolConfirmationOutcome.ProceedAlwaysTool, // Cast until types are updated diff --git a/packages/core/src/config/config.test.ts b/packages/core/src/config/config.test.ts index a37a9fe9f3..3326ebf96f 100644 --- a/packages/core/src/config/config.test.ts +++ b/packages/core/src/config/config.test.ts @@ -685,4 +685,18 @@ describe('setApprovalMode with folder trust', () => { expect(() => config.setApprovalMode(ApprovalMode.AUTO_EDIT)).not.toThrow(); expect(() => config.setApprovalMode(ApprovalMode.DEFAULT)).not.toThrow(); }); + + it('should NOT throw an error when setting any mode if trustedFolder is undefined', () => { + const config = new Config({ + sessionId: 'test', + targetDir: '.', + debugMode: false, + model: 'test-model', + cwd: '.', + trustedFolder: undefined, // Undefined + }); + expect(() => config.setApprovalMode(ApprovalMode.YOLO)).not.toThrow(); + expect(() => config.setApprovalMode(ApprovalMode.AUTO_EDIT)).not.toThrow(); + expect(() => config.setApprovalMode(ApprovalMode.DEFAULT)).not.toThrow(); + }); }); diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 4b2f508dc9..86d3ddd5f4 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -564,7 +564,7 @@ export class Config { } setApprovalMode(mode: ApprovalMode): void { - if (!this.isTrustedFolder() && mode !== ApprovalMode.DEFAULT) { + if (this.isTrustedFolder() === false && mode !== ApprovalMode.DEFAULT) { throw new Error( 'Cannot enable privileged approval modes in an untrusted folder.', );