use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AgentCli {
Claude,
Codex,
Gemini,
}
impl AgentCli {
pub fn as_str(self) -> &'static str {
match self {
AgentCli::Claude => "claude",
AgentCli::Codex => "codex",
AgentCli::Gemini => "gemini",
}
}
pub fn label(self) -> &'static str {
match self {
AgentCli::Claude => "Claude",
AgentCli::Codex => "Codex",
AgentCli::Gemini => "Gemini",
}
}
pub fn cycle(self) -> Self {
match self {
AgentCli::Claude => AgentCli::Codex,
AgentCli::Codex => AgentCli::Gemini,
AgentCli::Gemini => AgentCli::Claude,
}
}
}
#[derive(Clone, Debug)]
pub struct TermCell {
pub ch: String,
pub fg: [u8; 3],
pub bg: [u8; 3],
pub bold: bool,
}
impl Default for TermCell {
fn default() -> Self {
Self {
ch: " ".to_string(),
fg: [204, 204, 204],
bg: [0, 0, 0],
bold: false,
}
}
}
#[derive(Clone, Debug)]
pub struct TermGrid {
pub cells: Vec<Vec<TermCell>>,
pub cols: u16,
pub rows: u16,
pub cursor_row: u16,
pub cursor_col: u16,
}
impl TermGrid {
pub fn empty(cols: u16, rows: u16) -> Self {
Self {
cells: vec![vec![TermCell::default(); cols as usize]; rows as usize],
cols,
rows,
cursor_row: 0,
cursor_col: 0,
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ChatRole {
User,
Assistant,
Tool,
Thinking,
Error,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ChatMessage {
pub role: ChatRole,
pub content: String,
pub tool_name: Option<String>,
}
#[derive(Clone, Debug)]
pub enum AgentSnapshotMode {
Pty(TermGrid),
Chat(Vec<ChatMessage>),
Idle,
}
#[derive(Clone, Debug)]
pub struct AgentRenderSnapshot {
pub mode: AgentSnapshotMode,
pub session_active: bool,
}