
























@@ -17,7 +17,7 @@ import { formatConfigIssueLines } from "../../config/issue-format.js";
1717import { asResolvedSourceConfig, asRuntimeConfig } from "../../config/materialize.js";
1818import { resolveGatewayInstallEntrypoint } from "../../daemon/gateway-entrypoint.js";
1919import { resolveGatewayRestartLogPath } from "../../daemon/restart-logs.js";
20-import { resolveGatewayService } from "../../daemon/service.js";
20+import { readGatewayServiceState, resolveGatewayService } from "../../daemon/service.js";
2121import { createLowDiskSpaceWarning } from "../../infra/disk-space.js";
2222import { runGlobalPackageUpdateSteps } from "../../infra/package-update-steps.js";
2323import { nodeVersionSatisfiesEngine } from "../../infra/runtime-guard.js";
@@ -133,6 +133,24 @@ function pickUpdateQuip(): string {
133133function isPackageManagerUpdateMode(mode: UpdateRunResult["mode"]): mode is "npm" | "pnpm" | "bun" {
134134return mode === "npm" || mode === "pnpm" || mode === "bun";
135135}
136+137+export function shouldPrepareUpdatedInstallRestart(params: {
138+updateMode: UpdateRunResult["mode"];
139+serviceInstalled: boolean;
140+serviceLoaded: boolean;
141+}): boolean {
142+if (isPackageManagerUpdateMode(params.updateMode)) {
143+return params.serviceInstalled;
144+}
145+return params.serviceLoaded;
146+}
147+148+export function shouldUseLegacyProcessRestartAfterUpdate(params: {
149+updateMode: UpdateRunResult["mode"];
150+}): boolean {
151+return !isPackageManagerUpdateMode(params.updateMode);
152+}
153+136154function formatCommandFailure(stdout: string, stderr: string): string {
137155const detail = (stderr || stdout).trim();
138156if (!detail) {
@@ -267,6 +285,7 @@ async function refreshGatewayServiceEnv(params: {
267285result: UpdateRunResult;
268286jsonMode: boolean;
269287invocationCwd?: string;
288+env?: NodeJS.ProcessEnv;
270289}): Promise<void> {
271290const args = ["gateway", "install", "--force"];
272291if (params.jsonMode) {
@@ -277,7 +296,7 @@ async function refreshGatewayServiceEnv(params: {
277296if (entrypoint) {
278297const res = await runCommandWithTimeout([resolveNodeRunner(), entrypoint, ...args], {
279298cwd: params.result.root,
280-env: resolveServiceRefreshEnv(process.env, params.invocationCwd),
299+env: resolveServiceRefreshEnv(params.env ?? process.env, params.invocationCwd),
281300timeoutMs: SERVICE_REFRESH_TIMEOUT_MS,
282301});
283302if (res.code === 0) {
@@ -288,9 +307,45 @@ async function refreshGatewayServiceEnv(params: {
288307);
289308}
290309310+if (isPackageManagerUpdateMode(params.result.mode)) {
311+throw new Error(
312+`updated install entrypoint not found under ${params.result.root ?? "unknown"}`,
313+);
314+}
315+291316await runDaemonInstall({ force: true, json: params.jsonMode || undefined });
292317}
293318319+async function runUpdatedInstallGatewayRestart(params: {
320+result: UpdateRunResult;
321+jsonMode: boolean;
322+invocationCwd?: string;
323+env?: NodeJS.ProcessEnv;
324+}): Promise<boolean> {
325+const entrypoint = await resolveGatewayInstallEntrypoint(params.result.root);
326+if (!entrypoint) {
327+throw new Error(
328+`updated install entrypoint not found under ${params.result.root ?? "unknown"}`,
329+);
330+}
331+332+const args = ["gateway", "restart"];
333+if (params.jsonMode) {
334+args.push("--json");
335+}
336+const res = await runCommandWithTimeout([resolveNodeRunner(), entrypoint, ...args], {
337+cwd: params.result.root,
338+env: resolveServiceRefreshEnv(params.env ?? process.env, params.invocationCwd),
339+timeoutMs: SERVICE_REFRESH_TIMEOUT_MS,
340+});
341+if (res.code === 0) {
342+return true;
343+}
344+throw new Error(
345+`updated install restart failed (${entrypoint}): ${formatCommandFailure(res.stdout, res.stderr)}`,
346+);
347+}
348+294349async function tryInstallShellCompletion(opts: {
295350jsonMode: boolean;
296351skipPrompt: boolean;
@@ -739,11 +794,26 @@ async function maybeRestartService(params: {
739794result: UpdateRunResult;
740795opts: UpdateCommandOptions;
741796refreshServiceEnv: boolean;
797+serviceEnv?: NodeJS.ProcessEnv;
742798gatewayPort: number;
743799restartScriptPath?: string | null;
744800invocationCwd?: string;
745801}): Promise<boolean> {
746802const verifyRestartedGateway = async (expectedGatewayVersion: string | undefined) => {
803+const restartAfterStaleCleanup = async () => {
804+if (params.refreshServiceEnv && isPackageManagerUpdateMode(params.result.mode)) {
805+await runUpdatedInstallGatewayRestart({
806+result: params.result,
807+jsonMode: Boolean(params.opts.json),
808+invocationCwd: params.invocationCwd,
809+env: params.serviceEnv,
810+});
811+return;
812+}
813+if (shouldUseLegacyProcessRestartAfterUpdate({ updateMode: params.result.mode })) {
814+await runDaemonRestart();
815+}
816+};
747817const service = resolveGatewayService();
748818let health = await waitForGatewayHealthyRestart({
749819 service,
@@ -759,7 +829,7 @@ async function maybeRestartService(params: {
759829);
760830}
761831await terminateStaleGatewayPids(health.staleGatewayPids);
762-await runDaemonRestart();
832+await restartAfterStaleCleanup();
763833health = await waitForGatewayHealthyRestart({
764834 service,
765835port: params.gatewayPort,
@@ -799,6 +869,7 @@ async function maybeRestartService(params: {
799869const expectedGatewayVersion = isPackageManagerUpdateMode(params.result.mode)
800870 ? normalizeOptionalString(params.result.after?.version)
801871 : undefined;
872+const isPackageUpdate = isPackageManagerUpdateMode(params.result.mode);
802873let restarted = false;
803874let restartInitiated = false;
804875if (params.refreshServiceEnv) {
@@ -807,6 +878,7 @@ async function maybeRestartService(params: {
807878result: params.result,
808879jsonMode: Boolean(params.opts.json),
809880invocationCwd: params.invocationCwd,
881+env: params.serviceEnv,
810882});
811883} catch (err) {
812884// Always log the refresh failure so callers can detect it (issue #56772).
@@ -818,16 +890,25 @@ async function maybeRestartService(params: {
818890} else {
819891defaultRuntime.log(theme.warn(message));
820892}
821-if (isPackageManagerUpdateMode(params.result.mode)) {
893+if (isPackageUpdate) {
822894return false;
823895}
824896}
825897}
826898if (params.restartScriptPath) {
827899await runRestartScript(params.restartScriptPath);
828900restartInitiated = true;
829-} else {
901+} else if (params.refreshServiceEnv && isPackageUpdate) {
902+restarted = await runUpdatedInstallGatewayRestart({
903+result: params.result,
904+jsonMode: Boolean(params.opts.json),
905+invocationCwd: params.invocationCwd,
906+env: params.serviceEnv,
907+});
908+} else if (shouldUseLegacyProcessRestartAfterUpdate({ updateMode: params.result.mode })) {
830909restarted = await runDaemonRestart();
910+} else if (!params.opts.json) {
911+defaultRuntime.log(theme.muted("No installed gateway service found; skipped restart."));
831912}
832913833914const shouldVerifyRestart =
@@ -871,6 +952,9 @@ async function maybeRestartService(params: {
871952),
872953);
873954}
955+if (isPackageManagerUpdateMode(params.result.mode)) {
956+return false;
957+}
874958}
875959return true;
876960}
@@ -1419,15 +1503,25 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
1419150314201504let restartScriptPath: string | null = null;
14211505let refreshGatewayServiceEnv = false;
1506+let gatewayServiceEnv: NodeJS.ProcessEnv | undefined;
14221507const gatewayPort = resolveGatewayPort(
14231508postUpdateConfigSnapshot.valid ? postUpdateConfigSnapshot.config : undefined,
14241509process.env,
14251510);
14261511if (shouldRestart) {
14271512try {
1428-const loaded = await resolveGatewayService().isLoaded({ env: process.env });
1429-if (loaded) {
1430-restartScriptPath = await prepareRestartScript(process.env, gatewayPort);
1513+const serviceState = await readGatewayServiceState(resolveGatewayService(), {
1514+env: process.env,
1515+});
1516+if (
1517+shouldPrepareUpdatedInstallRestart({
1518+updateMode: resultWithPostUpdate.mode,
1519+serviceInstalled: serviceState.installed,
1520+serviceLoaded: serviceState.loaded,
1521+})
1522+) {
1523+gatewayServiceEnv = serviceState.env;
1524+restartScriptPath = await prepareRestartScript(serviceState.env, gatewayPort);
14311525refreshGatewayServiceEnv = true;
14321526}
14331527} catch {
@@ -1446,6 +1540,7 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
14461540result: resultWithPostUpdate,
14471541 opts,
14481542refreshServiceEnv: refreshGatewayServiceEnv,
1543+serviceEnv: gatewayServiceEnv,
14491544 gatewayPort,
14501545 restartScriptPath,
14511546 invocationCwd,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。