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", 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 () => {