Skip to content

Commit 46dd19f

Browse files
committed
test(subagent): pin workdir setup barrier
1 parent fd20db0 commit 46dd19f

1 file changed

Lines changed: 85 additions & 0 deletions

File tree

‎src/subagent/run-audit-store.test.ts‎

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
206291
test("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

Comments
 (0)