Files
openclaw/src/plugins/bundled-sources.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

87 lines
2.3 KiB
TypeScript

import { discoverOpenClawPlugins } from "./discovery.js";
import { loadPluginManifest } from "./manifest.js";
export type BundledPluginSource = {
pluginId: string;
localPath: string;
npmSpec?: string;
};
export type BundledPluginLookup =
| { kind: "npmSpec"; value: string }
| { kind: "pluginId"; value: string };
export function findBundledPluginSourceInMap(params: {
bundled: ReadonlyMap<string, BundledPluginSource>;
lookup: BundledPluginLookup;
}): BundledPluginSource | undefined {
const targetValue = params.lookup.value.trim();
if (!targetValue) {
return undefined;
}
if (params.lookup.kind === "pluginId") {
return params.bundled.get(targetValue);
}
for (const source of params.bundled.values()) {
if (source.npmSpec === targetValue) {
return source;
}
}
return undefined;
}
export function resolveBundledPluginSources(params: {
workspaceDir?: string;
/** Use an explicit env when bundled roots should resolve independently from process.env. */
env?: NodeJS.ProcessEnv;
}): Map<string, BundledPluginSource> {
const discovery = discoverOpenClawPlugins({
workspaceDir: params.workspaceDir,
env: params.env,
});
const bundled = new Map<string, BundledPluginSource>();
for (const candidate of discovery.candidates) {
if (candidate.origin !== "bundled") {
continue;
}
const manifest = loadPluginManifest(candidate.rootDir, false);
if (!manifest.ok) {
continue;
}
const pluginId = manifest.manifest.id;
if (bundled.has(pluginId)) {
continue;
}
const npmSpec =
candidate.packageManifest?.install?.npmSpec?.trim() ||
candidate.packageName?.trim() ||
undefined;
bundled.set(pluginId, {
pluginId,
localPath: candidate.rootDir,
npmSpec,
});
}
return bundled;
}
export function findBundledPluginSource(params: {
lookup: BundledPluginLookup;
workspaceDir?: string;
/** Use an explicit env when bundled roots should resolve independently from process.env. */
env?: NodeJS.ProcessEnv;
}): BundledPluginSource | undefined {
const bundled = resolveBundledPluginSources({
workspaceDir: params.workspaceDir,
env: params.env,
});
return findBundledPluginSourceInMap({
bundled,
lookup: params.lookup,
});
}