diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 244e5e07b..5c8e140c3 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -16,7 +16,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const sdk = useSDK() type Child = ReturnType<(typeof globalSync)["child"]> - type Store = Child[0] type Setter = Child[1] const current = createMemo(() => globalSync.child(sdk.directory)) @@ -43,18 +42,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ return Math.ceil(count / chunk) * chunk } - const hydrateMessages = (directory: string, store: Store, sessionID: string) => { - const key = keyFor(directory, sessionID) - if (meta.limit[key] !== undefined) return - - const messages = store.message[sessionID] - if (!messages) return - - const limit = limitFor(messages.length) - setMeta("limit", key, limit) - setMeta("complete", key, messages.length < limit) - } - const loadMessages = async (input: { directory: string client: typeof sdk.client @@ -150,21 +137,20 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const directory = sdk.directory const client = sdk.client const [store, setStore] = globalSync.child(directory) + const key = keyFor(directory, sessionID) const hasSession = (() => { const match = Binary.search(store.session, sessionID, (s) => s.id) return match.found })() - hydrateMessages(directory, store, sessionID) - const hasMessages = store.message[sessionID] !== undefined - if (hasSession && hasMessages) return - - const key = keyFor(directory, sessionID) + const hydrated = meta.limit[key] !== undefined + if (hasSession && hasMessages && hydrated) return const pending = inflight.get(key) if (pending) return pending - const limit = meta.limit[key] ?? chunk + const count = store.message[sessionID]?.length ?? 0 + const limit = hydrated ? (meta.limit[key] ?? chunk) : limitFor(count) const sessionReq = hasSession ? Promise.resolve() @@ -184,15 +170,16 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ ) }) - const messagesReq = hasMessages - ? Promise.resolve() - : loadMessages({ - directory, - client, - setStore, - sessionID, - limit, - }) + const messagesReq = + hasMessages && hydrated + ? Promise.resolve() + : loadMessages({ + directory, + client, + setStore, + sessionID, + limit, + }) const promise = Promise.all([sessionReq, messagesReq]) .then(() => {}) diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index 4f8ce37fb..5aa79e0b9 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -283,6 +283,7 @@ export function SessionTurn( const shellModePart = createMemo(() => { const p = parts() + if (p.length === 0) return if (!p.every((part) => part?.type === "text" && part?.synthetic)) return const msgs = assistantMessages()