import { ipcMain } from "electron"; import type { BooleanResult, FocusGenshinResult, NativeScannerCatalogStatus, NativeScannerDataStatus, NativeScannerImageLoadStatus, NativeScannerPreflightStatus, NativeScannerProcessStatus, NativeScannerPromotionStatus, NativeScannerReviewArtifactInput, NativeScannerReviewStatus, NativeScannerResultsLoadStatus, NativeScannerRunStatus, NativeScannerStartCategory, RuntimeInfo, SaveSnapshotResult, ScannerStatusPayload, } from "../../src/types/global.js"; import type { AppSnapshot } from "../../src/types/domain.js"; interface AppCommandDependencies { focusMainWindow: () => BooleanResult; moveMainWindowOffGenshin: () => Promise; focusGenshinForScanStart: () => Promise; publishScannerStatus: (status: ScannerStatusPayload) => Promise; nativeScannerDataStatus: () => Promise; nativeScannerCatalog: () => Promise; nativeScannerPreflight: (options?: { category?: NativeScannerStartCategory | string }) => Promise; nativeScannerStart: (options?: { limit?: number; category?: NativeScannerStartCategory }) => Promise; nativeScannerStop: () => Promise; nativeScannerStatus: () => Promise; nativeScannerProcessRun: (options?: { runDir?: string; persist?: boolean; limit?: number }) => Promise; nativeScannerLoadResults: (options?: { runDir?: string; limit?: number }) => Promise; nativeScannerPromoteResults: (options: { runDir?: string; resultIds: string[] }) => Promise; nativeScannerReviewResult: (options: { runDir?: string; resultId: string; action: "approve" | "reject"; artifact?: NativeScannerReviewArtifactInput; note?: string }) => Promise; nativeScannerLoadImage: (options: { runDir?: string; imagePath: string }) => Promise; getRuntimeInfo: () => Promise; loadSnapshot: () => Promise; saveSnapshot: (snapshot: AppSnapshot) => Promise; runMockScan: () => Promise; showOverlay: () => Promise; hideOverlay: () => Promise; } export function registerAppHandlers({ focusMainWindow, moveMainWindowOffGenshin, focusGenshinForScanStart, publishScannerStatus, nativeScannerDataStatus, nativeScannerCatalog, nativeScannerPreflight, nativeScannerStart, nativeScannerStop, nativeScannerStatus, nativeScannerProcessRun, nativeScannerLoadResults, nativeScannerPromoteResults, nativeScannerReviewResult, nativeScannerLoadImage, getRuntimeInfo, loadSnapshot, saveSnapshot, runMockScan, showOverlay, hideOverlay, }: AppCommandDependencies) { ipcMain.handle("app:focusMainWindow", async () => focusMainWindow()); ipcMain.handle("automation:focusGenshin", async () => { await moveMainWindowOffGenshin(); return focusGenshinForScanStart(); }); ipcMain.handle("scanner:publishStatus", async (_event, status: ScannerStatusPayload) => { await publishScannerStatus(status); return { ok: true }; }); ipcMain.handle("scanner:nativeDataStatus", async () => nativeScannerDataStatus()); ipcMain.handle("scanner:nativeCatalog", async () => nativeScannerCatalog()); ipcMain.handle("scanner:nativePreflight", async (_event, options?: { category?: NativeScannerStartCategory | string }) => nativeScannerPreflight(options)); ipcMain.handle("scanner:nativeStart", async (_event, options?: { limit?: number; category?: NativeScannerStartCategory }) => nativeScannerStart(options)); ipcMain.handle("scanner:nativeStop", async () => nativeScannerStop()); ipcMain.handle("scanner:nativeStatus", async () => nativeScannerStatus()); ipcMain.handle("scanner:nativeProcessRun", async (_event, options?: { runDir?: string; persist?: boolean; limit?: number }) => nativeScannerProcessRun(options)); ipcMain.handle("scanner:nativeLoadResults", async (_event, options?: { runDir?: string; limit?: number }) => nativeScannerLoadResults(options)); ipcMain.handle("scanner:nativePromoteResults", async (_event, options: { runDir?: string; resultIds: string[] }) => nativeScannerPromoteResults(options)); ipcMain.handle("scanner:nativeReviewResult", async (_event, options: { runDir?: string; resultId: string; action: "approve" | "reject"; artifact?: NativeScannerReviewArtifactInput; note?: string }) => nativeScannerReviewResult(options)); ipcMain.handle("scanner:nativeLoadImage", async (_event, options: { runDir?: string; imagePath: string }) => nativeScannerLoadImage(options)); ipcMain.handle("app:getRuntimeInfo", async () => getRuntimeInfo()); ipcMain.handle("snapshot:load", async () => loadSnapshot()); ipcMain.handle("snapshot:save", async (_event, snapshot: AppSnapshot) => saveSnapshot(snapshot)); ipcMain.handle("scan:runMock", async () => runMockScan()); ipcMain.handle("overlay:show", () => showOverlay()); ipcMain.handle("overlay:hide", () => hideOverlay()); }