Codex Handbook
rollout-trace/src/model/session.rs 110 lines
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<String>,    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<String>,    /// Logical conversation items first observed for this thread, in transcript order.    pub conversation_item_ids: Vec<ConversationItemId>,}/// 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<i64>,    pub ended_seq: Option<RawEventSeq>,    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<ConversationItemId>,}