UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

130 lines (129 loc) 5.21 kB
import { t as createLazyImportLoader } from "./lazy-promise-DGqyc4Y4.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { r as copyProviderCatalogResultProjection, t as copyProviderCatalogOutcomes } from "./provider-catalog-result-C_zhEwjo.js"; //#region src/plugins/provider-discovery.ts /** Control-plane provider discovery helpers that keep runtime imports lazy until catalog hooks run. */ const DISCOVERY_ORDER = [ "simple", "profile", "paired", "late" ]; const DANGEROUS_PROVIDER_KEYS = /* @__PURE__ */ new Set([ "__proto__", "prototype", "constructor" ]); const providerRuntimeLoader = createLazyImportLoader(() => import("./plugins/provider-discovery.runtime.js")); function loadProviderRuntime() { return providerRuntimeLoader.load(); } function resolveProviderCatalogHook(provider) { return provider.catalog; } function resolveProviderCatalogOrderHook(provider) { return resolveProviderCatalogHook(provider) ?? provider.staticCatalog; } function createProviderConfigRecord() { return Object.create(null); } function isSafeProviderConfigKey(value) { return value !== "" && !DANGEROUS_PROVIDER_KEYS.has(value); } async function planRuntimePluginDiscovery(params) { return (await loadProviderRuntime()).planPluginDiscoveryRuntime(params); } /** Loads provider runtime discovery and filters to providers that can produce catalog order entries. */ async function resolveRuntimePluginDiscoveryProviders(params) { return (await loadProviderRuntime()).resolvePluginDiscoveryProvidersRuntime(params).filter((provider) => resolveProviderCatalogOrderHook(provider) || params.includeSyntheticAuthProviders === true && (typeof provider.resolveSyntheticAuth === "function" || typeof provider.prepareSyntheticAuth === "function")); } /** Groups plugin providers into stable discovery phases for catalog probing. */ function groupPluginDiscoveryProvidersByOrder(providers) { const grouped = { simple: [], profile: [], paired: [], late: [] }; for (const provider of providers) grouped[resolveProviderCatalogOrderHook(provider)?.order ?? "late"].push(provider); for (const order of DISCOVERY_ORDER) grouped[order].sort((a, b) => a.label.localeCompare(b.label)); return grouped; } /** Normalizes a plugin discovery response into safe provider-config keys. */ function normalizePluginDiscoveryResult(params) { const result = params.result; if (!result) return {}; const projection = copyProviderCatalogResultProjection(result); if (projection.kind === "provider") { const normalized = createProviderConfigRecord(); for (const providerId of [ params.provider.id, ...params.provider.aliases ?? [], ...params.provider.hookAliases ?? [] ]) { const normalizedKey = normalizeProviderId(providerId); if (!isSafeProviderConfigKey(normalizedKey)) continue; normalized[normalizedKey] = projection.provider; } return normalized; } const normalized = createProviderConfigRecord(); if (projection.kind !== "providers") return normalized; for (const [key, value] of projection.providers) { const normalizedKey = normalizeProviderId(key); if (!isSafeProviderConfigKey(normalizedKey) || !value) continue; normalized[normalizedKey] = value; } return normalized; } async function runProviderCatalog(params) { const hook = resolveProviderCatalogHook(params.provider); if (!hook) return; const result = await hook.run({ config: params.config, agentDir: params.agentDir, workspaceDir: params.workspaceDir, env: params.env, ...params.providerIds !== void 0 ? { providerIds: params.providerIds } : {}, resolveProviderApiKey: params.resolveProviderApiKey, resolveProviderAuth: params.resolveProviderAuth }); for (const outcome of copyProviderCatalogOutcomes(result)) { if (params.providerIds !== void 0 && !params.providerIds.some((providerId) => normalizeProviderId(providerId) === normalizeProviderId(outcome.provider))) continue; params.reportCatalogOutcome?.(outcome); } return result; } function runProviderStaticCatalog(params) { return params.provider.staticCatalog?.run({ config: {}, env: {}, resolveProviderApiKey: () => ({ apiKey: void 0 }), resolveProviderAuth: () => ({ apiKey: void 0, mode: "none", source: "none" }) }); } /** * Runs sterile provider catalogs once so lifecycle owners can reuse the immutable results. * Providers remain attached to their plugin identity for later agent-specific scope filtering. */ async function prepareProviderStaticCatalog(params) { const entries = []; const byOrder = groupPluginDiscoveryProvidersByOrder([...params.providers]); for (const order of DISCOVERY_ORDER) for (const provider of byOrder[order]) { if (!provider.staticCatalog) continue; entries.push(Object.freeze({ provider, result: await runProviderStaticCatalog({ provider }) })); } return Object.freeze({ providers: Object.freeze([...params.providers]), entries: Object.freeze(entries) }); } //#endregion export { resolveRuntimePluginDiscoveryProviders as a, prepareProviderStaticCatalog as i, normalizePluginDiscoveryResult as n, runProviderCatalog as o, planRuntimePluginDiscovery as r, runProviderStaticCatalog as s, groupPluginDiscoveryProvidersByOrder as t };