mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 01:00:43 +00:00
fix(plugins): invalidate runtime deps cache on package upgrade
This commit is contained in:
@@ -544,6 +544,72 @@ function setCachedPluginRegistry(cacheKey: string, state: CachedPluginState): vo
|
||||
pluginLoaderCacheState.set(cacheKey, state);
|
||||
}
|
||||
|
||||
function resolveBundledPackageRootForCache(stockRoot?: string): string | undefined {
|
||||
if (!stockRoot) {
|
||||
return undefined;
|
||||
}
|
||||
const resolved = path.resolve(stockRoot);
|
||||
const parent = path.dirname(resolved);
|
||||
if (
|
||||
path.basename(resolved) === "extensions" &&
|
||||
(path.basename(parent) === "dist" || path.basename(parent) === "dist-runtime")
|
||||
) {
|
||||
return path.dirname(parent);
|
||||
}
|
||||
const sourcePackageRoot = parent;
|
||||
if (fs.existsSync(path.join(sourcePackageRoot, "package.json"))) {
|
||||
return sourcePackageRoot;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function readPackageVersionForCache(packageJsonPath: string): string {
|
||||
try {
|
||||
const parsed = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")) as unknown;
|
||||
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
||||
return "unknown";
|
||||
}
|
||||
const version = (parsed as { version?: unknown }).version;
|
||||
return typeof version === "string" && version.trim() ? version.trim() : "unknown";
|
||||
} catch {
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function resolveBundledPackageCacheIdentity(stockRoot?: string):
|
||||
| {
|
||||
packageJson: string;
|
||||
packageRoot: string;
|
||||
packageVersion: string;
|
||||
size: number;
|
||||
mtimeMs: number;
|
||||
}
|
||||
| undefined {
|
||||
const packageRoot = resolveBundledPackageRootForCache(stockRoot);
|
||||
if (!packageRoot) {
|
||||
return undefined;
|
||||
}
|
||||
const packageJsonPath = path.join(packageRoot, "package.json");
|
||||
try {
|
||||
const stat = fs.statSync(packageJsonPath);
|
||||
return {
|
||||
packageJson: safeRealpathOrResolve(packageJsonPath),
|
||||
packageRoot: safeRealpathOrResolve(packageRoot),
|
||||
packageVersion: readPackageVersionForCache(packageJsonPath),
|
||||
size: stat.size,
|
||||
mtimeMs: stat.mtimeMs,
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
packageJson: path.resolve(packageJsonPath),
|
||||
packageRoot: safeRealpathOrResolve(packageRoot),
|
||||
packageVersion: "missing",
|
||||
size: -1,
|
||||
mtimeMs: -1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function buildCacheKey(params: {
|
||||
workspaceDir?: string;
|
||||
plugins: NormalizedPluginsConfig;
|
||||
@@ -567,6 +633,7 @@ function buildCacheKey(params: {
|
||||
loadPaths: params.plugins.loadPaths,
|
||||
env: params.env,
|
||||
});
|
||||
const bundledPackage = resolveBundledPackageCacheIdentity(roots.stock);
|
||||
const installs = Object.fromEntries(
|
||||
Object.entries(params.installs ?? {}).map(([pluginId, install]) => [
|
||||
pluginId,
|
||||
@@ -600,6 +667,7 @@ function buildCacheKey(params: {
|
||||
const gatewayMethodsKey = JSON.stringify(params.coreGatewayMethodNames ?? []);
|
||||
const activationMode = params.activate === false ? "snapshot" : "active";
|
||||
return `${roots.workspace ?? ""}::${roots.global ?? ""}::${roots.stock ?? ""}::${JSON.stringify({
|
||||
bundledPackage,
|
||||
...params.plugins,
|
||||
installs,
|
||||
loadPaths,
|
||||
|
||||
Reference in New Issue
Block a user