import { app, BrowserWindow } from 'electron'; import path from 'node:path'; import started from 'electron-squirrel-startup'; import { initDb } from './db'; import { appRouter } from './router'; import { createIPCHandler } from './ipc'; import { initAI } from './ai/provider'; import { initVectorDb, migrateNotesIfNeeded } from './db/vectordb'; // Import to trigger provider registration before initAI() runs import './ai/copilot'; // Handle creating/removing shortcuts on Windows when installing/uninstalling. if (started) { app.quit(); } const createWindow = (): BrowserWindow => { // Create the browser window. const mainWindow = new BrowserWindow({ width: 1280, height: 800, minWidth: 900, minHeight: 600, titleBarStyle: 'hiddenInset', webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true, nodeIntegration: false, }, }); // and load the index.html of the app. if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL); } else { mainWindow.loadFile( path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`), ); } // Open DevTools in development. if (process.env.NODE_ENV === 'development') { mainWindow.webContents.openDevTools(); } return mainWindow; }; // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.on('ready', () => { initDb(); const win = createWindow(); createIPCHandler({ router: appRouter, windows: [win] }); // AI init is best-effort — never block window creation initAI().catch((err) => console.error('[AI] Init failed:', err)); // Vector DB init + migration is best-effort — runs after window is shown initVectorDb() .then(() => migrateNotesIfNeeded()) .catch((err) => console.error('[VectorDB] Init or migration failed:', err)); }); // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and import them here.