""" All WebSocket/SSE event types sent from Fellowship to connected members. Every event is a Pydantic model serialized to JSON. """ from typing import Any, Literal from pydantic import BaseModel class HistoryEvent(BaseModel): type: Literal["history"] = "history" messages: list[dict[str, Any]] class TurnStartEvent(BaseModel): type: Literal["turn_start"] = "turn_start" bot: str turn: int class BotMessageEvent(BaseModel): type: Literal["bot_message"] = "bot_message" bot: str content: str turn: int class TokenEvent(BaseModel): """Only emitted when stream_tokens is enabled.""" type: Literal["token"] = "token" bot: str token: str turn: int class TurnEndEvent(BaseModel): type: Literal["turn_end"] = "turn_end" bot: str turn: int tokens: int class TalkerMessageEvent(BaseModel): type: Literal["talker_message"] = "talker_message" talker_id: str talker_name: str content: str turn: int class MemberJoinedEvent(BaseModel): type: Literal["member_joined"] = "member_joined" role: Literal["talker", "observer"] class MemberLeftEvent(BaseModel): type: Literal["member_left"] = "member_left" role: Literal["talker", "observer"] class SessionPausedEvent(BaseModel): type: Literal["session_paused"] = "session_paused" class SessionResumedEvent(BaseModel): type: Literal["session_resumed"] = "session_resumed" class SessionEndEvent(BaseModel): type: Literal["session_end"] = "session_end" reason: Literal["max_turns", "max_time", "max_context", "orchestrator", "client_request"] class ErrorEvent(BaseModel): type: Literal["error"] = "error" message: str class DebugEvent(BaseModel): """Only emitted when debug mode is active.""" type: Literal["debug"] = "debug" category: str data: dict[str, Any]