@@ -279,6 +279,44 @@ describe("messages handler", () => {
279279 assertStringIncludes ( output . messages [ 0 ] . parts [ 0 ] . text , "next" ) ;
280280 } ) ;
281281
282+ it ( "rewrites leading legacy memory blocks with empty or missing data-uuids" , async ( ) => {
283+ const cases = [
284+ '<memory data-uuids=""></memory>\n\nnext' ,
285+ "<memory></memory>\n\nnext" ,
286+ ] ;
287+
288+ for ( const text of cases ) {
289+ const sessionManager = new MockSessionManager ( ) ;
290+ sessionManager . state . pendingInjection = {
291+ envelope :
292+ '<session_memory version="1"><last_request>next</last_request></session_memory>' ,
293+ nodeRefs : [ ] ,
294+ refreshDecision : {
295+ classification : "aligned" ,
296+ shouldRefresh : false ,
297+ similarity : 1 ,
298+ threshold : 0.5 ,
299+ cachedQuery : "next" ,
300+ } ,
301+ } ;
302+ const handler = createMessagesHandler ( {
303+ sessionManager : sessionManager as never ,
304+ } ) ;
305+ const output = {
306+ messages : [ {
307+ info : { role : "user" , sessionID : "session-1" } ,
308+ parts : [ { type : "text" , text } ] ,
309+ } ] ,
310+ } ;
311+
312+ await handler ( { } , output as never ) ;
313+
314+ assertStringIncludes ( output . messages [ 0 ] . parts [ 0 ] . text , "<session_memory" ) ;
315+ assertEquals ( output . messages [ 0 ] . parts [ 0 ] . text . includes ( "<memory" ) , false ) ;
316+ assertStringIncludes ( output . messages [ 0 ] . parts [ 0 ] . text , "next" ) ;
317+ }
318+ } ) ;
319+
282320 it ( "preserves user-authored persistent memory blocks away from the reinjection prefix" , async ( ) => {
283321 const sessionManager = new MockSessionManager ( ) ;
284322 sessionManager . state . pendingInjection = {
@@ -430,6 +468,40 @@ describe("messages handler", () => {
430468 }
431469 } ) ;
432470
471+ it ( "preserves leading user-authored non-empty legacy memory blocks without data-uuids" , async ( ) => {
472+ const sessionManager = new MockSessionManager ( ) ;
473+ sessionManager . state . pendingInjection = {
474+ envelope :
475+ '<session_memory source="graphiti" version="1"><last_request>inspect example</last_request></session_memory>' ,
476+ nodeRefs : [ ] ,
477+ refreshDecision : {
478+ classification : "aligned" ,
479+ shouldRefresh : false ,
480+ similarity : 1 ,
481+ threshold : 0.5 ,
482+ cachedQuery : "inspect example" ,
483+ } ,
484+ } ;
485+ const handler = createMessagesHandler ( {
486+ sessionManager : sessionManager as never ,
487+ } ) ;
488+
489+ const userAuthoredBlock = "<memory>user-authored example</memory>" ;
490+ const output = {
491+ messages : [ {
492+ info : { role : "user" , sessionID : "session-1" } ,
493+ parts : [ {
494+ type : "text" ,
495+ text : `${ userAuthoredBlock } \n\ninspect example` ,
496+ } ] ,
497+ } ] ,
498+ } ;
499+
500+ await handler ( { } as never , output as never ) ;
501+
502+ assertStringIncludes ( output . messages [ 0 ] . parts [ 0 ] . text , userAuthoredBlock ) ;
503+ } ) ;
504+
433505 it ( "reports rewroteExistingMemory when canonical or legacy blocks were scrubbed" , async ( ) => {
434506 const sessionManager = new MockSessionManager ( ) ;
435507 sessionManager . state . pendingInjection = {
0 commit comments