diff --git a/src/core/auto-approval/__tests__/checkAutoApproval.test.ts b/src/core/auto-approval/__tests__/checkAutoApproval.test.ts new file mode 100644 index 00000000000..ca2c8afcad2 --- /dev/null +++ b/src/core/auto-approval/__tests__/checkAutoApproval.test.ts @@ -0,0 +1,65 @@ +import { checkAutoApproval } from "../index" +import { ExtensionState } from "../../../shared/ExtensionMessage" + +describe("checkAutoApproval", () => { + const mockAsk = "tool" + + it("should approve deleteFile when alwaysAllowDelete is true", async () => { + const state = { + alwaysAllowDelete: true, + autoApprovalEnabled: true, + } as ExtensionState + + const text = JSON.stringify({ + tool: "deleteFile", + path: "/path/to/file", + }) + + const result = await checkAutoApproval({ state, ask: mockAsk, text }) + expect(result).toEqual({ decision: "approve" }) + }) + + it("should ask for deleteFile when alwaysAllowDelete is false", async () => { + const state = { + alwaysAllowDelete: false, + autoApprovalEnabled: true, + } as ExtensionState + + const text = JSON.stringify({ + tool: "deleteFile", + path: "/path/to/file", + }) + + const result = await checkAutoApproval({ state, ask: mockAsk, text }) + expect(result).toEqual({ decision: "ask" }) + }) + + it("should ask for deleteFile when alwaysAllowDelete is undefined", async () => { + const state = { + autoApprovalEnabled: true, + } as ExtensionState + + const text = JSON.stringify({ + tool: "deleteFile", + path: "/path/to/file", + }) + + const result = await checkAutoApproval({ state, ask: mockAsk, text }) + expect(result).toEqual({ decision: "ask" }) + }) + + it("should ask when autoApprovalEnabled is false even if alwaysAllowDelete is true", async () => { + const state = { + alwaysAllowDelete: true, + autoApprovalEnabled: false, + } as ExtensionState + + const text = JSON.stringify({ + tool: "deleteFile", + path: "/path/to/file", + }) + + const result = await checkAutoApproval({ state, ask: mockAsk, text }) + expect(result).toEqual({ decision: "ask" }) + }) +}) diff --git a/webview-ui/src/components/settings/AutoApproveSettings.tsx b/webview-ui/src/components/settings/AutoApproveSettings.tsx index b0565dbc7fa..d186164bfd6 100644 --- a/webview-ui/src/components/settings/AutoApproveSettings.tsx +++ b/webview-ui/src/components/settings/AutoApproveSettings.tsx @@ -23,6 +23,7 @@ type AutoApproveSettingsProps = HTMLAttributes & { alwaysAllowWrite?: boolean alwaysAllowWriteOutsideWorkspace?: boolean alwaysAllowWriteProtected?: boolean + alwaysAllowDelete?: boolean alwaysAllowBrowser?: boolean alwaysApproveResubmit?: boolean requestDelaySeconds: number @@ -73,6 +74,7 @@ export const AutoApproveSettings = ({ alwaysAllowWrite, alwaysAllowWriteOutsideWorkspace, alwaysAllowWriteProtected, + alwaysAllowDelete, alwaysAllowBrowser, alwaysApproveResubmit, requestDelaySeconds, @@ -200,6 +202,7 @@ export const AutoApproveSettings = ({ ((props, ref) alwaysAllowWrite, alwaysAllowWriteOutsideWorkspace, alwaysAllowWriteProtected, + alwaysAllowDelete, // kilocode_change alwaysApproveResubmit, autoCondenseContext, autoCondenseContextPercent, @@ -519,6 +520,7 @@ const SettingsView = forwardRef((props, ref) alwaysAllowWrite: alwaysAllowWrite ?? undefined, alwaysAllowWriteOutsideWorkspace: alwaysAllowWriteOutsideWorkspace ?? undefined, alwaysAllowWriteProtected: alwaysAllowWriteProtected ?? undefined, + alwaysAllowDelete: alwaysAllowDelete ?? undefined, // kilocode_change alwaysAllowExecute: alwaysAllowExecute ?? undefined, alwaysAllowBrowser: alwaysAllowBrowser ?? undefined, alwaysAllowMcp, @@ -1027,6 +1029,7 @@ const SettingsView = forwardRef((props, ref) alwaysAllowWrite={alwaysAllowWrite} alwaysAllowWriteOutsideWorkspace={alwaysAllowWriteOutsideWorkspace} alwaysAllowWriteProtected={alwaysAllowWriteProtected} + alwaysAllowDelete={alwaysAllowDelete} // kilocode_change alwaysAllowBrowser={alwaysAllowBrowser} alwaysApproveResubmit={alwaysApproveResubmit} requestDelaySeconds={requestDelaySeconds} diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index e57ea004b43..c2d852f0288 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -276,6 +276,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode alwaysApproveResubmit: false, alwaysAllowWrite: true, // kilocode_change alwaysAllowReadOnly: true, // kilocode_change + alwaysAllowDelete: false, // kilocode_change requestDelaySeconds: 5, currentApiConfigName: "default", listApiConfigMeta: [],