/** * 预加载:桌面能力 + 用户目录(对标 Codex ~/.codex → ~/.aps) */ const { contextBridge, ipcRenderer } = require('electron'); const os = require('os'); const path = require('path'); /** 安装态 / 桌面态:固定用户主目录下的 .aps */ const home = process.env.APS_HOME || path.join(os.homedir(), '.aps'); try { contextBridge.exposeInMainWorld('apsDesktop', { mode: 'desktop', apiUrl: process.env.APS_API_URL || 'http://127.0.0.1:8000', home, skillsDir: path.join(home, 'skills'), sessionsDir: path.join(home, 'sessions'), async getDeviceId() { return ipcRenderer.invoke('aps:get-device-id'); }, openHome() { ipcRenderer.send('aps:open-path', 'home'); }, openSkills() { ipcRenderer.send('aps:open-path', 'skills'); }, openSessions() { ipcRenderer.send('aps:open-path', 'sessions'); }, async pickDirectory() { return ipcRenderer.invoke('aps:pick-directory'); }, toggleDevTools() { ipcRenderer.send('aps:toggle-devtools'); }, toggleFullScreen() { ipcRenderer.send('aps:toggle-fullscreen'); }, leaveFullScreen() { ipcRenderer.send('aps:leave-fullscreen'); }, windowMinimize() { ipcRenderer.send('aps:window-minimize'); }, windowMaximize() { ipcRenderer.send('aps:window-maximize'); }, windowClose() { ipcRenderer.send('aps:window-close'); }, onWindowState(callback) { if (typeof callback !== 'function') return () => {}; const handler = (_event, state) => callback(state); ipcRenderer.on('aps:window-state', handler); ipcRenderer.send('aps:window-state-request'); return () => ipcRenderer.removeListener('aps:window-state', handler); }, onMenuAction(callback) { if (typeof callback !== 'function') return () => {}; const handler = (_event, action) => callback(action); ipcRenderer.on('menu:action', handler); return () => ipcRenderer.removeListener('menu:action', handler); }, }); } catch (err) { console.error('[aps-desktop] preload expose failed', err); }