Files
openclaw/src/plugins/roots.ts
Gustavo Madeira Santana e6897c800b Plugins: fix env-aware root resolution and caching (#44046)
Merged via squash.

Prepared head SHA: 6e8852a188
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-03-12 15:31:31 +00:00

47 lines
1.5 KiB
TypeScript

import path from "node:path";
import { resolveConfigDir, resolveUserPath } from "../utils.js";
import { resolveBundledPluginsDir } from "./bundled-dir.js";
export type PluginSourceRoots = {
stock?: string;
global: string;
workspace?: string;
};
export type PluginCacheInputs = {
roots: PluginSourceRoots;
loadPaths: string[];
};
export function resolvePluginSourceRoots(params: {
workspaceDir?: string;
env?: NodeJS.ProcessEnv;
}): PluginSourceRoots {
const env = params.env ?? process.env;
const workspaceRoot = params.workspaceDir ? resolveUserPath(params.workspaceDir, env) : undefined;
const stock = resolveBundledPluginsDir(env);
const global = path.join(resolveConfigDir(env), "extensions");
const workspace = workspaceRoot ? path.join(workspaceRoot, ".openclaw", "extensions") : undefined;
return { stock, global, workspace };
}
// Shared env-aware cache inputs for discovery, manifest, and loader caches.
export function resolvePluginCacheInputs(params: {
workspaceDir?: string;
loadPaths?: string[];
env?: NodeJS.ProcessEnv;
}): PluginCacheInputs {
const env = params.env ?? process.env;
const roots = resolvePluginSourceRoots({
workspaceDir: params.workspaceDir,
env,
});
// Preserve caller order because load-path precedence follows input order.
const loadPaths = (params.loadPaths ?? [])
.filter((entry): entry is string => typeof entry === "string")
.map((entry) => entry.trim())
.filter(Boolean)
.map((entry) => resolveUserPath(entry, env));
return { roots, loadPaths };
}