use std::path::PathBuf;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub type SessionId = String;
pub type AgentId = String;
pub type CorrectionId = String;
pub type ToolId = String;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ImageFormat {
Png,
Jpeg,
Gif,
WebP,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
System,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ContentType {
Json,
CliOutput { command: String },
Code { language: String, path: PathBuf },
PlainText,
Image { format: ImageFormat },
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ModelFamily {
AnthropicClaude,
OpenAiGpt,
GoogleGemini,
Local(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Provider {
Anthropic,
OpenAI,
Google,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TaskClassification {
Simple,
Complex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentMetadata {
pub source: Option<String>,
pub path: Option<PathBuf>,
pub language: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Content {
pub raw: String,
pub content_type: ContentType,
pub metadata: ContentMetadata,
pub tokens_original: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Provenance {
pub file: Option<PathBuf>,
pub line_range: Option<std::ops::Range<usize>>,
pub content_hash: Option<String>,
pub tool_call_id: Option<String>,
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressedContent {
pub data: String,
pub tokens_compressed: u32,
pub tokens_original: u32,
pub stages_applied: Vec<String>,
pub compression_ratio: f64,
#[serde(default)]
pub provenance: Provenance,
#[serde(default)]
pub verify: Option<VerifyResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Turn {
pub role: Role,
pub content: String,
pub tokens: u32,
pub pinned: bool,
pub timestamp: DateTime<Utc>,
}
pub type ConversationTurn = Turn;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PinnedSegment {
pub turn_index: usize,
pub reason: String,
pub tokens: u32,
}
pub type PinEntry = PinnedSegment;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KvFact {
pub key: String,
pub value: String,
pub source_turn: usize,
}
pub type Learning = KvFact;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WindowUsage {
pub window_size: u32,
pub consumed: u32,
pub pinned: u32,
pub model_family: ModelFamily,
}
pub type BudgetState = WindowUsage;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCall {
pub tool_name: String,
pub tokens_input: u32,
pub tokens_output: u32,
pub cost_usd: f64,
pub timestamp: DateTime<Utc>,
}
pub type ToolUsageRecord = ToolCall;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EditRecord {
pub id: CorrectionId,
pub timestamp: DateTime<Utc>,
pub original: String,
pub correction: String,
pub context: String,
}
pub type CorrectionEntry = EditRecord;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EditHistory {
pub entries: Vec<EditRecord>,
}
pub type CorrectionLog = EditHistory;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Session {
pub id: SessionId,
pub project_dir: PathBuf,
pub conversation: Vec<Turn>,
pub corrections: EditHistory,
pub pins: Vec<PinnedSegment>,
pub learnings: Vec<KvFact>,
pub compressed_summary: String,
pub budget: WindowUsage,
pub tool_usage: Vec<ToolCall>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
pub type SessionState = Session;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct StageConfig {
pub enabled: bool,
#[serde(default)]
pub options: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifyResult {
pub passed: bool,
pub confidence: f64,
pub checks_passed: Vec<String>,
pub checks_failed: Vec<(String, String)>,
pub fallback_triggered: bool,
}