| 83 | streamFor(event.messageId).append(autoCloseOpenMarkdown(next)); |
| 84 | }, |
| 85 | async onTextMessageEndEvent({ event }) { |
| 86 | if (aborted) return; |
| 87 | const text = buffers.get(event.messageId) ?? ""; |
| 88 | buffers.delete(event.messageId); |
| 89 | // Commit the agent's exact final text (now balanced on its own) so the |
| 90 | // settled message carries no synthetic closers. |
| 91 | const stream = streamFor(event.messageId); |
| 92 | stream.append(text); |
| 93 | await stream.finish(); |
| 94 | streams.delete(event.messageId); |
| 95 | const trimmed = text.trim(); |
| 96 | if (trimmed) args.recordAssistant?.(trimmed); |
| 97 | }, |
| 98 | |
| 99 | onToolCallArgsEvent({ event, toolCallName, partialToolCallArgs }) { |
| 100 | if (aborted) return; |