use chrono::{DateTime, Utc};
use tokio::sync::broadcast;
use tokio_util::sync::CancellationToken;
use bamboo_agent_core::AgentEvent;
#[derive(Debug, Clone)]
pub enum AgentStatus {
Pending,
Running,
Completed,
Cancelled,
Error(String),
}
#[derive(Debug, Clone)]
pub struct AgentRunner {
pub event_sender: broadcast::Sender<AgentEvent>,
pub cancel_token: CancellationToken,
pub status: AgentStatus,
pub started_at: DateTime<Utc>,
pub completed_at: Option<DateTime<Utc>>,
pub last_budget_event: Option<AgentEvent>,
pub last_tool_name: Option<String>,
pub last_tool_phase: Option<String>,
pub last_event_at: Option<DateTime<Utc>>,
pub round_count: u32,
}
impl Default for AgentRunner {
fn default() -> Self {
Self::new()
}
}
impl AgentRunner {
pub const EVENT_CHANNEL_CAPACITY: usize = 1000;
pub fn new() -> Self {
let (event_sender, _) = broadcast::channel(Self::EVENT_CHANNEL_CAPACITY);
Self {
event_sender,
cancel_token: CancellationToken::new(),
status: AgentStatus::Pending,
started_at: Utc::now(),
completed_at: None,
last_budget_event: None,
last_tool_name: None,
last_tool_phase: None,
last_event_at: None,
round_count: 0,
}
}
}