@@ -138,7 +138,12 @@ import { validateAndFixToolResultIds } from "./validateToolResultIds"
138138import { mergeConsecutiveApiMessages } from "./mergeConsecutiveApiMessages"
139139import { prepareApiConversationMessage } from "./apiConversationHistory"
140140import { shouldAddUserMessageToHistory } from "./messageCounting"
141- import { decideMidStreamFailure , MAX_MID_STREAM_RETRIES , shouldRemoveMidStreamRetryMessage } from "./midStreamRetry"
141+ import {
142+ decideMidStreamFailure ,
143+ MAX_MID_STREAM_RETRIES ,
144+ shouldRemoveMidStreamRetryMessage ,
145+ wasMidStreamRetryMessageAdded ,
146+ } from "./midStreamRetry"
142147import { type TaskExecutionContext } from "./providerHandoff"
143148
144149const MAX_EXPONENTIAL_BACKOFF_SECONDS = 600 // 10 minutes
@@ -2926,10 +2931,10 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
29262931 includeFileDetails : boolean
29272932 retryAttempt ?: number
29282933 userMessageWasRemoved ?: boolean // Track if user message was removed due to empty response
2929- userMessageWasAdded : boolean
2934+ userMessageWasAdded ? : boolean
29302935 }
29312936
2932- const stack : StackItem [ ] = [ { userContent, includeFileDetails, retryAttempt : 0 , userMessageWasAdded : false } ]
2937+ const stack : StackItem [ ] = [ { userContent, includeFileDetails, retryAttempt : 0 } ]
29332938
29342939 while ( stack . length > 0 ) {
29352940 const currentItem = stack . pop ( ) !
@@ -3068,7 +3073,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
30683073 isEmptyUserContent,
30693074 userMessageWasRemoved : currentItem . userMessageWasRemoved ,
30703075 } )
3071- let { userMessageWasAdded } = currentItem
3076+ let userMessageWasAdded = wasMidStreamRetryMessageAdded ( currentItem . userMessageWasAdded )
30723077 if ( shouldAddUserMessage ) {
30733078 await this . addToApiConversationHistory ( { role : "user" , content : finalUserContent } )
30743079 this . messageCounts . user ++
@@ -3708,7 +3713,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
37083713 // Stryker disable next-line BooleanLiteral: file details are already materialized in the persisted request being retried.
37093714 includeFileDetails : false ,
37103715 retryAttempt : 0 ,
3711- userMessageWasAdded : false ,
37123716 } )
37133717
37143718 // Continue to retry the request
@@ -4108,7 +4112,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
41084112 stack . push ( {
41094113 userContent : [ ...this . userMessageContent ] , // Create a copy to avoid mutation issues
41104114 includeFileDetails : false , // Subsequent iterations don't need file details
4111- userMessageWasAdded : false ,
41124115 } )
41134116
41144117 // Add periodic yielding to prevent blocking
@@ -4176,7 +4179,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
41764179 includeFileDetails : false ,
41774180 retryAttempt : ( currentItem . retryAttempt ?? 0 ) + 1 ,
41784181 userMessageWasRemoved : removedCurrentUserMessage ,
4179- userMessageWasAdded : false ,
41804182 } )
41814183
41824184 // Continue to retry the request
@@ -4198,7 +4200,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
41984200 includeFileDetails : false ,
41994201 retryAttempt : ( currentItem . retryAttempt ?? 0 ) + 1 ,
42004202 userMessageWasRemoved : removedCurrentUserMessage ,
4201- userMessageWasAdded : false ,
42024203 } )
42034204
42044205 // Continue to retry the request
0 commit comments