From 02dcb8feedd62bad6891c56c6b0051e4fd84c6a1 Mon Sep 17 00:00:00 2001 From: Merge Sim Date: Mon, 31 Aug 2026 17:54:51 -0700 Subject: [PATCH] refactor(daemon): extract startup query authority --- src/main/daemon/session-startup-query-authority.ts | 10 ++++++++++ src/main/daemon/session.ts | 13 +++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 src/main/daemon/session-startup-query-authority.ts diff --git a/src/main/daemon/session-startup-query-authority.ts b/src/main/daemon/session-startup-query-authority.ts new file mode 100644 index 00000000000..1ff557065c5 --- /dev/null +++ b/src/main/daemon/session-startup-query-authority.ts @@ -0,0 +1,10 @@ +import type { PtyStartupIngress } from '../../shared/pty-startup-ingress' + +/** Owns the one-way close of a session's startup query authority. */ +export abstract class SessionStartupQueryAuthority { + protected abstract readonly startupIngress: PtyStartupIngress + + closeStartupQueryAuthority(): number { + return this.startupIngress.closeQueryAuthority() + } +} diff --git a/src/main/daemon/session.ts b/src/main/daemon/session.ts index a7eb732a00c..fa527348344 100644 --- a/src/main/daemon/session.ts +++ b/src/main/daemon/session.ts @@ -11,21 +11,21 @@ import { import type { SubprocessHandle } from './session-subprocess-handle' import type { JobTerminationOutcome } from '../windows/windows-pty-job' import type { SessionOptions } from './session-options' -import type { TuiAgent } from '../../shared/tui-agent' import { randomUUID } from 'node:crypto' import { PtyStartupIngress } from '../../shared/pty-startup-ingress' import { SessionCheckpointAccess } from './session-checkpoint-access' import { SessionWslShellAnchorTracker } from './session-wsl-shell-anchor-tracker' +import { SessionStartupQueryAuthority } from './session-startup-query-authority' import type { SessionState, ShellReadyState, TakePendingOutputResult } from './types' import type { TerminalSnapshot } from './terminal-snapshot' import type { TerminalExitCause } from '../../shared/terminal-exit-cause' -export class Session { +export class Session extends SessionStartupQueryAuthority { readonly sessionId: string readonly incarnationId = randomUUID() readonly terminalHandle: string | null - readonly launchAgent: TuiAgent | null + readonly launchAgent: NonNullable | null readonly wslDistro: string | null private _state: SessionState = 'running' private _exitCode: number | null = null @@ -36,12 +36,13 @@ export class Session { private readonly producerPause: SessionProducerPause private readonly shellReady: SessionShellReadyBarrier private readonly termination: SessionTerminationController - private readonly startupIngress: PtyStartupIngress + protected readonly startupIngress: PtyStartupIngress private readonly recoveryBarrier: TerminalShellRecoveryBarrier private readonly checkpoint: SessionCheckpointAccess private readonly wslShellAnchorTracker: SessionWslShellAnchorTracker constructor(opts: SessionOptions) { + super() this.sessionId = opts.sessionId this.terminalHandle = opts.terminalHandle ?? null this.launchAgent = opts.launchAgent ?? null @@ -390,8 +391,4 @@ export class Session { // Why: hand off to the owner's reaper (disposes emulator, drops session from host map); else dead sessions accumulate. this.onSessionExit?.(code) } - - closeStartupQueryAuthority(): number { - return this.startupIngress.closeQueryAuthority() - } }