diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index f85175cb7909..ad1aab39185e 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -179,6 +179,9 @@ export const Info = Schema.Struct({ policies: Schema.optional(Schema.mutable(Schema.Array(ConfigExperimental.Policy))).annotate({ description: "Policy statements applied to supported resources, such as provider access", }), + enable_exa: Schema.optional(Schema.Boolean).annotate({ + description: "Enable experimental Exa features", + }), }), ), }).annotate({ identifier: "Config" }) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 2527303d92b5..74470e10499c 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -20,6 +20,7 @@ import { InstanceState } from "@/effect/instance-state" import { Context, Duration, Effect, Exit, Fiber, Layer, Option, Schema } from "effect" import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http" import { EffectFlock } from "@opencode-ai/core/util/effect-flock" +import { makeRuntime } from "@/effect/run-service" import { containsPath, type InstanceContext } from "../project/instance-context" import { ConfigV1 } from "@opencode-ai/core/v1/config/config" import { ConfigPermissionV1 } from "@opencode-ai/core/v1/config/permission" @@ -676,4 +677,19 @@ export const defaultLayer = layer.pipe( Layer.provide(FetchHttpClient.layer), ) +const { runPromise } = makeRuntime(Service, defaultLayer) + +export async function experimentalEnableExa(): Promise { + if (envTruthy("OPENCODE_EXPERIMENTAL") || envTruthy("OPENCODE_ENABLE_EXA") || envTruthy("OPENCODE_EXPERIMENTAL_EXA")) { + return true + } + const config = await runPromise((svc) => svc.get()) + return config.experimental?.enable_exa === true +} + +function envTruthy(key: string) { + const value = process.env[key]?.toLowerCase() + return value === "true" || value === "1" +} + export * as Config from "./config" diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 68b3245233d1..c8e29c49e35b 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -311,9 +311,13 @@ export const layer: Layer.Layer< }) const tools: Interface["tools"] = Effect.fn("ToolRegistry.tools")(function* (input) { + const cfg = yield* config.get() const filtered = (yield* all()).filter((tool) => { if (tool.id === WebSearchTool.id) { - return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) + return webSearchEnabled(input.providerID, { + exa: flags.enableExa || cfg.experimental?.enable_exa === true, + parallel: flags.enableParallel, + }) } const usePatch =