fix(terminal): avoid repeated waits on stalled snapshot providers

This commit is contained in:
m4air
2026-09-07 16:32:56 -07:00
parent 8d88c5b65d
commit 791cb10fe4
2 changed files with 24 additions and 3 deletions
@@ -76,7 +76,16 @@ describe('hidden-output recovery after provider reattach', () => {
it('falls back to retained renderer history when a deep provider request stalls', async () => {
vi.useFakeTimers()
const runtime = createRuntime()
const serializeProviderBuffer = vi.fn(() => new Promise<never>(() => {}))
let settleProvider!: (value: null) => void
const serializeProviderBuffer = vi
.fn()
.mockImplementationOnce(
() =>
new Promise<null>((resolve) => {
settleProvider = resolve
})
)
.mockResolvedValue({ data: 'provider recovered', cols: 80, rows: 24, seq: 10 })
runtime.setPtyController({
write: () => true,
kill: () => true,
@@ -94,9 +103,20 @@ describe('hidden-output recovery after provider reattach', () => {
source: 'renderer'
})
const retry = runtime.serializeHiddenOutputRecoveryBuffer('pty-1', { scrollbackRows: 100000 })
await vi.advanceTimersByTimeAsync(AUTHORITATIVE_TERMINAL_SNAPSHOT_TIMEOUT_MS)
let retrySettled = false
void retry.then(() => {
retrySettled = true
})
await vi.advanceTimersByTimeAsync(0)
expect(retrySettled).toBe(true)
await expect(retry).resolves.toMatchObject({ data: 'retained SSH history' })
expect(serializeProviderBuffer).toHaveBeenCalledTimes(1)
settleProvider(null)
await vi.advanceTimersByTimeAsync(0)
await expect(
runtime.serializeHiddenOutputRecoveryBuffer('pty-1', { scrollbackRows: 100000 })
).resolves.toMatchObject({ data: 'provider recovered' })
expect(serializeProviderBuffer).toHaveBeenCalledTimes(2)
})
it('uses retained provider modes instead of the pre-attach redraw suffix', async () => {
@@ -61,7 +61,8 @@ export class OrcaRuntimeWithSerializeTerminalBufferFromAvailableState extends Or
}
// Bound optional deep-history acquisition without duplicating an outstanding provider request.
const provider = await this.serializeProviderTerminalBuffer(ptyId, opts, {
timeoutMs: AUTHORITATIVE_TERMINAL_SNAPSHOT_TIMEOUT_MS
timeoutMs: AUTHORITATIVE_TERMINAL_SNAPSHOT_TIMEOUT_MS,
retireOnTimeout: true
})
if (provider) {
return provider