(messages: FormattableMessage[])
| 116 | * Filters out noise messages, merges same-sender runs, truncates long content. |
| 117 | */ |
| 118 | export function formatMessagesCompact(messages: FormattableMessage[]): string { |
| 119 | if (messages.length === 0) return '' |
| 120 | |
| 121 | const valid = messages.filter((m) => m.content && isValidMessage(m.content)) |
| 122 | if (valid.length === 0) return '' |
| 123 | |
| 124 | const lines: string[] = [] |
| 125 | let prevSender = '' |
| 126 | let pendingContents: string[] = [] |
| 127 | let pendingTs = 0 |
| 128 | |
| 129 | const flush = () => { |
| 130 | if (pendingContents.length === 0) return |
| 131 | const combined = pendingContents.join('; ') |
| 132 | const maxLen = pendingContents.length > 1 ? MAX_MERGED_CONTENT_LENGTH : MAX_CONTENT_LENGTH |
| 133 | lines.push(`${formatTimestamp(pendingTs)} ${prevSender}: ${truncate(combined, maxLen)}`) |
| 134 | } |
| 135 | |
| 136 | for (const msg of valid) { |
| 137 | const content = msg.content!.trim() |
| 138 | if (msg.senderName === prevSender) { |
| 139 | pendingContents.push(content) |
| 140 | } else { |
| 141 | flush() |
| 142 | prevSender = msg.senderName |
| 143 | pendingContents = [content] |
| 144 | pendingTs = msg.timestamp |
| 145 | } |
| 146 | } |
| 147 | flush() |
| 148 | |
| 149 | return lines.join('\n') |
| 150 | } |
| 151 | |
| 152 | /** |
| 153 | * Try to parse a tool result's JSON content and convert to compact text. |
no test coverage detected