openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
504 lines (503 loc) • 24.1 kB
JavaScript
import { c as isRecord, i as asOptionalObjectRecord } from "./record-coerce-DItp3I4t.js";
import { c as normalizeOptionalLowercaseString } from "./string-coerce-CIXf7egm.js";
import { i as listAgentEntries } from "./agent-scope-config-DcbEhP0R.js";
import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js";
import { n as registerPluginMetadataProcessMemoLifecycleClear } from "./plugin-metadata-lifecycle-C6m-q5Au.js";
import { _ as resolveInstalledPluginIndexPolicyHash } from "./installed-plugin-index-wrDsjyMD.js";
import { l as normalizePluginsConfig } from "./config-state-BkU1frVq.js";
import { n as getCurrentPluginMetadataSnapshot } from "./current-plugin-metadata-snapshot-CmSX4G3W.js";
import { a as loadPluginMetadataSnapshot } from "./plugin-metadata-snapshot-w-4EjxI4.js";
import { r as collectConfiguredModelRefs } from "./configured-model-refs-DEXTV_K3.js";
import { a as resolveConfiguredChannelAutoEnableCandidates, i as collectAutoEnableChannelIds, n as materializePluginAutoEnableCandidatesInternal, t as hasMaterialPluginEntryConfig } from "./plugin-auto-enable.materialize-8JtnUPNO.js";
import { a as resolveConfiguredTalkRealtimeProviderId } from "./talk-DRVl_bf5.js";
import { t as collectConfiguredAgentHarnessRuntimes } from "./harness-runtimes-BrMGAsrQ.js";
import { t as collectConfiguredSpeechProviderIds } from "./gateway-startup-speech-providers-C1sqNf-9.js";
import { l as resolveOwningPluginIdsForModelRef } from "./providers-DCe4UB6a.js";
import { t as resolvePluginSetupAutoEnableReasons } from "./setup-registry-DZrwT-ft.js";
import { t as collectConfiguredWorkerProviderIds } from "./worker-provider-config-Cq1C8T7E.js";
import { t as listBundledWorkerProviderOwners } from "./worker-provider-manifest-p8jUgDjU.js";
//#region src/config/plugin-auto-enable.shared.ts
const EMPTY_PLUGIN_MANIFEST_REGISTRY = {
plugins: [],
diagnostics: []
};
function resolveAutoEnableProviderPluginIds(registry) {
const entries = /* @__PURE__ */ new Map();
for (const plugin of registry.plugins) for (const providerId of plugin.autoEnableWhenConfiguredProviders ?? []) if (!entries.has(providerId)) entries.set(providerId, plugin.id);
return Object.fromEntries(entries);
}
function canReuseUnscopedCurrentPluginMetadataSnapshot(config) {
return normalizePluginsConfig(config.plugins).loadPaths.length === 0;
}
function extractProviderFromModelRef(value) {
const trimmed = value.trim();
const slash = trimmed.indexOf("/");
if (slash <= 0) return null;
return normalizeProviderId(trimmed.slice(0, slash));
}
function hasConfiguredEmbeddedHarnessRuntime(cfg, _env) {
return collectConfiguredAgentHarnessRuntimes(cfg).length > 0;
}
function resolveAgentHarnessOwnerPluginIds(registry, runtime) {
const normalizedRuntime = normalizeOptionalLowercaseString(runtime);
if (!normalizedRuntime) return [];
return registry.plugins.filter((plugin) => [...plugin.activation?.onAgentHarnesses ?? [], ...plugin.cliBackends ?? []].some((entry) => normalizeOptionalLowercaseString(entry) === normalizedRuntime)).map((plugin) => plugin.id).toSorted((left, right) => left.localeCompare(right));
}
function isProviderConfigured(cfg, providerId) {
const normalized = normalizeProviderId(providerId);
const profiles = cfg.auth?.profiles;
if (profiles && typeof profiles === "object") for (const profile of Object.values(profiles)) {
if (!isRecord(profile)) continue;
if (normalizeProviderId(profile.provider ?? "") === normalized) return true;
}
const providerConfig = cfg.models?.providers;
if (providerConfig && typeof providerConfig === "object") {
for (const key of Object.keys(providerConfig)) if (normalizeProviderId(key) === normalized) return true;
}
for (const { value: ref } of collectConfiguredModelRefs(cfg, { includeChannelModelOverrides: false })) {
const provider = extractProviderFromModelRef(ref);
if (provider && provider === normalized) return true;
}
return false;
}
function hasPluginOwnedWebSearchConfig(cfg, pluginId) {
const pluginConfig = cfg.plugins?.entries?.[pluginId]?.config;
return isRecord(pluginConfig) && isRecord(pluginConfig.webSearch);
}
function hasPluginOwnedWebFetchConfig(cfg, pluginId) {
const pluginConfig = cfg.plugins?.entries?.[pluginId]?.config;
return isRecord(pluginConfig) && isRecord(pluginConfig.webFetch);
}
function resolvePluginOwnedToolConfigKeys(plugin) {
if ((plugin.contracts?.tools?.length ?? 0) === 0) return [];
const properties = isRecord(plugin.configSchema) ? plugin.configSchema.properties : void 0;
if (!isRecord(properties)) return [];
return Object.keys(properties).filter((key) => key !== "webSearch" && key !== "webFetch");
}
function hasPluginOwnedToolConfig(cfg, plugin) {
const pluginConfig = cfg.plugins?.entries?.[plugin.id]?.config;
if (!isRecord(pluginConfig)) return false;
return resolvePluginOwnedToolConfigKeys(plugin).some((key) => pluginConfig[key] !== void 0);
}
function resolveProviderPluginsWithOwnedWebSearch(registry) {
return registry.plugins.filter((plugin) => (plugin.providers?.length ?? 0) > 0).filter((plugin) => (plugin.contracts?.webSearchProviders?.length ?? 0) > 0);
}
function resolveProviderPluginsWithOwnedWebFetch(registry) {
return registry.plugins.filter((plugin) => (plugin.contracts?.webFetchProviders?.length ?? 0) > 0);
}
function resolvePluginIdsForConfiguredSpeechProvider(providerId, registry) {
const normalizedProviderId = normalizeOptionalLowercaseString(providerId);
if (!normalizedProviderId) return [];
return registry.plugins.filter((plugin) => (plugin.contracts?.speechProviders ?? []).some((candidate) => normalizeOptionalLowercaseString(candidate) === normalizedProviderId)).map((plugin) => plugin.id).toSorted((left, right) => left.localeCompare(right));
}
function resolvePluginsWithOwnedToolConfig(registry) {
return registry.plugins.filter((plugin) => (plugin.contracts?.tools?.length ?? 0) > 0);
}
function resolvePluginIdForConfiguredWebFetchProvider(providerId, registry) {
const normalizedProviderId = normalizeOptionalLowercaseString(providerId);
if (!normalizedProviderId) return;
return registry.plugins.find((plugin) => plugin.origin === "bundled" && (plugin.contracts?.webFetchProviders ?? []).some((candidate) => normalizeOptionalLowercaseString(candidate) === normalizedProviderId))?.id;
}
function resolvePluginIdForConfiguredWebSearchProvider(providerId, registry) {
const normalizedProviderId = normalizeOptionalLowercaseString(providerId);
if (!normalizedProviderId) return;
return registry.plugins.find((plugin) => (plugin.contracts?.webSearchProviders ?? []).some((candidate) => normalizeOptionalLowercaseString(candidate) === normalizedProviderId))?.id;
}
function hasConfiguredWebSearchProviderSelection(cfg) {
const provider = cfg.tools?.web?.search?.provider;
return cfg.tools?.web?.search?.enabled !== false && typeof provider === "string" && Boolean(provider.trim());
}
function hasConfiguredVoiceProviderSelection(cfg) {
return Boolean(collectConfiguredSpeechProviderIds(cfg).size || resolveConfiguredTalkRealtimeProviderId(cfg));
}
function hasConfiguredPluginConfigEntry(cfg, configKey) {
const entries = asOptionalObjectRecord(cfg.plugins?.entries);
return entries !== void 0 && Object.values(entries).some((entry) => isRecord(entry) && isRecord(entry.config) && (configKey === void 0 || isRecord(entry.config[configKey])));
}
function listContainsNormalized(value, expected) {
return Array.isArray(value) && value.some((entry) => normalizeOptionalLowercaseString(entry) === expected);
}
function toolPolicyReferencesBrowser(value) {
return isRecord(value) && (listContainsNormalized(value.allow, "browser") || listContainsNormalized(value.alsoAllow, "browser"));
}
function hasBrowserToolReference(cfg) {
if (toolPolicyReferencesBrowser(cfg.tools)) return true;
return listAgentEntries(cfg).some((entry) => toolPolicyReferencesBrowser(entry.tools));
}
function collectConfiguredPluginEntryIds(cfg) {
const entries = asOptionalObjectRecord(cfg.plugins?.entries);
if (!entries) return [];
return Object.keys(entries).map((pluginId) => pluginId.trim()).filter((pluginId) => pluginId && !isPluginEntryExplicitlyDisabled(cfg, pluginId));
}
function hasOwnPluginEntry(cfg, pluginId) {
const entries = asOptionalObjectRecord(cfg.plugins?.entries);
return entries !== void 0 && Object.hasOwn(entries, pluginId);
}
function isPluginEntryExplicitlyDisabled(cfg, pluginId) {
return cfg.plugins?.entries?.[pluginId]?.enabled === false;
}
function hasNonDisabledPluginEntry(cfg, pluginId) {
if (!hasOwnPluginEntry(cfg, pluginId)) return false;
return !isPluginEntryExplicitlyDisabled(cfg, pluginId);
}
function hasBrowserSetupAutoEnableRelevantConfig(cfg) {
if (cfg.browser?.enabled === false || isPluginEntryExplicitlyDisabled(cfg, "browser")) return false;
if (isRecord(cfg.browser)) return true;
if (hasNonDisabledPluginEntry(cfg, "browser")) return true;
return hasBrowserToolReference(cfg);
}
function hasAcpxSetupAutoEnableRelevantConfig(cfg) {
if (isPluginEntryExplicitlyDisabled(cfg, "acpx")) return false;
if (!isRecord(cfg.acp)) return false;
const backend = normalizeOptionalLowercaseString(cfg.acp.backend);
return (cfg.acp.enabled === true || isRecord(cfg.acp.dispatch) && cfg.acp.dispatch.enabled === true || backend === "acpx") && (!backend || backend === "acpx");
}
function hasXaiSetupAutoEnableRelevantConfig(cfg) {
if (isPluginEntryExplicitlyDisabled(cfg, "xai")) return false;
const pluginConfig = cfg.plugins?.entries?.xai?.config;
return isRecord(pluginConfig) && (isRecord(pluginConfig.xSearch) || isRecord(pluginConfig.codeExecution));
}
function resolveRelevantSetupAutoEnablePluginIds(cfg) {
const pluginIds = new Set(collectConfiguredPluginEntryIds(cfg));
if (hasBrowserSetupAutoEnableRelevantConfig(cfg)) pluginIds.add("browser");
if (hasAcpxSetupAutoEnableRelevantConfig(cfg)) pluginIds.add("acpx");
if (hasXaiSetupAutoEnableRelevantConfig(cfg)) pluginIds.add("xai");
return [...pluginIds].toSorted((left, right) => left.localeCompare(right));
}
function hasSetupAutoEnableRelevantConfig(cfg) {
return hasBrowserSetupAutoEnableRelevantConfig(cfg) || hasAcpxSetupAutoEnableRelevantConfig(cfg) || hasXaiSetupAutoEnableRelevantConfig(cfg) || hasConfiguredPluginConfigEntry(cfg);
}
function hasPluginEntries(cfg) {
const entries = asOptionalObjectRecord(cfg.plugins?.entries);
return entries !== void 0 && Object.keys(entries).length > 0;
}
function hasPluginAllowlistWithMaterialEntries(cfg) {
if (!Array.isArray(cfg.plugins?.allow) || cfg.plugins.allow.length === 0 || !hasPluginEntries(cfg)) return false;
const entries = asOptionalObjectRecord(cfg.plugins?.entries);
if (!entries) return false;
return Object.values(entries).some(hasMaterialPluginEntryConfig);
}
function hasConfiguredProviderModelOrHarness(cfg, env) {
if (cfg.auth?.profiles && Object.keys(cfg.auth.profiles).length > 0) return true;
if (cfg.models?.providers && Object.keys(cfg.models.providers).length > 0) return true;
if (collectConfiguredModelRefs(cfg, { includeChannelModelOverrides: false }).length > 0) return true;
return hasConfiguredEmbeddedHarnessRuntime(cfg, env);
}
function arePluginsGloballyDisabled(cfg) {
return cfg.plugins?.enabled === false;
}
function configMayNeedPluginManifestRegistry(cfg, env) {
if (arePluginsGloballyDisabled(cfg)) return false;
if (hasPluginAllowlistWithMaterialEntries(cfg)) return true;
if (hasConfiguredPluginConfigEntry(cfg)) return true;
if (hasConfiguredProviderModelOrHarness(cfg, env)) return true;
if (hasConfiguredVoiceProviderSelection(cfg)) return true;
if (collectConfiguredWorkerProviderIds(cfg).length > 0) return true;
if (hasConfiguredWebSearchProviderSelection(cfg)) return true;
const configuredChannels = cfg.channels;
if (!configuredChannels || typeof configuredChannels !== "object") return false;
for (const key of Object.keys(configuredChannels)) {
if (key === "defaults" || key === "modelByChannel") continue;
return true;
}
return false;
}
function configMayNeedPluginAutoEnable(cfg, env) {
return resolvePluginAutoEnableReadiness(cfg, env).mayNeedAutoEnable;
}
function resolvePluginAutoEnableReadiness(cfg, env, discovery, ambientEnvTriggers = "allow") {
if (arePluginsGloballyDisabled(cfg)) return {
mayNeedAutoEnable: false,
configuredChannelIds: []
};
const configuredChannelIds = collectAutoEnableChannelIds(cfg, env, discovery, ambientEnvTriggers);
if (hasPluginAllowlistWithMaterialEntries(cfg)) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (hasConfiguredPluginConfigEntry(cfg)) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (configuredChannelIds.length > 0) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (hasConfiguredProviderModelOrHarness(cfg, env)) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (hasConfiguredVoiceProviderSelection(cfg)) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (collectConfiguredWorkerProviderIds(cfg).length > 0) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (hasConfiguredWebSearchProviderSelection(cfg) || hasConfiguredPluginConfigEntry(cfg, "webSearch") || hasConfiguredPluginConfigEntry(cfg, "webFetch")) return {
mayNeedAutoEnable: true,
configuredChannelIds
};
if (!hasSetupAutoEnableRelevantConfig(cfg)) return {
mayNeedAutoEnable: false,
configuredChannelIds
};
return {
mayNeedAutoEnable: resolvePluginSetupAutoEnableReasons({
config: cfg,
env,
pluginIds: resolveRelevantSetupAutoEnablePluginIds(cfg)
}).length > 0,
configuredChannelIds
};
}
function resolveConfiguredPluginAutoEnableCandidates(params) {
const changes = resolveConfiguredChannelAutoEnableCandidates(params);
for (const [providerId, pluginId] of Object.entries(resolveAutoEnableProviderPluginIds(params.registry))) if (isProviderConfigured(params.config, providerId)) changes.push({
pluginId,
kind: "provider-auth-configured",
providerId
});
const configuredModelPluginIds = /* @__PURE__ */ new Set();
for (const modelRef of new Set(collectConfiguredModelRefs(params.config, { includeChannelModelOverrides: false }).map(({ value }) => value))) {
const owningPluginIds = resolveOwningPluginIdsForModelRef({
model: modelRef,
config: params.config,
env: params.env,
manifestRegistry: params.registry
});
const pluginId = owningPluginIds?.length === 1 ? owningPluginIds[0] : void 0;
if (!pluginId || configuredModelPluginIds.has(pluginId)) continue;
configuredModelPluginIds.add(pluginId);
changes.push({
pluginId,
kind: "provider-model-configured",
modelRef
});
}
for (const providerId of collectConfiguredSpeechProviderIds(params.config)) for (const pluginId of resolvePluginIdsForConfiguredSpeechProvider(providerId, params.registry)) changes.push({
pluginId,
kind: "speech-provider-selected",
providerId
});
const realtimeProviderId = resolveConfiguredTalkRealtimeProviderId(params.config);
if (realtimeProviderId) for (const plugin of params.registry.plugins) {
if (!plugin.contracts?.realtimeVoiceProviders?.includes(realtimeProviderId.toLowerCase())) continue;
changes.push({
pluginId: plugin.id,
kind: "setup-auto-enable",
reason: `${realtimeProviderId} realtime voice provider selected`
});
}
for (const { pluginId, providerId } of listBundledWorkerProviderOwners(params.registry, collectConfiguredWorkerProviderIds(params.config))) changes.push({
pluginId,
kind: "worker-provider-selected",
providerId
});
for (const runtime of collectConfiguredAgentHarnessRuntimes(params.config)) {
const pluginIds = resolveAgentHarnessOwnerPluginIds(params.registry, runtime);
for (const pluginId of pluginIds) changes.push({
pluginId,
kind: "agent-harness-runtime-configured",
runtime
});
}
const webSearchConfig = params.config.tools?.web?.search;
const webSearchProvider = webSearchConfig?.enabled !== false && typeof webSearchConfig?.provider === "string" ? webSearchConfig.provider : void 0;
const webSearchPluginId = resolvePluginIdForConfiguredWebSearchProvider(webSearchProvider, params.registry);
if (webSearchPluginId) changes.push({
pluginId: webSearchPluginId,
kind: "web-search-provider-selected",
providerId: normalizeOptionalLowercaseString(webSearchProvider) ?? ""
});
const webFetchProvider = typeof params.config.tools?.web?.fetch?.provider === "string" ? params.config.tools.web.fetch.provider : void 0;
const webFetchPluginId = resolvePluginIdForConfiguredWebFetchProvider(webFetchProvider, params.registry);
if (webFetchPluginId) changes.push({
pluginId: webFetchPluginId,
kind: "web-fetch-provider-selected",
providerId: normalizeOptionalLowercaseString(webFetchProvider) ?? ""
});
for (const plugin of resolveProviderPluginsWithOwnedWebSearch(params.registry)) {
const pluginId = plugin.id;
if (hasPluginOwnedWebSearchConfig(params.config, pluginId)) changes.push({
pluginId,
kind: "plugin-web-search-configured"
});
}
for (const plugin of resolvePluginsWithOwnedToolConfig(params.registry)) {
const pluginId = plugin.id;
if (hasPluginOwnedToolConfig(params.config, plugin)) changes.push({
pluginId,
kind: "plugin-tool-configured"
});
}
for (const plugin of resolveProviderPluginsWithOwnedWebFetch(params.registry)) {
const pluginId = plugin.id;
if (hasPluginOwnedWebFetchConfig(params.config, pluginId)) changes.push({
pluginId,
kind: "plugin-web-fetch-configured"
});
}
if (hasSetupAutoEnableRelevantConfig(params.config)) {
const manifestMatchedPluginIds = new Set(changes.map((entry) => entry.pluginId));
const setupPluginIds = resolveRelevantSetupAutoEnablePluginIds(params.config).filter((pluginId) => !manifestMatchedPluginIds.has(pluginId));
for (const entry of resolvePluginSetupAutoEnableReasons({
config: params.config,
env: params.env,
pluginIds: setupPluginIds,
manifestRegistry: params.registry
})) changes.push({
pluginId: entry.pluginId,
kind: "setup-auto-enable",
reason: entry.reason
});
}
return changes;
}
function resolvePluginAutoEnableManifestRegistry(params) {
if (params.manifestRegistry) return params.manifestRegistry;
if (!configMayNeedPluginManifestRegistry(params.config, params.env)) return EMPTY_PLUGIN_MANIFEST_REGISTRY;
return (getCurrentPluginMetadataSnapshot({
config: params.config,
env: params.env,
allowWorkspaceScopedSnapshot: true
}) ?? (() => {
if (!canReuseUnscopedCurrentPluginMetadataSnapshot(params.config)) return;
const snapshot = getCurrentPluginMetadataSnapshot({
env: params.env,
allowWorkspaceScopedSnapshot: true,
requireDefaultDiscoveryContext: true
});
return snapshot?.policyHash === resolveInstalledPluginIndexPolicyHash(params.config) ? snapshot : void 0;
})())?.manifestRegistry ?? loadPluginMetadataSnapshot({
config: params.config,
env: params.env
}).manifestRegistry;
}
//#endregion
//#region src/config/plugin-auto-enable.detect.ts
/** Detects installed plugins that should become enabled from existing config usage. */
function detectPluginAutoEnableCandidates(params) {
const env = params.env ?? process.env;
const config = params.config ?? {};
const readiness = resolvePluginAutoEnableReadiness(config, env, params.discovery, params.ambientEnvTriggers);
if (!readiness.mayNeedAutoEnable) return [];
return resolveConfiguredPluginAutoEnableCandidates({
config,
env,
registry: resolvePluginAutoEnableManifestRegistry({
config,
env,
manifestRegistry: params.manifestRegistry
}),
configuredChannelIds: readiness.configuredChannelIds
});
}
//#endregion
//#region src/config/plugin-auto-enable.apply.ts
let sameTurnApplyCache;
let sameTurnApplyCacheClearScheduled = false;
let stableFingerprintMemo = /* @__PURE__ */ new WeakMap();
registerPluginMetadataProcessMemoLifecycleClear(() => {
stableFingerprintMemo = /* @__PURE__ */ new WeakMap();
sameTurnApplyCache = void 0;
});
function scheduleSameTurnApplyCacheClear() {
if (sameTurnApplyCacheClearScheduled) return;
sameTurnApplyCacheClearScheduled = true;
setImmediate(() => {
sameTurnApplyCache = void 0;
sameTurnApplyCacheClearScheduled = false;
}).unref?.();
}
function getOrCreateWeakMap(parent, key, create) {
const existing = parent.get(key);
if (existing) return existing;
const next = create();
parent.set(key, next);
return next;
}
function stableFingerprintValue(value) {
if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
const cached = stableFingerprintMemo.get(value);
if (cached !== void 0) return cached;
const fingerprint = Array.isArray(value) ? `[${value.map((entry) => stableFingerprintValue(entry)).join(",")}]` : (() => {
const record = value;
return `{${Object.keys(record).toSorted((left, right) => left.localeCompare(right)).map((key) => `${JSON.stringify(key)}:${stableFingerprintValue(record[key])}`).join(",")}}`;
})();
stableFingerprintMemo.set(value, fingerprint);
return fingerprint;
}
function createPluginAutoEnableCacheEntry(params) {
return {
discoveryFingerprint: stableFingerprintValue(params.discovery.candidates),
registryFingerprint: stableFingerprintValue(params.manifestRegistry.plugins),
ambientEnvTriggers: params.ambientEnvTriggers,
result: params.result
};
}
function isPluginAutoEnableCacheEntryFresh(params) {
return params.entry.discoveryFingerprint === stableFingerprintValue(params.discovery.candidates) && params.entry.registryFingerprint === stableFingerprintValue(params.manifestRegistry.plugins) && params.entry.ambientEnvTriggers === params.ambientEnvTriggers;
}
/** Applies already detected plugin auto-enable candidates to config. */
function materializePluginAutoEnableCandidates(params) {
const env = params.env ?? process.env;
const config = params.config ?? {};
const entries = config.plugins?.entries;
const hasRestrictiveAllowlistWithEntries = Array.isArray(config.plugins?.allow) && config.plugins.allow.length > 0 && entries !== void 0 && typeof entries === "object";
if (params.candidates.length === 0 && !hasRestrictiveAllowlistWithEntries) return {
config,
changes: [],
autoEnabledReasons: {}
};
const manifestRegistry = resolvePluginAutoEnableManifestRegistry({
config,
env,
manifestRegistry: params.manifestRegistry
});
return materializePluginAutoEnableCandidatesInternal({
config,
candidates: params.candidates,
env,
manifestRegistry
});
}
function applyPluginAutoEnable(params) {
const config = params.config;
if (config && typeof config === "object" && params.manifestRegistry && params.discovery) {
const env = params.env ?? process.env;
const ambientEnvTriggers = params.ambientEnvTriggers ?? "allow";
const discoveryCache = getOrCreateWeakMap(getOrCreateWeakMap(getOrCreateWeakMap(sameTurnApplyCache ??= /* @__PURE__ */ new WeakMap(), config, () => /* @__PURE__ */ new WeakMap()), env, () => /* @__PURE__ */ new WeakMap()), params.manifestRegistry, () => /* @__PURE__ */ new WeakMap());
const cached = discoveryCache.get(params.discovery);
if (cached && isPluginAutoEnableCacheEntryFresh({
entry: cached,
discovery: params.discovery,
manifestRegistry: params.manifestRegistry,
ambientEnvTriggers
})) return cached.result;
const result = materializePluginAutoEnableCandidates({
config,
candidates: detectPluginAutoEnableCandidates(params),
env: params.env,
manifestRegistry: params.manifestRegistry
});
discoveryCache.set(params.discovery, createPluginAutoEnableCacheEntry({
discovery: params.discovery,
manifestRegistry: params.manifestRegistry,
result,
ambientEnvTriggers
}));
scheduleSameTurnApplyCacheClear();
return result;
}
const candidates = detectPluginAutoEnableCandidates(params);
return materializePluginAutoEnableCandidates({
config: params.config,
candidates,
env: params.env,
manifestRegistry: params.manifestRegistry
});
}
//#endregion
export { configMayNeedPluginAutoEnable as i, materializePluginAutoEnableCandidates as n, detectPluginAutoEnableCandidates as r, applyPluginAutoEnable as t };