import { isTauriRuntime } from '../lib/desktopRuntime' export type TerminalSpawnResult = { session_id: number shell: string cwd: string } export type TerminalOutputPayload = { session_id: number data: string } export type TerminalExitPayload = { session_id: number code: number signal?: string | null } type Unlisten = () => void async function invoke(command: string, args?: Record): Promise { if (!isTauriRuntime()) { throw new Error('Terminal is available in the desktop app runtime.') } const api = await import('@tauri-apps/api/core') return api.invoke(command, args) } export const terminalApi = { isAvailable: isTauriRuntime, spawn(input: { cols: number; rows: number; cwd?: string }) { return invoke('terminal_spawn', input) }, write(sessionId: number, data: string) { return invoke('terminal_write', { sessionId, data }) }, resize(sessionId: number, cols: number, rows: number) { return invoke('terminal_resize', { sessionId, cols, rows }) }, kill(sessionId: number) { return invoke('terminal_kill', { sessionId }) }, async onOutput(handler: (payload: TerminalOutputPayload) => void): Promise { const events = await import('@tauri-apps/api/event') return events.listen('terminal-output', (event) => handler(event.payload)) }, async onExit(handler: (payload: TerminalExitPayload) => void): Promise { const events = await import('@tauri-apps/api/event') return events.listen('terminal-exit', (event) => handler(event.payload)) }, getBashPath() { return invoke('get_terminal_bash_path', undefined) }, setBashPath(path: string | null) { return invoke('set_terminal_bash_path', { path }) }, }