mirror of
https://github.com/stablyai/orca.git
synced 2026-10-02 00:02:05 +00:00
* 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>
76 lines
2.1 KiB
TypeScript
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
|
|
}
|
|
}
|