use crate::config::KodaConfig;
use crate::memory;
use crate::providers::ToolDefinition;
use crate::tools::ToolRegistry;
use anyhow::Result;
use std::path::PathBuf;
pub struct KodaAgent {
pub project_root: PathBuf,
pub tools: ToolRegistry,
pub tool_defs: Vec<ToolDefinition>,
pub system_prompt: String,
}
impl KodaAgent {
pub async fn new(
config: &KodaConfig,
project_root: PathBuf,
commands: &[(&str, &str)],
) -> Result<Self> {
let tools = ToolRegistry::new(project_root.clone(), config.max_context_tokens);
let tool_defs = tools.get_definitions(&config.allowed_tools, &config.disallowed_tools);
let semantic_memory = memory::load(&project_root)?;
let env = crate::prompt::EnvironmentInfo {
project_root: &project_root,
model: &config.model,
platform: std::env::consts::OS,
};
let system_prompt = crate::prompt::build_system_prompt(
&config.system_prompt,
&semantic_memory,
&config.agents_dir,
&tool_defs,
&env,
commands,
);
Ok(Self {
project_root,
tools,
tool_defs,
system_prompt,
})
}
}