@@ -203,6 +203,91 @@ test("runSubAgent overlaps store creation with workdir setup", async () => {
203203 }
204204} ) ;
205205
206+ test ( "runSubAgent waits for workdir setup after stores resolve" , async ( ) => {
207+ const cwd = await mkdtemp ( join ( tmpdir ( ) , "corbits-run-mkdir-barrier-" ) ) ;
208+ const store = fakeStore ( ) ;
209+ let releaseMkdir : ( ( ) => void ) | undefined ;
210+ let signalMkdirStarted : ( ( ) => void ) | undefined ;
211+ const pendingMkdir = new Promise < void > ( ( resolve ) => {
212+ releaseMkdir = resolve ;
213+ } ) ;
214+ const mkdirStarted = new Promise < void > ( ( resolve ) => {
215+ signalMkdirStarted = resolve ;
216+ } ) ;
217+ let resolveStores :
218+ | ( ( stores : { storage : ContextStore ; audit : AuditStore } ) => void )
219+ | undefined ;
220+ const pendingStores = new Promise < {
221+ storage : ContextStore ;
222+ audit : AuditStore ;
223+ } > ( ( resolve ) => {
224+ resolveStores = resolve ;
225+ } ) ;
226+ let agentStores : { storage : ContextStore ; audit : AuditStore } | undefined ;
227+
228+ try {
229+ await withMockedModuleDuring (
230+ import . meta. resolve ( "node:fs/promises" ) ,
231+ ( real : typeof import ( "node:fs/promises" ) ) => ( {
232+ ...real ,
233+ mkdir : ( ) => {
234+ defined ( signalMkdirStarted , "mkdir start signal" ) ( ) ;
235+ return pendingMkdir ;
236+ } ,
237+ } ) ,
238+ async ( ) => {
239+ await withMockedModuleDuring (
240+ import . meta. resolve ( "../session/optimized-context-store.js" ) ,
241+ ( real : typeof import ( "../session/optimized-context-store.js" ) ) => ( {
242+ ...real ,
243+ createSessionStores : ( ) => pendingStores ,
244+ } ) ,
245+ async ( ) => {
246+ await withMockedModuleDuring (
247+ import . meta. resolve ( "../agent/live-tool-dispatch.js" ) ,
248+ ( real : typeof import ( "../agent/live-tool-dispatch.js" ) ) => ( {
249+ ...real ,
250+ createAgentWithLiveToolDispatch : async (
251+ _def : unknown ,
252+ env : { storage : ContextStore ; audit : AuditStore } ,
253+ ) => {
254+ agentStores = env ;
255+ return stubAgent ( ) as unknown as Awaited <
256+ ReturnType < typeof real . createAgentWithLiveToolDispatch >
257+ > ;
258+ } ,
259+ } ) ,
260+ async ( ) => {
261+ const { runSubAgent } = await import ( "./run.js" ) ;
262+ const run = runSubAgent ( runParams ( cwd , "mkdir-barrier-child" ) ) ;
263+ await mkdirStarted ;
264+
265+ defined (
266+ resolveStores ,
267+ "store resolver" ,
268+ ) ( {
269+ storage : store ,
270+ audit : store ,
271+ } ) ;
272+ await pendingStores ;
273+ expect ( agentStores ) . toBeUndefined ( ) ;
274+
275+ defined ( releaseMkdir , "mkdir resolver" ) ( ) ;
276+ await run ;
277+ expect ( defined ( agentStores ) . storage ) . toBe ( store ) ;
278+ expect ( defined ( agentStores ) . audit ) . toBe ( store ) ;
279+ } ,
280+ ) ;
281+ } ,
282+ ) ;
283+ } ,
284+ ) ;
285+ } finally {
286+ releaseMkdir ?.( ) ;
287+ await rm ( cwd , { recursive : true , force : true } ) ;
288+ }
289+ } ) ;
290+
206291test ( "runSubAgent keeps session stores isolated between workers" , async ( ) => {
207292 const cwd = await mkdtemp ( join ( tmpdir ( ) , "corbits-run-store-isolation-" ) ) ;
208293 const storesBySession = new Map < string , ContextStore & AuditStore > ( ) ;
0 commit comments