@@ -19,6 +19,7 @@ import { resolveGatewayInstallEntrypoint } from "../../daemon/gateway-entrypoint
1919import { resolveGatewayRestartLogPath } from "../../daemon/restart-logs.js" ;
2020import { resolveGatewayService } from "../../daemon/service.js" ;
2121import { createLowDiskSpaceWarning } from "../../infra/disk-space.js" ;
22+ import { runGlobalPackageUpdateSteps } from "../../infra/package-update-steps.js" ;
2223import { nodeVersionSatisfiesEngine } from "../../infra/runtime-guard.js" ;
2324import {
2425 channelToNpmTag ,
@@ -33,13 +34,10 @@ import {
3334 checkUpdateStatus ,
3435} from "../../infra/update-check.js" ;
3536import {
36- collectInstalledGlobalPackageErrors ,
3737 canResolveRegistryVersionForPackageTarget ,
3838 createGlobalInstallEnv ,
3939 cleanupGlobalRenameDirs ,
40- globalInstallFallbackArgs ,
4140 globalInstallArgs ,
42- resolveExpectedInstalledVersionFromSpec ,
4341 resolveGlobalInstallTarget ,
4442 resolveGlobalInstallSpec ,
4543} from "../../infra/update-global.js" ;
@@ -399,86 +397,45 @@ async function runPackageInstallUpdate(params: {
399397 }
400398 }
401399
402- const updateStep = await runUpdateStep ( {
403- name : "global update" ,
404- argv : globalInstallArgs ( installTarget , installSpec ) ,
405- env : installEnv ,
400+ const packageUpdate = await runGlobalPackageUpdateSteps ( {
401+ installTarget,
402+ installSpec,
403+ packageName,
404+ packageRoot : pkgRoot ,
405+ runCommand,
406406 timeoutMs : params . timeoutMs ,
407- progress : params . progress ,
408- } ) ;
409-
410- const steps = [ updateStep ] ;
411- let finalInstallStep = updateStep ;
412- if ( updateStep . exitCode !== 0 ) {
413- const fallbackArgv = globalInstallFallbackArgs ( installTarget , installSpec ) ;
414- if ( fallbackArgv ) {
415- const fallbackStep = await runUpdateStep ( {
416- name : "global update (omit optional)" ,
417- argv : fallbackArgv ,
418- env : installEnv ,
419- timeoutMs : params . timeoutMs ,
420- progress : params . progress ,
421- } ) ;
422- steps . push ( fallbackStep ) ;
423- finalInstallStep = fallbackStep ;
424- }
425- }
426- let afterVersion = beforeVersion ;
427-
428- const verifiedPackageRoot =
429- (
430- await resolveGlobalInstallTarget ( {
431- manager : installTarget ,
432- runCommand,
433- timeoutMs : params . timeoutMs ,
434- } )
435- ) . packageRoot ?? pkgRoot ;
436- if ( verifiedPackageRoot ) {
437- afterVersion = await readPackageVersion ( verifiedPackageRoot ) ;
438- const expectedVersion = resolveExpectedInstalledVersionFromSpec ( packageName , installSpec ) ;
439- const verificationErrors = await collectInstalledGlobalPackageErrors ( {
440- packageRoot : verifiedPackageRoot ,
441- expectedVersion,
442- } ) ;
443- if ( verificationErrors . length > 0 ) {
444- steps . push ( {
445- name : "global install verify" ,
446- command : `verify ${ verifiedPackageRoot } ` ,
447- cwd : verifiedPackageRoot ,
448- durationMs : 0 ,
449- exitCode : 1 ,
450- stderrTail : verificationErrors . join ( "\n" ) ,
451- stdoutTail : null ,
452- } ) ;
453- }
454- const entryPath = await resolveGatewayInstallEntrypoint ( verifiedPackageRoot ) ;
455- if ( entryPath ) {
456- const doctorStep = await runUpdateStep ( {
457- name : `${ CLI_NAME } doctor` ,
458- argv : [ resolveNodeRunner ( ) , entryPath , "doctor" , "--non-interactive" , "--fix" ] ,
459- env : {
460- ...process . env ,
461- OPENCLAW_UPDATE_IN_PROGRESS : "1" ,
462- } ,
463- timeoutMs : params . timeoutMs ,
407+ ...( installEnv === undefined ? { } : { env : installEnv } ) ,
408+ runStep : ( stepParams ) =>
409+ runUpdateStep ( {
410+ ...stepParams ,
464411 progress : params . progress ,
465- } ) ;
466- steps . push ( doctorStep ) ;
467- }
468- }
412+ } ) ,
413+ postVerifyStep : async ( verifiedPackageRoot ) => {
414+ const entryPath = await resolveGatewayInstallEntrypoint ( verifiedPackageRoot ) ;
415+ if ( entryPath ) {
416+ return await runUpdateStep ( {
417+ name : `${ CLI_NAME } doctor` ,
418+ argv : [ resolveNodeRunner ( ) , entryPath , "doctor" , "--non-interactive" , "--fix" ] ,
419+ env : {
420+ ...process . env ,
421+ OPENCLAW_UPDATE_IN_PROGRESS : "1" ,
422+ } ,
423+ timeoutMs : params . timeoutMs ,
424+ progress : params . progress ,
425+ } ) ;
426+ }
427+ return null ;
428+ } ,
429+ } ) ;
469430
470- const failedStep =
471- finalInstallStep . exitCode !== 0
472- ? finalInstallStep
473- : ( steps . find ( ( step ) => step !== updateStep && step . exitCode !== 0 ) ?? null ) ;
474431 return {
475- status : failedStep ? "error" : "ok" ,
432+ status : packageUpdate . failedStep ? "error" : "ok" ,
476433 mode : manager ,
477- root : verifiedPackageRoot ?? params . root ,
478- reason : failedStep ? failedStep . name : undefined ,
434+ root : packageUpdate . verifiedPackageRoot ?? params . root ,
435+ reason : packageUpdate . failedStep ? packageUpdate . failedStep . name : undefined ,
479436 before : { version : beforeVersion } ,
480- after : { version : afterVersion } ,
481- steps,
437+ after : { version : packageUpdate . afterVersion ?? beforeVersion } ,
438+ steps : packageUpdate . steps ,
482439 durationMs : Date . now ( ) - params . startedAt ,
483440 } ;
484441}
0 commit comments