From 633b5d62084743a33a403c7bc9b0dbfddf625236 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Mon, 25 May 2026 16:42:34 -0500 Subject: [PATCH] fix: allow experimental flags to override umbrella (#29273) --- packages/core/src/flag/flag.ts | 6 +++++- packages/opencode/src/effect/runtime-flags.ts | 6 ++++-- .../opencode/test/effect/runtime-flags.test.ts | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index 54f2445e00..504e156ac2 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -8,6 +8,10 @@ function truthy(key: string) { const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL") const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"] +function enabledByExperimental(key: string) { + return process.env[key] === undefined ? OPENCODE_EXPERIMENTAL : truthy(key) +} + export const Flag = { OTEL_EXPORTER_OTLP_ENDPOINT: process.env["OTEL_EXPORTER_OTLP_ENDPOINT"], OTEL_EXPORTER_OTLP_HEADERS: process.env["OTEL_EXPORTER_OTLP_HEADERS"], @@ -42,7 +46,7 @@ export const Flag = { OPENCODE_DB: process.env["OPENCODE_DB"], OPENCODE_WORKSPACE_ID: process.env["OPENCODE_WORKSPACE_ID"], - OPENCODE_EXPERIMENTAL_WORKSPACES: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES"), + OPENCODE_EXPERIMENTAL_WORKSPACES: enabledByExperimental("OPENCODE_EXPERIMENTAL_WORKSPACES"), // Evaluated at access time (not module load) because tests, the CLI, and // external tooling set these env vars at runtime. diff --git a/packages/opencode/src/effect/runtime-flags.ts b/packages/opencode/src/effect/runtime-flags.ts index 520bcb30f8..b12a5d5707 100644 --- a/packages/opencode/src/effect/runtime-flags.ts +++ b/packages/opencode/src/effect/runtime-flags.ts @@ -1,4 +1,4 @@ -import { Config, ConfigProvider, Context, Effect, Layer } from "effect" +import { Config, ConfigProvider, Context, Effect, Layer, Option } from "effect" import { ConfigService } from "@/effect/config-service" const bool = (name: string) => Config.boolean(name).pipe(Config.withDefault(false)) @@ -9,7 +9,9 @@ const positiveInteger = (name: string) => ) const experimental = bool("OPENCODE_EXPERIMENTAL") const enabledByExperimental = (name: string) => - Config.all({ experimental, enabled: bool(name) }).pipe(Config.map((flags) => flags.experimental || flags.enabled)) + Config.all({ experimental, enabled: Config.boolean(name).pipe(Config.option) }).pipe( + Config.map((flags) => Option.getOrElse(flags.enabled, () => flags.experimental)), + ) export class Service extends ConfigService.Service()("@opencode/RuntimeFlags", { autoShare: bool("OPENCODE_AUTO_SHARE"), diff --git a/packages/opencode/test/effect/runtime-flags.test.ts b/packages/opencode/test/effect/runtime-flags.test.ts index 0c913979f8..b044d07f23 100644 --- a/packages/opencode/test/effect/runtime-flags.test.ts +++ b/packages/opencode/test/effect/runtime-flags.test.ts @@ -213,6 +213,21 @@ describe("RuntimeFlags", () => { }), ) + it.effect("specific experimental flags override OPENCODE_EXPERIMENTAL", () => + Effect.gen(function* () { + const flags = yield* readFlags.pipe( + Effect.provide( + fromConfig({ + OPENCODE_EXPERIMENTAL: "true", + OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: "false", + }), + ), + ) + + expect(flags.experimentalIconDiscovery).toBe(false) + }), + ) + it.effect("experimentalOxfmt defaults to false", () => Effect.gen(function* () { const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))