

























@@ -1,3 +1,4 @@
1+import path from "node:path";
12import type { OpenClawConfig } from "../config/types.openclaw.js";
23import type { PluginInstallRecord } from "../config/types.plugins.js";
34import type { NpmSpecResolution } from "../infra/install-source-utils.js";
@@ -155,6 +156,19 @@ function pathsEqual(
155156return resolveUserPath(left, env) === resolveUserPath(right, env);
156157}
157158159+function resolveRecordedExtensionsDir(params: {
160+pluginId: string;
161+installPath: string;
162+}): string | undefined {
163+const parentDir = path.dirname(params.installPath);
164+try {
165+const canonicalInstallPath = resolvePluginInstallDir(params.pluginId, parentDir);
166+return canonicalInstallPath === params.installPath ? parentDir : undefined;
167+} catch {
168+return undefined;
169+}
170+}
171+158172function buildLoadPathHelpers(existing: string[], env: NodeJS.ProcessEnv = process.env) {
159173let paths = [...existing];
160174const resolveSet = () => new Set(paths.map((entry) => resolveUserPath(entry, env)));
@@ -535,6 +549,10 @@ export async function updateNpmInstalledPlugins(params: {
535549continue;
536550}
537551const currentVersion = await readInstalledPackageVersion(installPath);
552+const extensionsDir = resolveRecordedExtensionsDir({
553+ pluginId,
554+ installPath,
555+});
538556539557if (!params.dryRun && record.source === "npm" && currentVersion) {
540558const metadataResult = await resolveNpmSpecMetadata({ spec: effectiveSpec! });
@@ -573,6 +591,7 @@ export async function updateNpmInstalledPlugins(params: {
573591 ? await installPluginFromNpmSpec({
574592spec: effectiveSpec!,
575593mode: "update",
594+ extensionsDir,
576595dryRun: true,
577596dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
578597expectedPluginId: pluginId,
@@ -590,6 +609,7 @@ export async function updateNpmInstalledPlugins(params: {
590609spec: effectiveSpec ?? `clawhub:${record.clawhubPackage!}`,
591610baseUrl: record.clawhubUrl,
592611mode: "update",
612+ extensionsDir,
593613dryRun: true,
594614dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
595615expectedPluginId: pluginId,
@@ -599,6 +619,7 @@ export async function updateNpmInstalledPlugins(params: {
599619marketplace: record.marketplaceSource!,
600620plugin: record.marketplacePlugin!,
601621mode: "update",
622+ extensionsDir,
602623dryRun: true,
603624dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
604625expectedPluginId: pluginId,
@@ -674,6 +695,7 @@ export async function updateNpmInstalledPlugins(params: {
674695 ? await installPluginFromNpmSpec({
675696spec: effectiveSpec!,
676697mode: "update",
698+ extensionsDir,
677699dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
678700expectedPluginId: pluginId,
679701 expectedIntegrity,
@@ -690,6 +712,7 @@ export async function updateNpmInstalledPlugins(params: {
690712spec: effectiveSpec ?? `clawhub:${record.clawhubPackage!}`,
691713baseUrl: record.clawhubUrl,
692714mode: "update",
715+ extensionsDir,
693716dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
694717expectedPluginId: pluginId,
695718 logger,
@@ -698,6 +721,7 @@ export async function updateNpmInstalledPlugins(params: {
698721marketplace: record.marketplaceSource!,
699722plugin: record.marketplacePlugin!,
700723mode: "update",
724+ extensionsDir,
701725dangerouslyForceUnsafeInstall: params.dangerouslyForceUnsafeInstall,
702726expectedPluginId: pluginId,
703727 logger,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。