Files
orca/src/main/ipc/ssh-pty-output-exit.ts
T
JinjingandOrcaWin 5f7807497e feat(ssh): bound relay PTY output end to end (#11005)
* docs: design SSH relay PTY backpressure

* fix(ssh): bound relay frame decoding

* fix(relay): bound PTY output publication

* fix(ssh): bound PTY model admission

* fix(ssh): settle closed model admissions

* feat(ssh): negotiate bounded PTY consumer sessions

* fix(ssh): fence exit on renderer settlement

* feat(ssh): track PTY source credit end to end

* fix(ssh): recover bounded PTY output across reconnect

* feat(ssh): complete relay PTY output backpressure

* fix(ssh): close final PTY source credit races

* docs(ssh): record final backpressure validation

* feat(ssh): complete relay PTY source-credit lifecycle

* test(ssh): complete provider notification fixture

* fix(ssh): preserve terminal source credit across rotation

* fix(ssh): fail closed on recovery cancellation

* fix(ssh): prioritize mux control writes after drain

* fix(ssh): retire canceled relay restore deliveries

* fix(ssh): order exit cancellation cleanup

* fix(ssh): gate provisional source activation

* test(ssh): register mux drain-priority coverage

* fix(ssh): type stale owner recovery mismatches

* fix(ssh): close projection replacement races

* fix(relay): contain streaming edge failures

* fix(ssh): secure relay endpoint credentials

* docs(ssh): reconcile final backpressure lifecycle

* fix(ssh): bound main IPC output lifecycle

* fix(ssh): close recovery ownership gaps

* docs(ssh): record exact artifact validation

* fix(ssh): reject reclaimed snapshot replacements

* fix(ssh): fence model admission across reconnect

* fix(ssh): contain migration failure per PTY

* docs(ssh): record final exact-head validation

* test(ssh): align deploy fixtures with credential publication

* feat(ssh): add per-target bounded output setting

* fix(ssh): close source recovery review gaps

* fix(ssh): latch source credit environment override

* feat(ssh): make PTY source credit the default

* docs(ssh): record always-on relay validation

* docs(ssh): bind validation to current main

* test(ssh): grant source credit in IPC fixture

* test(ssh): grant source credit in fake relay

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-07-29 17:03:15 -07:00

76 lines
2.1 KiB
TypeScript

import type { SshPtyLegacyProjectionLedger } from './ssh-pty-legacy-projection'
import type { SshPtyModelAdmission } from './ssh-pty-model-admission'
import type {
SshPtyOutputExitEvent,
SshPtyOutputIntakeDependencies
} from './ssh-pty-output-intake-contract'
export async function settleSshPtyOutputExit(args: {
event: SshPtyOutputExitEvent
admission: SshPtyModelAdmission
projections: SshPtyLegacyProjectionLedger
dependencies: SshPtyOutputIntakeDependencies
validateGeneration: () => void
prepareExit?: () => void
afterAdmissionIdle?: () => void
waitForSourceTerminal?: () => Promise<void>
beforeFinalize?: () => void
}): Promise<void> {
const {
event,
admission,
projections,
dependencies,
validateGeneration,
prepareExit,
afterAdmissionIdle,
waitForSourceTerminal,
beforeFinalize
} = args
await admission.whenIdle({
ptyId: event.id,
providerGeneration: event.providerGeneration
})
validateGeneration()
afterAdmissionIdle?.()
try {
if (prepareExit) {
prepareExit()
} else {
dependencies.prepareExit(event)
}
} catch (error) {
projections.closePty(
event.id,
event.providerGeneration,
event.ptyIncarnation,
'pty-exit-finalize-failed'
)
dependencies.closeProvider?.(event.providerGeneration, 'pty-exit-finalize-failed')
throw error
}
projections.transferUnpublishedPty(
event.id,
event.providerGeneration,
event.ptyIncarnation,
'pty-exit-unpublished'
)
await projections.whenPtyTerminal(event.id, event.providerGeneration, event.ptyIncarnation)
await waitForSourceTerminal?.()
validateGeneration()
try {
beforeFinalize?.()
dependencies.finalizeExit(event)
projections.closePty(event.id, event.providerGeneration, event.ptyIncarnation, 'pty-exit')
} catch (error) {
projections.closePty(
event.id,
event.providerGeneration,
event.ptyIncarnation,
'pty-exit-finalize-failed'
)
dependencies.closeProvider?.(event.providerGeneration, 'pty-exit-finalize-failed')
throw error
}
}