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")