/** * TerminalStoreSync - Abstract interface and base implementation * * Unlike the original, this does NOT depend on Electron (BrowserWindow) * or any specific store implementation. The store access is abstracted * behind an interface that consumers implement for their environment. * * Key responsibilities: * - Register/unregister terminals in an abstract store * - Handle setActive() with one-active-per-session enforcement * - React to remote changes and apply mode updates locally */ import { EventEmitter } from 'events'; import type { TerminalInfo, TerminalMode } from '#types'; export type TerminalEntryMode = 'active' | 'passive'; export type TerminalEntryType = 'headless' | 'virtual' | 'cli'; export interface TerminalEntry { id: string; sessionId: string; deviceId: string; mode: TerminalEntryMode; type: TerminalEntryType; cols: number; rows: number; createdAt: number; } export interface TerminalsStoreData { terminals: TerminalEntry[]; } export interface TerminalStoreSyncEvents { modeChanged: (terminalId: string, mode: TerminalEntryMode) => void; remoteTerminalsChanged: (deviceId: string, type: string) => void; } export interface ITerminalStoreSync extends EventEmitter { dispose(): void; getLocalDeviceId(): string | null; registerTerminal(terminal: TerminalInfo, canonicalSessionId: string): void; unregisterTerminal(terminalId: string): void; updateTerminalDimensions(terminalId: string, cols: number, rows: number): void; setActive(terminalId: string): void; registerCliTerminal(sessionId: string, cols: number, rows: number): string; unregisterCliTerminal(cliTerminalId: string): void; getActiveTerminalForSession(sessionId: string): TerminalEntry | null; canResize(terminalId: string): boolean; canDeviceResizeSession(sessionId: string, deviceId: string): boolean; getActiveDeviceForSession(sessionId: string): string | null; setSessionIdMapping(proxySessionId: string, canonicalSessionId: string): void; getCanonicalSessionId(sessionId: string): string; setApplyModeCallback?(callback: (terminalId: string, mode: TerminalMode) => void): void; on(event: K, listener: TerminalStoreSyncEvents[K]): this; emit(event: K, ...args: Parameters): boolean; } /** * Abstract store backend that consumers implement for their environment. * The original used Electron's BrowserWindow + LocalDeviceStore. * Implementations could use: * - In-memory store (for testing) * - WebSocket-synced store (for web apps) * - Electron IPC store (for desktop apps) */ export interface ITerminalStoreBackend { /** Get the local device ID */ getLocalDeviceId(): string | null; /** Get local terminal entries */ getLocalTerminals(): TerminalEntry[]; /** Set local terminal entries */ setLocalTerminals(terminals: TerminalEntry[]): void; /** Get all terminal entries across all devices */ getAllTerminals(): Map; /** Subscribe to remote store changes */ subscribe(callback: (deviceId: string, type: string) => void): () => void; } export declare class TerminalStoreSyncImpl extends EventEmitter implements ITerminalStoreSync { private storeBackend; private disposed; private unsubscribeStore; private sessionIdMap; private applyModeCallback; constructor(storeBackend?: ITerminalStoreBackend); setApplyModeCallback(callback: (terminalId: string, mode: TerminalMode) => void): void; /** Connect to a store backend after construction */ setStoreBackend(backend: ITerminalStoreBackend): void; dispose(): void; getLocalDeviceId(): string | null; registerTerminal(terminal: TerminalInfo, canonicalSessionId: string): void; unregisterTerminal(terminalId: string): void; updateTerminalDimensions(terminalId: string, cols: number, rows: number): void; setActive(terminalId: string): void; registerCliTerminal(sessionId: string, cols: number, rows: number): string; unregisterCliTerminal(cliTerminalId: string): void; getActiveTerminalForSession(sessionId: string): TerminalEntry | null; canResize(terminalId: string): boolean; canDeviceResizeSession(sessionId: string, deviceId: string): boolean; getActiveDeviceForSession(sessionId: string): string | null; setSessionIdMapping(proxySessionId: string, canonicalSessionId: string): void; getCanonicalSessionId(sessionId: string): string; private handleRemoteChange; private makeLocalTerminalsPassive; } export declare function createTerminalStoreSync(storeBackend?: ITerminalStoreBackend): ITerminalStoreSync; //# sourceMappingURL=terminal-store-sync.d.ts.map