56 lines
1.3 KiB
TypeScript
56 lines
1.3 KiB
TypeScript
import type { AttachmentMessage, RenderableMessage } from '../types/message.js'
|
|
|
|
function isTeammateShutdownAttachment(
|
|
msg: RenderableMessage,
|
|
): msg is AttachmentMessage {
|
|
return (
|
|
msg.type === 'attachment' &&
|
|
msg.attachment.type === 'task_status' &&
|
|
msg.attachment.taskType === 'in_process_teammate' &&
|
|
msg.attachment.status === 'completed'
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Collapses consecutive in-process teammate shutdown task_status attachments
|
|
* into a single `teammate_shutdown_batch` attachment with a count.
|
|
*/
|
|
export function collapseTeammateShutdowns(
|
|
messages: RenderableMessage[],
|
|
): RenderableMessage[] {
|
|
const result: RenderableMessage[] = []
|
|
let i = 0
|
|
|
|
while (i < messages.length) {
|
|
const msg = messages[i]!
|
|
if (isTeammateShutdownAttachment(msg)) {
|
|
let count = 0
|
|
while (
|
|
i < messages.length &&
|
|
isTeammateShutdownAttachment(messages[i]!)
|
|
) {
|
|
count++
|
|
i++
|
|
}
|
|
if (count === 1) {
|
|
result.push(msg)
|
|
} else {
|
|
result.push({
|
|
type: 'attachment',
|
|
uuid: msg.uuid,
|
|
timestamp: msg.timestamp,
|
|
attachment: {
|
|
type: 'teammate_shutdown_batch',
|
|
count,
|
|
},
|
|
})
|
|
}
|
|
} else {
|
|
result.push(msg)
|
|
i++
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|