From 2f7b93ee95d1b4d98b8216c8fbfe0d731e7b0b5e Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 21 Oct 2026 09:49:18 -0700 Subject: [PATCH] fix(app): stop history enrichment at the original turn (#57700) --- .../app/src/session/timeline/model.test.ts | 9 +++++++-- packages/app/src/session/timeline/model.ts | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/app/src/session/timeline/model.test.ts b/packages/app/src/session/timeline/model.test.ts index 7aa247fc425..bb79d8fbbe3 100644 --- a/packages/app/src/session/timeline/model.test.ts +++ b/packages/app/src/session/timeline/model.test.ts @@ -63,7 +63,12 @@ describe("timeline model", () => { }) test("pauses between history pages and stops once the leading turn has its parent", async () => { - const pages: SessionMessageInfo[][] = [[assistant("msg_older")], [user("msg_parent")], [user("msg_earlier")]] + const pages: SessionMessageInfo[][] = [ + [assistant("msg_older")], + [assistant("msg_previous_turn"), user("msg_parent")], + [user("msg_earlier")], + ] + const messages: SessionMessageInfo[] = [assistant("msg_latest"), user("msg_next")] const calls: string[] = [] @@ -83,7 +88,7 @@ describe("timeline model", () => { maxPages: 3, }) - expect(calls).toEqual(["pause", "load:msg_older", "pause", "load:msg_parent"]) + expect(calls).toEqual(["pause", "load:msg_older", "pause", "load:msg_previous_turn"]) expect(pages).toHaveLength(1) }) }) diff --git a/packages/app/src/session/timeline/model.ts b/packages/app/src/session/timeline/model.ts index 4a1ad3d1334..9b76dfe10e6 100644 --- a/packages/app/src/session/timeline/model.ts +++ b/packages/app/src/session/timeline/model.ts @@ -86,12 +86,21 @@ export async function enrichLeadingTurn(input: { pause: () => Promise maxPages: number }) { + const assistant = input.messages().find((message) => message.type === "assistant")?.id + + if (!assistant) return + const load = async (pages: number): Promise => { - if (!input.current() || pages >= input.maxPages || !leadingTurnNeedsParent(input.messages()) || !input.more()) + if ( + !input.current() || + pages >= input.maxPages || + !leadingTurnNeedsParent(input.messages(), assistant) || + !input.more() + ) return await input.pause() - if (!input.current() || !leadingTurnNeedsParent(input.messages()) || !input.more()) return + if (!input.current() || !leadingTurnNeedsParent(input.messages(), assistant) || !input.more()) return if (input.loading()) return load(pages) await input.loadMore() @@ -102,8 +111,9 @@ export async function enrichLeadingTurn(input: { return load(0) } -function leadingTurnNeedsParent(messages: SessionMessageInfo[]) { - const assistant = messages.findIndex((message) => message.type === "assistant") +function leadingTurnNeedsParent(messages: SessionMessageInfo[], id: string) { + // Older pages can start mid-turn too; only complete the turn that was visible on entry. + const assistant = messages.findIndex((message) => message.id === id) if (assistant === -1) return false const boundary = messages.findIndex((message) => message.type === "user" || message.type === "shell")