Browse Source

fix(app): session sync issue

adamelmore 1 month ago
parent
commit
d4e3acf17e
2 changed files with 16 additions and 28 deletions
  1. 15 28
      packages/app/src/context/sync.tsx
  2. 1 0
      packages/ui/src/components/session-turn.tsx

+ 15 - 28
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(() => {})

+ 1 - 0
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()