use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::ContractModel;
use super::span::SpanLinkItem;
use super::trace::TraceDetail;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionItem {
pub auth_subject: String,
pub cwd: String,
pub display_name: String,
pub display_title: String,
pub ended_at: String,
pub harness_id: String,
#[serde(deserialize_with = "super::null_default")]
pub harness_metadata: BTreeMap<String, Value>,
pub harness_session_id: String,
pub harness_version: String,
pub id: String,
pub last_seen_at: String,
pub live: bool,
pub name: String,
pub parent_session_id: String,
#[serde(deserialize_with = "super::null_default")]
pub rollup: SessionRollup,
pub started_at: String,
}
impl ContractModel for SessionItem {
const SCHEMA: &'static str = "SessionItem";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionRollup {
#[serde(deserialize_with = "super::null_default")]
pub kind_counts: BTreeMap<String, i32>,
pub model: String,
#[serde(deserialize_with = "super::null_default")]
pub model_usage: Vec<ModelUsage>,
pub preview: String,
pub status: String,
#[serde(deserialize_with = "super::null_default")]
pub tasks: Vec<TreeTask>,
pub title: String,
pub turn_count: i32,
#[serde(deserialize_with = "super::null_default")]
pub usage: SessionUsage,
}
impl ContractModel for SessionRollup {
const SCHEMA: &'static str = "SessionRollup";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionUsage {
pub cost_usd: f64,
pub input_tokens: i64,
pub output_tokens: i64,
}
impl ContractModel for SessionUsage {
const SCHEMA: &'static str = "SessionUsage";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct ModelUsage {
pub calls: i64,
pub cost_usd: f64,
pub input_tokens: i64,
pub model: String,
pub output_tokens: i64,
}
impl ContractModel for ModelUsage {
const SCHEMA: &'static str = "ModelUsage";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct TreeTask {
pub description: String,
pub id: String,
pub status: String,
pub subject: String,
pub updates: i32,
}
impl ContractModel for TreeTask {
const SCHEMA: &'static str = "TreeTask";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionListResponse {
#[serde(deserialize_with = "super::null_default")]
pub items: Vec<SessionItem>,
pub next_cursor: String,
}
impl ContractModel for SessionListResponse {
const SCHEMA: &'static str = "SessionListResponse";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionDetailResponse {
#[serde(deserialize_with = "super::null_default")]
pub session: SessionItem,
}
impl ContractModel for SessionDetailResponse {
const SCHEMA: &'static str = "SessionDetailResponse";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
#[non_exhaustive]
pub struct SessionTracesResponse {
#[serde(deserialize_with = "super::null_default")]
pub links: Vec<SpanLinkItem>,
pub schema: String,
#[serde(deserialize_with = "super::null_default")]
pub session: SessionItem,
#[serde(deserialize_with = "super::null_default")]
pub traces: Vec<TraceDetail>,
}
impl ContractModel for SessionTracesResponse {
const SCHEMA: &'static str = "SessionTracesResponse";
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(default)]
pub struct SessionUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
}
impl ContractModel for SessionUpdateRequest {
const SCHEMA: &'static str = "sessionUpdateRequest";
}
impl SessionListResponse {
#[must_use]
pub fn into_page(self) -> crate::page::Page<SessionItem> {
crate::page::Page {
items: self.items,
next_cursor: Some(self.next_cursor),
}
}
}