OpenCowork
架构设计

IPC 通信机制

OpenCowork 主进程与渲染进程之间的 IPC 通信设计。

IPC 通信机制 / IPC Communication

OpenCowork 使用 Electron IPC 连接渲染进程与主进程。原则是:UI 只发起请求,主进程负责访问系统资源与持久化。

通道组织 / Channel Organization

IPC 通道按领域集中定义,常见分组包括:

  • 文件系统:fs:*
  • 数据库:db:*
  • 设置 / 密钥:settings:*config:*
  • Agent / 任务:agent:*commands:*prompts:*skills:*
  • 消息平台:plugin:*
  • MCP / Cron / SSH:mcp:*cron:*ssh:*
  • 通知 / 搜索 / OAuth / 截图:notify:*web-search:*oauth:*screenshot:*
  • 图像:image:*clipboard:*

这些名称由前端 IPC 常量统一引用,避免字符串散落在业务代码中。

调用模式 / Invocation Patterns

Request-Response(invoke)

// 渲染进程
const plugins = await window.electron.ipc.invoke('plugin:list')

// 主进程
ipcMain.handle('plugin:list', () => {
  return readPlugins()
})

事件推送(on)

// 渲染进程监听插件消息
window.electron.ipc.on('plugin:incoming-message', (_event, message) => {
  pluginStore.addMessage(message)
})

// 主进程推送
mainWindow.webContents.send('plugin:incoming-message', event)

Fire-and-Forget 模式

对于不需要等待结果的操作(例如异步保存或状态刷新),会直接调用 invoke 而不等待结果,避免阻塞 UI。

window.electron.ipc.invoke('db:saveMessage', message)

设计原则 / Design Principles

  • 渲染进程不直接访问 Node.js 文件系统或数据库
  • 主进程只暴露必要的命令面,不暴露内部实现细节
  • 事件只负责通知状态变化,复杂数据通过 invoke 拉取
  • 消息平台与 Agent 的边界清晰分离,便于扩展新平台

On this page