From a0200376a1aaa35e00c1e2583b47f5a39c5ba157 Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Wed, 29 Jul 2026 03:44:57 +0800 Subject: [PATCH] fix(pty): defer the first readiness poll --- packages/pty/pty-local/src/session.ts | 2 +- packages/pty/pty-local/tests/session.spec.ts | 25 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/pty/pty-local/src/session.ts b/packages/pty/pty-local/src/session.ts index 9a0beed6ff..03809aec9f 100644 --- a/packages/pty/pty-local/src/session.ts +++ b/packages/pty/pty-local/src/session.ts @@ -266,7 +266,7 @@ export class LocalPtySession implements PtyBackendSession { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (this.active === operation && !this.closing) { this.pollingReady = operation - this.schedulePoll(operation, 0) + this.schedulePoll(operation) } } catch (error: unknown) { if (this.active === operation) { diff --git a/packages/pty/pty-local/tests/session.spec.ts b/packages/pty/pty-local/tests/session.spec.ts index 120b2881e1..5f0065d0ee 100644 --- a/packages/pty/pty-local/tests/session.spec.ts +++ b/packages/pty/pty-local/tests/session.spec.ts @@ -143,6 +143,31 @@ async function initialize(session: LocalPtySession, terminal: FakeTerminal): Pro } describe('LocalPtySession readiness and output', () => { + it('lets queued terminal output run before the first post-write readiness poll', async () => { + vi.useFakeTimers() + const terminal = new FakeTerminal() + const inspector = new FakeInspector() + const session = makeSession(terminal, inspector, config()) + await initialize(session, terminal) + + const inspect = terminal.inspectForeground.bind(terminal) + let inspections = 0 + terminal.inspectForeground = async () => { + inspections += 1 + return await inspect() + } + const operation = session.startSend({ text: 'true', submit: true }) + await Promise.resolve() + await Promise.resolve() + expect(inspections).toBe(1) + + await vi.advanceTimersByTimeAsync(0) + expect(inspections).toBe(1) + terminal.emitData('\x1b]133;D;0\x07dsh> ') + await vi.advanceTimersByTimeAsync(10) + expect((await operation.done).waitReason).toBe('stdin_read') + }) + it('captures prompt MOTD, writes submit explicitly, and settles exact stdin waits', async () => { vi.useFakeTimers() const terminal = new FakeTerminal()