@@ -60,6 +60,7 @@ import * as Option from "effect/Option";
6060import * as Path from "effect/Path";
6161import * as Queue from "effect/Queue";
6262import * as Schema from "effect/Schema";
63+ import * as Scheduler from "effect/Scheduler";
6364import * as Scope from "effect/Scope";
6465import * as Stream from "effect/Stream";
6566import * as TestClock from "effect/testing/TestClock";
@@ -9002,6 +9003,53 @@ describe("ClaudeAdapterV2 background wake turns", () => {
90029003 ),
90039004 );
90049005
9006+ it.effect.each([1, 2, 3, 4, 5, 6, 7, 8])(
9007+ "accepts completion during Stop at scheduler step %s",
9008+ (pauseAt) =>
9009+ Effect.scoped(
9010+ Effect.gen(function* () {
9011+ const fixture = yield* makeStopFixture();
9012+ const resumptions = yield* Queue.unbounded<() => void>();
9013+ const scheduler = yield* Scheduler.Scheduler;
9014+ const dispatcher = scheduler.makeDispatcher();
9015+ let checks = 0;
9016+ // Pause Stop before its SDK request and deliver the outcome while it is suspended.
9017+ const stopping = yield* fixture.stop().pipe(
9018+ Effect.provideService(Scheduler.Scheduler, {
9019+ executionMode: scheduler.executionMode,
9020+ shouldYield: () => ++checks === pauseAt,
9021+ makeDispatcher: () => ({
9022+ scheduleTask: (task, priority) => {
9023+ if (checks === pauseAt) Queue.offerUnsafe(resumptions, task);
9024+ else dispatcher.scheduleTask(task, priority);
9025+ },
9026+ flush: () => dispatcher.flush(),
9027+ }),
9028+ }),
9029+ Effect.exit,
9030+ Effect.forkScoped,
9031+ );
9032+ const resume = yield* Queue.take(resumptions);
9033+ yield* fixture.notify("completed");
9034+ const completed = yield* Queue.take(fixture.subagentReceipts);
9035+ yield* Effect.sync(resume);
9036+ yield* TestClock.adjust("2 seconds");
9037+ assert.deepEqual(
9038+ yield* Fiber.join(stopping),
9039+ Exit.succeed({
9040+ status: "completed" as const,
9041+ completedAt: completed.subagent.completedAt!,
9042+ result: "Native outcome.",
9043+ }),
9044+ );
9045+ }).pipe(
9046+ Effect.provide(
9047+ Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
9048+ ),
9049+ ),
9050+ ),
9051+ );
9052+
90059053 it.effect("retains native confirmation after the synchronous Agent tool result", () =>
90069054 Effect.scoped(
90079055 Effect.gen(function* () {
0 commit comments