UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

223 lines (222 loc) 10.2 kB
import { v as sortUniqueStrings } from "./string-normalization-DsCfAx8q.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { a as preparePluginModule, t as getCachedPluginModuleLoader } from "./plugin-module-loader-cache-lf3kAaBw.js"; import { t as shouldRejectHardlinkedPluginFiles } from "./hardlink-policy-CslDqyMD.js"; import { c as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-BbV7X6pV.js"; import { t as planEffectiveModelCatalogRows } from "./model-catalog-BiOJ2EJd.js"; import { n as resolvePluginRuntimeArtifactPreference, t as prefersBuiltPluginArtifacts } from "./plugin-runtime-artifact-selection-OSt151GX.js"; import { o as resolveDiscoveredProviderPluginIds } from "./providers-DCe4UB6a.js"; import { r as resolvePluginRuntimeArtifact } from "./plugin-runtime-artifact-resolution-B06Nm0lT.js"; import { t as getPluginRuntimeGenerationRegistry } from "./generation-scope-Cf83d_iq.js"; import { i as withProfile } from "./plugin-load-profile-CjbuhLIb.js"; import { i as getPluginRuntimeLoadContext } from "./load-context-BdeWeJHL.js"; import { n as resolvePluginProvidersCore } from "./providers.runtime-DCovueHC.js"; import { t as buildEffectiveManifestProviderConfig } from "./provider-catalog-8ARoyQkL.js"; //#region src/plugins/provider-discovery.runtime.ts function normalizeDiscoveryModule(value) { const resolved = value && typeof value === "object" && "default" in value && value.default !== void 0 ? value.default : value; if (Array.isArray(resolved)) return resolved; if (resolved && typeof resolved === "object" && "id" in resolved) return [resolved]; if (value && typeof value === "object" && !Array.isArray(value)) { const record = value; if (Array.isArray(record.providers)) return record.providers; if (record.provider) return [record.provider]; } return []; } function loadProviderDiscoveryProviders(manifest) { const registry = getPluginRuntimeGenerationRegistry(); const loadContext = getPluginRuntimeLoadContext(registry); const { source, rootDir } = registry ? resolvePluginRuntimeArtifact({ pluginId: manifest.id, entryKind: "provider-discovery", source: manifest.providerDiscoverySource, rootDir: manifest.rootDir, origin: manifest.origin, packageManifest: manifest.packageManifest, preferBuiltPluginArtifacts: prefersBuiltPluginArtifacts(resolvePluginRuntimeArtifactPreference(loadContext?.preferBuiltPluginArtifacts), manifest.origin), sourcePreferred: manifest.sourcePreferred, registry }) : { source: manifest.providerDiscoverySource, rootDir: manifest.rootDir }; const modulePath = registry ? preparePluginModule({ modulePath: source, boundaryRoot: rootDir, boundaryLabel: "plugin root", surfaceLabel: `plugin provider discovery ${manifest.id}`, rejectHardlinks: shouldRejectHardlinkedPluginFiles({ origin: manifest.origin, rootDir: manifest.rootDir, env: loadContext?.env }) }).modulePath : source; const moduleLoader = getCachedPluginModuleLoader({ modulePath, rootDir, importerUrl: import.meta.url, loaderFilename: import.meta.url, preferBuiltDist: true }); return normalizeDiscoveryModule(withProfile({ pluginId: manifest.id, source: modulePath }, "provider-discovery-entry", () => moduleLoader(modulePath))).map((provider) => Object.assign({}, provider, { pluginId: manifest.id })); } function hasLiveProviderDiscoveryHook(provider) { return typeof provider.catalog?.run === "function"; } function hasProviderCatalogHook(provider) { return hasLiveProviderDiscoveryHook(provider) || typeof provider.staticCatalog?.run === "function"; } function hasProviderAuthEnvCredential(plugin, env) { return (plugin.setup?.providers ?? []).flatMap((provider) => provider.envVars ?? []).some((name) => { const value = env[name]?.trim(); return value !== void 0 && value !== ""; }); } function prepareManifestCatalogDiscovery(pluginRecords, config, includeProviders) { const providers = []; const runtimeManifestCatalogPluginIds = /* @__PURE__ */ new Set(); for (const plugin of pluginRecords) { if (!plugin.modelCatalog) continue; const ownedProviders = new Set(plugin.providers.map((provider) => normalizeProviderId(provider))); if (Object.entries(plugin.modelCatalog.discovery ?? {}).some(([provider, discovery]) => (discovery === "runtime" || discovery === "refreshable") && ownedProviders.has(normalizeProviderId(provider)))) runtimeManifestCatalogPluginIds.add(plugin.id); if (!plugin.modelCatalog.providers) continue; const plan = planEffectiveModelCatalogRows({ registry: { plugins: [plugin] }, config }); for (const entry of plan.entries) { if (entry.discovery === "runtime" || entry.discovery === "refreshable") { runtimeManifestCatalogPluginIds.add(plugin.id); continue; } if (!includeProviders || entry.rows.length === 0) continue; const providerConfig = buildEffectiveManifestProviderConfig(entry.rows); if (!providerConfig) continue; providers.push({ id: entry.provider, pluginId: plugin.id, label: entry.provider, auth: [], staticCatalog: { order: "simple", run: async () => ({ providers: { [entry.provider]: providerConfig } }) } }); } } return { providers, runtimeManifestCatalogPluginIds }; } function resolveProviderDiscoveryEntryPlugins(params) { const metadataSnapshot = params.pluginMetadataSnapshot ?? loadManifestMetadataSnapshot({ config: params.config ?? {}, env: params.env ?? process.env, ...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {} }); const registry = metadataSnapshot.index; const manifestRegistry = metadataSnapshot.manifestRegistry; const pluginIds = resolveDiscoveredProviderPluginIds({ ...params, registry, manifestRegistry }); const pluginIdSet = new Set(pluginIds); const pluginRecords = manifestRegistry.plugins.filter((plugin) => pluginIdSet.has(plugin.id)); const { providers: manifestProviders, runtimeManifestCatalogPluginIds } = prepareManifestCatalogDiscovery(pluginRecords, params.config ?? {}, params.includeManifestModelCatalogProviders !== false); const entryRecords = pluginRecords.filter((plugin) => plugin.providerDiscoverySource); const entryPluginIds = new Set(entryRecords.map((plugin) => plugin.id)); const manifestEntryPluginIds = /* @__PURE__ */ new Set(); for (const pluginId of manifestProviders.map((provider) => provider.pluginId)) if (pluginId) { manifestEntryPluginIds.add(pluginId); if (!runtimeManifestCatalogPluginIds.has(pluginId)) entryPluginIds.add(pluginId); } const complete = entryPluginIds.size === pluginIdSet.size; const result = { providers: manifestProviders, complete, pluginRecords, entryPluginIds, runtimeManifestCatalogPluginIds }; const entriesOnlyComplete = (/* @__PURE__ */ new Set([...entryPluginIds, ...manifestEntryPluginIds])).size === pluginIdSet.size; if (entryRecords.length === 0) return result; if (params.requireCompleteDiscoveryEntryCoverage && !(params.discoveryEntriesOnly === true ? entriesOnlyComplete : complete)) return { ...result, providers: [], complete: false }; const providers = []; for (const manifest of entryRecords) try { providers.push(...loadProviderDiscoveryProviders(manifest)); } catch { return { ...result, complete: false, entryPluginIds: manifestEntryPluginIds }; } return { ...result, providers: [...manifestProviders, ...providers] }; } function resolveRuntimeEntryProviders(entryResult) { return entryResult.providers.filter((provider) => { if (hasLiveProviderDiscoveryHook(provider)) return true; return Boolean(provider.pluginId && entryResult.entryPluginIds.has(provider.pluginId) && typeof provider.staticCatalog?.run === "function"); }); } function planPluginDiscoveryRuntime(params) { const env = params.env ?? process.env; const entryResult = resolveProviderDiscoveryEntryPlugins({ ...params, env }); const entryProviders = entryResult.providers.filter((provider) => hasProviderCatalogHook(provider) || params.includeSyntheticAuthProviders === true && (typeof provider.resolveSyntheticAuth === "function" || typeof provider.prepareSyntheticAuth === "function")); const runtimeEntryProviders = resolveRuntimeEntryProviders(entryResult); if (params.discoveryEntriesOnly === true) return { kind: "entries", providers: entryProviders }; if (entryResult.providers.length > 0 && entryResult.complete && runtimeEntryProviders.length === entryResult.providers.length && entryResult.runtimeManifestCatalogPluginIds.size === 0) return { kind: "entries", providers: runtimeEntryProviders }; let fullPluginIds = params.onlyPluginIds; let retainedProviders; if (runtimeEntryProviders.length > 0 || entryResult.runtimeManifestCatalogPluginIds.size > 0) { fullPluginIds = sortUniqueStrings([...entryResult.pluginRecords.filter((plugin) => !entryResult.entryPluginIds.has(plugin.id) && (params.onlyPluginIds !== void 0 || hasProviderAuthEnvCredential(plugin, env))).map((plugin) => plugin.id), ...entryResult.runtimeManifestCatalogPluginIds]); if (fullPluginIds.length === 0) return { kind: "entries", providers: runtimeEntryProviders }; const fullPluginIdSet = new Set(fullPluginIds); retainedProviders = runtimeEntryProviders.filter((provider) => !provider.pluginId || !fullPluginIdSet.has(provider.pluginId)); } else if (entryProviders.length > 0) { const entryPluginIds = sortUniqueStrings(entryProviders.map((provider) => provider.pluginId).filter((pluginId) => typeof pluginId === "string" && pluginId !== "")); if (entryPluginIds.length > 0) fullPluginIds = entryPluginIds; } return { kind: "runtime", providers: retainedProviders ?? [], pluginIds: fullPluginIds }; } function resolvePluginDiscoveryProvidersRuntime(params) { const plan = planPluginDiscoveryRuntime(params); if (plan.kind === "entries") return plan.providers; const fullProviders = resolvePluginProvidersCore({ ...params, env: params.env ?? process.env, ...plan.pluginIds ? { onlyPluginIds: plan.pluginIds } : {} }); return [...plan.providers, ...fullProviders]; } //#endregion export { resolvePluginDiscoveryProvidersRuntime as n, planPluginDiscoveryRuntime as t };