diff --git a/src/wizard/onboarding.finalize.ts b/src/wizard/onboarding.finalize.ts index 1c071aced..c0d5cbff9 100644 --- a/src/wizard/onboarding.finalize.ts +++ b/src/wizard/onboarding.finalize.ts @@ -163,46 +163,62 @@ export async function finalizeOnboardingWizard(options: FinalizeOnboardingOption if (!loaded || (loaded && (await service.isLoaded({ env: process.env })) === false)) { const devMode = process.argv[1]?.includes(`${path.sep}src${path.sep}`) && process.argv[1]?.endsWith(".ts"); - await withWizardProgress( - "Gateway daemon", - { doneMessage: "Gateway daemon installed." }, - async (progress) => { - progress.update("Preparing Gateway daemon…"); - const nodePath = await resolvePreferredNodePath({ - env: process.env, - runtime: daemonRuntime, - }); - const { programArguments, workingDirectory } = await resolveGatewayProgramArguments({ - port: settings.port, - dev: devMode, - runtime: daemonRuntime, - nodePath, - }); - if (daemonRuntime === "node") { - const systemNode = await resolveSystemNodeInfo({ env: process.env }); - const warning = renderSystemNodeWarning(systemNode, programArguments[0]); - if (warning) await prompter.note(warning, "Gateway runtime"); - } - const environment = buildServiceEnvironment({ - env: process.env, - port: settings.port, - token: settings.gatewayToken, - launchdLabel: - process.platform === "darwin" - ? resolveGatewayLaunchAgentLabel(process.env.CLAWDBOT_PROFILE) - : undefined, - }); + const progress = prompter.progress("Gateway daemon"); + let installError: string | null = null; + try { + progress.update("Preparing Gateway daemon…"); + const nodePath = await resolvePreferredNodePath({ + env: process.env, + runtime: daemonRuntime, + }); + const { programArguments, workingDirectory } = await resolveGatewayProgramArguments({ + port: settings.port, + dev: devMode, + runtime: daemonRuntime, + nodePath, + }); + if (daemonRuntime === "node") { + const systemNode = await resolveSystemNodeInfo({ env: process.env }); + const warning = renderSystemNodeWarning(systemNode, programArguments[0]); + if (warning) await prompter.note(warning, "Gateway runtime"); + } + const environment = buildServiceEnvironment({ + env: process.env, + port: settings.port, + token: settings.gatewayToken, + launchdLabel: + process.platform === "darwin" + ? resolveGatewayLaunchAgentLabel(process.env.CLAWDBOT_PROFILE) + : undefined, + }); - progress.update("Installing Gateway daemon…"); - await service.install({ - env: process.env, - stdout: process.stdout, - programArguments, - workingDirectory, - environment, - }); - }, - ); + progress.update("Installing Gateway daemon…"); + await service.install({ + env: process.env, + stdout: process.stdout, + programArguments, + workingDirectory, + environment, + }); + } catch (err) { + installError = err instanceof Error ? err.message : String(err); + } finally { + progress.stop(installError ? "Gateway daemon install failed." : "Gateway daemon installed."); + } + if (installError) { + await prompter.note(`Gateway daemon install failed: ${installError}`, "Gateway"); + if (process.platform === "win32") { + await prompter.note( + "Tip: rerun from an elevated PowerShell (Start → type PowerShell → right-click → Run as administrator) or skip daemon install.", + "Gateway", + ); + } else { + await prompter.note( + "Tip: rerun `clawdbot daemon install` after fixing the error.", + "Gateway", + ); + } + } } }