use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunAttempt {
pub issue_id: String,
pub issue_identifier: String,
pub attempt: Option<u32>,
pub workspace_path: String,
pub started_at: DateTime<Utc>,
pub status: RunAttemptStatus,
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RunAttemptStatus {
PreparingWorkspace,
BuildingPrompt,
LaunchingAgentProcess,
InitializingSession,
StreamingTurn,
Finishing,
Succeeded,
Failed,
TimedOut,
Stalled,
CanceledByReconciliation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LiveSession {
pub session_id: String,
pub thread_id: String,
pub turn_id: String,
pub codex_app_server_pid: Option<String>,
pub last_codex_event: Option<String>,
pub last_codex_timestamp: Option<DateTime<Utc>>,
pub last_codex_message: Option<String>,
pub codex_input_tokens: u64,
pub codex_output_tokens: u64,
pub codex_total_tokens: u64,
pub last_reported_input_tokens: u64,
pub last_reported_output_tokens: u64,
pub last_reported_total_tokens: u64,
pub turn_count: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryEntry {
pub issue_id: String,
pub identifier: String,
pub attempt: u32,
pub due_at_ms: u64,
pub error: Option<String>,
}