Files
openclaw/src/plugins/setup-registry.runtime.ts
2026-04-07 08:06:29 +01:00

66 lines
2.1 KiB
TypeScript

import { createRequire } from "node:module";
import { normalizeProviderId } from "../agents/provider-id.js";
import { loadPluginManifestRegistry } from "./manifest-registry.js";
type SetupRegistryRuntimeModule = Pick<
typeof import("./setup-registry.js"),
"resolvePluginSetupCliBackend"
>;
type SetupCliBackendRuntimeEntry = {
pluginId: string;
backend: {
id: string;
};
};
const require = createRequire(import.meta.url);
const SETUP_REGISTRY_RUNTIME_CANDIDATES = ["./setup-registry.js", "./setup-registry.ts"] as const;
let setupRegistryRuntimeModule: SetupRegistryRuntimeModule | undefined;
let bundledSetupCliBackendsCache: SetupCliBackendRuntimeEntry[] | undefined;
function resolveBundledSetupCliBackends(): SetupCliBackendRuntimeEntry[] {
if (bundledSetupCliBackendsCache) {
return bundledSetupCliBackendsCache;
}
bundledSetupCliBackendsCache = loadPluginManifestRegistry({ cache: true })
.plugins.filter((plugin) => plugin.origin === "bundled" && plugin.cliBackends.length > 0)
.flatMap((plugin) =>
plugin.cliBackends.map(
(backendId) =>
({
pluginId: plugin.id,
backend: { id: backendId },
}) satisfies SetupCliBackendRuntimeEntry,
),
);
return bundledSetupCliBackendsCache;
}
function loadSetupRegistryRuntime(): SetupRegistryRuntimeModule | null {
if (setupRegistryRuntimeModule) {
return setupRegistryRuntimeModule;
}
for (const candidate of SETUP_REGISTRY_RUNTIME_CANDIDATES) {
try {
setupRegistryRuntimeModule = require(candidate) as SetupRegistryRuntimeModule;
return setupRegistryRuntimeModule;
} catch {
// Try source/runtime candidates in order.
}
}
return null;
}
export function resolvePluginSetupCliBackendRuntime(params: { backend: string }) {
const runtime = loadSetupRegistryRuntime();
if (runtime) {
return runtime.resolvePluginSetupCliBackend(params);
}
const normalized = normalizeProviderId(params.backend);
return resolveBundledSetupCliBackends().find(
(entry) => normalizeProviderId(entry.backend.id) === normalized,
);
}