/** * AgentMail Electron preload —— 通过 contextBridge 暴露安全 API 给渲染进程。 * * 渲染进程是 web/src 的 React,跑在 sandbox: true 下(无 nodeIntegration)。 * 需要桌面能力时(文件选择、通知、托盘角标、SSE 转发)走这里暴露的桥。 * * Phase 1 只暴露最小集;后续 Phase 逐步加。 */ const { contextBridge, ipcRenderer } = require('electron'); // 注入 API 基地址与 token:渲染进程的 config.ts 在读 window.__AGENTMAIL_API_BASE__ // 与 __AGENTMAIL_TOKEN__ 时拿到它们,于是现有 client.ts/sse.ts **零改动**复用。 // 这两个值由主进程在创建窗口时通过附加参数传进来(见 main.cjs 的 additionalArguments)。 function getInjected(name) { const prefix = `--agentmail-${name}=`; const arg = process.argv.find(a => a.startsWith(prefix)); return arg ? arg.slice(prefix.length) : undefined; } contextBridge.exposeInMainWorld('__AGENTMAIL_API_BASE__', getInjected('api-base') || 'http://127.0.0.1:8180/api/v1'); contextBridge.exposeInMainWorld('__AGENTMAIL_TOKEN__', getInjected('token') || undefined); contextBridge.exposeInMainWorld('agentmail', { /** Gateway 基础地址(主进程 env 或默认 127.0.0.1:8180) */ gatewayUrl: () => ipcRenderer.invoke('get-gateway-url'), /** 版本信息(渲染进程可显示在 About 页) */ versions: { electron: process.versions.electron, chrome: process.versions.chrome, node: process.versions.node, }, /** 平台标识:win32 / linux / darwin */ platform: process.platform, });