From 989ddefa098ee2fafe155ffe93a24af796df2537 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sat, 28 Mar 2026 15:10:57 -0700 Subject: [PATCH] Guard Claude stream exit handling - Prevent stream exit handling from racing with stopped sessions - Clear the active stream fiber only for the current stream --- .../src/provider/Layers/ClaudeAdapter.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.ts b/apps/server/src/provider/Layers/ClaudeAdapter.ts index b0f080118e..6b50bd4fbb 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.ts @@ -2817,16 +2817,25 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* ( providerRefs: {}, }); - const streamFiber = runFork(runSdkStream(context)); + let streamFiber: Fiber.Fiber; + streamFiber = runFork( + Effect.exit(runSdkStream(context)).pipe( + Effect.flatMap((exit) => { + if (context.stopped) { + return Effect.void; + } + if (context.streamFiber === streamFiber) { + context.streamFiber = undefined; + } + return handleStreamExit(context, exit); + }), + ), + ); context.streamFiber = streamFiber; - streamFiber.addObserver((exit) => { - if (context.stopped) { - return; - } + streamFiber.addObserver(() => { if (context.streamFiber === streamFiber) { context.streamFiber = undefined; } - runFork(handleStreamExit(context, exit)); }); return {