@@ -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