Adds new event for session completed that includes usage. Also ensures
we return 1 on failures.
```
{
"type": "session.created",
"session_id": "019987a7-93e7-7b20-9e05-e90060e411ea"
}
{
"type": "turn.started"
}
...
{
"type": "turn.completed",
"usage": {
"input_tokens": 78913,
"cached_input_tokens": 65280,
"output_tokens": 1099
}
}
```
192 lines
5.2 KiB
Rust
192 lines
5.2 KiB
Rust
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 = "turn.started")]
|
|
TurnStarted(TurnStartedEvent),
|
|
#[serde(rename = "turn.completed")]
|
|
TurnCompleted(TurnCompletedEvent),
|
|
#[serde(rename = "item.started")]
|
|
ItemStarted(ItemStartedEvent),
|
|
#[serde(rename = "item.updated")]
|
|
ItemUpdated(ItemUpdatedEvent),
|
|
#[serde(rename = "item.completed")]
|
|
ItemCompleted(ItemCompletedEvent),
|
|
#[serde(rename = "error")]
|
|
Error(ConversationErrorEvent),
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct SessionCreatedEvent {
|
|
pub session_id: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS, Default)]
|
|
pub struct TurnStartedEvent {}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct TurnCompletedEvent {
|
|
pub usage: Usage,
|
|
}
|
|
|
|
/// Minimal usage summary for a turn.
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS, Default)]
|
|
pub struct Usage {
|
|
pub input_tokens: u64,
|
|
pub cached_input_tokens: u64,
|
|
pub output_tokens: u64,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct ItemStartedEvent {
|
|
pub item: ConversationItem,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct ItemCompletedEvent {
|
|
pub item: ConversationItem,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct ItemUpdatedEvent {
|
|
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),
|
|
TodoList(TodoListItem),
|
|
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<i32>,
|
|
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<FileUpdateChange>,
|
|
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,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct TodoItem {
|
|
pub text: String,
|
|
pub completed: bool,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, TS)]
|
|
pub struct TodoListItem {
|
|
pub items: Vec<TodoItem>,
|
|
}
|