@@ -54,6 +54,7 @@ function startCompaction(sessionFile: string, options: { currentTokenCount?: num
5454 sessionKey : "agent:main:session-1" ,
5555 sessionFile,
5656 workspaceDir : tempDir ,
57+ trigger : "manual" ,
5758 ...options ,
5859 } ) ;
5960}
@@ -123,6 +124,35 @@ describe("maybeCompactCodexAppServerSession", () => {
123124 expect ( details . pending ) . toBe ( true ) ;
124125 } ) ;
125126
127+ it ( "skips native app-server compaction for automatic budget triggers" , async ( ) => {
128+ const fake = createFakeCodexClient ( ) ;
129+ setCodexAppServerClientFactoryForTest ( async ( ) => fake . client ) ;
130+ const sessionFile = await writeTestBinding ( ) ;
131+
132+ const result = requireCompactResult (
133+ await maybeCompactCodexAppServerSession ( {
134+ sessionId : "session-1" ,
135+ sessionKey : "agent:main:session-1" ,
136+ sessionFile,
137+ workspaceDir : tempDir ,
138+ trigger : "budget" ,
139+ currentTokenCount : 456 ,
140+ } ) ,
141+ ) ;
142+
143+ expect ( fake . request ) . not . toHaveBeenCalled ( ) ;
144+ expect ( result . ok ) . toBe ( true ) ;
145+ expect ( result . compacted ) . toBe ( false ) ;
146+ expect ( result . reason ) . toBe ( "codex app-server owns automatic compaction" ) ;
147+ expect ( result . result ?. tokensBefore ) . toBe ( 456 ) ;
148+ expect ( compactDetails ( result ) ) . toMatchObject ( {
149+ backend : "codex-app-server" ,
150+ skipped : true ,
151+ reason : "non_manual_trigger" ,
152+ trigger : "budget" ,
153+ } ) ;
154+ } ) ;
155+
126156 it ( "blocks native app-server compaction when the current OpenClaw session is sandboxed" , async ( ) => {
127157 const fake = createFakeCodexClient ( ) ;
128158 setCodexAppServerClientFactoryForTest ( async ( ) => fake . client ) ;
0 commit comments