@@ -24,6 +24,26 @@ const hiddenToolNames = new Set<ToolName | 'spawn_agent_inline'>([
2424 'spawn_agents' ,
2525] )
2626
27+ // Helper function to recursively update blocks
28+ const updateBlocksRecursively = (
29+ blocks : ContentBlock [ ] ,
30+ targetAgentId : string ,
31+ updateFn : ( block : ContentBlock ) => ContentBlock ,
32+ ) : ContentBlock [ ] => {
33+ return blocks . map ( ( block ) => {
34+ if ( block . type === 'agent' && block . agentId === targetAgentId ) {
35+ return updateFn ( block )
36+ }
37+ if ( block . type === 'agent' && block . blocks ) {
38+ return {
39+ ...block ,
40+ blocks : updateBlocksRecursively ( block . blocks , targetAgentId , updateFn ) ,
41+ }
42+ }
43+ return block
44+ } )
45+ }
46+
2747interface UseSendMessageOptions {
2848 setMessages : React . Dispatch < React . SetStateAction < ChatMessage [ ] > >
2949 setFocusedAgentId : ( id : string | null ) => void
@@ -171,8 +191,11 @@ export const useSendMessage = ({
171191 setMessages ( ( prev ) =>
172192 prev . map ( ( msg ) => {
173193 if ( msg . id === aiMessageId && msg . blocks ) {
174- const newBlocks = msg . blocks . map ( ( block ) => {
175- if ( block . type === 'agent' && block . agentId === agentId ) {
194+ // Use recursive update to handle nested agents
195+ const newBlocks = updateBlocksRecursively (
196+ msg . blocks ,
197+ agentId ,
198+ ( block ) => {
176199 const agentBlocks : ContentBlock [ ] = block . blocks
177200 ? [ ...block . blocks ]
178201 : [ ]
@@ -223,9 +246,9 @@ export const useSendMessage = ({
223246 } )
224247 return { ...block , blocks : [ ...agentBlocks , update ] }
225248 }
226- }
227- return block
228- } )
249+ return block
250+ } ,
251+ )
229252 return { ...msg , blocks : newBlocks }
230253 }
231254 return msg
@@ -467,6 +490,8 @@ export const useSendMessage = ({
467490 logger . info ( 'subagent_start event' , {
468491 agentId : event . agentId ,
469492 agentType : event . agentType ,
493+ parentAgentId : event . parentAgentId || 'ROOT' ,
494+ hasParentAgentId : ! ! event . parentAgentId ,
470495 } )
471496 activeSubagentsRef . current . add ( event . agentId )
472497
@@ -529,6 +554,7 @@ export const useSendMessage = ({
529554 {
530555 agentId : event . agentId ,
531556 agentType : event . agentType ,
557+ parentAgentId : event . parentAgentId || 'ROOT' ,
532558 } ,
533559 )
534560 setMessages ( ( prev ) =>
@@ -551,6 +577,27 @@ export const useSendMessage = ({
551577 initialPrompt : '' ,
552578 }
553579
580+ // If parentAgentId exists, nest inside parent agent
581+ if ( event . parentAgentId ) {
582+ logger . info ( 'Nesting agent inside parent' , {
583+ childId : event . agentId ,
584+ parentId : event . parentAgentId ,
585+ } )
586+ const updatedBlocks = updateBlocksRecursively (
587+ blocks ,
588+ event . parentAgentId ,
589+ ( parentBlock ) => ( {
590+ ...parentBlock ,
591+ blocks : [
592+ ...( parentBlock . blocks || [ ] ) ,
593+ newAgentBlock ,
594+ ] ,
595+ } ) ,
596+ )
597+ return { ...msg , blocks : updatedBlocks }
598+ }
599+
600+ // No parent - add to top level
554601 return {
555602 ...msg ,
556603 blocks : [ ...blocks , newAgentBlock ] ,
@@ -572,15 +619,12 @@ export const useSendMessage = ({
572619 setMessages ( ( prev ) =>
573620 prev . map ( ( msg ) => {
574621 if ( msg . id === aiMessageId && msg . blocks ) {
575- const blocks = msg . blocks . map ( ( block ) => {
576- if (
577- block . type === 'agent' &&
578- block . agentId === event . agentId
579- ) {
580- return { ...block , status : 'complete' as const }
581- }
582- return block
583- } )
622+ // Use recursive update to handle nested agents
623+ const blocks = updateBlocksRecursively (
624+ msg . blocks ,
625+ event . agentId ,
626+ ( block ) => ( { ...block , status : 'complete' as const } ) ,
627+ )
584628 return { ...msg , blocks }
585629 }
586630 return msg
@@ -597,6 +641,12 @@ export const useSendMessage = ({
597641
598642 if ( event . type === 'tool_call' && event . toolCallId ) {
599643 const { toolCallId, toolName, input, agentId } = event
644+ logger . info ( 'tool_call event received' , {
645+ toolCallId,
646+ toolName,
647+ agentId : agentId || 'ROOT' ,
648+ hasAgentId : ! ! agentId ,
649+ } )
600650
601651 if ( toolName === 'spawn_agents' && input ?. agents ) {
602652 const agents = Array . isArray ( input . agents ) ? input . agents : [ ]
@@ -678,12 +728,11 @@ export const useSendMessage = ({
678728 return msg
679729 }
680730
681- const updatedBlocks : ContentBlock [ ] = msg . blocks . map (
731+ // Use recursive update to handle nested agents
732+ const updatedBlocks = updateBlocksRecursively (
733+ msg . blocks ,
734+ agentId ,
682735 ( block ) => {
683- if ( block . type !== 'agent' || block . agentId !== agentId ) {
684- return block
685- }
686-
687736 const agentBlocks : ContentBlock [ ] = block . blocks
688737 ? [ ...block . blocks ]
689738 : [ ]
0 commit comments