From 98d91fd69655fabc6b79f08f627d5ec8b65e1465 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 10 Mar 2026 13:07:10 +0700 Subject: [PATCH] Instrument desktop smoke hangs --- .../desktop/scripts/managed-daemon-smoke.mjs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/desktop/scripts/managed-daemon-smoke.mjs b/packages/desktop/scripts/managed-daemon-smoke.mjs index 31ca1d9fd..9af83e5d6 100644 --- a/packages/desktop/scripts/managed-daemon-smoke.mjs +++ b/packages/desktop/scripts/managed-daemon-smoke.mjs @@ -391,6 +391,8 @@ async function waitFor(assertion, timeoutMs, label) { } function logStep(label) { + currentStepLabel = label; + currentStepStartedAt = Date.now(); console.log(`\n[managed-smoke] ${label}`); } @@ -422,6 +424,23 @@ await fs.mkdir(externalHome, { recursive: true }); await fs.writeFile(path.join(fakePaseoHome, "sentinel.txt"), "do not touch\n", "utf8"); const fakePaseoSnapshotBefore = await snapshotTree(fakePaseoHome); +const smokeStartedAt = Date.now(); +const smokeDeadlineMs = 15 * 60 * 1000; +let currentStepLabel = "initializing"; +let currentStepStartedAt = smokeStartedAt; +const heartbeat = setInterval(() => { + const elapsedSeconds = Math.floor((Date.now() - smokeStartedAt) / 1000); + const currentStepSeconds = Math.floor((Date.now() - currentStepStartedAt) / 1000); + console.log( + `[managed-smoke] heartbeat elapsed=${elapsedSeconds}s currentStep=${JSON.stringify(currentStepLabel)} stepElapsed=${currentStepSeconds}s` + ); + if (Date.now() - smokeStartedAt > smokeDeadlineMs) { + console.error( + `[managed-smoke] FAIL exceeded ${smokeDeadlineMs / 1000}s overall deadline during ${JSON.stringify(currentStepLabel)}` + ); + process.exit(1); + } +}, 30_000); const managedEnv = { ...process.env, HOME: fakeHome, @@ -739,6 +758,7 @@ try { console.log(`\n[managed-smoke] PASS (${testRoot})`); } finally { + clearInterval(heartbeat); try { await runBinary(packagedBinary, ["--managed-headless", "stop-daemon"], managedEnv); } catch {}