架构设计
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 的边界清晰分离,便于扩展新平台