use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
pub enum CliTool {
#[serde(alias = "claude")]
#[default]
ClaudeCode,
Codex,
Gemini,
}
impl std::fmt::Display for CliTool {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CliTool::ClaudeCode => write!(f, "Claude Code"),
CliTool::Codex => write!(f, "Codex"),
CliTool::Gemini => write!(f, "Gemini"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionConfig {
pub tool: CliTool,
pub working_dir: PathBuf,
pub env_vars: Vec<(String, String)>,
pub name: Option<String>,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
tool: CliTool::ClaudeCode,
working_dir: std::env::current_dir().unwrap_or_default(),
env_vars: Vec::new(),
name: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitInfo {
pub limit_type: RateLimitType,
pub resets_at: Option<DateTime<Utc>>,
pub usage_percent: Option<f64>,
pub raw_message: String,
pub detected_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RateLimitType {
Session,
Daily,
Weekly,
Unknown,
}
#[derive(Debug, Clone)]
pub struct PtyEvent {
pub raw: String,
}
#[derive(Debug, Clone)]
pub enum AgentEvent {
Started { session_id: String },
Exited { code: i32 },
Error { message: String },
PtyRaw { data: Vec<u8> },
PtyParsed(crate::cli::traits::ParsedMessage),
PtyReady,
PtyToolApproval { tool_name: String, description: Option<String> },
PipeSessionStart { session_id: String, model: String, tools: Vec<String> },
PipeText { text: String, is_delta: bool },
PipeToolStart { id: String, name: String, input: serde_json::Value },
PipeToolResult { id: String, output: String, is_error: bool, duration_ms: Option<u64> },
PipeThinking { text: String },
PipeTurnComplete { input_tokens: u64, output_tokens: u64 },
PipeSessionEnd { result: String, cost_usd: Option<f64>, is_error: bool },
RateLimit(RateLimitInfo),
}