




















@@ -32,6 +32,7 @@ import { GATEWAY_SERVICE_KIND, GATEWAY_SERVICE_MARKER } from "../../daemon/const
3232import { resolveGatewayInstallEntrypoint } from "../../daemon/gateway-entrypoint.js";
3333import { disableCurrentOpenClawUpdateLaunchdJob } from "../../daemon/launchd.js";
3434import { resolveGatewayRestartLogPath } from "../../daemon/restart-logs.js";
35+import { summarizeGatewayServiceLayout } from "../../daemon/service-layout.js";
3536import {
3637readGatewayServiceState,
3738resolveGatewayService,
@@ -1208,6 +1209,35 @@ async function tryInstallShellCompletion(opts: {
12081209}
12091210}
121012111212+async function tryRealpathOrResolve(value: string): Promise<string> {
1213+try {
1214+return await fs.realpath(path.resolve(value));
1215+} catch {
1216+return path.resolve(value);
1217+}
1218+}
1219+1220+async function resolveManagedServicePackageUpdateRoot(params: {
1221+root: string;
1222+}): Promise<{ root: string; previousRoot: string } | null> {
1223+const command = await resolveGatewayService()
1224+.readCommand(process.env)
1225+.catch(() => null);
1226+const layout = await summarizeGatewayServiceLayout(command);
1227+const serviceRoot = layout?.packageRoot;
1228+if (!serviceRoot || layout.entrypointSourceCheckout === true) {
1229+return null;
1230+}
1231+const [currentRootReal, serviceRootReal] = await Promise.all([
1232+tryRealpathOrResolve(params.root),
1233+tryRealpathOrResolve(serviceRoot),
1234+]);
1235+if (currentRootReal === serviceRootReal) {
1236+return null;
1237+}
1238+return { root: serviceRoot, previousRoot: params.root };
1239+}
1240+12111241async function runPackageInstallUpdate(params: {
12121242root: string;
12131243installKind: "git" | "package" | "unknown";
@@ -1218,6 +1248,7 @@ async function runPackageInstallUpdate(params: {
12181248jsonMode: boolean;
12191249managedServiceEnv?: NodeJS.ProcessEnv;
12201250invocationCwd?: string;
1251+honorPackageRoot?: boolean;
12211252}): Promise<UpdateRunResult> {
12221253const manager = await resolveGlobalManager({
12231254root: params.root,
@@ -1231,6 +1262,7 @@ async function runPackageInstallUpdate(params: {
12311262 runCommand,
12321263timeoutMs: params.timeoutMs,
12331264pkgRoot: params.root,
1265+honorPackageRoot: params.honorPackageRoot === true,
12341266});
12351267const pkgRoot = installTarget.packageRoot;
12361268const packageName =
@@ -2722,7 +2754,7 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
27222754}
27232755const updateStepTimeoutMs = timeoutMs ?? DEFAULT_UPDATE_STEP_TIMEOUT_MS;
272427562725-const root = await resolveUpdateRoot();
2757+let root = await resolveUpdateRoot();
27262758if (postCoreUpdateResume) {
27272759if (
27282760postCoreUpdateChannel !== "stable" &&
@@ -2852,6 +2884,21 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
28522884let fallbackToLatest = false;
28532885let packageInstallSpec: string | null = null;
28542886let packageAlreadyCurrent = false;
2887+let managedServiceRootRedirect: { root: string; previousRoot: string } | null = null;
2888+2889+if (updateInstallKind === "package") {
2890+managedServiceRootRedirect = await resolveManagedServicePackageUpdateRoot({ root });
2891+if (managedServiceRootRedirect) {
2892+root = managedServiceRootRedirect.root;
2893+if (!opts.json) {
2894+defaultRuntime.log(
2895+theme.muted(
2896+`Targeting managed gateway service package root: ${managedServiceRootRedirect.root}`,
2897+),
2898+);
2899+}
2900+}
2901+}
2855290228562903if (updateInstallKind !== "git") {
28572904currentVersion = switchToPackage ? null : await readPackageVersion(root);
@@ -2929,6 +2976,11 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
29292976if (fallbackToLatest) {
29302977notes.push("Beta channel resolves to latest for this run (fallback).");
29312978}
2979+if (managedServiceRootRedirect) {
2980+notes.push(
2981+`Package update targets managed service root ${managedServiceRootRedirect.root} instead of invoking root ${managedServiceRootRedirect.previousRoot}.`,
2982+);
2983+}
29322984if (explicitTag && !canResolveRegistryVersionForPackageTarget(tag)) {
29332985notes.push("Non-registry package specs skip npm version lookup and downgrade previews.");
29342986}
@@ -3062,6 +3114,7 @@ export async function updateCommand(opts: UpdateCommandOptions): Promise<void> {
30623114jsonMode: Boolean(opts.json),
30633115managedServiceEnv: prePackageServiceStop?.serviceEnv,
30643116 invocationCwd,
3117+honorPackageRoot: managedServiceRootRedirect !== null,
30653118})
30663119 : await runGitUpdate({
30673120 root,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。