第 3 讲:事件系统(Session/Agent/Capability events)

DeepSeek Harness 源码解析 · 第 3 讲

DeepSeek Harness 源码解析系列 第 3 讲:事件系统(Session/Agent/Capability events) 基于 DeepSeek Harness 源码 · 2026-08-18 一、事件驱动架构总览 DeepSeek Harness 的核心理念是 "everything is a plugin" (万物皆插件)。插件之间如何通信?答案是 事件系统 。整个框架围绕三层事件构建: 🔹 Cordis 事件总线 — 底层事件分发引擎,5 种 dispatch 模式 🔹 Session Events — 会话级事件,append-only 日志,事件溯源(event sourcing) 🔹 Capability Events — 能力层事件,工具调用、审批、提问等业务信号 理解事件系统是理解整个 Harness 的关键—— Session 不存储消息,只存储事件 ,消息是从事件日志中派生出来的。 二、Cordis 事件总线:5 种分发模式 Cordis 是 Harness 的底层插件框架(vendored 在 vendor/cordis/ )。它的事件总线 EventsService 提供 5 种分发策略,每种对应不同的语义: 📄 vendor/cordis/src/events.ts (第 25-32 行) /** * Event dispatch strategy used by the event service. * * `emit` runs synchronous listeners without awaiting them, `parallel` awaits * all listeners together, `serial` awaits them in order until one bails, * `bail` stops on the first synchronous bail value, and `waterfall` composes * listeners around a final `next` callback. */ export type DispatchMode = 'emit' | 'parallel' | 'serial' | 'bail' | 'waterfall' 模式 语义 典型场景 emit 同步调用,不等待返回 session/event 通知、日志 parallel 并发等待所有 listener session/flush 持久化检查点 serial 串行等待,首个 bail 值终止 权限检查、拦截器链 bail 同步串行,首个非空值终止 internal/listener 注册拦截 waterfall 中间件链,next() 传递 internal/update 配置更新 每种模式对应 ctx 上的同名方法: 📄 vendor/cordis/src/events.ts (第 43-97 行, 节选) declare module './context.ts' { export interface Context { /** 同步广播,忽略返回值 */ emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void /** 并发等待所有 listener */ parallel<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promise<void> /** 串行等待,首个 bail 值终止 */ serial<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): Promisify<ReturnType<Events[K]>> /** 同步 bail */ bail<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): ReturnType<Events[K]> /** 中间件链,next() 传递 */ waterfal…

阅读全文:DeepSeek Harness 源码解析 第 3 讲