Files
orca/src/shared/terminal-output-source-range.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

51 lines
1.9 KiB
TypeScript

import type { PtySourceDeliveryIdentity, PtySourceSpan } from './pty-source-credit-contract'
import {
assertNonNegativeSafeInteger,
assertPtySourceIdentity
} from './pty-source-credit-validation'
export type TerminalOutputSourceRange = Readonly<
Omit<PtySourceSpan, 'data' | 'splittable' | 'indivisible'> & {
splittable: boolean
}
>
export function assertTerminalOutputSourceRange(range: TerminalOutputSourceRange): void {
assertPtySourceIdentity(range)
if (!range.spanId) {
throw new Error('Terminal output source range requires a span ID')
}
assertNonNegativeSafeInteger(range.sourceStartSu, 'sourceStartSu')
assertNonNegativeSafeInteger(range.sourceEndSu, 'sourceEndSu')
assertNonNegativeSafeInteger(range.displayStart, 'displayStart')
assertNonNegativeSafeInteger(range.displayEnd, 'displayEnd')
assertNonNegativeSafeInteger(range.transform.rawLengthSu, 'rawLengthSu')
if (
range.sourceEndSu <= range.sourceStartSu ||
range.displayEnd < range.displayStart ||
range.sourceEndSu - range.sourceStartSu !== range.transform.rawLengthSu ||
typeof range.splittable !== 'boolean' ||
typeof range.transform.transformed !== 'boolean' ||
typeof range.transform.scalarSafe !== 'boolean' ||
(range.transform.transformed && range.splittable) ||
(!range.transform.transformed &&
range.sourceEndSu - range.sourceStartSu !== range.displayEnd - range.displayStart)
) {
throw new Error('Terminal output source range is malformed')
}
}
export function sameTerminalOutputSourceIdentity(
left: PtySourceDeliveryIdentity,
right: PtySourceDeliveryIdentity
): boolean {
return (
left.id === right.id &&
left.providerGeneration === right.providerGeneration &&
left.clientGeneration === right.clientGeneration &&
left.ownerGeneration === right.ownerGeneration &&
left.ptyIncarnation === right.ptyIncarnation &&
left.deliveryToken === right.deliveryToken
)
}