- Added `vectordb` as a dependency in `package.json`. - Implemented `embedText` function in `src/main/ai/embeddings.ts` to handle text embeddings using GitHub Copilot OAuth token or OpenAI token. - Created `vectordb.ts` for managing LanceDB connection and embedding notes with upsert strategy. - Updated `index.ts` to initialize vector database and migrate existing notes on app ready. - Modified `router/index.ts` to fire-and-forget embedding calls on note creation and updates. - Enhanced `progress.txt` with detailed implementation notes and learnings regarding the integration.
83 lines
2.6 KiB
TypeScript
83 lines
2.6 KiB
TypeScript
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.
|