use serde::Deserialize; use serde::Serialize; use ts_rs::TS; /// Top-level events emitted on the Codex Exec conversation stream. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] #[serde(tag = "type")] pub enum ConversationEvent { #[serde(rename = "session.created")] SessionCreated(SessionCreatedEvent), #[serde(rename = "item.started")] ItemStarted(ItemStartedEvent), #[serde(rename = "item.completed")] ItemCompleted(ItemCompletedEvent), #[serde(rename = "error")] Error(ConversationErrorEvent), } /// Payload describing a newly created conversation item. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct SessionCreatedEvent { pub session_id: String, } /// Payload describing the start of an existing conversation item. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ItemStartedEvent { pub item: ConversationItem, } /// Payload describing the completion of an existing conversation item. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ItemCompletedEvent { pub item: ConversationItem, } /// Fatal error emitted by the stream. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ConversationErrorEvent { pub message: String, } /// Canonical representation of a conversation item and its domain-specific payload. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ConversationItem { pub id: String, #[serde(flatten)] pub details: ConversationItemDetails, } /// Typed payloads for each supported conversation item type. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] #[serde(tag = "item_type", rename_all = "snake_case")] pub enum ConversationItemDetails { AssistantMessage(AssistantMessageItem), Reasoning(ReasoningItem), CommandExecution(CommandExecutionItem), FileChange(FileChangeItem), McpToolCall(McpToolCallItem), WebSearch(WebSearchItem), Error(ErrorItem), } /// Session conversation metadata. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct SessionItem { pub session_id: String, } /// Assistant message payload. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct AssistantMessageItem { pub text: String, } /// Model reasoning summary payload. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ReasoningItem { pub text: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default, TS)] #[serde(rename_all = "snake_case")] pub enum CommandExecutionStatus { #[default] InProgress, Completed, Failed, } /// Local shell command execution payload. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct CommandExecutionItem { pub command: String, pub aggregated_output: String, #[serde(skip_serializing_if = "Option::is_none")] pub exit_code: Option, pub status: CommandExecutionStatus, } /// Single file change summary for a patch. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct FileUpdateChange { pub path: String, pub kind: PatchChangeKind, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] #[serde(rename_all = "snake_case")] pub enum PatchApplyStatus { Completed, Failed, } /// Patch application payload. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct FileChangeItem { pub changes: Vec, pub status: PatchApplyStatus, } /// Known change kinds for a patch. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] #[serde(rename_all = "snake_case")] pub enum PatchChangeKind { Add, Delete, Update, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default, TS)] #[serde(rename_all = "snake_case")] pub enum McpToolCallStatus { #[default] InProgress, Completed, Failed, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct McpToolCallItem { pub server: String, pub tool: String, pub status: McpToolCallStatus, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct WebSearchItem { pub query: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)] pub struct ErrorItem { pub message: String, }