#![allow(dead_code, unused_imports, unused_variables)]
pub mod ast_tools;
pub mod daemon;
pub mod fitness;
pub mod micro_mode;
pub mod sandbox;
pub mod telemetry;
pub mod tournament;
use std::path::PathBuf;
use std::time::Duration;
pub const PROTECTED_PATHS: &[&str] = &[
"src/evolution/",
"src/safety/",
"system_tests/",
"benches/sab_",
"tests/",
];
#[derive(Clone)]
pub struct LlmConfig {
pub endpoint: String,
pub model: String,
pub api_key: Option<String>,
pub max_tokens: usize,
pub temperature: f32,
}
impl std::fmt::Debug for LlmConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LlmConfig")
.field("endpoint", &self.endpoint)
.field("model", &self.model)
.field(
"api_key",
&self.api_key.as_ref().map(|k| {
let mut m: String = k.chars().take(4).collect();
m.push_str("…[redacted]");
m
}),
)
.field("max_tokens", &self.max_tokens)
.field("temperature", &self.temperature)
.finish()
}
}
impl Default for LlmConfig {
fn default() -> Self {
Self {
endpoint: String::from("http://localhost:8080/v1"),
model: String::from("default"),
api_key: None,
max_tokens: 16384,
temperature: 0.7,
}
}
}
#[derive(Debug, Clone)]
pub struct EvolutionConfig {
pub generations: usize,
pub population_size: usize,
pub parallel_eval: usize,
pub checkpoint_interval: usize,
pub fitness_weights: FitnessWeights,
pub mutation_targets: MutationTargets,
pub safety: SafetyConfig,
pub llm: LlmConfig,
}
#[derive(Debug, Clone)]
pub struct FitnessWeights {
pub sab_score: f64,
pub token_efficiency: f64,
pub latency: f64,
pub test_coverage: f64,
pub binary_size: f64,
pub visual_quality: f64,
}
impl FitnessWeights {
pub fn composite(&self, metrics: &FitnessMetrics) -> f64 {
let normalized_tokens =
1.0 - (metrics.tokens_used as f64 / metrics.token_budget as f64).min(1.0);
let normalized_latency = 1.0 - (metrics.wall_clock_secs / metrics.timeout_secs).min(1.0);
let normalized_coverage = metrics.test_coverage_pct / 100.0;
let normalized_size = 1.0 - (metrics.binary_size_mb / metrics.max_binary_size_mb).min(1.0);
let normalized_visual = metrics.visual_score / 100.0;
self.sab_score * (metrics.sab_score / 100.0)
+ self.token_efficiency * normalized_tokens
+ self.latency * normalized_latency
+ self.test_coverage * normalized_coverage
+ self.binary_size * normalized_size
+ self.visual_quality * normalized_visual
}
}
impl Default for FitnessWeights {
fn default() -> Self {
Self {
sab_score: 0.50,
token_efficiency: 0.25,
latency: 0.15,
test_coverage: 0.05,
binary_size: 0.05,
visual_quality: 0.0,
}
}
}
#[derive(Debug, Clone)]
pub struct FitnessMetrics {
pub sab_score: f64,
pub tokens_used: u64,
pub token_budget: u64,
pub wall_clock_secs: f64,
pub timeout_secs: f64,
pub test_coverage_pct: f64,
pub binary_size_mb: f64,
pub max_binary_size_mb: f64,
pub tests_passed: usize,
pub tests_total: usize,
pub visual_score: f64,
}
#[derive(Debug, Clone)]
pub struct MutationTargets {
pub config_keys: Vec<String>,
pub prompt_logic: Vec<PathBuf>,
pub tool_code: Vec<PathBuf>,
pub cognitive: Vec<PathBuf>,
}
#[derive(Debug, Clone)]
pub struct SafetyConfig {
pub protected_files: Vec<String>,
pub min_test_count: usize,
pub max_binary_size_mb: f64,
pub rollback_on_any_test_failure: bool,
}
impl Default for SafetyConfig {
fn default() -> Self {
Self {
protected_files: PROTECTED_PATHS.iter().map(|s| s.to_string()).collect(),
min_test_count: 5000,
max_binary_size_mb: 50.0,
rollback_on_any_test_failure: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum GenerationRating {
Bloom,
Grow,
Wilt,
Frost,
}
impl std::fmt::Display for GenerationRating {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Bloom => write!(f, "BLOOM 🌸"),
Self::Grow => write!(f, "GROW 🌿"),
Self::Wilt => write!(f, "WILT 🥀"),
Self::Frost => write!(f, "FROST ❄️"),
}
}
}
pub fn is_protected(path: &std::path::Path) -> bool {
let canonical_path = crate::safety::checker::normalize_path(path);
let path_str = canonical_path.to_string_lossy().replace('\\', "/");
PROTECTED_PATHS.iter().any(|protected_prefix| {
path_str.starts_with(protected_prefix) || path_str.contains(protected_prefix)
})
}
#[cfg(test)]
#[path = "../../tests/unit/evolution/mod_test.rs"]
mod tests;