export type AgentEventPayload = { runId: string; seq: number; stream: "job" | "tool" | string; ts: number; data: Record; }; // Keep per-run counters so streams stay strictly monotonic per runId. const seqByRun = new Map(); const listeners = new Set<(evt: AgentEventPayload) => void>(); export function emitAgentEvent(event: Omit) { const nextSeq = (seqByRun.get(event.runId) ?? 0) + 1; seqByRun.set(event.runId, nextSeq); const enriched: AgentEventPayload = { ...event, seq: nextSeq, ts: Date.now(), }; for (const listener of listeners) { try { listener(enriched); } catch { /* ignore */ } } } export function onAgentEvent(listener: (evt: AgentEventPayload) => void) { listeners.add(listener); return () => listeners.delete(listener); }