#[derive(Debug, Clone, Copy)]
pub struct TokenBudget {
pub model_context_window: usize,
pub nexus_allocation_pct: f32,
pub soul_budget: usize,
pub context_budget: usize,
}
impl TokenBudget {
pub fn for_model(context_window: usize) -> Self {
let nexus_pct = 0.10;
let nexus_budget = (context_window as f32 * nexus_pct) as usize;
let soul_budget = (nexus_budget as f32 * 0.30) as usize;
let context_budget = nexus_budget - soul_budget;
Self {
model_context_window: context_window,
nexus_allocation_pct: nexus_pct,
soul_budget,
context_budget,
}
}
pub fn estimate_window(agent_type: &str) -> usize {
match agent_type.to_lowercase().as_str() {
"claude-code" | "amp" | "codex" | "sonnet-specialist" => 200_000,
"gemini" | "gemini-analyzer" => 1_000_000,
"opus-specialist" => 200_000,
_ => 128_000, }
}
pub fn estimate_tokens(text: &str) -> usize {
text.len() / 4
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_token_budget_math() {
let budget = TokenBudget::for_model(100_000);
assert_eq!(budget.model_context_window, 100_000);
assert_eq!(budget.soul_budget, 3000);
assert_eq!(budget.context_budget, 7000);
}
#[test]
fn test_estimate_window() {
assert_eq!(TokenBudget::estimate_window("claude-code"), 200_000);
assert_eq!(TokenBudget::estimate_window("gemini"), 1_000_000);
assert_eq!(TokenBudget::estimate_window("unknown"), 128_000);
}
}