use async_trait::async_trait;
use bamboo_agent_core::tools::ToolExecutor;
use bamboo_agent_core::{AgentError, AgentEvent, Session};
use bamboo_domain::AgentRuntimeState;
use bamboo_infrastructure::LLMProvider;
use tokio::sync::mpsc;
use tokio_util::sync::CancellationToken;
use crate::runtime::config::AgentLoopConfig;
use crate::runtime::task_context::TaskLoopContext;
#[async_trait]
pub trait LifecycleManager: Send + Sync {
fn initialize_run(&self, session: &Session, config: &AgentLoopConfig) -> AgentRuntimeState;
#[allow(clippy::too_many_arguments)]
async fn prepare_round(
&self,
session: &mut Session,
task_context: &mut Option<TaskLoopContext>,
runtime_state: &mut AgentRuntimeState,
round: usize,
max_rounds: usize,
config: &AgentLoopConfig,
cancel_token: &CancellationToken,
metrics_collector: Option<&crate::metrics::MetricsCollector>,
session_id: &str,
model_name: &str,
tools: &dyn ToolExecutor,
llm: &dyn LLMProvider,
) -> Result<String, AgentError>;
async fn handle_round_outcome(
&self,
session: &mut Session,
runtime_state: &mut AgentRuntimeState,
task_context: &mut Option<TaskLoopContext>,
round: usize,
should_break: bool,
) -> Result<bool, AgentError>;
#[allow(clippy::too_many_arguments)]
async fn finalize_run(
&self,
session: &mut Session,
runtime_state: &mut AgentRuntimeState,
event_tx: &mpsc::Sender<AgentEvent>,
session_id: &str,
config: &AgentLoopConfig,
metrics_collector: Option<&crate::metrics::MetricsCollector>,
task_context: Option<TaskLoopContext>,
);
}