kwaak 0.8.2

Run a team of autonomous agents on your code, right from your terminal
Documentation
use anyhow::Result;
use std::fs;
use std::path::{Path, PathBuf};
use std::time::{Duration, Instant};

#[derive(Debug)]
pub struct EvalMetrics {
    pub time_spent: Duration,
    pub input_tokens: u32,
    pub output_tokens: u32,
}

impl EvalMetrics {
    pub fn new(time_spent: Duration, input_tokens: u32, output_tokens: u32) -> Self {
        Self {
            time_spent,
            input_tokens,
            output_tokens,
        }
    }
}

#[derive(Debug)]
pub struct EvalOutput {
    iteration_dir: PathBuf,
    pub(crate) start_time: Instant,
}

impl EvalOutput {
    pub fn new(eval_type: &str, iteration: u32) -> Result<Self> {
        let output_dir = Path::new("evals");
        let eval_dir = output_dir.join(eval_type);
        let iteration_dir = eval_dir.join(format!("iteration_{iteration}"));

        fs::remove_dir_all(&iteration_dir)?;
        fs::create_dir_all(&iteration_dir)?;

        Ok(Self {
            iteration_dir,
            start_time: Instant::now(),
        })
    }

    pub fn write_agent_log(&self, content: &str) -> Result<()> {
        fs::write(self.iteration_dir.join("agent.log"), content)?;
        Ok(())
    }

    pub fn write_diff(&self, content: &str) -> Result<()> {
        fs::write(self.iteration_dir.join("changes.diff"), content)?;
        Ok(())
    }

    pub fn write_file(&self, name: &str, content: &str) -> Result<()> {
        fs::write(self.iteration_dir.join(name), content)?;
        Ok(())
    }

    pub fn write_metrics(&self, metrics: &EvalMetrics) -> Result<()> {
        let content = format!(
            "Time spent: {:.2}s\nInput tokens: {}\nOutput tokens: {}\n",
            metrics.time_spent.as_secs_f64(),
            metrics.input_tokens,
            metrics.output_tokens,
        );

        fs::write(self.iteration_dir.join("metrics"), content)?;
        Ok(())
    }

    pub fn elapsed_time(&self) -> Duration {
        self.start_time.elapsed()
    }
}