fix(core): map ProceedAlways to ProceedOnce in Plan Mode to prevent exiting plan mode

This commit is contained in:
Mahima Shanware
2026-05-15 03:09:12 +00:00
parent af332c614a
commit d43af03598
2 changed files with 35 additions and 0 deletions
@@ -813,6 +813,33 @@ describe('policy.ts', () => {
}),
);
});
it('should map ProceedAlways to ProceedOnce in Plan Mode', async () => {
const mockConfig = {
getApprovalMode: vi.fn().mockReturnValue(ApprovalMode.PLAN),
setApprovalMode: vi.fn(),
getSessionId: vi.fn().mockReturnValue('test-session-id'),
} as unknown as Mocked<Config>;
(mockConfig as unknown as { config: Config }).config =
mockConfig as Config;
const mockMessageBus = {
publish: vi.fn(),
} as unknown as Mocked<MessageBus>;
(mockConfig as unknown as { messageBus: MessageBus }).messageBus =
mockMessageBus;
const tool = { name: 'replace' } as AnyDeclarativeTool;
await updatePolicy(
tool,
ToolConfirmationOutcome.ProceedAlways,
undefined,
mockConfig,
mockMessageBus,
);
expect(mockConfig.setApprovalMode).not.toHaveBeenCalled();
expect(mockMessageBus.publish).not.toHaveBeenCalled();
});
});
describe('getPolicyDenialError', () => {
+8
View File
@@ -121,6 +121,14 @@ export async function updatePolicy(
): Promise<void> {
const currentMode = context.config.getApprovalMode();
// If in Plan Mode, map 'Proceed Always' (Allow for this session) to 'Proceed Once' (Allow once)
// to prevent transitioning to AUTO_EDIT mode and updating policy.
if (
currentMode === ApprovalMode.PLAN &&
outcome === ToolConfirmationOutcome.ProceedAlways
) {
outcome = ToolConfirmationOutcome.ProceedOnce;
}
// Mode Transitions (AUTO_EDIT)
if (isAutoEditTransition(tool, outcome)) {
context.config.setApprovalMode(ApprovalMode.AUTO_EDIT);