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", ]);