use std::sync::Arc;
use tokio::sync::Mutex;
use tracing::warn;
use kodegen_mcp_client::KodegenClient;
use crate::agent::{ActionResult, AgentError, AgentOutput, AgentResult, prompts::{AgentMessagePrompt, SystemPrompt}};
use crate::utils::AgentState;
pub(super) struct AgentInner {
pub(super) task: String,
pub(super) add_infos: String,
pub(super) mcp_client: Arc<KodegenClient>,
pub(super) system_prompt: SystemPrompt,
pub(super) agent_prompt: AgentMessagePrompt,
pub(super) max_actions_per_step: usize,
pub(super) agent_state: Arc<Mutex<AgentState>>,
pub(super) temperature: f64,
pub(super) max_tokens: u64,
pub(super) vision_timeout_secs: u64,
pub(super) llm_timeout_secs: u64,
pub(super) previous_action_results: Mutex<Vec<ActionResult>>,
}
impl AgentInner {
pub(super) async fn process_step(&self) -> AgentResult<AgentOutput> {
let agent_state = self.agent_state.lock().await;
if agent_state.is_stop_requested() {
return Err(AgentError::Stopped);
}
drop(agent_state);
let previous_results = {
let guard = self.previous_action_results.lock().await;
guard.clone()
};
let mut browser_state = self.get_browser_state().await?;
let llm_response = self.generate_actions_with_llm(&mut browser_state, &previous_results).await?;
let (action_results, errors) = self.execute_actions(llm_response.action.clone()).await?;
{
let mut guard = self.previous_action_results.lock().await;
*guard = action_results;
}
if !errors.is_empty() {
warn!("Action execution errors: {:?}", errors);
}
Ok(AgentOutput {
current_state: llm_response.current_state,
action: llm_response.action,
})
}
}