import { app, ipcMain, shell, globalShortcut } from 'electron' import { createRequire } from 'module' import { registerGlobalShortcuts, setupSpotlightIPC } from './spotlightWindow.js' import { createWindow, setupMainWindowIPC, setupMainWindowAppEvents, setupDevAuthServer } from './mainWindow.js' // --- Keytar-backed auth session storage (main process) --- const require = createRequire(import.meta.url) let keytar = null try { // keytar is a native module; in some dev environments it may not be built yet. keytar = require('keytar') } catch (e) { console.warn( '[keytar] Not available; auth session persistence will be disabled.', e?.message || e ) } const KEYTAR_SERVICE = app.name || 'Farm Control' const KEYTAR_ACCOUNT = 'authSession' app.whenReady().then(() => { createWindow() registerGlobalShortcuts() setupSpotlightIPC() setupMainWindowIPC() setupMainWindowAppEvents(app) setupDevAuthServer() }) app.on('will-quit', () => { globalShortcut.unregisterAll() }) // IPC handler to get OS ipcMain.handle('os-info', () => { return { platform: process.platform } }) ipcMain.handle('auth-session-get', async () => { try { if (!keytar) return null const raw = await keytar.getPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT) if (!raw) return null return JSON.parse(raw) } catch (e) { console.warn('[keytar] Failed to read auth session.', e?.message || e) return null } }) ipcMain.handle('auth-session-set', async (event, session) => { try { if (!keytar) return false if (!session || typeof session !== 'object') return false await keytar.setPassword( KEYTAR_SERVICE, KEYTAR_ACCOUNT, JSON.stringify(session) ) return true } catch (e) { console.warn('[keytar] Failed to write auth session.', e?.message || e) return false } }) ipcMain.handle('auth-session-clear', async () => { try { if (!keytar) return false return await keytar.deletePassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT) } catch (e) { console.warn('[keytar] Failed to clear auth session.', e?.message || e) return false } }) // IPC handler for opening external URLs ipcMain.handle('open-external-url', (event, url) => { shell.openExternal(url) })