| import { AgentMessage } from "../types"; |
| |
| export function aggregateAgentMessages( |
| arr1: AgentMessage[], |
| arr2: AgentMessage[], |
| ): AgentMessage[] { |
| const mergedArray = [...arr1, ...arr2]; |
| const seenIds = new Set<number>(); |
| const toolCallResults = new Map<string, AgentMessage>(); |
| |
| const ret: AgentMessage[] = mergedArray |
| .filter((msg) => { |
| if (msg.type == "tool") { |
| toolCallResults.set(msg.tool_call_id, msg); |
| return false; |
| } |
| // Suppress internal message types that shouldn't be displayed |
| if (msg.type == "slug" || msg.type == "compact") { |
| return false; |
| } |
| if (seenIds.has(msg.idx)) { |
| return false; // Skip if idx is already seen |
| } |
| |
| seenIds.add(msg.idx); |
| return true; |
| }) |
| .sort((a: AgentMessage, b: AgentMessage) => a.idx - b.idx); |
| |
| // Attach any tool_call result messages to the original message's tool_call object. |
| ret.forEach((msg) => { |
| msg.tool_calls?.forEach((toolCall) => { |
| if (toolCallResults.has(toolCall.tool_call_id)) { |
| toolCall.result_message = toolCallResults.get(toolCall.tool_call_id); |
| } |
| }); |
| }); |
| return ret; |
| } |