openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
567 lines (566 loc) • 27.9 kB
JavaScript
import { s as normalizeSortedUniqueStringEntries } from "./string-normalization-WNUDCpXX.js";
import { p as resolveUserPath } from "./utils-CCC-BEJH.js";
import { o as resolveCompatibilityHostVersion } from "./version-Crcn9X9T.js";
import { i as normalizeProviderId } from "./provider-id-Dq06Bcx6.js";
import { i as normalizePluginsConfigWithResolver } from "./config-normalization-shared-DReIawrL.js";
import { n as resolveBundledPluginsDir } from "./bundled-dir-CG-NYRXR.js";
import { t as resolvePluginCacheInputs } from "./roots-C7jycnOA.js";
import { n as loadInstalledPluginIndexInstallRecordsSync } from "./installed-plugin-index-record-reader-CPHayOZI.js";
import { s as normalizePluginsConfig } from "./config-state-CikNNz7T.js";
import { r as getCurrentPluginMetadataSnapshot } from "./current-plugin-metadata-snapshot-CfA_n2Nc.js";
import { n as registerPluginMetadataProcessMemoLifecycleClear } from "./plugin-metadata-lifecycle-C3dWg4tn.js";
import { c as hasMissingConfigPathActivationMetadata, d as hasOptionalMissingPluginManifestFile, f as extractPluginInstallRecordsFromInstalledPluginIndex, g as hashJson, h as fileSignatureMatches, i as loadInstalledPluginIndexWithDiscovery, m as resolveInstalledPluginIndexPolicyHash, n as isInstalledPluginEnabled, t as getInstalledPluginRecord } from "./installed-plugin-index-BSYm7o5l.js";
import { t as loadPluginManifestRegistryForInstalledIndex } from "./manifest-registry-installed-DSyeeqEt.js";
import { a as refreshPersistedInstalledPluginIndex, i as readPersistedInstalledPluginIndexSync, t as inspectPersistedInstalledPluginIndex } from "./installed-plugin-index-store-DyTBte5L.js";
import fs from "node:fs";
import path from "node:path";
import crypto from "node:crypto";
//#region src/plugins/plugin-registry-id-normalizer.ts
function normalizePluginRegistryAlias(value) {
return value.trim();
}
function normalizePluginRegistryAliasKey(value) {
return normalizePluginRegistryAlias(value).toLowerCase();
}
function collectObjectKeys$1(value) {
return value ? Object.keys(value) : [];
}
function listPluginRegistryNormalizerAliases(plugin) {
return [
plugin.id,
...plugin.providers ?? [],
...plugin.channels ?? [],
...plugin.setup?.providers?.map((provider) => provider.id) ?? [],
...plugin.cliBackends ?? [],
...plugin.setup?.cliBackends ?? [],
...collectObjectKeys$1(plugin.modelCatalog?.providers),
...collectObjectKeys$1(plugin.modelCatalog?.aliases),
...collectObjectKeys$1(plugin.providerAuthAliases),
...plugin.legacyPluginIds ?? []
];
}
/** Creates a normalizer that maps provider/channel/catalog aliases back to plugin ids. */
function createPluginRegistryIdNormalizer(index, options = {}) {
const aliases = /* @__PURE__ */ new Map();
for (const plugin of index.plugins) {
if (!plugin.pluginId) continue;
const pluginId = normalizePluginRegistryAlias(plugin.pluginId);
if (pluginId) aliases.set(normalizePluginRegistryAliasKey(pluginId), plugin.pluginId);
}
const registry = options.lookUpTable?.manifestRegistry ?? options.manifestRegistry ?? loadPluginManifestRegistryForInstalledIndex({
index,
includeDisabled: true
});
for (const plugin of [...registry.plugins].toSorted((left, right) => left.id.localeCompare(right.id))) {
const pluginId = normalizePluginRegistryAlias(plugin.id);
if (!pluginId) continue;
aliases.set(normalizePluginRegistryAliasKey(pluginId), plugin.id);
for (const alias of listPluginRegistryNormalizerAliases(plugin)) {
const normalizedAlias = normalizePluginRegistryAlias(alias);
const normalizedAliasKey = normalizePluginRegistryAliasKey(alias);
if (normalizedAlias && !aliases.has(normalizedAliasKey)) aliases.set(normalizedAliasKey, pluginId);
}
}
return (pluginId) => {
const trimmed = normalizePluginRegistryAlias(pluginId);
return aliases.get(normalizePluginRegistryAliasKey(trimmed)) ?? trimmed;
};
}
//#endregion
//#region src/plugins/plugin-registry-snapshot.ts
const DISABLE_PERSISTED_PLUGIN_REGISTRY_ENV = "OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY";
const MAX_PLUGIN_REGISTRY_SNAPSHOT_MEMOS = 8;
const REGISTRY_SNAPSHOT_MEMO_ENV_KEYS = [
"APPDATA",
"HOME",
"OPENCLAW_BUNDLED_PLUGINS_DIR",
"OPENCLAW_COMPATIBILITY_HOST_VERSION",
"OPENCLAW_CONFIG_PATH",
"OPENCLAW_DISABLE_BUNDLED_PLUGINS",
"OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS",
DISABLE_PERSISTED_PLUGIN_REGISTRY_ENV,
"OPENCLAW_HOME",
"OPENCLAW_NIX_MODE",
"OPENCLAW_STATE_DIR",
"USERPROFILE",
"XDG_CONFIG_HOME"
];
let pluginRegistrySnapshotMemos = [];
function clearLoadPluginRegistrySnapshotMemo() {
pluginRegistrySnapshotMemos = [];
}
registerPluginMetadataProcessMemoLifecycleClear(clearLoadPluginRegistrySnapshotMemo);
function formatDeprecatedPersistedRegistryDisableWarning() {
return `${DISABLE_PERSISTED_PLUGIN_REGISTRY_ENV} is a deprecated break-glass compatibility switch; use \`openclaw plugins registry --refresh\` or \`openclaw doctor --fix\` to repair registry state.`;
}
function hasEnvFlag(env, name) {
const value = env[name]?.trim().toLowerCase();
return Boolean(value && value !== "0" && value !== "false" && value !== "no");
}
function pickRegistrySnapshotMemoEnv(env) {
return Object.fromEntries(REGISTRY_SNAPSHOT_MEMO_ENV_KEYS.flatMap((key) => {
const value = env[key];
return value === void 0 ? [] : [[key, value]];
}));
}
function canMemoizePluginRegistrySnapshot(params) {
return params.index === void 0 && params.candidates === void 0 && params.diagnostics === void 0 && params.discovery === void 0 && params.installRecords === void 0 && params.now === void 0 && params.filePath === void 0 && params.pluginIndexFilePath === void 0;
}
function resolvePluginRegistrySnapshotMemoKey(params, env) {
if (!canMemoizePluginRegistrySnapshot(params)) return;
const persistedRegistryFingerprint = params.preferPersisted !== false && !hasEnvFlag(env, "OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY") ? hashJson(readPersistedInstalledPluginIndexSync({
env,
...params.stateDir ? { stateDir: params.stateDir } : {}
})) : "disabled";
return hashJson({
config: params.config ?? null,
cwd: process.cwd(),
env: pickRegistrySnapshotMemoEnv(env),
hostContractVersion: resolveCompatibilityHostVersion(env),
preferPersisted: params.preferPersisted ?? null,
registry: persistedRegistryFingerprint,
pluginRoots: fingerprintPluginSourceRoots(params, env),
stateDir: params.stateDir ? resolveUserPath(params.stateDir, env) : null,
workspaceDir: params.workspaceDir ? resolveUserPath(params.workspaceDir, env) : null
});
}
function fingerprintPluginSourceRoots(params, env) {
const cacheInputs = resolvePluginCacheInputs({
workspaceDir: params.workspaceDir ? resolveUserPath(params.workspaceDir, env) : void 0,
loadPaths: normalizePluginsConfig(params.config?.plugins).loadPaths,
env
});
return {
global: sourceRootFingerprint(cacheInputs.roots.global),
loadPaths: cacheInputs.loadPaths.map((entry) => sourceRootFingerprint(entry)),
stock: cacheInputs.roots.stock ? sourceRootFingerprint(cacheInputs.roots.stock) : null,
workspace: cacheInputs.roots.workspace ? sourceRootFingerprint(cacheInputs.roots.workspace) : null
};
}
function sourceRootFingerprint(rootPath) {
return {
root: fileFingerprint(rootPath),
children: directoryChildFingerprint(rootPath)
};
}
function directoryChildFingerprint(directoryPath) {
try {
return fs.readdirSync(directoryPath, { withFileTypes: true }).map((entry) => [entry.name, entry.isDirectory() ? "dir" : entry.isFile() ? "file" : "other"]).toSorted(([left], [right]) => left.localeCompare(right));
} catch {
return "unreadable";
}
}
function fileFingerprint(filePath) {
try {
const stat = fs.statSync(filePath, { bigint: true });
return [
filePath,
stat.isFile() ? "file" : stat.isDirectory() ? "dir" : "other",
stat.size.toString(),
stat.mtimeNs.toString(),
stat.ctimeNs.toString()
];
} catch {
return [filePath, "missing"];
}
}
function findPluginRegistrySnapshotMemo(key) {
if (!key) return;
const index = pluginRegistrySnapshotMemos.findIndex((memo) => memo.key === key);
if (index === -1) return;
const [memo] = pluginRegistrySnapshotMemos.splice(index, 1);
if (!memo) return;
pluginRegistrySnapshotMemos.unshift(memo);
return memo.result;
}
function rememberPluginRegistrySnapshotMemo(key, result) {
if (!key) return result;
pluginRegistrySnapshotMemos = [{
key,
result
}, ...pluginRegistrySnapshotMemos.filter((memo) => memo.key !== key)].slice(0, MAX_PLUGIN_REGISTRY_SNAPSHOT_MEMOS);
return result;
}
function canReuseCurrentPluginMetadataSnapshot(params) {
return params.preferPersisted !== false && params.stateDir === void 0 && params.filePath === void 0 && params.pluginIndexFilePath === void 0 && params.installRecords === void 0 && params.candidates === void 0 && params.diagnostics === void 0 && params.now === void 0;
}
function loadCurrentPluginRegistrySnapshotResult(params) {
if (!canReuseCurrentPluginMetadataSnapshot(params)) return;
const env = params.env ?? process.env;
const current = getCurrentPluginMetadataSnapshot({
config: params.config,
env,
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {},
...params.workspaceDir === void 0 ? { allowWorkspaceScopedSnapshot: true } : {}
});
if (!current || current.registryDiagnostics.length > 0) return;
return {
snapshot: current.index,
source: "provided",
diagnostics: current.registryDiagnostics
};
}
function hasMissingPersistedPluginSource(index) {
return index.plugins.some((plugin) => {
if (!plugin.enabled) return false;
return !fs.existsSync(plugin.rootDir) || !hasOptionalMissingPluginManifestFile(plugin) && !fs.existsSync(plugin.manifestPath) || (plugin.source ? !fs.existsSync(plugin.source) : false) || (plugin.setupSource ? !fs.existsSync(plugin.setupSource) : false);
});
}
function resolveComparablePath(filePath) {
try {
return fs.realpathSync(filePath);
} catch {
return path.resolve(filePath);
}
}
function isRelativePathInsideOrEqual(relativePath) {
return relativePath === "" || relativePath !== ".." && !relativePath.startsWith(`..${path.sep}`) && !path.isAbsolute(relativePath);
}
function isPathInsideOrEqual(childPath, parentPath) {
return isRelativePathInsideOrEqual(path.relative(resolveComparablePath(parentPath), resolveComparablePath(childPath)));
}
function hasMismatchedPersistedBundledPluginRoot(index, env) {
const bundledPluginsDir = resolveBundledPluginsDir(env);
if (!bundledPluginsDir) return false;
return index.plugins.some((plugin) => plugin.origin === "bundled" && !isPathInsideOrEqual(plugin.rootDir, bundledPluginsDir));
}
function hashExistingFile(filePath) {
try {
return crypto.createHash("sha256").update(fs.readFileSync(filePath)).digest("hex");
} catch {
return null;
}
}
function resolveRecordPackageJsonPath(plugin) {
const packageJsonPath = plugin.packageJson?.path;
if (!packageJsonPath) return null;
const rootDir = plugin.rootDir || path.dirname(plugin.manifestPath);
const resolved = path.resolve(rootDir, packageJsonPath);
if (!isRelativePathInsideOrEqual(path.relative(rootDir, resolved))) return null;
return isRelativePathInsideOrEqual(path.relative(resolveComparablePath(rootDir), resolveComparablePath(resolved))) ? resolved : null;
}
function hasStalePersistedPluginDiagnostics(index) {
return index.diagnostics.some((diag) => {
const source = diag.source;
return typeof diag.pluginId === "string" && diag.pluginId.trim().length > 0 && typeof source === "string" && path.isAbsolute(source) && !fs.existsSync(source);
});
}
function hasStalePersistedPluginMetadata(index) {
return index.plugins.some((plugin) => {
if (!hasOptionalMissingPluginManifestFile(plugin)) {
if (fileSignatureMatches(plugin.manifestPath, plugin.manifestFile) !== true) {
const manifestHash = hashExistingFile(plugin.manifestPath);
if (manifestHash && manifestHash !== plugin.manifestHash) return true;
}
}
const packageJsonPath = resolveRecordPackageJsonPath(plugin);
if (!plugin.packageJson?.hash) return false;
if (!packageJsonPath) return true;
const packageJsonSignatureMatches = fileSignatureMatches(packageJsonPath, plugin.packageJson.fileSignature);
if (packageJsonSignatureMatches === true && plugin.origin === "bundled") return false;
if (packageJsonSignatureMatches === false) return hashExistingFile(packageJsonPath) !== plugin.packageJson.hash;
return hashExistingFile(packageJsonPath) !== plugin.packageJson.hash;
});
}
function loadSnapshotInstallRecords(params, env) {
return loadInstalledPluginIndexInstallRecordsSync({
env,
...params.stateDir ? { stateDir: params.stateDir } : {},
...params.filePath ? { filePath: params.filePath } : params.pluginIndexFilePath ? { filePath: params.pluginIndexFilePath } : {}
});
}
function hasRecoveredInstallRecordsMissingFromPersistedIndex(index, installRecords, env) {
const persistedRecords = extractPluginInstallRecordsFromInstalledPluginIndex(index);
const persistedPluginIds = new Set(index.plugins.map((plugin) => plugin.pluginId));
return Object.entries(installRecords).some(([pluginId, record]) => {
if (persistedRecords[pluginId] && persistedPluginIds.has(pluginId)) return false;
const installPaths = [record.installPath, record.sourcePath].filter((candidate) => typeof candidate === "string" && candidate.trim().length > 0);
if (installPaths.length === 0) return true;
return installPaths.some((installPath) => fs.existsSync(resolveUserPath(installPath, env)));
});
}
function loadPluginRegistrySnapshotWithMetadata(params = {}) {
if (params.index) return {
snapshot: params.index,
source: "provided",
diagnostics: []
};
const current = loadCurrentPluginRegistrySnapshotResult(params);
if (current) return current;
const env = params.env ?? process.env;
const memoKey = resolvePluginRegistrySnapshotMemoKey(params, env);
const memo = findPluginRegistrySnapshotMemo(memoKey);
if (memo) return memo;
const diagnostics = [];
const disabledByCaller = params.preferPersisted === false;
const disabledByEnv = hasEnvFlag(env, DISABLE_PERSISTED_PLUGIN_REGISTRY_ENV);
const persistedReadsEnabled = !disabledByCaller && !disabledByEnv;
const persistedInstallRecordReadsEnabled = persistedReadsEnabled;
let persistedIndex;
if (persistedInstallRecordReadsEnabled) {
persistedIndex = readPersistedInstalledPluginIndexSync(params);
if (persistedReadsEnabled && persistedIndex) if (params.config && persistedIndex.policyHash !== resolveInstalledPluginIndexPolicyHash(params.config)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-policy",
message: "Persisted plugin registry policy does not match current config; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasMissingPersistedPluginSource(persistedIndex)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry points at missing plugin files; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasMismatchedPersistedBundledPluginRoot(persistedIndex, env)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry points at a different bundled plugin tree; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasStalePersistedPluginDiagnostics(persistedIndex)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry contains diagnostics referencing missing paths; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasMissingConfigPathActivationMetadata(persistedIndex)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry is missing config-path startup metadata; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasStalePersistedPluginMetadata(persistedIndex)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry metadata no longer matches plugin manifest or package files; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else if (hasRecoveredInstallRecordsMissingFromPersistedIndex(persistedIndex, loadSnapshotInstallRecords(params, env), env)) diagnostics.push({
level: "warn",
code: "persisted-registry-stale-source",
message: "Persisted plugin registry is missing recoverable managed npm plugins; using derived plugin index. Run `openclaw plugins registry --refresh` to update the persisted registry."
});
else return rememberPluginRegistrySnapshotMemo(memoKey, {
snapshot: persistedIndex,
source: "persisted",
diagnostics
});
else if (persistedReadsEnabled) diagnostics.push({
level: "info",
code: "persisted-registry-missing",
message: "Persisted plugin registry is missing or invalid; using derived plugin index."
});
} else diagnostics.push({
level: "warn",
code: "persisted-registry-disabled",
message: disabledByEnv ? `${formatDeprecatedPersistedRegistryDisableWarning()} Using legacy derived plugin index.` : "Persisted plugin registry reads are disabled by the caller; using derived plugin index."
});
const derived = loadInstalledPluginIndexWithDiscovery({
...params,
installRecords: persistedInstallRecordReadsEnabled ? params.installRecords : params.installRecords ?? {}
});
return rememberPluginRegistrySnapshotMemo(memoKey, {
snapshot: derived.index,
source: "derived",
diagnostics,
discovery: derived.discovery
});
}
function resolveSnapshot(params = {}) {
return loadPluginRegistrySnapshotWithMetadata(params).snapshot;
}
function loadPluginRegistrySnapshot(params = {}) {
return resolveSnapshot(params);
}
function getPluginRecord(params) {
return getInstalledPluginRecord(resolveSnapshot(params), params.pluginId);
}
function isPluginEnabled(params) {
return isInstalledPluginEnabled(resolveSnapshot(params), params.pluginId, params.config);
}
function inspectPluginRegistry(params = {}) {
return inspectPersistedInstalledPluginIndex(params);
}
function refreshPluginRegistry(params) {
return refreshPersistedInstalledPluginIndex(params);
}
//#endregion
//#region src/plugins/plugin-registry-contributions.ts
/** Loads manifest and installed-index contributions used to build plugin registry snapshots. */
function normalizeContributionId(value) {
return value.trim();
}
function collectObjectKeys(value) {
return value ? Object.keys(value) : [];
}
function collectContractKeys(plugin) {
const contracts = plugin.contracts;
if (!contracts) return [];
return Object.entries(contracts).flatMap(([key, value]) => Array.isArray(value) && value.length > 0 ? [key] : []);
}
function listManifestContractValues(plugin, contract) {
return plugin.contracts?.[contract] ?? [];
}
function loadManifestContractRegistry(params) {
return loadPluginManifestRegistryForPluginRegistry({
...params,
pluginIds: params.onlyPluginIds,
includeDisabled: true
});
}
function listManifestContributionIds(plugin, contribution) {
switch (contribution) {
case "providers": return plugin.providers;
case "channels": return plugin.channels;
case "channelConfigs": return collectObjectKeys(plugin.channelConfigs);
case "setupProviders": return plugin.setup?.providers?.map((provider) => provider.id) ?? [];
case "cliBackends": return [...plugin.cliBackends, ...plugin.setup?.cliBackends ?? []];
case "modelCatalogProviders": return [...collectObjectKeys(plugin.modelCatalog?.providers), ...collectObjectKeys(plugin.modelCatalog?.aliases)];
case "commandAliases": return plugin.commandAliases?.map((alias) => alias.name) ?? [];
case "contracts": return collectContractKeys(plugin);
}
return [];
}
function resolveContributionPluginIds(params) {
if (params.includeDisabled) return params.index.plugins.map((plugin) => plugin.pluginId);
return params.index.plugins.filter((plugin) => isInstalledPluginEnabled(params.index, plugin.pluginId, params.config)).map((plugin) => plugin.pluginId);
}
function loadContributionManifestRegistry(params) {
return loadPluginManifestRegistryForInstalledIndex({
index: params.index,
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
pluginIds: resolveContributionPluginIds({
index: params.index,
includeDisabled: params.includeDisabled,
config: params.config
}),
includeDisabled: true
});
}
function listContributionManifestPlugins(params) {
const plugins = params.lookUpTable?.plugins;
if (plugins) {
const enabledPluginIds = new Set(resolveContributionPluginIds({
index: params.index,
includeDisabled: params.includeDisabled,
config: params.config
}));
return plugins.filter((plugin) => enabledPluginIds.has(plugin.id));
}
return loadContributionManifestRegistry({
...params,
index: params.index
}).plugins;
}
function resolveContributionOwnerMap(table, contribution) {
switch (contribution) {
case "channels": return table.owners.channels;
case "channelConfigs": return table.owners.channelConfigs;
case "providers": return table.owners.providers;
case "modelCatalogProviders": return table.owners.modelCatalogProviders;
case "cliBackends": return table.owners.cliBackends;
case "setupProviders": return table.owners.setupProviders;
case "commandAliases": return table.owners.commandAliases;
case "contracts": return table.owners.contracts;
}
}
function filterContributionOwnerIds(params) {
const enabledPluginIds = new Set(resolveContributionPluginIds({
index: params.index,
includeDisabled: params.includeDisabled,
config: params.config
}));
return normalizeSortedUniqueStringEntries(params.owners.filter((owner) => enabledPluginIds.has(owner)));
}
function canReuseCurrentManifestRegistry(params) {
return params.bundledChannelConfigCollector === void 0 && params.index === void 0 && params.preferPersisted !== false && params.stateDir === void 0 && params.filePath === void 0 && params.pluginIndexFilePath === void 0 && params.installRecords === void 0 && params.candidates === void 0 && params.diagnostics === void 0;
}
function loadCurrentManifestRegistryForPluginRegistry(params) {
if (!canReuseCurrentManifestRegistry(params)) return;
const env = params.env ?? process.env;
const current = getCurrentPluginMetadataSnapshot({
config: params.config,
env,
...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {},
...params.workspaceDir === void 0 ? { allowWorkspaceScopedSnapshot: true } : {}
});
if (!current || current.registryDiagnostics.length > 0) return;
const pluginIdSet = params.pluginIds === void 0 ? void 0 : new Set(params.pluginIds);
const enabledPluginIds = new Set(current.index.plugins.filter((plugin) => params.includeDisabled || plugin.enabled).map((plugin) => plugin.pluginId));
return {
plugins: current.manifestRegistry.plugins.filter((plugin) => (!pluginIdSet || pluginIdSet.has(plugin.id)) && (params.includeDisabled || enabledPluginIds.has(plugin.id))),
diagnostics: pluginIdSet ? current.manifestRegistry.diagnostics.filter((diagnostic) => !diagnostic.pluginId || pluginIdSet.has(diagnostic.pluginId)) : current.manifestRegistry.diagnostics
};
}
function loadPluginManifestRegistryForPluginRegistry(params = {}) {
const current = loadCurrentManifestRegistryForPluginRegistry(params);
if (current) return current;
return loadPluginManifestRegistryForInstalledIndex({
index: loadPluginRegistrySnapshot(params),
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
pluginIds: params.pluginIds,
includeDisabled: params.includeDisabled,
...params.bundledChannelConfigCollector ? { bundledChannelConfigCollector: params.bundledChannelConfigCollector } : {}
});
}
function normalizePluginsConfigWithRegistry(config, index, options = {}) {
return normalizePluginsConfigWithResolver(config, createPluginRegistryIdNormalizer(index, options));
}
function listPluginContributionIds(params) {
const index = params.lookUpTable?.index ?? loadPluginRegistrySnapshot(params);
return normalizeSortedUniqueStringEntries(listContributionManifestPlugins({
...params,
index
}).flatMap((plugin) => listManifestContributionIds(plugin, params.contribution)));
}
function resolvePluginContributionOwners(params) {
const index = params.lookUpTable?.index ?? loadPluginRegistrySnapshot(params);
if (params.lookUpTable && typeof params.matches === "string") {
const owners = resolveContributionOwnerMap(params.lookUpTable, params.contribution)?.get(params.matches);
if (owners) return filterContributionOwnerIds({
owners,
index,
includeDisabled: params.includeDisabled,
config: params.config
});
return [];
}
const matcher = typeof params.matches === "string" ? (contributionId) => contributionId === params.matches : params.matches;
return normalizeSortedUniqueStringEntries(listContributionManifestPlugins({
...params,
index
}).flatMap((plugin) => listManifestContributionIds(plugin, params.contribution).some(matcher) ? [plugin.id] : []));
}
function resolveProviderOwners(params) {
const providerId = normalizeProviderId(params.providerId);
if (!providerId) return [];
if (params.lookUpTable) {
const index = params.lookUpTable.index;
const owners = [];
for (const [contributionId, ownerIds] of params.lookUpTable.owners.providers.entries()) if (normalizeProviderId(contributionId) === providerId) owners.push(...ownerIds);
return filterContributionOwnerIds({
owners,
index,
includeDisabled: params.includeDisabled,
config: params.config
});
}
return resolvePluginContributionOwners({
...params,
contribution: "providers",
matches: (contributionId) => normalizeProviderId(contributionId) === providerId
});
}
function resolveManifestContractPluginIds(params) {
return loadManifestContractRegistry(params).plugins.filter((plugin) => (!params.origin || plugin.origin === params.origin) && listManifestContractValues(plugin, params.contract).length > 0).map((plugin) => plugin.id).toSorted((left, right) => left.localeCompare(right));
}
function resolveManifestContractPluginIdsByCompatibilityRuntimePath(params) {
const normalizedPath = params.path?.trim();
if (!normalizedPath) return [];
return loadManifestContractRegistry(params).plugins.filter((plugin) => (!params.origin || plugin.origin === params.origin) && listManifestContractValues(plugin, params.contract).length > 0 && (plugin.configContracts?.compatibilityRuntimePaths ?? []).includes(normalizedPath)).map((plugin) => plugin.id).toSorted((left, right) => left.localeCompare(right));
}
function resolveManifestContractOwnerPluginId(params) {
const normalizedValue = normalizeContributionId(params.value ?? "").toLowerCase();
if (!normalizedValue) return;
return loadManifestContractRegistry(params).plugins.find((plugin) => (!params.origin || plugin.origin === params.origin) && listManifestContractValues(plugin, params.contract).some((candidate) => normalizeContributionId(candidate).toLowerCase() === normalizedValue))?.id;
}
//#endregion
export { resolveManifestContractPluginIds as a, resolveProviderOwners as c, inspectPluginRegistry as d, isPluginEnabled as f, createPluginRegistryIdNormalizer as g, refreshPluginRegistry as h, resolveManifestContractOwnerPluginId as i, DISABLE_PERSISTED_PLUGIN_REGISTRY_ENV as l, loadPluginRegistrySnapshotWithMetadata as m, loadPluginManifestRegistryForPluginRegistry as n, resolveManifestContractPluginIdsByCompatibilityRuntimePath as o, loadPluginRegistrySnapshot as p, normalizePluginsConfigWithRegistry as r, resolvePluginContributionOwners as s, listPluginContributionIds as t, getPluginRecord as u };