use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use starweaver_core::{CheckpointId, Metadata, RunId, SessionId, TraceContext};
use crate::records::{RunStatus, SessionStatus, StreamCursorRef};
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct CompactRunTrace {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<SessionId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub run_id: Option<RunId>,
#[serde(default)]
pub status: RunStatus,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub checkpoints: Vec<CheckpointId>,
pub approvals: usize,
pub deferred_tools: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub latest_checkpoint: Option<CheckpointId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stream_cursor: Option<usize>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub stream_cursors: Vec<StreamCursorRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_preview: Option<String>,
#[serde(default, skip_serializing_if = "TraceContext::is_empty")]
pub trace_context: TraceContext,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub updated_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
pub metadata: Metadata,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CompactSessionTrace {
pub session_id: SessionId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workspace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile: Option<String>,
#[serde(default)]
pub status: SessionStatus,
pub runs: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub latest_run_id: Option<RunId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_output_preview: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub stream_cursors: Vec<StreamCursorRef>,
#[serde(default, skip_serializing_if = "TraceContext::is_empty")]
pub trace_context: TraceContext,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
pub metadata: Metadata,
}