From edd8aa2f4ed6a781382d91d387036b4e151b07db Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 30 May 2026 19:21:17 -0400 Subject: [PATCH] fix(agents): clamp embedded run drain polling --- src/agents/embedded-agent-runner/runs.test.ts | 22 +++++++++++++++++++ src/agents/embedded-agent-runner/runs.ts | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/agents/embedded-agent-runner/runs.test.ts b/src/agents/embedded-agent-runner/runs.test.ts index 5bf19a9e99e..dab7e153bfc 100644 --- a/src/agents/embedded-agent-runner/runs.test.ts +++ b/src/agents/embedded-agent-runner/runs.test.ts @@ -393,6 +393,28 @@ describe("embedded-agent runner run registry", () => { } }); + it("clamps oversized active-run drain poll intervals", async () => { + vi.useFakeTimers(); + try { + const setTimeoutSpy = vi.spyOn(globalThis, "setTimeout"); + const handle = createRunHandle(); + setActiveEmbeddedRun("session-a", handle); + + const waitPromise = waitForActiveEmbeddedRuns(undefined, { + pollMs: Number.MAX_SAFE_INTEGER, + }); + await Promise.resolve(); + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), MAX_TIMER_TIMEOUT_MS); + clearActiveEmbeddedRun("session-a", handle); + await vi.advanceTimersByTimeAsync(MAX_TIMER_TIMEOUT_MS); + await expect(waitPromise).resolves.toEqual({ drained: true }); + } finally { + await vi.runOnlyPendingTimersAsync(); + vi.useRealTimers(); + } + }); + it("shares active run state across distinct module instances", async () => { const runsA = await importFreshModule( import.meta.url, diff --git a/src/agents/embedded-agent-runner/runs.ts b/src/agents/embedded-agent-runner/runs.ts index a2a3a832d00..446a8aa4409 100644 --- a/src/agents/embedded-agent-runner/runs.ts +++ b/src/agents/embedded-agent-runner/runs.ts @@ -617,7 +617,7 @@ export async function waitForActiveEmbeddedRuns( opts?: { pollMs?: number }, ): Promise<{ drained: boolean }> { const pollMsRaw = opts?.pollMs ?? 250; - const pollMs = Math.max(10, Math.floor(pollMsRaw)); + const pollMs = resolveTimerTimeoutMs(pollMsRaw, 250, 10); if (timeoutMs !== undefined && timeoutMs <= 0) { return { drained: getActiveEmbeddedRunCount() === 0 }; }