import type { OpenClawConfig } from "../config/types.openclaw.js"; import { hashJson } from "./installed-plugin-index-hash.js"; import { resolveInstalledPluginIndexPolicyHash } from "./installed-plugin-index-policy.js"; import type { InstalledPluginIndex } from "./installed-plugin-index.js"; import { resolveInstalledManifestRegistryIndexFingerprint } from "./manifest-registry-installed.js"; import { resolvePluginCacheInputs, type PluginSourceRoots } from "./roots.js"; export type PluginDiscoveryContext = { roots: PluginSourceRoots; loadPaths: readonly string[]; }; export type PluginControlPlaneContext = { discovery: PluginDiscoveryContext; policyFingerprint: string; inventoryFingerprint?: string; activationFingerprint?: string; }; export type ResolvePluginDiscoveryContextParams = { config?: OpenClawConfig; env?: NodeJS.ProcessEnv; workspaceDir?: string; loadPaths?: readonly string[]; }; export type ResolvePluginControlPlaneContextParams = ResolvePluginDiscoveryContextParams & { activationFingerprint?: string; index?: InstalledPluginIndex; inventoryFingerprint?: string; policyHash?: string; }; function resolveConfiguredPluginLoadPaths( config: OpenClawConfig | undefined, ): readonly string[] | undefined { const paths = config?.plugins?.load?.paths; return Array.isArray(paths) ? paths : undefined; } export function resolvePluginDiscoveryContext( params: ResolvePluginDiscoveryContextParams = {}, ): PluginDiscoveryContext { return resolvePluginCacheInputs({ env: params.env ?? process.env, workspaceDir: params.workspaceDir, loadPaths: [...(params.loadPaths ?? resolveConfiguredPluginLoadPaths(params.config) ?? [])], }); } export function resolvePluginDiscoveryFingerprint( params: ResolvePluginDiscoveryContextParams = {}, ): string { return fingerprintPluginDiscoveryContext(resolvePluginDiscoveryContext(params)); } export function fingerprintPluginDiscoveryContext(context: PluginDiscoveryContext): string { return hashJson(context); } export function resolvePluginControlPlaneContext( params: ResolvePluginControlPlaneContextParams = {}, ): PluginControlPlaneContext { const inventoryFingerprint = params.inventoryFingerprint ?? (params.index ? resolveInstalledManifestRegistryIndexFingerprint(params.index) : undefined); return { discovery: resolvePluginDiscoveryContext(params), policyFingerprint: params.policyHash ?? resolveInstalledPluginIndexPolicyHash(params.config), ...(inventoryFingerprint ? { inventoryFingerprint } : {}), ...(params.activationFingerprint ? { activationFingerprint: params.activationFingerprint } : {}), }; } export function resolvePluginControlPlaneFingerprint( params: ResolvePluginControlPlaneContextParams = {}, ): string { return fingerprintPluginControlPlaneContext(resolvePluginControlPlaneContext(params)); } function fingerprintPluginControlPlaneContext(context: PluginControlPlaneContext): string { return hashJson(context); }