OpenCode 源码解析 · 第 17 讲
OpenCode 源码解析 第 17 讲:Event 事件总线与 GlobalBus——从 PubSub 到 SSE 的完整链路 基于 dev 分支源码 · 2026-07-25 一、事件系统:OpenCode 的神经系统 前十六讲覆盖了 OpenCode 从 CLI 到 Effect 运行时的核心能力。这一讲深入 Event 事件系统 ——OpenCode 的"神经系统",负责在 Server、TUI、Web App、ACP 子代理和桌面客户端之间传递每一个状态变化。从 LLM 的流式输出来到用户屏幕,从工具执行的每一步到会话状态的持久化,所有数据流都经过事件总线。 事件模块横跨 13 个核心文件、约 2035 行代码 ,包含三层架构:Schema 层定义事件契约,Core 层实现 PubSub 与持久化,Opencode 层桥接到 HTTP SSE 与 GlobalBus。 📦 本讲核心文件 core/src/event.ts (638 行)— EventV2 服务与 Layer opencode/src/bus/global.ts (22 行)— GlobalBus 全局事件发射器 opencode/src/event-v2-bridge.ts (71 行)— 实例位置桥接 schema/src/event.ts (125 行)— 事件 Schema 定义 schema/src/session-event.ts (521 行)— 30+ 会话事件类型 schema/src/event-manifest.ts (84 行)— 80+ 事件注册表 core/src/session/runner/publish-llm-event.ts (423 行)— LLM 事件发布器 opencode/src/server/routes/instance/httpapi/handlers/event.ts (99 行)— SSE 端点 二、三层事件架构 OpenCode 的事件系统不是单一模块,而是 三层协作 : 1. Schema 层:事件契约(@opencode-ai/schema) schema/src/event.ts 定义了事件系统的类型基础设施。核心是 Event.define() 工厂函数——它接收类型名、可选的持久化配置和字段 Schema,返回一个完整的 Effect Schema 定义。 📄 schema/src/event.ts (第 42-70 行) export function define< const Type extends string, const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>, >(input: { readonly type: Type readonly durable?: { readonly version: number readonly aggregate: string } readonly schema: Fields }) { const data = Schema.Struct(input.schema) return Schema.Struct({ id: ID, metadata: optional(Schema.Record(Schema.String, Schema.Unknown)), type: Schema.Literal(input.type), durable: optional(Schema.Struct({ aggregateID: Schema.String, seq: Schema.Int, version: Schema.Int })), location: optional(Location.Ref), data, }) .annotate({ identifier: input.type }) .pipe( statics(() => ({ type: input.type, ...(input.durable === undefined ? {} : { durable: input.durable }), data, })), )…
阅读全文:OpenCode 源码解析 第 17 讲