diff --git a/src/plugins/contracts/registry.contract.test.ts b/src/plugins/contracts/registry.contract.test.ts index d9767cd8ecf..043d37bc905 100644 --- a/src/plugins/contracts/registry.contract.test.ts +++ b/src/plugins/contracts/registry.contract.test.ts @@ -7,6 +7,7 @@ import { pluginRegistrationContractRegistry, providerContractLoadError, providerContractPluginIds, + resolveWebSearchProviderContractEntriesForPluginId, speechProviderContractRegistry, } from "./registry.js"; import { uniqueSortedStrings } from "./testkit.js"; @@ -104,4 +105,16 @@ describe("plugin contract registry", () => { ), ).toEqual(bundledWebSearchPluginIds); }); + + it( + "loads bundled web search providers for each shared-resolver plugin", + { timeout: REGISTRY_CONTRACT_TIMEOUT_MS }, + () => { + for (const pluginId of resolveBundledWebSearchPluginIds({})) { + expect(resolveWebSearchProviderContractEntriesForPluginId(pluginId).length).toBeGreaterThan( + 0, + ); + } + }, + ); }); diff --git a/src/plugins/contracts/registry.ts b/src/plugins/contracts/registry.ts index 5f4cdbd8874..09851888761 100644 --- a/src/plugins/contracts/registry.ts +++ b/src/plugins/contracts/registry.ts @@ -77,6 +77,10 @@ function uniqueStrings(values: readonly string[]): string[] { let providerContractRegistryCache: ProviderContractEntry[] | null = null; let providerContractRegistryByPluginIdCache: Map | null = null; let webSearchProviderContractRegistryCache: WebSearchProviderContractEntry[] | null = null; +let webSearchProviderContractRegistryByPluginIdCache: Map< + string, + WebSearchProviderContractEntry[] +> | null = null; let speechProviderContractRegistryCache: SpeechProviderContractEntry[] | null = null; let mediaUnderstandingProviderContractRegistryCache: | MediaUnderstandingProviderContractEntry[] @@ -188,6 +192,34 @@ function loadWebSearchProviderContractRegistry(): WebSearchProviderContractEntry return webSearchProviderContractRegistryCache; } +export function resolveWebSearchProviderContractEntriesForPluginId( + pluginId: string, +): WebSearchProviderContractEntry[] { + if (webSearchProviderContractRegistryCache) { + return webSearchProviderContractRegistryCache.filter((entry) => entry.pluginId === pluginId); + } + + const cache = + webSearchProviderContractRegistryByPluginIdCache ?? + new Map(); + webSearchProviderContractRegistryByPluginIdCache = cache; + const cached = cache.get(pluginId); + if (cached) { + return cached; + } + + const entries = loadBundledCapabilityRuntimeRegistry({ + pluginIds: [pluginId], + pluginSdkResolution: "dist", + }).webSearchProviders.map((entry) => ({ + pluginId: entry.pluginId, + provider: entry.provider, + credentialValue: resolveWebSearchCredentialValue(entry.provider), + })); + cache.set(pluginId, entries); + return entries; +} + function loadSpeechProviderContractRegistry(): SpeechProviderContractEntry[] { if (!speechProviderContractRegistryCache) { speechProviderContractRegistryCache = process.env.VITEST diff --git a/test/helpers/extensions/web-search-provider-contract.ts b/test/helpers/extensions/web-search-provider-contract.ts index 1ed0db7e96f..d07f0dfa611 100644 --- a/test/helpers/extensions/web-search-provider-contract.ts +++ b/test/helpers/extensions/web-search-provider-contract.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { pluginRegistrationContractRegistry, - webSearchProviderContractRegistry, + resolveWebSearchProviderContractEntriesForPluginId, } from "../../../src/plugins/contracts/registry.js"; import { installWebSearchProviderContractSuite } from "../../../src/plugins/contracts/suites.js"; @@ -10,8 +10,7 @@ export function describeWebSearchProviderContracts(pluginId: string) { pluginRegistrationContractRegistry.find((entry) => entry.pluginId === pluginId) ?.webSearchProviderIds ?? []; - const resolveProviders = () => - webSearchProviderContractRegistry.filter((entry) => entry.pluginId === pluginId); + const resolveProviders = () => resolveWebSearchProviderContractEntriesForPluginId(pluginId); describe(`${pluginId} web search provider contract registry load`, () => { it("loads bundled web search providers", () => {