From bf21d108f1510190eb0de25cd30ff2769dcd128c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 27 Apr 2026 16:41:11 +0200 Subject: [PATCH] fix(env): proxy directly to process.env instead of snapshotting --- packages/opencode/src/config/config.ts | 1 - packages/opencode/src/env/index.ts | 31 ++++++++++------------ packages/opencode/src/provider/provider.ts | 4 --- packages/opencode/test/preload.ts | 14 ++++++++++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 1b6b58500707..69c9279ecb19 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -603,7 +603,6 @@ export const layer = Layer.effect( { concurrency: 2 }, ) if (Option.isSome(tokenOpt)) { - process.env["OPENCODE_CONSOLE_TOKEN"] = tokenOpt.value yield* env.set("OPENCODE_CONSOLE_TOKEN", tokenOpt.value) } diff --git a/packages/opencode/src/env/index.ts b/packages/opencode/src/env/index.ts index a53d96def259..56acf3dcbb4b 100644 --- a/packages/opencode/src/env/index.ts +++ b/packages/opencode/src/env/index.ts @@ -1,5 +1,4 @@ import { Context, Effect, Layer } from "effect" -import { InstanceState } from "@/effect" type State = Record @@ -12,23 +11,21 @@ export interface Interface { export class Service extends Context.Service()("@opencode/Env") {} -export const layer = Layer.effect( +export const layer = Layer.succeed( Service, - Effect.gen(function* () { - const state = yield* InstanceState.make(Effect.fn("Env.state")(() => Effect.succeed({ ...process.env }))) - - const get = Effect.fn("Env.get")((key: string) => InstanceState.use(state, (env) => env[key])) - const all = Effect.fn("Env.all")(() => InstanceState.get(state)) - const set = Effect.fn("Env.set")(function* (key: string, value: string) { - const env = yield* InstanceState.get(state) - env[key] = value - }) - const remove = Effect.fn("Env.remove")(function* (key: string) { - const env = yield* InstanceState.get(state) - delete env[key] - }) - - return Service.of({ get, all, set, remove }) + Service.of({ + get: Effect.fn("Env.get")((key: string) => Effect.sync(() => process.env[key])), + all: Effect.fn("Env.all")(() => Effect.sync(() => ({ ...process.env }) as State)), + set: Effect.fn("Env.set")((key: string, value: string) => + Effect.sync(() => { + process.env[key] = value + }), + ), + remove: Effect.fn("Env.remove")((key: string) => + Effect.sync(() => { + delete process.env[key] + }), + ), }), ) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 9aa1b6304c12..b3568501cd53 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -257,8 +257,6 @@ function custom(dep: CustomDep): Record { const awsAccessKeyId = env["AWS_ACCESS_KEY_ID"] - // TODO: Using process.env directly because Env.set only updates a process.env shallow copy, - // until the scope of the Env API is clarified (test only or runtime?) const awsBearerToken = iife(() => { const envToken = process.env.AWS_BEARER_TOKEN_BEDROCK if (envToken) return envToken @@ -496,8 +494,6 @@ function custom(dep: CustomDep): Record { }), "sap-ai-core": Effect.fnUntraced(function* () { const auth = yield* dep.auth("sap-ai-core") - // TODO: Using process.env directly because Env.set only updates a shallow copy (not process.env), - // until the scope of the Env API is clarified (test only or runtime?) const envServiceKey = iife(() => { const envAICoreServiceKey = process.env.AICORE_SERVICE_KEY if (envAICoreServiceKey) return envAICoreServiceKey diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index 58dc2b0b48c5..0684e7b826f4 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -61,6 +61,10 @@ delete process.env["AWS_ACCESS_KEY_ID"] delete process.env["AWS_PROFILE"] delete process.env["AWS_REGION"] delete process.env["AWS_BEARER_TOKEN_BEDROCK"] +delete process.env["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"] +delete process.env["AWS_CONTAINER_CREDENTIALS_FULL_URI"] +delete process.env["AWS_WEB_IDENTITY_TOKEN_FILE"] +delete process.env["AWS_ROLE_ARN"] delete process.env["OPENROUTER_API_KEY"] delete process.env["LLM_GATEWAY_API_KEY"] delete process.env["GROQ_API_KEY"] @@ -72,6 +76,16 @@ delete process.env["DEEPSEEK_API_KEY"] delete process.env["FIREWORKS_API_KEY"] delete process.env["CEREBRAS_API_KEY"] delete process.env["SAMBANOVA_API_KEY"] +delete process.env["AICORE_SERVICE_KEY"] +delete process.env["AICORE_DEPLOYMENT_ID"] +delete process.env["AICORE_RESOURCE_GROUP"] +delete process.env["GOOGLE_APPLICATION_CREDENTIALS"] +delete process.env["CLOUDFLARE_ACCOUNT_ID"] +delete process.env["CLOUDFLARE_GATEWAY_ID"] +delete process.env["CLOUDFLARE_API_TOKEN"] +delete process.env["SINGLE_ENV_KEY"] +delete process.env["MULTI_ENV_KEY_1"] +delete process.env["FALLBACK_KEY"] delete process.env["OPENCODE_SERVER_PASSWORD"] delete process.env["OPENCODE_SERVER_USERNAME"]