From ca79f4364c63c3f0d7a9ace8c127fc2f696e5fdf Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:15:18 +0800 Subject: [PATCH] test(e2b): prove stale interrupt isolation --- .../tests/fixtures/e2b/e2b/bin.ts | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/examples/headless-agent/tests/fixtures/e2b/e2b/bin.ts b/examples/headless-agent/tests/fixtures/e2b/e2b/bin.ts index 6fa95c24b6..b4acfd1e5a 100644 --- a/examples/headless-agent/tests/fixtures/e2b/e2b/bin.ts +++ b/examples/headless-agent/tests/fixtures/e2b/e2b/bin.ts @@ -252,14 +252,38 @@ try { } const staleInterrupt = ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 0.2', submit: true }) if (!staleInterrupt.cancel()) throw new Error('E2B PTY refused the stale-interrupt probe cancellation') - await staleInterrupt.done - const sleeping = ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 30', submit: true }) + let canceledSendRetained = false + try { + ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 30', submit: true }) + } catch (error: unknown) { + canceledSendRetained = String(error).includes('active send') + } foregroundLookup.resolve(undefined) + await staleInterrupt.done + remoteCommands.run = runRemoteCommand + if (!canceledSendRetained) throw new Error('E2B PTY released a canceled send before foreground signalling settled') + const sleeping = ctx.pty.startSend(owner, terminal.sessionId, { + text: "printf 'DSH_SLEEP_%s\\n' READY; sleep 30", + submit: true, + }) + let sleepReadyOutput = '' + const sleepReadyDeadline = Date.now() + 5_000 + while (!sleepReadyOutput.includes('DSH_SLEEP_READY\n')) { + sleepReadyOutput += sleeping.readOutput().delta + if (sleepReadyOutput.includes('DSH_SLEEP_READY\n')) break + const settled = await Promise.race([ + sleeping.done.then(result => ({ result })), + new Promise(resolveDelay => setTimeout(() => { resolveDelay(undefined) }, 25)), + ]) + if (settled !== undefined) { + throw new Error(`E2B PTY successor settled before executing: ${JSON.stringify(settled.result)}`) + } + if (Date.now() >= sleepReadyDeadline) throw new Error(`E2B PTY successor did not execute: ${sleepReadyOutput}`) + } const interruptIdentitySafe = await Promise.race([ sleeping.done.then(() => false), new Promise(resolveDelay => setTimeout(() => { resolveDelay(true) }, 300)), ]) - remoteCommands.run = runRemoteCommand if (!delayedForegroundLookup || !interruptIdentitySafe) { throw new Error('E2B PTY stale interrupt affected its successor send') }