@@ -199,6 +199,31 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
199199 const item = messages . findLast ( ( item ) => item . type === "compaction" && item . status === "running" )
200200 return item ?. type === "compaction" ? item : undefined
201201 } ,
202+ fromPending ( item : SessionPendingInfo ) : SessionMessageInfo {
203+ if ( item . type === "user" )
204+ return {
205+ id : item . id ,
206+ type : "user" ,
207+ ...item . data ,
208+ time : { created : item . timeCreated } ,
209+ }
210+ if ( item . type === "synthetic" )
211+ return {
212+ id : item . id ,
213+ type : "synthetic" ,
214+ ...item . data ,
215+ time : { created : item . timeCreated } ,
216+ }
217+ return {
218+ id : item . id ,
219+ type : "compaction" ,
220+ status : "running" ,
221+ reason : "manual" ,
222+ summary : "" ,
223+ recent : "" ,
224+ time : { created : item . timeCreated } ,
225+ }
226+ } ,
202227 latestTool ( assistant : SessionMessageAssistant | undefined , callID ?: string ) {
203228 return assistant ?. content . findLast (
204229 ( item ) : item is SessionMessageAssistantTool =>
@@ -960,16 +985,29 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
960985 } ,
961986 sync ( sessionID : string ) {
962987 return sync . run ( `session.message:${ sessionID } ` , async ( ) => {
963- const pending = new Set ( store . session . input [ sessionID ] ?? [ ] )
964- const messages = (
965- await client . api . message . list ( { sessionID, limit : 200 , order : "desc" } )
966- ) . data . toReversed ( )
967- const index = new Map ( messages . map ( ( message , index ) => [ message . id , index ] ) )
968- store . session . message [ sessionID ]
969- ?. filter ( ( message ) => pending . has ( message . id ) )
970- . forEach ( ( item ) => message . append ( messages , index , item ) )
971- messageIndex . set ( sessionID , index )
972- setStore ( "session" , "message" , sessionID , reconcile ( messages ) )
988+ const inputsBeforeSync = new Set ( store . session . input [ sessionID ] ?? [ ] )
989+ const [ projected , pending ] = await Promise . all ( [
990+ client . api . message . list ( { sessionID, limit : 200 , order : "desc" } ) ,
991+ client . api . session . pending . list ( { sessionID } ) ,
992+ ] )
993+ const messages = projected . data . toReversed ( )
994+ const projectedIDs = new Set ( messages . map ( ( message ) => message . id ) )
995+ const pendingMessages = pending . filter ( ( item ) => ! projectedIDs . has ( item . id ) ) . map ( message . fromPending )
996+ const next = [ ...messages , ...pendingMessages ]
997+ messageIndex . set ( sessionID , new Map ( next . map ( ( message , index ) => [ message . id , index ] ) ) )
998+ const inputsAfterSync = new Set ( store . session . input [ sessionID ] ?? [ ] )
999+ setStore (
1000+ "session" ,
1001+ "input" ,
1002+ sessionID ,
1003+ pendingMessages . flatMap ( ( message ) =>
1004+ ( message . type === "user" || message . type === "synthetic" ) &&
1005+ ( ! inputsBeforeSync . has ( message . id ) || inputsAfterSync . has ( message . id ) )
1006+ ? [ message . id ]
1007+ : [ ] ,
1008+ ) ,
1009+ )
1010+ setStore ( "session" , "message" , sessionID , reconcile ( next ) )
9731011 } )
9741012 } ,
9751013 invalidate ( sessionID : string ) {
0 commit comments