blob: 53475402bda043526189fd15baed8c7e51eb608a [file] [log] [blame]
Pokey Rulee2a8c2f2025-04-23 15:09:25 +01001import { AgentMessage } from "../types";
2
3export function aggregateAgentMessages(
4 arr1: AgentMessage[],
Philip Zeyliger72682df2025-04-23 13:09:46 -07005 arr2: AgentMessage[],
6): AgentMessage[] {
Pokey Rulee2a8c2f2025-04-23 15:09:25 +01007 const mergedArray = [...arr1, ...arr2];
8 const seenIds = new Set<number>();
9 const toolCallResults = new Map<string, AgentMessage>();
10
philip.zeyliger26bc6592025-06-30 20:15:30 -070011 const ret: AgentMessage[] = mergedArray
Pokey Rulee2a8c2f2025-04-23 15:09:25 +010012 .filter((msg) => {
13 if (msg.type == "tool") {
14 toolCallResults.set(msg.tool_call_id, msg);
15 return false;
16 }
Josh Bleecher Snyder3b44cc32025-07-22 02:28:14 +000017 // Suppress internal message types that shouldn't be displayed
18 if (msg.type == "slug" || msg.type == "compact") {
19 return false;
20 }
Pokey Rulee2a8c2f2025-04-23 15:09:25 +010021 if (seenIds.has(msg.idx)) {
22 return false; // Skip if idx is already seen
23 }
24
25 seenIds.add(msg.idx);
26 return true;
27 })
28 .sort((a: AgentMessage, b: AgentMessage) => a.idx - b.idx);
29
30 // Attach any tool_call result messages to the original message's tool_call object.
31 ret.forEach((msg) => {
32 msg.tool_calls?.forEach((toolCall) => {
33 if (toolCallResults.has(toolCall.tool_call_id)) {
34 toolCall.result_message = toolCallResults.get(toolCall.tool_call_id);
35 }
36 });
37 });
38 return ret;
39}