From c5d3032118aa87cdecb3ae40f1117344762efd2b Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 27 Jul 2026 14:47:11 -0400 Subject: [PATCH] fix: keep third-party web search opt-in --- .changeset/enable-websearch-config.md | 2 +- packages/core/src/v1/config/config.ts | 3 +- .../src/routes/config/ToolsRoute.tsx | 2 +- .../src/components/settings/BrowserTab.tsx | 2 +- packages/opencode/src/tool/registry.ts | 2 +- .../test/kilocode/config/config.test.ts | 6 +-- packages/opencode/test/tool/registry.test.ts | 50 +++++++------------ 7 files changed, 26 insertions(+), 41 deletions(-) diff --git a/.changeset/enable-websearch-config.md b/.changeset/enable-websearch-config.md index ebbc4135f3b..cd47a9e9fb5 100644 --- a/.changeset/enable-websearch-config.md +++ b/.changeset/enable-websearch-config.md @@ -3,4 +3,4 @@ "kilo-code": patch --- -Configure web search for models from all providers through Kilo configuration, VS Code settings, and Kilo Console settings. +Allow users to enable web search for models from all providers through Kilo configuration, VS Code settings, and Kilo Console settings. diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index 0ef9d1ffc71..fea9a7f5989 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -227,8 +227,7 @@ export const Info = Schema.Struct({ permission: Schema.optional(ConfigPermissionV1.Info), tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), web_search: Schema.optional(Schema.Boolean).annotate({ - description: - "Make web search available to models from all providers (default: true). Set to false to limit it to managed providers.", + description: "Make web search available to models from all providers (default: false)", }), // kilocode_change attachment: Schema.optional(ConfigAttachmentV1.Info).annotate({ description: "Attachment processing configuration, including image size limits and resizing behavior", diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index fae54f6b8cb..9dcb20b6e05 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -12,7 +12,7 @@ export function ToolsRoute() { const [search, setSearch] = createSignal("") const snap = () => ctx.data() const websearch = createMemo(() => snap()?.overlay.fields.web_search) - const searchEnabled = createMemo(() => websearch()?.value !== false) + const searchEnabled = createMemo(() => websearch()?.value === true) const rows = createMemo(() => { const data = snap() if (!data) return [] diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx index ca870fef21a..fabc7858b8a 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx @@ -86,7 +86,7 @@ const BrowserTab: Component = () => { description={t("settings.webTools.webSearch.description")} last > - + {t("settings.webTools.webSearch.title")} diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 4f7c275cfa5..4df567dd6bf 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -377,7 +377,7 @@ export const layer: Layer.Layer< const filtered = (yield* all()).filter((tool) => { if (!KiloToolRegistry.available(tool, input.agent)) return false // kilocode_change if (tool.id === WebSearchTool.id) { - if (cfg.web_search !== false) return true // kilocode_change + if (cfg.web_search === true) return true // kilocode_change return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) } diff --git a/packages/opencode/test/kilocode/config/config.test.ts b/packages/opencode/test/kilocode/config/config.test.ts index 39389503067..c384d76dff0 100644 --- a/packages/opencode/test/kilocode/config/config.test.ts +++ b/packages/opencode/test/kilocode/config/config.test.ts @@ -152,10 +152,10 @@ describe("global config updates", () => { }) describe("kilocode web search config", () => { - test("accepts explicitly limiting web search to managed providers", () => { - const config = Schema.decodeUnknownSync(Config.Info)({ web_search: false }) + test("accepts enabling web search for all providers", () => { + const config = Schema.decodeUnknownSync(Config.Info)({ web_search: true }) - expect(config.web_search).toBe(false) + expect(config.web_search).toBe(true) }) }) diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 2420506b9de..97e4e6c51c1 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -125,21 +125,7 @@ const websearch = testEffect( config: { get: () => Effect.succeed({ - provider: { openai: { options: { apiKey: "test-openai-key" } } }, - }), - }, - }), - node, - Agent.defaultLayer, - ), -) -const websearchOff = testEffect( - Layer.mergeAll( - registryLayer({ - config: { - get: () => - Effect.succeed({ - web_search: false, + web_search: true, provider: { openai: { options: { apiKey: "test-openai-key" } } }, }), }, @@ -169,23 +155,7 @@ function sandboxProfile(): Profile { describe("tool.registry", () => { // kilocode_change start - websearch.instance("shows websearch by default for a configured third-party provider", () => - Effect.gen(function* () { - const registry = yield* ToolRegistry.Service - const agent = yield* Agent.Service - const build = yield* agent.get("build") - if (!build) return yield* Effect.die(new Error("build agent not found")) - const tools = yield* registry.tools({ - providerID: ProviderV2.ID.openai, - modelID: ModelV2.ID.make("test"), - agent: build, - }) - - expect(tools.map((tool) => tool.id)).toContain("websearch") - }), - ) - - websearchOff.instance("hides websearch for a configured third-party provider when disabled", () => + it.instance("hides websearch for a third-party provider by default", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service const agent = yield* Agent.Service @@ -201,6 +171,22 @@ describe("tool.registry", () => { }), ) + websearch.instance("shows websearch for a configured third-party provider when enabled", () => + Effect.gen(function* () { + const registry = yield* ToolRegistry.Service + const agent = yield* Agent.Service + const build = yield* agent.get("build") + if (!build) return yield* Effect.die(new Error("build agent not found")) + const tools = yield* registry.tools({ + providerID: ProviderV2.ID.openai, + modelID: ModelV2.ID.make("test"), + agent: build, + }) + + expect(tools.map((tool) => tool.id)).toContain("websearch") + }), + ) + sandboxed.instance("preserves built-in network classification through production tool definition processing", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service