diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx index 5b8ec63a46..ff682fdeef 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/message-content.tsx @@ -161,6 +161,18 @@ function parseBlocks(blocks: ContentBlock[]): MessageSegment[] { segments.push({ ...nextGroup, isOpen }) } + const lastSubagentBlockIndex = new Map() + for (let i = 0; i < blocks.length; i++) { + const block = blocks[i] + if (block.type === 'subagent' && block.content) { + lastSubagentBlockIndex.set(block.content, i) + } + } + const hasSubagentBlockAfter = (name: string, index: number): boolean => { + const last = lastSubagentBlockIndex.get(name) + return last !== undefined && last > index + } + for (let i = 0; i < blocks.length; i++) { const block = blocks[i] @@ -267,6 +279,9 @@ function parseBlocks(blocks: ContentBlock[]): MessageSegment[] { const isDispatch = SUBAGENT_KEYS.has(tc.name) && !tc.calledBy if (isDispatch) { + if (hasSubagentBlockAfter(tc.name, i)) { + continue + } if (!group || group.agentName !== tc.name) { if (group) { pushGroup(group) diff --git a/apps/sim/lib/copilot/request/go/stream.ts b/apps/sim/lib/copilot/request/go/stream.ts index ddbf7678d6..add10dc5f4 100644 --- a/apps/sim/lib/copilot/request/go/stream.ts +++ b/apps/sim/lib/copilot/request/go/stream.ts @@ -361,29 +361,26 @@ export async function runStreamLoop( flushSubagentThinkingBlock(context) flushThinkingBlock(context) if (spanEvt === MothershipStreamV1SpanLifecycleEvent.start) { - const lastParent = context.subAgentParentStack[context.subAgentParentStack.length - 1] - const lastBlock = context.contentBlocks[context.contentBlocks.length - 1] if (toolCallId) { - if (lastParent !== toolCallId) { + if (!context.subAgentParentStack.includes(toolCallId)) { context.subAgentParentStack.push(toolCallId) } context.subAgentParentToolCallId = toolCallId context.subAgentContent[toolCallId] ??= '' context.subAgentToolCalls[toolCallId] ??= [] } - if ( - subagentName && - !( - lastParent === toolCallId && - lastBlock?.type === 'subagent' && - lastBlock.content === subagentName + if (subagentName) { + const alreadyOpen = context.contentBlocks.some( + (b) => + b.type === 'subagent' && b.content === subagentName && b.endedAt === undefined ) - ) { - context.contentBlocks.push({ - type: 'subagent', - content: subagentName, - timestamp: Date.now(), - }) + if (!alreadyOpen) { + context.contentBlocks.push({ + type: 'subagent', + content: subagentName, + timestamp: Date.now(), + }) + } } return }