/** * AvocadoPtyTransport — first-class restty `PtyTransport` that bridges * keystrokes/resize to avocado without local echo. * * Lifecycle: * idle → connect() → connected → disconnect() → idle * destroy() is terminal (no further connect). * * Display path is intentionally separate: avocado PTY output is pushed into * restty via `Restty.sendInput(text, "pty")`, not via `callbacks.onData`. * That keeps a single, explicit ownership boundary. * * @see https://github.com/wiedymi/restty (PtyTransport / custom-transport example) */ /** Mirrors restty's PtyResizeMeta (kept local so we don't hard-depend on restty types). */ export type AvocadoPtyResizeMeta = { widthPx?: number; heightPx?: number; cellW?: number; cellH?: number; }; /** Mirrors restty's PtyCallbacks subset we use. */ export type AvocadoPtyCallbacks = { onConnect?: () => void; onDisconnect?: () => void; /** Unused for display; avocado drives output via Restty.sendInput(..., "pty"). */ onData?: (data: string) => void; onStatus?: (shell: string) => void; onError?: (message: string, errors?: string[]) => void; onExit?: (code: number) => void; }; export type AvocadoPtyConnectOptions = { url?: string; cols?: number; rows?: number; callbacks: AvocadoPtyCallbacks; }; export type AvocadoPtyLifecycleState = 'idle' | 'connecting' | 'connected' | 'closing' | 'destroyed'; export type AvocadoPtyLifecycleEvent = { type: 'connected'; } | { type: 'disconnected'; reason?: string; } | { type: 'error'; message: string; errors?: string[]; } | { type: 'exit'; code?: number; }; export type AvocadoPtyTransportHandlers = { /** User keystrokes / paste from restty → avocado backend. */ onKeyInput: (data: string) => void; /** * Engine-driven resize (restty autoResize / fit). * Host-driven resizes must not loop back through this. */ onEngineResize: (cols: number, rows: number, meta?: AvocadoPtyResizeMeta) => void; /** Optional lifecycle observer (tests / UI). */ onLifecycle?: (event: AvocadoPtyLifecycleEvent) => void; }; /** * Restty-compatible PtyTransport implementation. * * When `isConnected()` is true, restty's `sendKeyInput` forwards keys here * and does **not** local-echo into WASM — preventing double characters when * the real shell also echoes. */ export declare class AvocadoPtyTransport { private state; private callbacks; private readonly handlers; /** Suppress transport.resize → onEngineResize while applying a host-driven resize. */ private suppressEngineResize; constructor(handlers: AvocadoPtyTransportHandlers); get lifecycleState(): AvocadoPtyLifecycleState; connect(options: AvocadoPtyConnectOptions): void; disconnect(): void; sendInput(data: string): boolean; resize(cols: number, rows: number, meta?: AvocadoPtyResizeMeta): boolean; /** * Run `fn` while transport.resize notifications are ignored. * Used when avocado applies a host-driven cols/rows change into restty so * restty's internal resize callback does not bounce back to avocado. */ withHostResizeSuppressed(fn: () => T): T; isConnected(): boolean; /** Signal session error to restty callbacks + lifecycle listeners. */ reportError(message: string, errors?: string[]): void; /** Signal PTY exit (session ended). */ reportExit(code?: number): void; destroy(): void; } export declare function createAvocadoPtyTransport(handlers: AvocadoPtyTransportHandlers): AvocadoPtyTransport; //# sourceMappingURL=avocado-pty-transport.d.ts.map