From 4f65e01a6372e4e28e8c3aeb70d9b1cee081ec9e Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Sun, 12 Jul 2026 00:45:26 +0300 Subject: [PATCH] fix(sync): defer incomplete assistant-only pages --- packages/ui/src/sync/use-sync.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/sync/use-sync.ts b/packages/ui/src/sync/use-sync.ts index 9abdd76b..9a50ad01 100644 --- a/packages/ui/src/sync/use-sync.ts +++ b/packages/ui/src/sync/use-sync.ts @@ -447,8 +447,9 @@ export function useSync() { // user sees content as soon as a user boundary appears, instead of // waiting for the full expansion sequence before the first paint. if (!options?.before && !page.complete && !hasUserMessage(page.session)) { - for (const nextLimit of getInitialPageExpansionLimits()) { - if (nextLimit <= limit) continue + const expansionLimits = getInitialPageExpansionLimits().filter((nextLimit) => nextLimit > limit) + for (let index = 0; index < expansionLimits.length; index += 1) { + const nextLimit = expansionLimits[index] if (options?.isStale?.()) { setMetaFor(sessionID, { loading: false }) return @@ -458,12 +459,22 @@ export function useSync() { setMetaFor(sessionID, { loading: false }) return } - committed = commitMessagesToStore(expandedPage, options?.mode, options?.isStale) + const hasBoundary = hasUserMessage(expandedPage.session) + const isFinalExpansion = index === expansionLimits.length - 1 + if (expandedPage.complete || hasBoundary || isFinalExpansion) { + committed = commitMessagesToStore(expandedPage, options?.mode, options?.isStale) + } else { + committed = { + messages: expandedPage.session, + cursor: expandedPage.cursor, + complete: expandedPage.complete, + } + } if (options?.isStale?.()) { setMetaFor(sessionID, { loading: false }) return } - if (expandedPage.complete || hasUserMessage(expandedPage.session)) break + if (expandedPage.complete || hasBoundary) break } }