From cba399e2460b442b29c1f3c2a326f1b1efac2693 Mon Sep 17 00:00:00 2001 From: Vadym O Date: Wed, 11 Nov 2026 07:27:51 +0800 Subject: [PATCH 1/2] test(ci): reap the cold-spawn descendant before the test ends The descendant-holding-pipes test left a detached grandchild alive for about 3 s into the next file of the same Bun process. In run 42898913860 shard 1/4 batch 4 hung in that next file's Bun.spawnSync git call on both attempts until the 120 s batch timeout. The test now parses the grandchild pid, kills it, and asserts it is gone before the test ends. Co-Authored-By: Claude Code --- tests/ci-workflows/cold-spawn-warmup.test.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/ci-workflows/cold-spawn-warmup.test.ts b/tests/ci-workflows/cold-spawn-warmup.test.ts index 7a3cdb62024..2fff53ab6d3 100644 --- a/tests/ci-workflows/cold-spawn-warmup.test.ts +++ b/tests/ci-workflows/cold-spawn-warmup.test.ts @@ -289,18 +289,27 @@ describe("warm-up failure policy", () => { // convert it into an unbounded wait, so exit starts a reap grace instead. const script = [ 'const { spawn } = require("node:child_process");', - 'spawn(process.execPath, ["--eval", "setTimeout(() => process.exit(0), 8_000)"], { detached: true, stdio: "inherit" }).unref();', - 'process.stdout.write("ok\\n");', + 'const descendant = spawn(process.execPath, ["--eval", "setTimeout(() => process.exit(0), 8_000)"], { detached: true, stdio: "inherit" });', + "descendant.unref();", + 'process.stdout.write(`ok ${descendant.pid}\\n`);', "process.exit(0);", ].join("\n"); const startedAt = performance.now(); // The parent exits before its short deadline; the descendant keeps the pipe open // past that deadline, so only reap grace should settle the completed child. const result = await spawnModuleGraphWarmupChild(script, repoRoot(), undefined, 1_000); + // The descendant must not outlive this test. Left alone it ran ~3 s into the next file of + // the same Bun process, where shard 1/4 batch 4 of run 42898913860 hung in a Bun.spawnSync + // git call on both attempts until the 120 s batch timeout. + const descendantPid = Number(/^ok (\d+)$/m.exec(result.stdout)?.[1]); + const alive = () => { try { process.kill(descendantPid, 0); return true; } catch { return false; } }; + if (descendantPid > 0 && alive()) process.kill(descendantPid, "SIGKILL"); + for (let i = 0; i < 40 && descendantPid > 0 && alive(); i++) await Bun.sleep(50); expect(performance.now() - startedAt).toBeLessThan(INTERNAL_DEADLINE_MS); expect(result.exitCode).toBe(0); expect(result.timedOut).toBe(false); - expect(result.stdout).toContain("ok"); + expect(descendantPid).toBeGreaterThan(0); + expect(alive()).toBe(false); }, INTERNAL_DEADLINE_MS); test("a real module graph loads, and reports what it loaded", async () => { From 023c62da615aa8158aad31f292aaac8ab651afa5 Mon Sep 17 00:00:00 2001 From: Vadym O Date: Wed, 11 Nov 2026 07:30:51 +0800 Subject: [PATCH 2/2] chore(release): 2.65.0-vadymhimself.19 Co-Authored-By: Claude Code --- desktop/src-tauri/Cargo.lock | 2 +- desktop/src-tauri/Cargo.toml | 2 +- desktop/src-tauri/tauri.conf.json | 2 +- package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index e7e7510e298..eb45b470877 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -2541,7 +2541,7 @@ dependencies = [ [[package]] name = "opencodex-desktop" -version = "2.65.0-vadymhimself.18" +version = "2.65.0-vadymhimself.19" dependencies = [ "dbus", "reqwest 0.12.24", diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 52c49a7e4fe..299699ed3fa 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "opencodex-desktop" -version = "2.65.0-vadymhimself.18" +version = "2.65.0-vadymhimself.19" description = "OpenCodex desktop shell" authors = ["OpenCodex contributors"] license = "MIT" diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index f071b2f8bc2..bfc1eff3f77 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "OpenCodex", - "version": "2.65.0-vadymhimself.18", + "version": "2.65.0-vadymhimself.19", "identifier": "com.opencodex.desktop", "build": { "frontendDist": "../ui", diff --git a/package.json b/package.json index 1a5577b2d5f..11bce44e4c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.65.0-vadymhimself.18", + "version": "2.65.0-vadymhimself.19", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs",