Secrets: avoid broad web search discovery for single plugin config

Add an Exa web-search contract artifact and use single bundled plugin-scoped webSearch config as a provider hint. This keeps runtime secret resolution on metadata-only surfaces instead of importing full provider tool implementations.
This commit is contained in:
Gustavo Madeira Santana
2026-04-17 13:32:55 -04:00
parent 20cf51169b
commit a464f5926b
4 changed files with 96 additions and 11 deletions

View File

@@ -871,6 +871,36 @@ describe("runtime web tools resolution", () => {
expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled();
});
it("uses single plugin-scoped web search config as a bundled provider hint", async () => {
const { metadata } = await runRuntimeWebTools({
config: asConfig({
plugins: {
entries: {
google: {
enabled: true,
config: {
webSearch: {
apiKey: { source: "env", provider: "default", id: "GOOGLE_PROVIDER_REF" },
},
},
},
},
},
}),
env: {
GOOGLE_PROVIDER_REF: "google-provider-key",
},
});
expect(metadata.search.selectedProvider).toBe("gemini");
expect(resolveBundledExplicitWebSearchProvidersFromPublicArtifactsMock).toHaveBeenCalledWith({
onlyPluginIds: ["google"],
});
expect(resolveManifestContractOwnerPluginIdMock).not.toHaveBeenCalled();
expect(resolveBundledWebSearchProvidersFromPublicArtifactsMock).not.toHaveBeenCalled();
expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled();
});
it("limits legacy top-level web search apiKey auto-detect to compatibility owners", async () => {
const { metadata } = await runRuntimeWebTools({
config: asConfig({

View File

@@ -542,18 +542,18 @@ export async function resolveRuntimeWebTools(params: {
}
const rawProvider = normalizeLowercaseStringOrEmpty(search?.provider);
let configuredBundledWebSearchPluginIdHint: string | undefined;
if (rawProvider && hasPluginWebSearchConfig) {
configuredBundledWebSearchPluginIdHint = inferExactBundledPluginScopedWebToolConfigOwner({
config: params.sourceConfig,
key: "webSearch",
pluginId: rawProvider,
});
if (!configuredBundledWebSearchPluginIdHint && !(await getHasCustomWebSearchRisk())) {
configuredBundledWebSearchPluginIdHint = inferSingleBundledPluginScopedWebToolConfigOwner(
params.sourceConfig,
"webSearch",
);
if (hasPluginWebSearchConfig && !(await getHasCustomWebSearchRisk())) {
if (rawProvider) {
configuredBundledWebSearchPluginIdHint = inferExactBundledPluginScopedWebToolConfigOwner({
config: params.sourceConfig,
key: "webSearch",
pluginId: rawProvider,
});
}
configuredBundledWebSearchPluginIdHint ??= inferSingleBundledPluginScopedWebToolConfigOwner(
params.sourceConfig,
"webSearch",
);
}
const searchMetadata: RuntimeWebSearchMetadata = {
providerSource: "none",