Skip to content

Commit 178b089

Browse files
author
PR Batch Tester
committed
test(server): wait for caller resolution before advancing time
1 parent 9be0d34 commit 178b089

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

‎apps/server/src/mcp/NativeSubagentDelegation.integration.test.ts‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ const makeHarness = (name: string) =>
212212
const interrupts: Array<ThreadId | null> = [];
213213
// The MCP service subscribes to stored events when it starts waiting; tests wait on that.
214214
const streamCalls = yield* Queue.unbounded<StreamCall>();
215+
const callerResolutions = yield* Queue.unbounded<string>();
215216
const layerAdapters = ProviderAdapterRegistry.layerSingle(
216217
makeAdapter(cwd, turns, stops, interrupts),
217218
);
@@ -240,11 +241,26 @@ const makeHarness = (name: string) =>
240241
),
241242
),
242243
);
244+
const layerMcpSessions = Layer.effect(
245+
McpProviderSessions.McpProviderSessions,
246+
Effect.map(McpProviderSessions.McpProviderSessions, (sessions) => ({
247+
...sessions,
248+
resolveNativeCaller: (input) =>
249+
Effect.gen(function* () {
250+
// The registry does no I/O before suspending on its caller wait.
251+
const caller = yield* Effect.forkChild(sessions.resolveNativeCaller(input), {
252+
startImmediately: true,
253+
});
254+
yield* Queue.offer(callerResolutions, input.callId);
255+
return yield* Fiber.join(caller);
256+
}),
257+
})),
258+
).pipe(Layer.provide(McpProviderSessions.layer));
243259
const layerTest = OrchestratorMcpService.layer.pipe(
244260
Layer.provide(Layer.mock(ThreadLaunchService.ThreadLaunchService)({})),
245261
Layer.provide(Layer.mock(GitVcsDriver.GitVcsDriver)({})),
246262
Layer.provideMerge(Layer.merge(layerOrchestrator, layerThreads)),
247-
Layer.provideMerge(McpProviderSessions.layer),
263+
Layer.provideMerge(layerMcpSessions),
248264
Layer.provide(
249265
Layer.mergeAll(
250266
layerAdapters,
@@ -532,6 +548,11 @@ const makeHarness = (name: string) =>
532548
listed,
533549
childTurn,
534550
nextStreamCall,
551+
nextCallerResolution: (callId: string) =>
552+
Stream.fromQueue(callerResolutions).pipe(
553+
Stream.filter((resolved) => resolved === callId),
554+
Stream.runHead,
555+
),
535556
};
536557
}).pipe(Effect.provide(context));
537558
});
@@ -670,6 +691,7 @@ it.effect(
670691
const unbound = yield* Effect.forkChild(
671692
Effect.exit(h.delegate(scope("claude-tool:nobody"), "x")),
672693
);
694+
yield* h.nextCallerResolution("claude-tool:nobody");
673695
yield* TestClock.adjust("5 seconds");
674696
assert.isTrue(Exit.isFailure(yield* Fiber.join(unbound)));
675697

0 commit comments

Comments
 (0)