From 1a9e915d493a0955bfd8d66338b2cb6407818d31 Mon Sep 17 00:00:00 2001 From: yushen Date: Sat, 14 Feb 2026 07:49:20 +0800 Subject: [PATCH] fix(hub): skip text processing after MessageAggregator reset Add an `active` flag so that message_update/message_end events are ignored after reset() until the next message_start, preventing stale accumulated text from being re-emitted as a block. Co-Authored-By: Claude Opus 4.6 --- packages/core/src/hub/message-aggregator.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/hub/message-aggregator.ts b/packages/core/src/hub/message-aggregator.ts index 4f4b3738..7acb2a3e 100644 --- a/packages/core/src/hub/message-aggregator.ts +++ b/packages/core/src/hub/message-aggregator.ts @@ -33,6 +33,7 @@ export class MessageAggregator { private buffer = ""; private previousText = ""; private blockIndex = 0; + private active = false; private readonly chunker: BlockChunker; constructor( @@ -60,15 +61,20 @@ export class MessageAggregator { case "message_start": this.resetState(); + this.active = true; this.onPassthrough(event); return; case "message_update": + if (!this.active) return; this.handleMessageUpdate(event as AgentEvent & { type: "message_update" }); return; case "message_end": - this.handleMessageEnd(event as AgentEvent & { type: "message_end" }); + if (this.active) { + this.handleMessageEnd(event as AgentEvent & { type: "message_end" }); + } + this.active = false; this.onPassthrough(event); return; @@ -134,5 +140,6 @@ export class MessageAggregator { this.buffer = ""; this.previousText = ""; this.blockIndex = 0; + this.active = false; } }