Files
orca/src/shared/terminal-scrollback-policy.ts
T
Jinjing 1bb029bfe9 Migrate terminal scrollback setting from bytes to rows
Transition terminal scrollback configuration from a byte-based (MB)
limit to a row-based count to align with standard terminal emulator
behavior.

- Introduce a shared scrollback policy to handle normalization and
  safe migration of legacy byte presets to row equivalents.
- Update persistence logic to automatically convert and clean up legacy
  settings on startup and write-back.
- Refactor the advanced settings interface and localization strings
  to let users configure scrollback in terms of rows (up to 50k).
- Live-apply row limit changes directly to mounted xterm instances
  without recreating panes or restarting PTY sessions.
2026-06-28 14:58:31 -07:00

56 lines
2.1 KiB
TypeScript

export const DESKTOP_TERMINAL_SCROLLBACK_ROWS_DEFAULT = 5_000
export const DESKTOP_TERMINAL_SCROLLBACK_ROWS_MIN = 1_000
export const DESKTOP_TERMINAL_SCROLLBACK_ROWS_MAX = 50_000
export const DESKTOP_TERMINAL_SCROLLBACK_ROW_PRESETS = [5_000, 10_000, 25_000, 50_000] as const
export const LEGACY_TERMINAL_SCROLLBACK_BYTES_1_MB = 1_000_000
export const LEGACY_TERMINAL_SCROLLBACK_BYTES_10_MB = 10_000_000
export const LEGACY_TERMINAL_SCROLLBACK_BYTES_25_MB = 25_000_000
export const LEGACY_TERMINAL_SCROLLBACK_BYTES_50_MB = 50_000_000
export const LEGACY_TERMINAL_SCROLLBACK_BYTES_100_MB = 100_000_000
export const LEGACY_TERMINAL_SCROLLBACK_BUCKET_5K_MAX_BYTES = 17_500_000
export const LEGACY_TERMINAL_SCROLLBACK_BUCKET_10K_MAX_BYTES = 37_500_000
export const LEGACY_TERMINAL_SCROLLBACK_BUCKET_25K_MAX_BYTES = 75_000_000
function isFiniteNumber(value: unknown): value is number {
return typeof value === 'number' && Number.isFinite(value)
}
function clampRows(value: number, min: number): number {
return Math.min(DESKTOP_TERMINAL_SCROLLBACK_ROWS_MAX, Math.max(min, Math.floor(value)))
}
export function normalizeDesktopTerminalScrollbackRows(value: unknown): number {
if (!isFiniteNumber(value)) {
return DESKTOP_TERMINAL_SCROLLBACK_ROWS_DEFAULT
}
return clampRows(value, DESKTOP_TERMINAL_SCROLLBACK_ROWS_MIN)
}
export function normalizeDesktopTerminalSnapshotRows(value: unknown): number | undefined {
if (!isFiniteNumber(value)) {
return undefined
}
return clampRows(value, 0)
}
export function legacyTerminalScrollbackBytesToRows(bytes: unknown): number {
if (!isFiniteNumber(bytes) || bytes <= 0) {
return DESKTOP_TERMINAL_SCROLLBACK_ROWS_DEFAULT
}
if (bytes <= LEGACY_TERMINAL_SCROLLBACK_BYTES_1_MB) {
return DESKTOP_TERMINAL_SCROLLBACK_ROWS_MIN
}
if (bytes < LEGACY_TERMINAL_SCROLLBACK_BUCKET_5K_MAX_BYTES) {
return DESKTOP_TERMINAL_SCROLLBACK_ROWS_DEFAULT
}
if (bytes < LEGACY_TERMINAL_SCROLLBACK_BUCKET_10K_MAX_BYTES) {
return 10_000
}
if (bytes < LEGACY_TERMINAL_SCROLLBACK_BUCKET_25K_MAX_BYTES) {
return 25_000
}
return DESKTOP_TERMINAL_SCROLLBACK_ROWS_MAX
}