use std::path::Path;
use async_trait::async_trait;
use crate::error::Result;
use crate::session::AgentSession;
use crate::types::{ExecutorType, PermissionMode};
#[derive(Debug, Clone)]
pub struct AgentCapabilities {
pub session_resume: bool,
pub token_usage: bool,
pub mcp_support: bool,
pub autonomous_mode: bool,
pub structured_output: bool,
}
#[derive(Debug, Clone)]
pub struct AvailabilityStatus {
pub available: bool,
pub reason: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct SpawnConfig {
pub model: Option<String>,
pub max_tokens: Option<u32>,
pub budget_usd: Option<f64>,
pub permission_mode: Option<PermissionMode>,
pub env: Vec<(String, String)>,
pub system_prompt: Option<String>,
pub reasoning: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ExecutorConfig {
pub api_key: Option<String>,
pub base_url: Option<String>,
pub working_dir: Option<String>,
}
#[async_trait]
pub trait AgentExecutor: Send + Sync {
fn executor_type(&self) -> ExecutorType;
async fn spawn(
&self,
working_dir: &Path,
prompt: &str,
config: &SpawnConfig,
) -> Result<AgentSession>;
async fn resume(
&self,
working_dir: &Path,
session_id: &str,
prompt: &str,
config: &SpawnConfig,
) -> Result<AgentSession>;
fn capabilities(&self) -> AgentCapabilities;
fn availability(&self) -> AvailabilityStatus;
}