@@ -61,38 +61,57 @@ Write out your complete implementation now.`,
6161 const initialMessageHistoryLength =
6262 initialAgentState . messageHistory . length
6363
64+ // Helper to check if a message is empty (no tool calls and empty/no text)
65+ const isEmptyAssistantMessage = ( message : any ) : boolean => {
66+ if ( message . role !== 'assistant' || ! Array . isArray ( message . content ) ) {
67+ return false
68+ }
69+ const hasToolCalls = message . content . some (
70+ ( part : any ) => part . type === 'tool-call' ,
71+ )
72+ if ( hasToolCalls ) {
73+ return false
74+ }
75+ // Check if all text parts are empty or there are no text parts
76+ const textParts = message . content . filter (
77+ ( part : any ) => part . type === 'text' ,
78+ )
79+ if ( textParts . length === 0 ) {
80+ return true
81+ }
82+ return textParts . every ( ( part : any ) => ! part . text || ! part . text . trim ( ) )
83+ }
84+
6485 const { agentState } = yield 'STEP_ALL'
6586
6687 let postMessages = agentState . messageHistory . slice (
6788 initialMessageHistoryLength ,
6889 )
6990
91+ // Retry if no messages or if the only message is empty (no tool calls and empty text)
7092 if ( postMessages . length === 0 ) {
71- const { agentState : postMessagesAgentState } = yield 'STEP'
93+ logger . debug ( 'No messages after STEP_ALL, retrying' )
94+ const { agentState : postMessagesAgentState } = yield 'STEP_ALL'
95+ postMessages = postMessagesAgentState . messageHistory . slice (
96+ initialMessageHistoryLength ,
97+ )
98+ } else if (
99+ postMessages . length === 1 &&
100+ isEmptyAssistantMessage ( postMessages [ 0 ] )
101+ ) {
102+ logger . debug (
103+ 'Empty assistant message (no tool calls, empty text) after STEP_ALL, retrying' ,
104+ )
105+ const { agentState : postMessagesAgentState } = yield 'STEP_ALL'
72106 postMessages = postMessagesAgentState . messageHistory . slice (
73107 initialMessageHistoryLength ,
74108 )
75- } else if ( postMessages . length == 1 ) {
76- const message = postMessages [ 0 ]
77- if (
78- message . role === 'assistant' &&
79- message . content . length === 1 &&
80- message . content [ 0 ] . type === 'text' &&
81- ! message . content [ 0 ] . text
82- ) {
83- const { agentState : postMessagesAgentState } = yield 'STEP_ALL'
84- postMessages = postMessagesAgentState . messageHistory . slice (
85- initialMessageHistoryLength ,
86- )
87- }
88109 }
89-
90110 logger . debug (
91111 {
92- numMessages : postMessages . length ,
93- messageRoles : postMessages . map ( ( m : any ) => m . role ) ,
112+ postMessages,
94113 } ,
95- 'Post STEP_ALL messages' ,
114+ 'Editor Implementor 2 Post STEP_ALL messages' ,
96115 )
97116
98117 // Extract tool calls from assistant messages
@@ -122,25 +141,12 @@ Write out your complete implementation now.`,
122141 }
123142 }
124143
125- logger . debug (
126- { numToolCalls : toolCalls . length , numToolResults : toolResults . length } ,
127- 'Extracted tool calls and results' ,
128- )
129-
130144 // Concatenate all unified diffs for the selector to review
131145 const unifiedDiffs = toolResults
132146 . filter ( ( result : any ) => result . unifiedDiff )
133147 . map ( ( result : any ) => `--- ${ result . file } ---\n${ result . unifiedDiff } ` )
134148 . join ( '\n\n' )
135149
136- logger . debug (
137- {
138- unifiedDiffsLength : unifiedDiffs . length ,
139- hasContent : unifiedDiffs . length > 0 ,
140- } ,
141- 'Generated unified diffs' ,
142- )
143-
144150 yield {
145151 toolName : 'set_output' ,
146152 input : {
0 commit comments