import type { AppInfo, LayoutMeta, PtyCreateOptions, PtyCreateResult, PtyDataEvent, PtyExitEvent, SessionOpenResult, SessionSnapshot } from './ipc' import type { AppSettings } from './settings' import type { ReleaseNote, UpdateState } from './ipc' import type { LockOperationResult, LockPasswordInput, LockSettingsState } from './ipc' import type { HostKeyAction, HostKeyPromptEvent, SessionOpenOptions, SshConnection, SshConnectionInput } from './connections' import type { SysinfoMeta, SysinfoSample } from './sysinfo' import type { SftpEntry, TransferProgressEvent } from './sftp' import type { CommandItem, SessionLogMeta } from './commands' import type { ZmodemDoneEvent, ZmodemOfferEvent, ZmodemResponse } from './ipc' /** * The single API surface exposed on `window.api` by the preload script. * Main process implements the handlers; renderer consumes this contract. */ export interface AppApi { appInfo(): Promise // ---- sessions (pty data plane is shared by local and ssh sessions) ---- createPty(opts?: PtyCreateOptions): Promise /** open a local or ssh session; resolves once the session is ready to stream */ openSession(opts: SessionOpenOptions): Promise /** output a session produced before this renderer subscribed (capped ring buffer) */ getSessionReplay(id: string): Promise writePty(id: string, data: string): void resizePty(id: string, cols: number, rows: number): void killPty(id: string): void /** subscribe to all session output; returns unsubscribe */ onPtyData(cb: (e: PtyDataEvent) => void): () => void onPtyExit(cb: (e: PtyExitEvent) => void): () => void // ---- sysinfo (M3: ssh sessions only; main polls the remote and broadcasts) ---- /** start polling for an ssh session; stop happens automatically on session close */ sysinfoStart(id: string): void sysinfoStop(id: string): void onSysinfoMeta(cb: (e: { id: string; meta: SysinfoMeta }) => void): () => void onSysinfoSample(cb: (e: { id: string; sample: SysinfoSample }) => void): () => void // ---- sftp (M4: bound to an established ssh session) ---- listRemote(sessionId: string, dir: string): Promise mkdirRemote(sessionId: string, dir: string, name: string): Promise renameRemote(sessionId: string, from: string, to: string): Promise deleteRemote(sessionId: string, paths: string[]): Promise /** mode = octal string, e.g. "755" or "0644" */ chmodRemote(sessionId: string, path: string, mode: string): Promise chownRemote(sessionId: string, path: string, uid: number, gid: number): Promise /** upload local files into remote dir; returns transferId */ uploadRemote(sessionId: string, localPaths: string[], remoteDir: string): Promise /** download remote paths into local dir; returns transferId */ downloadRemote(sessionId: string, remotePaths: string[], localDir: string): Promise cancelTransfer(transferId: string): void onTransferProgress(cb: (e: TransferProgressEvent) => void): () => void /** native open dialog; returns picked file paths (empty when cancelled) */ pickFiles(): Promise pickDirectory(): Promise // ---- command history / library + session logs (M5) ---- /** record one executed command (deduped, newest first, capped) */ recordCommand(cmd: string): Promise listHistory(): Promise clearHistory(): Promise listLibrary(): Promise saveLibraryItem(item: CommandItem): Promise deleteLibraryItem(id: string): Promise /** session output logging */ logStart(sessionId: string): Promise logStop(sessionId: string): Promise listSessionLogs(): Promise openLogsDir(): void /** open a local directory in the OS file manager; false if not a directory */ openDirectory(dir: string): Promise // ---- ssh connections ---- listConnections(): Promise saveConnection(input: SshConnectionInput): Promise deleteConnection(id: string): Promise onHostKeyPrompt(cb: (e: HostKeyPromptEvent) => void): () => void respondHostKey(promptId: string, action: HostKeyAction): void // ---- zmodem (M6: main-process engine over ssh sessions; progress reuses transfer events) ---- onZmodemOffer(cb: (e: ZmodemOfferEvent) => void): () => void zmodemRespond(resp: ZmodemResponse): void onZmodemDone(cb: (e: ZmodemDoneEvent) => void): () => void // ---- settings ---- getSettings(): Promise saveSettings(next: Partial): Promise onSettingsChanged(cb: (s: AppSettings) => void): () => void // ---- lock screen (main-window overlay; main owns the lock state) ---- getLockState(): Promise /** set or replace the password; verifies currentPassword when one exists */ setLockPassword(input: LockPasswordInput): Promise /** remove the password; verifies currentPassword when one exists */ clearLockPassword(input: { currentPassword?: string }): Promise /** answer the lock screen; resets the failure cooldown on success */ unlockLock(input: { password?: string }): Promise lockNow(): Promise onLockStateChanged(cb: (state: LockSettingsState) => void): () => void // ---- fonts ---- listFonts(): Promise // ---- layout templates ---- listLayouts(): Promise getLayout(id: string): Promise /** json = serialized dockview layout (DockviewApi.toJSON()) */ saveLayout(meta: LayoutMeta, json: string): Promise deleteLayout(id: string): Promise // ---- updater (domestic feed first, GitHub fallback) ---- updateCheck(): Promise /** read the updater's current state without triggering a network check */ getUpdateState(): Promise updateDownload(): Promise updateInstall(): Promise updateChangelog(): Promise onUpdateState(cb: (s: UpdateState) => void): () => void // ---- session snapshot (restore last layout + per-pane cwd) ---- getSessionState(): Promise saveSessionState(snapshot: SessionSnapshot): Promise /** resolve a cd-style argument against the current cwd (platform-aware) */ resolveCwd(current: string | undefined, arg: string): Promise /** normalize a shell-reported cwd payload (OSC 7 / OSC 9;9) */ reportCwd(payload: string): Promise }