@@ -71,7 +71,7 @@ export class AskAIApi {
7171 session_id : this . sessionId ,
7272 user_id : this . sessionId ,
7373 } ;
74-
74+
7575 console . log ( 'Fetching memory for session:' , this . sessionId ) ;
7676
7777 const response = await fetch ( `${ this . getApiBaseUrl ( ) } /memory` , {
@@ -86,7 +86,7 @@ export class AskAIApi {
8686 const data = await response . json ( ) ;
8787 const messages = data . messages || [ ] ;
8888 console . log ( 'Memory fetched:' , messages . length , 'messages' ) ;
89-
89+
9090 // Return latest messages if limit is specified
9191 return limit > 0 ? messages . slice ( - limit ) : messages ;
9292 } else {
@@ -236,11 +236,11 @@ export class AskAIApi {
236236 const toolCallWithId = data . content [ 0 ] ?. type === "data" ? data . content [ 0 ] . data : null ;
237237 const toolCallWithArgs = data . content . length > 1 ? data . content [ 1 ] : data . content [ 0 ] ;
238238 const toolCall = toolCallWithArgs ?. type === "data" ? toolCallWithArgs . data : null ;
239-
239+
240240 if ( toolCall && onToolUse ) {
241241 const toolName = toolCall . name || 'Unknown Tool' ;
242242 let toolArgs = toolCall . arguments || { } ;
243-
243+
244244 if ( typeof toolArgs === 'string' ) {
245245 try {
246246 toolArgs = JSON . parse ( toolArgs ) ;
@@ -249,7 +249,7 @@ export class AskAIApi {
249249 toolArgs = { } ;
250250 }
251251 }
252-
252+
253253 const callId = toolCallWithId ?. call_id || null ;
254254 console . log ( 'Tool call detected:' , { toolName, toolArgs, callId } ) ;
255255 onToolUse ( toolName , toolArgs , callId ) ;
@@ -263,7 +263,7 @@ export class AskAIApi {
263263 const outputData = data . content . find ( item => item . type === "data" ) ?. data ;
264264 const callId = outputData ?. call_id || null ;
265265 const output = outputData ?. output ;
266-
266+
267267 if ( output && callId && onToolComplete ) {
268268 console . log ( 'Tool output received for call_id:' , callId ) ;
269269 onToolComplete ( callId ) ;
@@ -299,7 +299,7 @@ export class AskAIApi {
299299 . filter ( c => c . type === "text" )
300300 . map ( c => c . text )
301301 . join ( '' ) ;
302-
302+
303303 if ( fullText && ! hasReceivedContent ) {
304304 currentStreamContent = fullText ;
305305 hasReceivedContent = true ;
@@ -327,67 +327,66 @@ export class AskAIApi {
327327
328328 // ✨ Fetch from memory to get verified messages with complete metadata
329329 console . log ( 'Stream ended, fetching latest messages from memory...' ) ;
330- const recentMessages = await this . getMemory ( 2 ) ; // Get last 2 messages (user + assistant)
331-
332- if ( recentMessages . length >= 2 ) {
333- const userMessage = recentMessages [ recentMessages . length - 2 ] ;
334- const assistantMessage = recentMessages [ recentMessages . length - 1 ] ;
335-
336- // Validate these are the messages we expect
337- if ( userMessage . role === 'user' && assistantMessage . role === 'assistant' ) {
338-
339- const extractText = ( content ) => {
340- if ( Array . isArray ( content ) ) {
341- return content . filter ( c => c . type === 'text' ) . map ( c => c . text ) . join ( '' ) . trim ( ) ;
342- }
343- return ( content || '' ) . trim ( ) ;
344- } ;
345-
346- const userContent = extractText ( userMessage . content ) ;
347- const expectedContent = message . trim ( ) ;
348-
349- if ( userContent === expectedContent ) {
350- console . log ( '✓ Memory sync successful' ) ;
351- console . log ( ' User message ID:' , userMessage . id ) ;
352- console . log ( ' Assistant message ID:' , assistantMessage . id ) ;
353-
354- // Extract assistant content
355- let verifiedContent = '' ;
356- if ( Array . isArray ( assistantMessage . content ) ) {
357- verifiedContent = assistantMessage . content
358- . filter ( c => c . type === "text" )
359- . map ( c => c . text )
360- . join ( '' ) ;
361- }
362-
363- // Use verified content if stream was incomplete or network was unstable
364- if ( verifiedContent && ( ! streamCompletedSuccessfully || verifiedContent !== currentStreamContent ) ) {
365- console . log ( '⚠ Stream content differs from server, using server version' ) ;
366- currentStreamContent = verifiedContent ;
367- // Update UI with correct content
368- if ( onContentUpdate ) {
369- onContentUpdate ( currentStreamContent ) ;
370- }
371- }
372-
373- if ( onComplete ) {
374- onComplete ( userMessage , assistantMessage ) ;
375- }
376- return ;
377- } else {
378- console . warn ( '⚠ User message content mismatch - memory may not be synced yet' ) ;
379- console . log ( ' Expected:' , expectedContent . substring ( 0 , 50 ) ) ;
380- console . log ( ' Found in memory:' , userContent . substring ( 0 , 50 ) ) ;
330+ const recentMessages = await this . getMemory ( 10 ) ; // Get more messages to debug
331+
332+ // Find the last user message and last assistant message
333+ const extractText = ( content ) => {
334+ if ( Array . isArray ( content ) ) {
335+ return content . filter ( c => c . type === 'text' ) . map ( c => c . text ) . join ( '' ) . trim ( ) ;
336+ }
337+ return ( content || '' ) . trim ( ) ;
338+ } ;
339+
340+ // Get the last user message and last assistant message from memory
341+ let lastUserMessage = null ;
342+ let lastAssistantMessage = null ;
343+
344+ for ( let i = recentMessages . length - 1 ; i >= 0 ; i -- ) {
345+ const msg = recentMessages [ i ] ;
346+ if ( ! lastAssistantMessage && msg . role === 'assistant' ) {
347+ lastAssistantMessage = msg ;
348+ }
349+ if ( ! lastUserMessage && msg . role === 'user' ) {
350+ lastUserMessage = msg ;
351+ }
352+ if ( lastUserMessage && lastAssistantMessage ) break ;
353+ }
354+
355+ const expectedContent = message . trim ( ) ;
356+ const lastUserContent = lastUserMessage ? extractText ( lastUserMessage . content ) : '' ;
357+
358+ if ( lastUserMessage && lastAssistantMessage && lastUserContent === expectedContent ) {
359+ const assistantContent = extractText ( lastAssistantMessage . content ) ;
360+
361+ console . log ( '✓ Memory sync successful' ) ;
362+ console . log ( ' User message ID:' , lastUserMessage . id ) ;
363+ console . log ( ' Assistant message ID:' , lastAssistantMessage . id ) ;
364+
365+ // Use server content if stream was incomplete or content differs
366+ if ( assistantContent && ( ! streamCompletedSuccessfully ) ) {
367+ console . log ( '⚠ Stream content differs from server, using server version' ) ;
368+ currentStreamContent = assistantContent ;
369+ if ( onContentUpdate ) {
370+ onContentUpdate ( currentStreamContent ) ;
381371 }
382372 }
373+
374+ if ( onComplete ) {
375+ onComplete ( lastUserMessage , lastAssistantMessage ) ;
376+ }
377+ return ;
378+ } else {
379+ console . warn ( '⚠ Could not verify messages from memory' ) ;
380+ console . log ( ' Expected user content:' , expectedContent . substring ( 0 , 50 ) ) ;
381+ console . log ( ' Found user content:' , lastUserContent . substring ( 0 , 50 ) ) ;
383382 }
384383
385384 // Fallback: memory sync failed, use stream data
386385 console . warn ( '⚠ Could not verify messages from memory, using stream data' ) ;
387386 if ( onComplete ) {
388387 // Create message objects from stream data
389388 const fallbackUserMessage = {
390- id : ` user_${ streamMessageId } ` ,
389+ id : ' user_' + streamMessageId ,
391390 role : 'user' ,
392391 content : [ { type : 'text' , text : message . trim ( ) } ]
393392 } ;
0 commit comments