import type { ActionEvent, ProseEvent } from './action-parser.js'; import type { RunStatus } from './character-agent.js'; export interface ChatTurnStartEvent { readonly kind: 'turn-start'; readonly userMessage: string; } export interface ChatTurnEndEvent { readonly kind: 'turn-end'; readonly finalText: string; readonly status: RunStatus; readonly errorMessage?: string; } export type CharacterEvent = ProseEvent | ActionEvent | ChatTurnStartEvent | ChatTurnEndEvent; export type CharacterEventKind = CharacterEvent['kind']; export type CharacterEventListener = (event: Extract) => void; /** * Tiny typed pub/sub. Not using `EventTarget` because the `CustomEvent` * wrapper adds ceremony for each listener and it does not exist in every * runtime we target (e.g. Bun workers historically). */ export declare class CharacterEventBus { private readonly listenersByKind; private readonly wildcardListeners; /** * Registers a listener for a specific event kind. Returns a disposer that, * when invoked, removes the registration. */ on(kind: K, listener: CharacterEventListener): () => void; /** * Registers a listener that receives every event. Useful for tracing. */ onAny(listener: (event: CharacterEvent) => void): () => void; /** * Dispatches an event to registered listeners. Listener errors are caught * and logged so a single faulty subscriber cannot break the turn. */ emit(event: CharacterEvent): void; /** Clears every registered listener. Useful when tearing down an agent. */ clear(): void; private logListenerError; }