import { connectTerminalStream, createTerminalSession, resizeTerminal, sendTerminalInput, closeTerminal, restartTerminalSession, forceKillTerminal, } from '@openchamber/ui/lib/terminalApi'; import type { TerminalAPI, TerminalHandlers, TerminalStreamOptions, CreateTerminalOptions, ResizeTerminalPayload, TerminalSession, ForceKillOptions, } from '@openchamber/ui/lib/api/types'; const getRetryPolicy = (options?: TerminalStreamOptions) => { const retry = options?.retry; return { maxRetries: retry?.maxRetries ?? 3, initialRetryDelay: retry?.initialDelayMs ?? 1000, maxRetryDelay: retry?.maxDelayMs ?? 8000, connectionTimeout: options?.connectionTimeoutMs ?? 10000, }; }; export const createWebTerminalAPI = (): TerminalAPI => ({ async createSession(options: CreateTerminalOptions): Promise { return createTerminalSession(options); }, connect(sessionId: string, handlers: TerminalHandlers, options?: TerminalStreamOptions) { const unsubscribe = connectTerminalStream( sessionId, handlers.onEvent, handlers.onError, getRetryPolicy(options) ); return { close: () => unsubscribe(), }; }, async sendInput(sessionId: string, input: string): Promise { await sendTerminalInput(sessionId, input); }, async resize(payload: ResizeTerminalPayload): Promise { await resizeTerminal(payload.sessionId, payload.cols, payload.rows); }, async close(sessionId: string): Promise { await closeTerminal(sessionId); }, async restartSession( currentSessionId: string, options: CreateTerminalOptions ): Promise { return restartTerminalSession(currentSessionId, { cwd: options.cwd ?? '', cols: options.cols, rows: options.rows, }); }, async forceKill(options: ForceKillOptions): Promise { await forceKillTerminal(options); }, });