fix(pty): fence delayed signal prompts

This commit is contained in:
Tianyi Cui
2026-07-29 11:57:12 +08:00
parent be3533fa19
commit d6b3de6e0d
8 changed files with 52 additions and 9 deletions
@@ -591,6 +591,35 @@ describe('LocalPtySession readiness and output', () => {
expect(await operation.done).toMatchObject({ waitReason: 'stdin_read' })
})
it('does not attribute a post-echo prompt from an inferred prior send to its successor', async () => {
vi.useFakeTimers()
const terminal = new FakeTerminal()
const session = new LocalPtySession(terminal, config({ idleSilenceMs: 50, timeoutMs: 200 }))
await initialize(session, terminal)
const interrupted = session.startSend({ text: 'sleep', submit: true })
await Promise.resolve()
await Promise.resolve()
await session.signal('SIGINT')
await vi.advanceTimersByTimeAsync(50)
expect((await interrupted.done).waitReason).toBe('inferred_idle')
const successor = session.startSend({ text: "printf 'PID=%s\\n' \"$!\"", submit: true })
let settled = false
void successor.done.then(() => { settled = true })
await Promise.resolve()
await Promise.resolve()
terminal.emitData('printf \'PID=%s\\n\' "$!"\r\n\x1b]133;D;130\x07dsh> ')
await vi.advanceTimersByTimeAsync(10)
expect(settled).toBe(false)
terminal.emitData('PID=123\r\n\x1b]133;D;0\x07dsh> ')
await vi.advanceTimersByTimeAsync(10)
const result = await successor.done
expect(result.waitReason).toBe('stdin_read')
expect(result.viewport).toContain('PID=123')
})
it('retains a prompt marker until the startup shell regains the foreground group', async () => {
vi.useFakeTimers()
const terminal = new FakeTerminal()