diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts index 5f2caa3f3e26a..0c61165924917 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts @@ -1008,12 +1008,9 @@ describe("ClaudeAdapterV2 approval cancellation", () => { decision: ProviderApprovalDecision; feedback?: string; }>(); - const controller = new AbortController(); - controller.abort(); - const result = yield* ClaudeAdapterV2.awaitClaudeApprovalDecision( decision, - controller.signal, + AbortSignal.abort(), ); assert.deepEqual(result, { decision: "cancel" }); @@ -1364,14 +1361,14 @@ describe("ClaudeAdapterV2 resume compaction", () => { Stream.runHead, Effect.forkScoped, ); - const controller = new AbortController(); + const signal = yield* Effect.abortSignal; const dialog = yield* Effect.promise(() => callback!( { dialogKind: "resume_return", payload: { sessionAgeMinutes: 90, estimatedTokens: 120000 }, }, - { signal: controller.signal, requestId: "dialog-resume-1" }, + { signal, requestId: "dialog-resume-1" }, ), ).pipe(Effect.forkScoped); const event = yield* Fiber.join(requestEvent); @@ -1387,8 +1384,6 @@ describe("ClaudeAdapterV2 resume compaction", () => { }); assert.deepEqual(yield* Fiber.join(dialog), { behavior: "completed", result: "compact" }); - const cancelledController = new AbortController(); - cancelledController.abort(); assert.deepEqual( yield* Effect.promise(() => callback!( @@ -1396,7 +1391,7 @@ describe("ClaudeAdapterV2 resume compaction", () => { dialogKind: "resume_return", payload: { sessionAgeMinutes: 90, estimatedTokens: 120000 }, }, - { signal: cancelledController.signal, requestId: "dialog-resume-2" }, + { signal: AbortSignal.abort(), requestId: "dialog-resume-2" }, ), ), { behavior: "cancelled" }, diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAgentSdkQueryRunner.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAgentSdkQueryRunner.test.ts index 2ba8f78c451b5..5723c488d8889 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAgentSdkQueryRunner.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAgentSdkQueryRunner.test.ts @@ -196,6 +196,7 @@ describe.skipIf(HostProcess.Platform.defaultValue() === "win32")("Claude CLI pro args: [], cwd: dir, env: process.env, + // @effect-diagnostics-next-line abortControllerInEffect:off - This crash fixture closes pipes itself; aborting on test teardown raises an unrelated process error. signal: new AbortController().signal, }) as NodeChildProcess.ChildProcess; yield* Effect.addFinalizer(() => diff --git a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts index 934805ac30fea..bde3af2c2aea9 100644 --- a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts +++ b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts @@ -139,6 +139,7 @@ it.effect.each(deliveries)( const sdkMessages = yield* Queue.unbounded(); const offers: SDKUserMessage[] = []; const nativeQueue: SDKUserMessage[] = []; + // @effect-diagnostics-next-line abortControllerInEffect:off - The fake SDK interrupts its batch independently of the test fiber. const batchAbort = new AbortController(); const adapter = yield* ClaudeAdapterV2.makeClaudeAdapterV2({ instanceId: modelSelection.instanceId, diff --git a/packages/provider-opencode/src/server/adapter.ts b/packages/provider-opencode/src/server/adapter.ts index a81a1e65d8a91..c9f95ba6298ed 100644 --- a/packages/provider-opencode/src/server/adapter.ts +++ b/packages/provider-opencode/src/server/adapter.ts @@ -983,6 +983,7 @@ export const makeOpenCodeAdapterV2 = Effect.fn("makeOpenCodeAdapterV2")(function if (settledNativeRequestIds.size >= 2_048) settledNativeRequestIds.clear(); settledNativeRequestIds.add(nativeRequestId); }; + // @effect-diagnostics-next-line abortControllerInEffect:off - Session closure aborts this stream independently of the creation fiber. const abortController = new AbortController(); let closing = false; let hasConnected = false; @@ -3159,6 +3160,7 @@ export const makeOpenCodeAdapterV2 = Effect.fn("makeOpenCodeAdapterV2")(function admissionMessageObserved: false, idleDuringAdmission: false, admissionSettled: Deferred.makeUnsafe(), + // @effect-diagnostics-next-line abortControllerInEffect:off - Turn interruption owns prompt admission cancellation. admissionAbortController: new AbortController(), }; if (turn.admissionMessageId !== null) @@ -3325,6 +3327,7 @@ export const makeOpenCodeAdapterV2 = Effect.fn("makeOpenCodeAdapterV2")(function turn.admissionMessageObserved = false; turn.idleDuringAdmission = false; turn.admissionSettled = Deferred.makeUnsafe(); + // @effect-diagnostics-next-line abortControllerInEffect:off - Steering replaces the admission request independently of this command fiber. turn.admissionAbortController = new AbortController(); if (turn.admissionMessageId !== null) turn.usage.promptMessageIds.add(turn.admissionMessageId); diff --git a/tsconfig.base.json b/tsconfig.base.json index d1e755d99c6be..b69040ba5c673 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -24,6 +24,7 @@ "namespaceImportPackages": ["@effect/platform-node", "effect"], "effectFn": ["span", "inferred-span", "suggested-span"], "diagnosticSeverity": { + "abortControllerInEffect": "error", "runEffectInsideEffect": "error", "flatMapConditionalToFilterOrFail": "error", "catchConditionalRefailToCatchIf": "error",