01 三进程拓扑与职责边界 本节摘要:理解 OpenWork 最大的障碍,是搞不清「到底有几个东西在跑」。答案是一个三进程模型(加上被托管的引擎,实际是四个角色):用户看到的界面是渲染进程(React 单页应用);它跑在 Electron 主进程(桌面外壳)里;主进程生成并管理本地服务端(自研 HTTP 中枢);服务端反向托管底层引擎(OpenCode)。本节用一张拓扑图把这四个角色讲清,重点是各自的职责边界——谁干什么、谁不干什么。把这个拓扑钉在脑子里,后续每一章你都能定位「我在哪个角色」。 一、为什么会有这么多进程 先回答一个自然疑问:为什么不能把所有东西塞进一个进程?
本节摘要:理解 OpenWork 最大的障碍,是搞不清「到底有几个东西在跑」。答案是一个三进程模型(加上被托管的引擎,实际是四个角色):用户看到的界面是渲染进程(React 单页应用);它跑在 Electron 主进程(桌面外壳)里;主进程生成并管理本地服务端(自研 HTTP 中枢);服务端反向托管底层引擎(OpenCode)。本节用一张拓扑图把这四个角色讲清,重点是各自的职责边界——谁干什么、谁不干什么。把这个拓扑钉在脑子里,后续每一章你都能定位「我在哪个角色」。
先回答一个自然疑问:为什么不能把所有东西塞进一个进程?三个工程理由:
这些约束合起来,自然推出「多进程」结构。
┌─────────────────────────────────────┐ │ 渲染进程(React 单页应用) │ 用户看到的界面 ├─────────────────────────────────────┤ │ Electron 主进程(桌面外壳) │ 窗口管理、运行时管理、IPC │ │ 生成管理 │ │ ▼ │ │ 本地服务端(自研 HTTP 中枢) │ 路由、鉴权、能力管理、引擎反代 │ │ 反向托管 │ │ ▼ │ │ 底层引擎 OpenCode(Agent 运行时) │ 会话循环、工具调用、上下文管理 └─────────────────────────────────────┘
注意:严格说渲染进程和主进程都在 Electron 这个「应用」里,但它们是两个隔离的进程(Electron 的多进程模型);服务端是主进程生成的子进程;引擎是服务端反向托管的子进程。所以「三进程」是渲染、主、服务端,引擎算第四个角色(被服务端托管的子进程)。
渲染进程是用户直接交互的界面——一个 React 单页应用。它的职责:
它不直接调引擎、不直接管文件系统——这些都是通过服务端。这个边界很重要:渲染进程永远只是「服务端的客户端」(第 02 节的主题)。
主进程是桌面形态的「大管家」,职责偏系统层:
它不直接处理业务逻辑——业务逻辑在服务端。主进程更像「基础设施层」,负责让服务端能跑起来、让渲染进程能显示。
服务端是整个产品的「中枢」,几乎所有的业务逻辑都在这里:
它是所有客户端(桌面、CLI Agent、企业云)的共同后端。这是为什么第 3~8 章都围着它转——它是 OpenWork 的心脏。
引擎是被服务端反向托管的子进程,职责是真正的 Agent 运行时:
它不直接被渲染进程调——所有对引擎的访问都经服务端代理(第 3 章)。服务端是引擎的「门卫」。
💡 记住边界:渲染进程只认服务端;主进程只管基础设施;服务端是中枢也代理引擎;引擎只管 Agent 运行时。这四条边界一旦清楚,你就能解释任何一次操作「该由谁处理」。
这是拓扑里最关键的设计决策,值得单独强调。服务端独立成进程(而不是塞进主进程),换来三样东西:
这就是为什么 OpenWork 的工程文档反复强调「服务端消费优先」——把中枢独立出来,让一切客户端共用它。这是下一节的主题。
从现在起,每读到一个新概念,先问自己:它在哪个角色里? 举几个例子预热:
拓扑清楚了,但有一个贯穿它的核心哲学没讲——为什么渲染进程只认服务端?这就是下一节「服务端消费优先」。