@@ -34,6 +34,7 @@ const runCrestodianMock = vi.hoisted(() =>
3434const commanderParseAsyncMock = vi . hoisted ( ( ) => vi . fn ( async ( ) => { } ) ) ;
3535const addGatewayRunCommandMock = vi . hoisted ( ( ) => vi . fn ( ( command : unknown ) => command ) ) ;
3636const emitCliBannerMock = vi . hoisted ( ( ) => vi . fn ( ) ) ;
37+ const enableConsoleCaptureMock = vi . hoisted ( ( ) => vi . fn ( ) ) ;
3738const progressDoneMock = vi . hoisted ( ( ) => vi . fn ( ) ) ;
3839const createCliProgressMock = vi . hoisted ( ( ) =>
3940 vi . fn ( ( ) => ( {
@@ -95,6 +96,11 @@ vi.mock("./banner.js", () => ({
9596 emitCliBanner : emitCliBannerMock ,
9697} ) ) ;
9798
99+ vi . mock ( "../logging.js" , async ( ) => ( {
100+ ...( await vi . importActual < typeof import ( "../logging.js" ) > ( "../logging.js" ) ) ,
101+ enableConsoleCapture : enableConsoleCaptureMock ,
102+ } ) ) ;
103+
98104vi . mock ( "./container-target.js" , ( ) => ( {
99105 maybeRunCliInContainer : maybeRunCliInContainerMock ,
100106 parseCliContainerArgs : ( argv : string [ ] ) => ( { ok : true , container : null , argv } ) ,
@@ -325,6 +331,17 @@ describe("runCli exit behavior", () => {
325331 ] ) ;
326332 } ) ;
327333
334+ it ( "installs console capture before parsing the gateway foreground fast path" , async ( ) => {
335+ await runCli ( [ "node" , "openclaw" , "gateway" , "--force" ] ) ;
336+
337+ expect ( enableConsoleCaptureMock ) . toHaveBeenCalledTimes ( 1 ) ;
338+ expect ( commanderParseAsyncMock ) . toHaveBeenCalledTimes ( 1 ) ;
339+ const captureOrder = enableConsoleCaptureMock . mock . invocationCallOrder [ 0 ] ?? 0 ;
340+ const parseOrder = commanderParseAsyncMock . mock . invocationCallOrder [ 0 ] ?? 0 ;
341+ expect ( captureOrder ) . toBeGreaterThan ( 0 ) ;
342+ expect ( parseOrder ) . toBeGreaterThan ( captureOrder ) ;
343+ } ) ;
344+
328345 it ( "honors banner suppression on the gateway foreground fast path" , async ( ) => {
329346 process . env . OPENCLAW_HIDE_BANNER = "1" ;
330347
0 commit comments