架构设计
Electron 进程模型
OpenCowork 的 Electron 主进程、渲染进程和预加载脚本详解。
Electron 进程模型 / Electron Process Model
OpenCowork 使用标准的 Electron 三层边界:主进程处理系统资源,渲染进程承载 UI 与 Agent 逻辑,预加载脚本只暴露最小能力面。
主进程 / Main Process
入口:src/main/index.ts
主进程运行在 Node.js 环境中,负责:
- 创建
BrowserWindow(无边框窗口) - 系统托盘图标管理
- 注册所有 IPC 处理器
- 初始化
ChannelManager和McpManager - 崩溃日志记录
IPC 处理器注册
// src/main/index.ts
registerFsHandlers()
registerAgentChangeHandlers()
registerShellHandlers()
registerApiProxyHandlers()
registerSettingsHandlers()
registerSkillsHandlers()
registerAgentsHandlers()
registerPromptsHandlers()
registerCommandsHandlers()
registerProcessManagerHandlers()
registerDbHandlers()
registerConfigHandlers()
registerSshHandlers()
registerChannelHandlers(channelManager)
registerMcpHandlers(mcpManager)
registerCronHandlers()
registerNotifyHandlers()
registerWebSearchHandlers()
registerOauthHandlers()
registerImageGifHandlers()渲染进程 / Renderer Process
入口:src/renderer/src/main.tsx
渲染进程运行在 Chromium 环境中,负责:
- React UI 渲染
- Agent 循环执行
- 状态管理(Zustand)
- 直接调用 LLM API(不经过主进程)
多窗口支持
通过 URL hash 区分窗口类型:
// main.tsx
if (location.hash === '#notify') {
render(<NotifyWindow />);
} else {
render(<App />);
}预加载脚本 / Preload Script
入口:src/preload/index.ts
预加载脚本在渲染进程中运行,但有 Node.js 访问权限,通过 contextBridge 暴露安全的 API:
contextBridge.exposeInMainWorld('electron', electronAPI)
contextBridge.exposeInMainWorld('api', {
downloadImage: (args) => ipcRenderer.invoke('image:download', args),
fetchImageBase64: (args) => ipcRenderer.invoke('image:fetch-base64', args),
writeImageToClipboard: (args) => ipcRenderer.invoke('clipboard:write-image', args)
})安全模型 / Security Model
- 渲染进程禁用
nodeIntegration - 渲染进程不能直接访问系统能力,只能通过 IPC / preload 桥接
window.electron暴露 Electron Toolkit 的标准 APIwindow.api仅暴露项目需要的少量自定义能力- IPC 通道名称按领域集中定义