diff --git a/packages/core/src/scheduler/scheduler.test.ts b/packages/core/src/scheduler/scheduler.test.ts index f909a11d23..dd26ba4c03 100644 --- a/packages/core/src/scheduler/scheduler.test.ts +++ b/packages/core/src/scheduler/scheduler.test.ts @@ -973,6 +973,10 @@ describe('Scheduler (Orchestrator)', () => { CoreToolCallStatus.Cancelled, 'User denied execution.', ); + expect(mockStateManager.setOutcome).toHaveBeenCalledWith( + 'call-1', + ToolConfirmationOutcome.Cancel, + ); expect(mockStateManager.cancelAllQueued).toHaveBeenCalledWith( 'User cancelled operation', ); diff --git a/packages/core/src/scheduler/scheduler.ts b/packages/core/src/scheduler/scheduler.ts index d71381eb33..deb28d33a5 100644 --- a/packages/core/src/scheduler/scheduler.ts +++ b/packages/core/src/scheduler/scheduler.ts @@ -487,15 +487,17 @@ export class Scheduler { }); outcome = result.outcome; lastDetails = result.lastDetails; - } else { - this.state.setOutcome(callId, ToolConfirmationOutcome.ProceedOnce); } + this.state.setOutcome(callId, outcome); + // Handle Policy Updates - await updatePolicy(toolCall.tool, outcome, lastDetails, { - config: this.config, - messageBus: this.messageBus, - }); + if (decision === PolicyDecision.ASK_USER && outcome) { + await updatePolicy(toolCall.tool, outcome, lastDetails, { + config: this.config, + messageBus: this.messageBus, + }); + } // Handle cancellation (cascades to entire batch) if (outcome === ToolConfirmationOutcome.Cancel) {