fix(coding-agent): resolve waitForRetry() race when auto-retry produces tool calls (#2440)
When auto-retry fires after a retryable error (e.g. overloaded_error) and the retry response includes tool_use, session.prompt() returned prematurely because _resolveRetry() was called on the first successful message_end — while the agent loop was still executing tools via the fire-and-forget agent.continue(). This caused callers to observe isStreaming=true after prompt() returned, and follow-up session.prompt() calls threw 'Agent is already processing'. The tool execution results were silently lost. Fix: move _resolveRetry() from the message_end handler to the agent_end handler. The _retryAttempt counter reset stays on message_end (preventing accumulation across LLM calls within a turn), but the promise that unblocks waitForRetry() now only resolves when the full agent loop completes.
This commit is contained in:
@@ -490,7 +490,6 @@ export class AgentSession {
|
||||
attempt: this._retryAttempt,
|
||||
});
|
||||
this._retryAttempt = 0;
|
||||
this._resolveRetry();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -506,6 +505,7 @@ export class AgentSession {
|
||||
if (didRetry) return; // Retry was initiated, don't proceed to compaction
|
||||
}
|
||||
|
||||
this._resolveRetry();
|
||||
await this._checkCompaction(msg);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user