@@ -26,14 +26,15 @@ import type {
2626 ContextEngineFactoryContext ,
2727 ContextEngineRegistrationResult ,
2828} from "./registry.js" ;
29- import type {
30- ContextEngine ,
31- ContextEngineInfo ,
32- AssembleResult ,
33- CompactResult ,
34- ContextEngineMaintenanceResult ,
35- BootstrapResult ,
36- IngestResult ,
29+ import {
30+ resolveCompactionSuccessorTranscript ,
31+ type ContextEngine ,
32+ type ContextEngineInfo ,
33+ type AssembleResult ,
34+ type CompactResult ,
35+ type ContextEngineMaintenanceResult ,
36+ type BootstrapResult ,
37+ type IngestResult ,
3738} from "./types.js" ;
3839
3940const { compactEmbeddedAgentSessionDirectMock } = vi . hoisted ( ( ) => ( {
@@ -599,8 +600,77 @@ describe("Engine contract tests", () => {
599600 tokensBefore : 0 ,
600601 tokensAfter : 0 ,
601602 details : undefined ,
603+ sessionTarget : {
604+ kind : "file" ,
605+ sessionId : "s2" ,
606+ sessionFile : "/tmp/session.json" ,
607+ } ,
608+ } ,
609+ } ) ;
610+ } ) ;
611+
612+ it ( "delegateCompactionToRuntime reports the rotated successor as a typed session target" , async ( ) => {
613+ compactEmbeddedAgentSessionDirectMock . mockResolvedValue ( {
614+ ok : true ,
615+ compacted : true ,
616+ result : {
617+ summary : "compacted" ,
618+ firstKeptEntryId : "e1" ,
619+ tokensBefore : 100 ,
620+ tokensAfter : 10 ,
621+ sessionId : "rotated-id" ,
622+ sessionFile : "/tmp/rotated.jsonl" ,
602623 } ,
603624 } ) ;
625+
626+ const result = await delegateCompactionToRuntime ( {
627+ sessionId : "s-rotate" ,
628+ sessionKey : "agent:main:test" ,
629+ sessionFile : "/tmp/session.json" ,
630+ runtimeContext : {
631+ workspaceDir : "/tmp/workspace" ,
632+ agentId : "main" ,
633+ } ,
634+ } ) ;
635+
636+ expect ( result . result ?. sessionTarget ) . toEqual ( {
637+ kind : "file" ,
638+ agentId : "main" ,
639+ sessionId : "rotated-id" ,
640+ sessionKey : "agent:main:test" ,
641+ sessionFile : "/tmp/rotated.jsonl" ,
642+ } ) ;
643+ // Deprecated raw fields stay populated for shipped plugin-sdk readers.
644+ expect ( result . result ?. sessionId ) . toBe ( "rotated-id" ) ;
645+ expect ( result . result ?. sessionFile ) . toBe ( "/tmp/rotated.jsonl" ) ;
646+ } ) ;
647+
648+ it ( "resolveCompactionSuccessorTranscript prefers the typed target over deprecated raw fields" , ( ) => {
649+ expect (
650+ resolveCompactionSuccessorTranscript ( {
651+ ok : true ,
652+ compacted : true ,
653+ result : {
654+ tokensBefore : 1 ,
655+ sessionId : "raw-id" ,
656+ sessionFile : "/tmp/raw.jsonl" ,
657+ sessionTarget : {
658+ kind : "file" ,
659+ sessionId : "target-id" ,
660+ sessionFile : "/tmp/target.jsonl" ,
661+ } ,
662+ } ,
663+ } ) ,
664+ ) . toEqual ( { sessionId : "target-id" , sessionFile : "/tmp/target.jsonl" } ) ;
665+
666+ // Raw-field fallback covers shipped engines that predate sessionTarget.
667+ expect (
668+ resolveCompactionSuccessorTranscript ( {
669+ ok : true ,
670+ compacted : true ,
671+ result : { tokensBefore : 1 , sessionId : "raw-id" , sessionFile : "/tmp/raw.jsonl" } ,
672+ } ) ,
673+ ) . toEqual ( { sessionId : "raw-id" , sessionFile : "/tmp/raw.jsonl" } ) ;
604674 } ) ;
605675
606676 it ( "delegateCompactionToRuntime forwards the caller abortSignal to the runtime (#89868)" , async ( ) => {
0 commit comments