From 7dd23a59dbe42076bd0cce185ad933bfa4e6bb10 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 6 Apr 2026 23:14:41 +0100 Subject: [PATCH] perf(secrets): complete bundled web provider artifacts --- extensions/minimax/web-search-provider.ts | 1 + extensions/ollama/web-search-provider.ts | 1 + .../web-provider-public-artifacts.test.ts | 44 ++++++++++++++++ src/plugins/web-provider-public-artifacts.ts | 50 +++++++++---------- src/secrets/runtime-web-tools.ts | 8 +-- 5 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 extensions/minimax/web-search-provider.ts create mode 100644 extensions/ollama/web-search-provider.ts create mode 100644 src/plugins/web-provider-public-artifacts.test.ts diff --git a/extensions/minimax/web-search-provider.ts b/extensions/minimax/web-search-provider.ts new file mode 100644 index 00000000000..740cc4ce4d2 --- /dev/null +++ b/extensions/minimax/web-search-provider.ts @@ -0,0 +1 @@ +export { createMiniMaxWebSearchProvider } from "./src/minimax-web-search-provider.js"; diff --git a/extensions/ollama/web-search-provider.ts b/extensions/ollama/web-search-provider.ts new file mode 100644 index 00000000000..f92a70a06b6 --- /dev/null +++ b/extensions/ollama/web-search-provider.ts @@ -0,0 +1 @@ +export { createOllamaWebSearchProvider } from "./src/web-search-provider.js"; diff --git a/src/plugins/web-provider-public-artifacts.test.ts b/src/plugins/web-provider-public-artifacts.test.ts new file mode 100644 index 00000000000..fbbd0433e34 --- /dev/null +++ b/src/plugins/web-provider-public-artifacts.test.ts @@ -0,0 +1,44 @@ +import { describe, expect, it } from "vitest"; +import { resolveManifestContractPluginIds } from "./manifest-registry.js"; +import { + resolveBundledWebFetchProvidersFromPublicArtifacts, + resolveBundledWebSearchProvidersFromPublicArtifacts, +} from "./web-provider-public-artifacts.js"; + +describe("web provider public artifacts", () => { + it("covers every bundled web search provider declared in manifests", () => { + const providers = resolveBundledWebSearchProvidersFromPublicArtifacts({ + bundledAllowlistCompat: true, + }); + + expect(providers).not.toBeNull(); + expect( + providers + ?.map((entry) => entry.pluginId) + .toSorted((left, right) => left.localeCompare(right)), + ).toEqual( + resolveManifestContractPluginIds({ + contract: "webSearchProviders", + origin: "bundled", + }), + ); + }); + + it("covers every bundled web fetch provider declared in manifests", () => { + const providers = resolveBundledWebFetchProvidersFromPublicArtifacts({ + bundledAllowlistCompat: true, + }); + + expect(providers).not.toBeNull(); + expect( + providers + ?.map((entry) => entry.pluginId) + .toSorted((left, right) => left.localeCompare(right)), + ).toEqual( + resolveManifestContractPluginIds({ + contract: "webFetchProviders", + origin: "bundled", + }), + ); + }); +}); diff --git a/src/plugins/web-provider-public-artifacts.ts b/src/plugins/web-provider-public-artifacts.ts index 1dbf3e6fd91..e3107572851 100644 --- a/src/plugins/web-provider-public-artifacts.ts +++ b/src/plugins/web-provider-public-artifacts.ts @@ -160,7 +160,7 @@ function resolveBundledManifestRecordsByPluginId(params: { export function resolveBundledWebSearchProvidersFromPublicArtifacts( params: BundledWebProviderPublicArtifactParams, -): PluginWebSearchProviderEntry[] { +): PluginWebSearchProviderEntry[] | null { const pluginIds = resolveBundledCandidatePluginIds({ contract: "webSearchProviders", configKey: "webSearch", @@ -183,32 +183,31 @@ export function resolveBundledWebSearchProvidersFromPublicArtifacts( for (const pluginId of pluginIds) { const record = recordsByPluginId.get(pluginId); if (!record) { - continue; + return null; } const mod = tryLoadBundledPublicArtifactModule({ dirName: path.basename(record.rootDir), artifactCandidates: WEB_SEARCH_ARTIFACT_CANDIDATES, }); if (!mod) { - continue; + return null; } - providers.push( - ...collectProviderFactories({ - mod, - suffix: "WebSearchProvider", - isProvider: isWebSearchProviderPlugin, - }).map((provider) => ({ - ...provider, - pluginId, - })), - ); + const loadedProviders = collectProviderFactories({ + mod, + suffix: "WebSearchProvider", + isProvider: isWebSearchProviderPlugin, + }); + if (loadedProviders.length === 0) { + return null; + } + providers.push(...loadedProviders.map((provider) => ({ ...provider, pluginId }))); } return providers; } export function resolveBundledWebFetchProvidersFromPublicArtifacts( params: BundledWebProviderPublicArtifactParams, -): PluginWebFetchProviderEntry[] { +): PluginWebFetchProviderEntry[] | null { const pluginIds = resolveBundledCandidatePluginIds({ contract: "webFetchProviders", configKey: "webFetch", @@ -231,25 +230,24 @@ export function resolveBundledWebFetchProvidersFromPublicArtifacts( for (const pluginId of pluginIds) { const record = recordsByPluginId.get(pluginId); if (!record) { - continue; + return null; } const mod = tryLoadBundledPublicArtifactModule({ dirName: path.basename(record.rootDir), artifactCandidates: WEB_FETCH_ARTIFACT_CANDIDATES, }); if (!mod) { - continue; + return null; } - providers.push( - ...collectProviderFactories({ - mod, - suffix: "WebFetchProvider", - isProvider: isWebFetchProviderPlugin, - }).map((provider) => ({ - ...provider, - pluginId, - })), - ); + const loadedProviders = collectProviderFactories({ + mod, + suffix: "WebFetchProvider", + isProvider: isWebFetchProviderPlugin, + }); + if (loadedProviders.length === 0) { + return null; + } + providers.push(...loadedProviders.map((provider) => ({ ...provider, pluginId }))); } return providers; } diff --git a/src/secrets/runtime-web-tools.ts b/src/secrets/runtime-web-tools.ts index 613be20b1d4..368bd9c72da 100644 --- a/src/secrets/runtime-web-tools.ts +++ b/src/secrets/runtime-web-tools.ts @@ -272,7 +272,7 @@ function resolveBundledWebSearchProviders(params: { bundledAllowlistCompat: true, onlyPluginIds: [params.configuredBundledPluginId], }); - if (bundled.length > 0) { + if (bundled && bundled.length > 0) { return bundled; } return resolvePluginWebSearchProviders({ @@ -289,7 +289,7 @@ function resolveBundledWebSearchProviders(params: { env, bundledAllowlistCompat: true, }); - if (bundled.length > 0) { + if (bundled && bundled.length > 0) { return bundled; } return resolvePluginWebSearchProviders({ @@ -319,7 +319,7 @@ function resolveBundledWebFetchProviders(params: { bundledAllowlistCompat: true, onlyPluginIds: [params.configuredBundledPluginId], }); - if (bundled.length > 0) { + if (bundled && bundled.length > 0) { return bundled; } return resolvePluginWebFetchProviders({ @@ -335,7 +335,7 @@ function resolveBundledWebFetchProviders(params: { env, bundledAllowlistCompat: true, }); - if (bundled.length > 0) { + if (bundled && bundled.length > 0) { return bundled; } return resolvePluginWebFetchProviders({