From 541b4d94d550680306c1d5aa52624af5d533c048 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 25 May 2026 16:35:33 -0500 Subject: [PATCH 1/2] fix: allow experimental flags to override umbrella --- packages/core/src/flag/flag.ts | 4 +++- packages/opencode/src/effect/runtime-flags.ts | 6 ++++-- .../opencode/test/effect/runtime-flags.test.ts | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index 54f2445e00d1..d495be8e1277 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -7,6 +7,7 @@ function truthy(key: string) { const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL") const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"] +const workspaces = process.env["OPENCODE_EXPERIMENTAL_WORKSPACES"] export const Flag = { OTEL_EXPORTER_OTLP_ENDPOINT: process.env["OTEL_EXPORTER_OTLP_ENDPOINT"], @@ -42,7 +43,8 @@ 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: + workspaces === undefined ? OPENCODE_EXPERIMENTAL : truthy("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 520bcb30f893..b12a5d5707c4 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 0c913979f875..b044d07f23e1 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({}))) From 66503b32e4fe2af882c06e502249e311ab7b6329 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 25 May 2026 16:36:37 -0500 Subject: [PATCH 2/2] refactor(core): extract experimental flag helper --- packages/core/src/flag/flag.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index d495be8e1277..504e156ac2f1 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -7,7 +7,10 @@ function truthy(key: string) { const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL") const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"] -const workspaces = process.env["OPENCODE_EXPERIMENTAL_WORKSPACES"] + +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"], @@ -43,8 +46,7 @@ export const Flag = { OPENCODE_DB: process.env["OPENCODE_DB"], OPENCODE_WORKSPACE_ID: process.env["OPENCODE_WORKSPACE_ID"], - OPENCODE_EXPERIMENTAL_WORKSPACES: - workspaces === undefined ? 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.