From 2a33addd290cba71a408a133a6780b311a0d3459 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:44:25 -0500 Subject: [PATCH] fix(opencode): avoid shell cancel race (#30641) --- packages/opencode/src/session/run-state.ts | 2 +- packages/opencode/test/session/prompt.test.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/session/run-state.ts b/packages/opencode/src/session/run-state.ts index 882817814..76f2e738a 100644 --- a/packages/opencode/src/session/run-state.ts +++ b/packages/opencode/src/session/run-state.ts @@ -78,7 +78,7 @@ export const layer = Layer.effect( yield* cancelBackgroundJobs(background, sessionID) const data = yield* InstanceState.get(state) const existing = data.runners.get(sessionID) - if (!existing || !existing.busy) { + if (!existing) { yield* status.set(sessionID, { type: "idle" }) return } diff --git a/packages/opencode/test/session/prompt.test.ts b/packages/opencode/test/session/prompt.test.ts index cac9ada02..5e97e850b 100644 --- a/packages/opencode/test/session/prompt.test.ts +++ b/packages/opencode/test/session/prompt.test.ts @@ -320,10 +320,9 @@ const useServerConfig = Effect.fn("test.useServerConfig")(function* (config: (ur return { dir, llm } }) -// Wait for a session's runner to enter a busy state. SessionStatus is flipped to -// "busy" inside Runner.startShell's modifyEffect at the same moment the runner -// is registered, so this is a deterministic readiness signal — cancel can't -// no-op once we observe it. +// Wait for a session's runner to enter a busy state. SessionStatus is flipped +// inside Runner.startShell's serialized transition, so cancel can't no-op once +// we observe it. const waitForBusy = (sessionID: SessionID, duration: Duration.Input = "2 seconds") => pollWithTimeout( Effect.gen(function* () {