import { type CursorCapabilities, type CursorRecordingData, type CursorTelemetryPoint, NATIVE_BRIDGE_CHANNEL, type NativeBridgeRequest, type NativeBridgeResponse, type NativePlatform, type ProjectContext, type ProjectFileResult, type ProjectPathResult, type SystemCapabilities, } from "./contracts"; function createRequestId() { if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { return crypto.randomUUID(); } return `req-${Date.now()}-${Math.random().toString(16).slice(2)}`; } function getElectronBridge() { if (!window.electronAPI?.invokeNativeBridge) { throw new Error( `Native bridge unavailable. Expected ${NATIVE_BRIDGE_CHANNEL} transport in preload.`, ); } return window.electronAPI.invokeNativeBridge; } export async function invokeNativeBridge( request: NativeBridgeRequest, ): Promise> { const invoke = getElectronBridge(); return invoke({ ...request, requestId: request.requestId ?? createRequestId(), }); } export async function requireNativeBridgeData(request: NativeBridgeRequest): Promise { const response = await invokeNativeBridge(request); if (!response.ok) { throw new Error(response.error.message); } return response.data; } export const nativeBridgeClient = { rawInvoke: invokeNativeBridge, system: { getPlatform: () => requireNativeBridgeData({ domain: "system", action: "getPlatform", }), getAssetBasePath: () => requireNativeBridgeData({ domain: "system", action: "getAssetBasePath", }), getCapabilities: () => requireNativeBridgeData({ domain: "system", action: "getCapabilities", }), }, project: { getCurrentContext: () => requireNativeBridgeData({ domain: "project", action: "getCurrentContext", }), saveProjectFile: (projectData: unknown, suggestedName?: string, existingProjectPath?: string) => requireNativeBridgeData({ domain: "project", action: "saveProjectFile", payload: { projectData, suggestedName, existingProjectPath, }, }), loadProjectFile: () => requireNativeBridgeData({ domain: "project", action: "loadProjectFile", }), loadCurrentProjectFile: () => requireNativeBridgeData({ domain: "project", action: "loadCurrentProjectFile", }), setCurrentVideoPath: (path: string) => requireNativeBridgeData({ domain: "project", action: "setCurrentVideoPath", payload: { path }, }), getCurrentVideoPath: () => requireNativeBridgeData({ domain: "project", action: "getCurrentVideoPath", }), clearCurrentVideoPath: () => requireNativeBridgeData({ domain: "project", action: "clearCurrentVideoPath", }), }, cursor: { getCapabilities: () => requireNativeBridgeData({ domain: "cursor", action: "getCapabilities", }), getRecordingData: (videoPath?: string) => requireNativeBridgeData({ domain: "cursor", action: "getRecordingData", payload: videoPath ? { videoPath } : {}, }), getTelemetry: (videoPath?: string) => requireNativeBridgeData({ domain: "cursor", action: "getTelemetry", payload: videoPath ? { videoPath } : {}, }), }, };