pub mod agent;
pub mod process;
use async_trait::async_trait;
use camino::Utf8PathBuf;
use crate::error::Result;
pub use crate::manifest::AgentKind;
pub use agent::{
ChatAgent, DEFAULT_SYSTEM_PROMPT, agent_for_kind, ensure_agent_available, extract_body,
format_prompt, resolve_backend,
};
pub use process::{
Backend, ResolvedCli, ensure_cli_installed, invoke_chat, resolve_cli, run_handoff,
};
#[derive(Debug, Clone)]
pub struct AiRequest {
pub system_prompt: String,
pub user_prompt: String,
pub current: Option<String>,
pub incoming: String,
pub template_diff: Option<String>,
pub dst: Utf8PathBuf,
}
#[derive(Debug, Clone)]
pub struct AiResponse {
pub full_body: Option<String>,
pub patch: Option<String>,
pub raw: String,
pub agent: AgentKind,
}
#[async_trait]
pub trait AiAgent: Send + Sync {
fn kind(&self) -> AgentKind;
async fn is_available(&self) -> bool;
async fn run(&self, req: AiRequest) -> Result<AiResponse>;
}