From 8eae3a287e3ec0970e00cca3918c3a7c6095b4bb Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 30 Apr 2026 21:03:14 -0400 Subject: [PATCH 1/2] refactor(session): yield instance context in llm --- packages/opencode/src/session/llm.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index b8b8911858..58677debc0 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -7,7 +7,7 @@ import { mergeDeep, pipe } from "remeda" import { GitLabWorkflowLanguageModel } from "gitlab-ai-provider" import { ProviderTransform } from "@/provider/transform" import { Config } from "@/config/config" -import { Instance } from "@/project/instance" +import { InstanceState } from "@/effect/instance-state" import type { Agent } from "@/agent/agent" import type { MessageV2 } from "./message-v2" import { Plugin } from "@/plugin" @@ -268,7 +268,7 @@ const live: Layer.Layer< const bridge = yield* EffectBridge.make() const approvedToolsForSession = new Set() - workflowModel.approvalHandler = Instance.bind(async (approvalTools) => { + workflowModel.approvalHandler = InstanceState.bind(async (approvalTools) => { const uniqueNames = [...new Set(approvalTools.map((t: { name: string }) => t.name))] as string[] // Auto-approve tools that were already approved in this session // (prevents infinite approval loops for server-side MCP tools) @@ -330,6 +330,10 @@ const live: Layer.Layer< }) : undefined + const opencodeProjectID = input.model.providerID.startsWith("opencode") + ? (yield* InstanceState.context).project.id + : undefined + return streamText({ onError(error) { l.error("stream error", { @@ -369,7 +373,7 @@ const live: Layer.Layer< headers: { ...(input.model.providerID.startsWith("opencode") ? { - "x-opencode-project": Instance.project.id, + "x-opencode-project": opencodeProjectID, "x-opencode-session": input.sessionID, "x-opencode-request": input.user.id, "x-opencode-client": Flag.OPENCODE_CLIENT, From 2d116655c4c10dc0c985971b3522d5c65a080203 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 30 Apr 2026 21:30:30 -0400 Subject: [PATCH 2/2] test(effect): stabilize runner active shell check --- packages/opencode/test/effect/runner.test.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/opencode/test/effect/runner.test.ts b/packages/opencode/test/effect/runner.test.ts index 97ca9f6161..0f5783bfc4 100644 --- a/packages/opencode/test/effect/runner.test.ts +++ b/packages/opencode/test/effect/runner.test.ts @@ -263,14 +263,25 @@ describe("Runner", () => { Effect.gen(function* () { const s = yield* Scope.Scope const runner = Runner.make(s) - const fiber = yield* runner.ensureRunning(Effect.never.pipe(Effect.as("x"))).pipe(Effect.forkChild) - yield* Effect.sleep("10 millis") + const started = yield* Deferred.make() + const fiber = yield* runner + .ensureRunning( + Effect.gen(function* () { + yield* Deferred.succeed(started, undefined) + return yield* Effect.never.pipe(Effect.as("x")) + }), + ) + .pipe(Effect.forkChild) + yield* Deferred.await(started).pipe(Effect.timeout("250 millis")) + yield* Effect.gen(function* () { + while (runner.state._tag !== "Running") yield* Effect.yieldNow + }).pipe(Effect.timeout("250 millis")) const exit = yield* runner.startShell(Effect.succeed("nope")).pipe(Effect.exit) expect(Exit.isFailure(exit)).toBe(true) yield* runner.cancel - yield* Fiber.await(fiber) + yield* Fiber.await(fiber).pipe(Effect.timeout("250 millis")) }), )