use serde::Deserialize; use serde::Serialize; use crate::raw_event::RawEventSeq; use super::AgentPath; use super::AgentThreadId; use super::CodexTurnId; use super::ConversationItemId; use super::EdgeId; /// Coarse terminal status for the rollout. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum RolloutStatus { /// Writer has not seen a terminal rollout event. Running, /// Rollout ended normally. Completed, /// Rollout ended because an operation failed. Failed, /// Rollout was cancelled or otherwise stopped before normal completion. Aborted, } /// One Codex thread/session participating in the rollout. /// /// Threads are agents in the multi-agent sense, but the root interactive /// session is represented by the same object. Runtime objects live in top-level /// maps and point back to their owning thread; only transcript order is stored /// here because compaction/reconciliation makes it semantic. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AgentThread { pub thread_id: AgentThreadId, /// Stable routing identity. Viewer/search should prefer this over nickname. pub agent_path: AgentPath, /// Presentation hint. It can collide and must not be used as identity. pub nickname: Option, pub origin: AgentOrigin, /// Session lifecycle for this thread. /// /// Child threads can end independently from the root rollout, for example /// after a parent calls `close_agent`. Keeping this on the thread prevents /// those shutdowns from being mistaken for whole-rollout completion. pub execution: ExecutionWindow, /// Configured model presentation hint. Individual inference calls carry the actual upstream model. pub default_model: Option, /// Logical conversation items first observed for this thread, in transcript order. pub conversation_item_ids: Vec, } /// Provenance for a traced Codex thread. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case", tag = "type")] pub enum AgentOrigin { Root, Spawned { parent_thread_id: AgentThreadId, /// Interaction edge that carried the spawn task. spawn_edge_id: EdgeId, /// Stable path segment/task name selected by the parent/tool call. task_name: String, /// Selected agent role/type, for example `worker` or `explorer`. agent_role: String, }, } /// Runtime interval for a typed trace object. /// /// Wall-clock timestamps are for display and latency. Sequence numbers are the /// causal ordering primitive and should be used to pair observations or break /// same-millisecond ties. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ExecutionWindow { pub started_at_unix_ms: i64, pub started_seq: RawEventSeq, pub ended_at_unix_ms: Option, pub ended_seq: Option, pub status: ExecutionStatus, } /// Coarse lifecycle status for a runtime object. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ExecutionStatus { /// Object is still live or the trace ended before its terminal event. Running, /// Object completed successfully. Completed, /// Object reached an error state. Failed, /// Object was cancelled by user/policy/runtime before completion. Cancelled, /// Object was aborted when its owner/runtime stopped. Aborted, } /// One activation of the Codex runtime for one thread. /// /// A Codex turn groups protocol/runtime work for one thread activation. /// It is not a user/assistant message pair; conversation belongs in /// `ConversationItem`. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CodexTurn { pub codex_turn_id: CodexTurnId, pub thread_id: AgentThreadId, pub execution: ExecutionWindow, /// Conversation items that directly triggered this activation, when known. pub input_item_ids: Vec, }