// main/index.js const { app, globalShortcut, BrowserWindow } = require('electron') const path = require('path') const { registerUpdater, updaterState } = require('./updater') const { createMainWindow } = require('./window') const { registerSystemIpc } = require('./ipc/system') const { registerFileIpc } = require('./ipc/files') const { registerMqIpc } = require('./ipc/mq') const { startIOSAIExecutable, killIOSAI } = require('./services/iosai') const { startSSE } = require('./services/sse') const { setupGuards } = require('./utils/guard') const { dumpAllMem } = require('./utils/mem') setupGuards() app.commandLine.appendSwitch('enable-precise-memory-info') app.commandLine.appendSwitch('js-flags', '--expose-gc --max-old-space-size=4096') app.commandLine.appendSwitch('enable-experimental-web-platform-features') app.commandLine.appendSwitch('enable-features', 'WebCodecs,MediaStreamInsertableStreams') let sse = null app.on('ready', async () => { // 更新 registerUpdater() // 启动外部服务 startIOSAIExecutable() // IPC registerSystemIpc() registerFileIpc() registerMqIpc((payload) => sse?.broadcast('message', payload)) // 渲染用 // SSE sse = startSSE() // 窗口 const win = createMainWindow({ updaterState }) // 快捷键 globalShortcut.register('Control+Shift+I', () => { const w = BrowserWindow.getFocusedWindow() if (!w) return const wc = w.webContents wc.isDevToolsOpened() ? wc.closeDevTools() : wc.openDevTools({ mode: 'detach' }) }) // 内存Dump(可选) setInterval(dumpAllMem, 5000) }) app.on('will-quit', () => globalShortcut.unregisterAll()) app.on('before-quit', async () => { await killIOSAI() }) app.on('window-all-closed', async () => { await killIOSAI() if (process.platform !== 'darwin') app.quit() }) app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createMainWindow({ updaterState }) })