为 Eyrie daemon 建起完整的 agent 事件流系统——从 agent 进程到 Electron 客户端的实时推送管线。
Agent(Claude Code、Codex 等)在工作时会不断产出事件——正在输出的消息、调用了什么工具、需要用户审批、运行是否完成。 之前 daemon 没有任何机制把这些事件传给前端。这个 PR 从零搭建了整个事件流管线—— agent 产出事件 → 存库 → 通过 SSE 实时推给 Electron,同时支持断线重连和崩溃恢复。
Agent 的每一条产出——消息、工具调用、审批请求——通过 SSE 实时到达 Electron 客户端
事件先存数据库再推送,断线重连时从断点自动续传
Agent 进程意外退出 → 自动标记状态、通知前端;daemon 重启 → 历史事件完好
Claude Code / Codex 等 agent 通过 provider adapter 发出原始事件(消息片段、工具调用、运行完成等)
event-codec 把原始事件翻译成数据库行——提取索引字段(role、toolCallId 等)、生成状态变更指令(projections)
在同一个 SQLite 事务里完成:插入事件行 → 分配序号(seq / sessionSeq)→ 执行状态投影(run 完成、session 回到 idle 等)
写入成功后,broadcaster 把事件推给所有订阅了该 session 的 SSE 连接——纯内存,零延迟
通过 Hono 的 streamSSE 把事件以 SSE 格式写到 HTTP 响应流,Electron 客户端实时接收并渲染
所有状态转换用 CAS(Compare-And-Swap)乐观锁——并发操作谁先到谁赢,不阻塞不报错。
RunnerManager 负责 agent 进程的创建、复用和善后。
实时展示 agent 的消息流、工具调用、审批请求
回放 agent 的代码变更历史,在 UI 内做行内审查
每个 agent 独立的事件通道,互不干扰