/** Shared remote-desktop (RDP / VNC) contracts for the renderer. */ export type DesktopProtocol = 'rdp' | 'vnc' export type DesktopSecurity = 'nla' | 'tls' | 'rdp' | 'auto' export interface RdpConfig { host: string port?: number username: string password: string domain?: string /** Default NLA (CredSSP). */ security?: DesktopSecurity width?: number height?: number } export interface VncConfig { host: string port?: number /** Optional VNC password (DES challenge). */ password?: string width?: number height?: number } export type DesktopSessionConfig = | { protocol: 'rdp'; config: RdpConfig } | { protocol: 'vnc'; config: VncConfig } export interface DesktopOpenResponse { sessionId: string } export interface DesktopStatusEvent { sessionId: string status: 'connecting' | 'connected' | 'disconnected' | 'error' message?: string width?: number height?: number } /** Dirty-rectangle frame. Prefer JPEG (`encoding: 'jpeg'`); `rgba` is raw w*h*4 fallback. */ export interface DesktopFrameEvent { sessionId: string x: number y: number width: number height: number /** Full framebuffer width (for canvas sizing). */ fbWidth: number /** Full framebuffer height. */ fbHeight: number encoding: 'jpeg' | 'rgba' dataBase64: string } export type DesktopPointerButton = 'left' | 'middle' | 'right' | 'wheel_up' | 'wheel_down' export interface DesktopPointerEvent { x: number y: number button?: DesktopPointerButton pressed?: boolean /** true = pointer move (may include held button for drag). */ moving?: boolean } export interface DesktopKeyEvent { key: string code: string pressed: boolean altKey?: boolean ctrlKey?: boolean metaKey?: boolean shiftKey?: boolean } export interface RdpClipboardEvent { sessionId: string text: string } export interface VncClipboardEvent { sessionId: string text: string } export interface RdpFileDownloadEvent { sessionId: string name: string /** Absolute path in the host Downloads folder. */ path: string }