import type { PtyTerminalSnapshot } from "./pty-terminal-state.js"; export interface TerminalDataEvent { data: string; /** Monotonic per-incarnation chunk sequence used for gap-free reattach. */ seq: number; } export interface TerminalExitEvent { exitCode: number; signal?: number; } export interface TerminalProcess { readonly sessionId: string; readonly incarnationId: string; readonly pid: number; write(data: string): void; resize(cols: number, rows: number): void; kill(signal?: string): void; pause(): void; resume(): void; onData(listener: (event: TerminalDataEvent) => void): { dispose(): void; }; onExit(listener: (event: TerminalExitEvent) => void): { dispose(): void; }; } export interface TerminalSessionState { sessionId: string; incarnationId: string; pid: number; status: "running" | "exited"; exitCode: number | null; cols: number; rows: number; seq: number; output: string; chunks: TerminalDataEvent[]; terminalSnapshot: PtyTerminalSnapshot | null; launchMarkerToken: string | null; } export interface TerminalAttachResult { process: TerminalProcess | null; state: TerminalSessionState; replay: TerminalDataEvent[]; isNew: boolean; } export interface TerminalSpawnRequest { sessionId: string; file: string; args: string[]; cwd: string; env: NodeJS.ProcessEnv; name: string; cols: number; rows: number; launchMarkerToken?: string; } /** * Owns terminal processes behind one small seam. Persistent adapters may outlive * their caller; in-process adapters deliberately retain the legacy lifecycle. */ export interface TerminalHost { readonly persistent: boolean; attach(sessionId: string, afterSeq?: number): TerminalAttachResult | null; createOrAttach(request: TerminalSpawnRequest, afterSeq?: number): Promise; forget(sessionId: string): void; disconnect(): void; } /** Legacy/local adapter and deterministic test adapter for the TerminalHost seam. */ export declare class InProcessTerminalHost implements TerminalHost { readonly persistent = false; private readonly processes; attach(): TerminalAttachResult | null; createOrAttach(request: TerminalSpawnRequest): Promise; forget(sessionId: string): void; disconnect(): void; } /** Keep a bounded replay log while preserving chunk sequence numbers. */ export declare function appendTerminalChunkWindow(chunks: readonly TerminalDataEvent[], event: TerminalDataEvent): TerminalDataEvent[];