Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/core/src/v1/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" })
Expand Down
16 changes: 16 additions & 0 deletions packages/opencode/src/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -676,4 +677,19 @@ export const defaultLayer = layer.pipe(
Layer.provide(FetchHttpClient.layer),
)

const { runPromise } = makeRuntime(Service, defaultLayer)

export async function experimentalEnableExa(): Promise<boolean> {
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"
6 changes: 5 additions & 1 deletion packages/opencode/src/tool/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down