From f1cc359b0af41a196e6f02324601172280b55fb8 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Fri, 19 Dec 2025 13:11:03 +0000 Subject: [PATCH] fix: add maximum retry limit for empty assistant responses This fix addresses Issue #10106 where the system enters infinite retry loops when API providers (Roo Cloud, OpenRouter, Requesty) return empty assistant responses while auto-approval is enabled. Changes: - Add MAX_EMPTY_RESPONSE_RETRIES constant (3 retries) - Add retry limit check before auto-retry logic - When limit is reached, fall back to user prompt instead of continuing to auto-retry indefinitely This is a centralized fix in Task.ts that benefits all providers, addressing the systemic nature of the issue rather than implementing provider-specific safeguards. --- src/core/task/Task.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index e0277350c24..726c031f908 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -137,6 +137,7 @@ const MAX_EXPONENTIAL_BACKOFF_SECONDS = 600 // 10 minutes const DEFAULT_USAGE_COLLECTION_TIMEOUT_MS = 5000 // 5 seconds const FORCED_CONTEXT_REDUCTION_PERCENT = 75 // Keep 75% of context (remove 25%) on context window errors const MAX_CONTEXT_WINDOW_RETRIES = 3 // Maximum retries for context window errors +const MAX_EMPTY_RESPONSE_RETRIES = 3 // Maximum retries for empty assistant response errors export interface TaskOptions extends CreateTaskOptions { provider: ClineProvider @@ -3307,7 +3308,14 @@ export class Task extends EventEmitter implements TaskLike { // Check if we should auto-retry or prompt the user // Reuse the state variable from above - if (state?.autoApprovalEnabled) { + // Check if we've exceeded maximum retries for empty responses + const emptyResponseRetryCount = currentItem.retryAttempt ?? 0 + if (emptyResponseRetryCount >= MAX_EMPTY_RESPONSE_RETRIES) { + console.warn( + `[Task#${this.taskId}.${this.instanceId}] Empty response retry limit reached (${emptyResponseRetryCount}/${MAX_EMPTY_RESPONSE_RETRIES}). Falling back to user prompt.`, + ) + // Fall through to manual retry prompt below + } else if (state?.autoApprovalEnabled) { // Auto-retry with backoff - don't persist failure message when retrying await this.backoffAndAnnounce( currentItem.retryAttempt ?? 0,