/** * Application Menu Configuration * Creates the native application menu for macOS/Windows/Linux */ import { Menu, app, shell, BrowserWindow } from 'electron'; /** * Create application menu */ export function createMenu(): void { const isMac = process.platform === 'darwin'; 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: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('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: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/chat'); }, }, { 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: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/'); }, }, { label: 'Chat', accelerator: 'CmdOrCtrl+2', click: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/chat'); }, }, { label: 'Channels', accelerator: 'CmdOrCtrl+3', click: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/channels'); }, }, { label: 'Skills', accelerator: 'CmdOrCtrl+4', click: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/skills'); }, }, { label: 'Cron Tasks', accelerator: 'CmdOrCtrl+5', click: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('navigate', '/cron'); }, }, { label: 'Settings', accelerator: isMac ? 'Cmd+,' : 'Ctrl+,', click: () => { const win = BrowserWindow.getFocusedWindow(); win?.webContents.send('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 }]), ], }, // Help menu { role: 'help', submenu: [ { label: 'Documentation', click: async () => { await shell.openExternal('https://github.rommark.dev/admin/DeskClaw'); }, }, { label: 'Report Issue', click: async () => { await shell.openExternal('https://github.rommark.dev/admin/DeskClaw/issues'); }, }, { type: 'separator' }, { label: 'OpenClaw Documentation', click: async () => { await shell.openExternal('https://docs.openclaw.ai'); }, }, ], }, ]; const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); }