From 4e29d24189d8b67d1d13c96597d2f37d8ce57108 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 7 Jun 2026 03:10:27 +0000 Subject: [PATCH 1/2] Allow slower Windows job helper startup Co-authored-by: Serhii Vecherenko --- src/main/windowsJobObject.test.ts | 29 ++++++++++++++++++++++++++++- src/main/windowsJobObject.ts | 2 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/windowsJobObject.test.ts b/src/main/windowsJobObject.test.ts index f43c3e19..f132167f 100644 --- a/src/main/windowsJobObject.test.ts +++ b/src/main/windowsJobObject.test.ts @@ -70,7 +70,7 @@ function createMockChild() { return child; } -describe.skipIf(process.platform !== "win32")("WindowsJobObjectManager", () => { +describe("WindowsJobObjectManager", () => { const platformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); beforeEach(() => { @@ -138,6 +138,33 @@ describe.skipIf(process.platform !== "win32")("WindowsJobObjectManager", () => { await expect(pending).rejects.toThrow(/failed to start/i); }); + it("allows slow helper startup beyond the old five second watchdog", async () => { + vi.useFakeTimers(); + const child = createMockChild(); + spawnMock.mockReturnValue(child); + + const manager = new WindowsJobObjectManager(); + const pending = manager.start(); + + await vi.advanceTimersByTimeAsync(5_000); + child.stdout.write('{"type":"ready"}\n'); + + await expect(pending).resolves.toBeUndefined(); + }); + + it("rejects startup when the helper never becomes ready", async () => { + vi.useFakeTimers(); + const child = createMockChild(); + spawnMock.mockReturnValue(child); + + const manager = new WindowsJobObjectManager(); + const pending = manager.start(); + + await vi.advanceTimersByTimeAsync(30_000); + + await expect(pending).rejects.toThrow(/timed out after 30000ms/i); + }); + it("sends an exit command and ends stdin on dispose", async () => { const child = createMockChild(); const writes: string[] = []; diff --git a/src/main/windowsJobObject.ts b/src/main/windowsJobObject.ts index b1f7d782..9f1157f9 100644 --- a/src/main/windowsJobObject.ts +++ b/src/main/windowsJobObject.ts @@ -25,7 +25,7 @@ interface HelperErrorMessage { type HelperMessage = HelperReadyMessage | HelperAssignedMessage | HelperErrorMessage; -const START_TIMEOUT_MS = 5_000; +const START_TIMEOUT_MS = 30_000; const DISPOSE_GRACE_MS = 500; function buildHelperScript(): string { From 4d1042c0ae3102c2dc72aff5e4875b58f11631b5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 7 Jun 2026 03:11:56 +0000 Subject: [PATCH 2/2] Stabilize Windows job helper timeout test --- src/main/windowsJobObject.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/windowsJobObject.test.ts b/src/main/windowsJobObject.test.ts index f132167f..3e7779b9 100644 --- a/src/main/windowsJobObject.test.ts +++ b/src/main/windowsJobObject.test.ts @@ -159,10 +159,16 @@ describe("WindowsJobObjectManager", () => { const manager = new WindowsJobObjectManager(); const pending = manager.start(); + let startupError: unknown; + const handledPending = pending.catch((error: unknown) => { + startupError = error; + }); await vi.advanceTimersByTimeAsync(30_000); - await expect(pending).rejects.toThrow(/timed out after 30000ms/i); + await handledPending; + expect(startupError).toBeInstanceOf(Error); + expect((startupError as Error).message).toMatch(/timed out after 30000ms/i); }); it("sends an exit command and ends stdin on dispose", async () => {