From 66f66d1c17213f55aa56d69c0cccc309b16f3362 Mon Sep 17 00:00:00 2001 From: Clawd Date: Sat, 28 Feb 2026 07:27:49 -0800 Subject: Phase 3: IPC layer - Implement src/main/preload.ts with typed API bridge - Projects, sessions, messages CRUD - Chat send/interrupt - Workflow review/advance/permissions - Artifact read/write - Directory picker dialog - Claude message event subscription - Implement src/main/ipc/handlers.ts - All IPC handlers with proper error handling - Message forwarding to renderer - Assistant message storage - Update src/main/index.ts - Initialize database on startup - Register IPC handlers - Clean database close on exit --- src/main/index.ts | 90 +++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 46 deletions(-) (limited to 'src/main/index.ts') diff --git a/src/main/index.ts b/src/main/index.ts index b164f15..f0b23f7 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,63 +1,61 @@ -import Database from 'better-sqlite3' -import { app, BrowserWindow } from 'electron' -import fs from 'node:fs' -import path from 'node:path' +import { app, BrowserWindow } from "electron"; +import path from "node:path"; +import { getDb, closeDb } from "./db"; +import { registerIpcHandlers } from "./ipc/handlers"; -const isDev = !app.isPackaged // reliable dev/prod switch. [oai_citation:2‡Electron](https://electronjs.org/docs/latest/api/app?utm_source=chatgpt.com) +const isDev = !app.isPackaged; +let mainWindow: BrowserWindow | null = null; function createWindow() { - const win = new BrowserWindow({ - width: 800, - height: 600, + mainWindow = new BrowserWindow({ + width: 1400, + height: 900, + minWidth: 1000, + minHeight: 600, show: false, + titleBarStyle: "hiddenInset", webPreferences: { contextIsolation: true, nodeIntegration: false, - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, "preload.js"), }, - }) + }); + + registerIpcHandlers(mainWindow); if (isDev) { - const url = process.env.VITE_DEV_SERVER_URL ?? 'http://localhost:5173' - win.loadURL(url).finally(() => { - win.show() - win.webContents.openDevTools({ mode: 'detach' }) - }) + const url = process.env.VITE_DEV_SERVER_URL ?? "http://localhost:5173"; + mainWindow.loadURL(url).finally(() => { + mainWindow!.show(); + mainWindow!.webContents.openDevTools({ mode: "detach" }); + }); } else { const indexHtml = path.join( app.getAppPath(), - 'renderer', - 'dist', - 'index.html' - ) - win.loadFile(indexHtml).finally(() => win.show()) + "renderer", + "dist", + "index.html" + ); + mainWindow.loadFile(indexHtml).finally(() => mainWindow!.show()); } } -function initDb() { - const dbDir = app.getPath('userData') - if (!fs.existsSync(dbDir)) fs.mkdirSync(dbDir, { recursive: true }) - const dbPath = path.join(dbDir, 'app.db') - - const db = new Database(dbPath) - db.pragma('journal_mode = WAL') - db.prepare('CREATE TABLE IF NOT EXISTS messages (text TEXT)').run() - db.prepare('INSERT INTO messages (text) VALUES (?)').run( - 'hello from better-sqlite3' - ) - const row = db.prepare('SELECT text FROM messages LIMIT 1').get() - console.log('Selected row:', row) - db.close() -} - app.whenReady().then(() => { - initDb() - createWindow() - app.on( - 'activate', - () => BrowserWindow.getAllWindows().length === 0 && createWindow() - ) -}) -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') app.quit() -}) + // Initialize database + getDb(); + + createWindow(); + + app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); +}); + +app.on("window-all-closed", () => { + closeDb(); + if (process.platform !== "darwin") { + app.quit(); + } +}); -- cgit v1.2.3