/ utils / collapseTeammateShutdowns.ts
collapseTeammateShutdowns.ts
 1  import type { AttachmentMessage, RenderableMessage } from '../types/message.js'
 2  
 3  function isTeammateShutdownAttachment(
 4    msg: RenderableMessage,
 5  ): msg is AttachmentMessage {
 6    return (
 7      msg.type === 'attachment' &&
 8      msg.attachment.type === 'task_status' &&
 9      msg.attachment.taskType === 'in_process_teammate' &&
10      msg.attachment.status === 'completed'
11    )
12  }
13  
14  /**
15   * Collapses consecutive in-process teammate shutdown task_status attachments
16   * into a single `teammate_shutdown_batch` attachment with a count.
17   */
18  export function collapseTeammateShutdowns(
19    messages: RenderableMessage[],
20  ): RenderableMessage[] {
21    const result: RenderableMessage[] = []
22    let i = 0
23  
24    while (i < messages.length) {
25      const msg = messages[i]!
26      if (isTeammateShutdownAttachment(msg)) {
27        let count = 0
28        while (
29          i < messages.length &&
30          isTeammateShutdownAttachment(messages[i]!)
31        ) {
32          count++
33          i++
34        }
35        if (count === 1) {
36          result.push(msg)
37        } else {
38          result.push({
39            type: 'attachment',
40            uuid: msg.uuid,
41            timestamp: msg.timestamp,
42            attachment: {
43              type: 'teammate_shutdown_batch',
44              count,
45            },
46          })
47        }
48      } else {
49        result.push(msg)
50        i++
51      }
52    }
53  
54    return result
55  }