11import type { AgentTemplate } from '@codebuff/common/types/agent-template'
2- import type { AssistantMessage } from '@codebuff/common/types/messages/codebuff-message'
2+ import type { Message } from '@codebuff/common/types/messages/codebuff-message'
33import type {
44 AgentState ,
55 AgentOutput ,
66} from '@codebuff/common/types/session-state'
77
8+ /**
9+ * Get the last assistant turn messages, which includes the last assistant message
10+ * and any subsequent tool messages that are responses to its tool calls.
11+ */
12+ function getLastAssistantTurnMessages ( messageHistory : Message [ ] ) : Message [ ] {
13+ // Find the index of the last assistant message
14+ let lastAssistantIndex = - 1
15+ for ( let i = messageHistory . length - 1 ; i >= 0 ; i -- ) {
16+ if ( messageHistory [ i ] . role === 'assistant' ) {
17+ lastAssistantIndex = i
18+ break
19+ }
20+ }
21+
22+ for ( let i = lastAssistantIndex ; i >= 0 ; i -- ) {
23+ if ( messageHistory [ i ] . role === 'assistant' ) {
24+ lastAssistantIndex = i
25+ } else break
26+ }
27+
28+ if ( lastAssistantIndex === - 1 ) {
29+ return [ ]
30+ }
31+
32+ // Collect the assistant message and all subsequent tool messages
33+ const result : Message [ ] = [ ]
34+ for ( let i = lastAssistantIndex ; i < messageHistory . length ; i ++ ) {
35+ const message = messageHistory [ i ]
36+ if ( message . role === 'assistant' || message . role === 'tool' ) {
37+ result . push ( message )
38+ } else {
39+ // Stop if we hit a user or system message
40+ break
41+ }
42+ }
43+
44+ return result
45+ }
46+
847export function getAgentOutput (
948 agentState : AgentState ,
1049 agentTemplate : AgentTemplate ,
@@ -16,19 +55,18 @@ export function getAgentOutput(
1655 }
1756 }
1857 if ( agentTemplate . outputMode === 'last_message' ) {
19- const assistantMessages = agentState . messageHistory . filter (
20- ( message ) : message is AssistantMessage => message . role === 'assistant' ,
58+ const lastTurnMessages = getLastAssistantTurnMessages (
59+ agentState . messageHistory ,
2160 )
22- const lastAssistantMessage = assistantMessages [ assistantMessages . length - 1 ]
23- if ( ! lastAssistantMessage ) {
61+ if ( lastTurnMessages . length === 0 ) {
2462 return {
2563 type : 'error' ,
2664 message : 'No response from agent' ,
2765 }
2866 }
2967 return {
3068 type : 'lastMessage' ,
31- value : lastAssistantMessage . content ,
69+ value : lastTurnMessages ,
3270 }
3371 }
3472 if ( agentTemplate . outputMode === 'all_messages' ) {
0 commit comments