From a371907809ad8cde231c2f1cf7f45d95f4f986c2 Mon Sep 17 00:00:00 2001 From: Xubin Ren <52506698+Re-bin@users.noreply.github.com> Date: Tue, 2 Jun 2026 15:38:23 +0800 Subject: [PATCH] fix(webui): keep tool activity in one thought block --- webui/src/lib/activity-timeline.ts | 7 ++++++- webui/src/tests/thread-messages.test.tsx | 6 ++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/webui/src/lib/activity-timeline.ts b/webui/src/lib/activity-timeline.ts index 0cb6ff20b..831c8e262 100644 --- a/webui/src/lib/activity-timeline.ts +++ b/webui/src/lib/activity-timeline.ts @@ -132,7 +132,12 @@ function pushActivityUnits(units: TurnUnit[], activityMessages: UIMessage[], vis for (const message of activityMessages) { const bucket = isFileEditActivityMessage(message) ? "file" : "other"; const segmentId = message.activitySegmentId; - const segmentChanged = !!runSegmentId && !!segmentId && runSegmentId !== segmentId; + const segmentChanged = + bucket === "file" + && runBucket === "file" + && !!runSegmentId + && !!segmentId + && runSegmentId !== segmentId; if ((runBucket && bucket !== runBucket) || segmentChanged) { flushRun(); } diff --git a/webui/src/tests/thread-messages.test.tsx b/webui/src/tests/thread-messages.test.tsx index 3d1839f65..5d78bb3f8 100644 --- a/webui/src/tests/thread-messages.test.tsx +++ b/webui/src/tests/thread-messages.test.tsx @@ -102,7 +102,7 @@ describe("ThreadMessages", () => { expect(units[2].type === "activity" ? units[2].messages.map((m) => m.id) : []).toEqual(["r2"]); }); - it("splits ordinary tool activity when segment ids changed", () => { + it("keeps ordinary tool activity in one Thought block across segment ids", () => { const messages: UIMessage[] = [ { id: "r1", @@ -142,12 +142,10 @@ describe("ThreadMessages", () => { const units = buildDisplayUnits(messages); - expect(units).toHaveLength(2); + expect(units).toHaveLength(1); expect(units[0].type === "activity" ? units[0].messages.map((m) => m.id) : []).toEqual([ "r1", "t1", - ]); - expect(units[1].type === "activity" ? units[1].messages.map((m) => m.id) : []).toEqual([ "r2", "t2", ]);