diff --git a/packages/core/src/confirmation-bus/message-bus.ts b/packages/core/src/confirmation-bus/message-bus.ts index b9033fd67d..1600f2f5b2 100644 --- a/packages/core/src/confirmation-bus/message-bus.ts +++ b/packages/core/src/confirmation-bus/message-bus.ts @@ -79,8 +79,21 @@ export class MessageBus extends EventEmitter { }); break; case PolicyDecision.ASK_USER: - // Pass through to UI for user confirmation - this.emitMessage(message); + // Pass through to UI for user confirmation if any listeners exist. + // If no listeners are registered (e.g., headless/ACP flows), + // immediately request user confirmation to avoid long timeouts. + if ( + this.listenerCount(MessageBusType.TOOL_CONFIRMATION_REQUEST) > 0 + ) { + this.emitMessage(message); + } else { + this.emitMessage({ + type: MessageBusType.TOOL_CONFIRMATION_RESPONSE, + correlationId: message.correlationId, + confirmed: false, + requiresUserConfirmation: true, + }); + } break; default: throw new Error(`Unknown policy decision: ${decision}`);