OpenCowork
架构设计

Electron 进程模型

OpenCowork 的 Electron 主进程、渲染进程和预加载脚本详解。

Electron 进程模型 / Electron Process Model

OpenCowork 使用标准的 Electron 三层边界:主进程处理系统资源,渲染进程承载 UI 与 Agent 逻辑,预加载脚本只暴露最小能力面。

主进程 / Main Process

入口src/main/index.ts

主进程运行在 Node.js 环境中,负责:

  • 创建 BrowserWindow(无边框窗口)
  • 系统托盘图标管理
  • 注册所有 IPC 处理器
  • 初始化 ChannelManagerMcpManager
  • 崩溃日志记录

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 的标准 API
  • window.api 仅暴露项目需要的少量自定义能力
  • IPC 通道名称按领域集中定义

On this page