用途:在 DAG 执行引擎与可视化仪表盘之间实现实时双向通信,覆盖连接管理、类型化事件协议与 React Hook 集成。
主要能力:
- 事件协议:服务端到客户端事件(ServerEvent)包括 node_state(节点状态、输出、指标)、edge_active(边激活)、dag_mutated(DAG 变更)、cost_update(已花费/预算/剩余)、execution_complete(执行结果)、human_gate_waiting(人工门等待)与 error;客户端到服务端事件(ClientEvent)包括 human_decision(approve/reject/modify 及反馈)、pause_execution、resume_execution、cancel_execution。
- React Hook useDAGStream:以 dagId 与 store 为参数,内部用 WebSocket 连接 /api/dags/${dagId}/stream,解析消息并按 type 分发更新节点数据、成本状态、DAG 变更与执行完成状态;提供 send 方法发送客户端事件。
- 连接管理:连接关闭后使用指数退避重连(1s、2s、4s、8s……最大 30s),重连后需重新同步状态。
- 服务端实现:示例使用 ws 的 WebSocketServer(noServer: true),按 DAG 划分房间(rooms 映射 dagId 到 WebSocket 集合),broadcast 向同一 DAG 的活跃连接推送 JSON 事件。
使用方式:当需要把 DAG 节点状态变化流式推到仪表盘、把人工门决策从仪表盘发回执行引擎、展示实时成本与进度、进行双向通信时使用;若只需单向服务端到客户端更新,可考虑更简单的 SSE;REST API 设计请使用 api-architect;轮询式状态检查可用 WebSocket 替代。
限制与注意:不适用于单向推送、REST 设计或轮询状态检查;避免无重连逻辑(否则仪表盘数据会永久陈旧)、避免每个事件都发送完整 DAG 状态(应只发增量:哪个节点、什么状态)、避免无类型协议(应定义 ServerEvent 与 ClientEvent 联合类型并对 msg.type 做穷尽 switch)。代码内容保持资料原样;其余实现细节暂未提供。