/** * Application Menu Configuration * Creates the native application menu for macOS/Windows/Linux */ import { Menu, app, BrowserWindow } from 'electron'; import { sendWhenWindowReady, showMainWindow, type EnsureMainWindow } from './window-provider'; /** * Create application menu */ export function createMenu(ensureMainWindow?: EnsureMainWindow): void { const isMac = process.platform === 'darwin'; const navigate = (route: string): void => { const window = ensureMainWindow ? ensureMainWindow() : BrowserWindow.getFocusedWindow(); showMainWindow(window); sendWhenWindowReady(window, 'navigate', route); }; const template: Electron.MenuItemConstructorOptions[] = [ // App menu (macOS only) ...(isMac ? [ { label: app.name, submenu: [ { role: 'about' as const }, { type: 'separator' as const }, { label: 'Preferences...', accelerator: 'Cmd+,', click: () => navigate('/settings'), }, { type: 'separator' as const }, { role: 'services' as const }, { type: 'separator' as const }, { role: 'hide' as const }, { role: 'hideOthers' as const }, { role: 'unhide' as const }, { type: 'separator' as const }, { role: 'quit' as const }, ], }, ] : []), // File menu { label: 'File', submenu: [ { label: 'New Chat', accelerator: 'CmdOrCtrl+N', click: () => navigate('/'), }, { type: 'separator' }, isMac ? { role: 'close' } : { role: 'quit' }, ], }, // Edit menu { label: 'Edit', submenu: [ { role: 'undo' }, { role: 'redo' }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, ...(isMac ? [ { role: 'pasteAndMatchStyle' as const }, { role: 'delete' as const }, { role: 'selectAll' as const }, ] : [ { role: 'delete' as const }, { type: 'separator' as const }, { role: 'selectAll' as const }, ]), ], }, // View menu { label: 'View', submenu: [ { role: 'reload' }, { role: 'forceReload' }, { role: 'toggleDevTools' }, { type: 'separator' }, { role: 'resetZoom' }, { role: 'zoomIn' }, { role: 'zoomOut' }, { type: 'separator' }, { role: 'togglefullscreen' }, ], }, // Navigate menu { label: 'Navigate', submenu: [ { label: 'Dashboard', accelerator: 'CmdOrCtrl+1', click: () => navigate('/'), }, { label: 'Sessions', accelerator: 'CmdOrCtrl+2', click: () => navigate('/sessions'), }, { label: 'Projects', accelerator: 'CmdOrCtrl+3', click: () => navigate('/projects'), }, { label: 'Models', accelerator: 'CmdOrCtrl+4', click: () => navigate('/models'), }, { label: 'Settings', accelerator: isMac ? 'Cmd+,' : 'Ctrl+,', click: () => navigate('/settings'), }, ], }, // Window menu { label: 'Window', submenu: [ { role: 'minimize' }, { role: 'zoom' }, ...(isMac ? [ { type: 'separator' as const }, { role: 'front' as const }, { type: 'separator' as const }, { role: 'window' as const }, ] : [{ role: 'close' as const }]), ], }, ]; const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); }