diff --git a/poc-memory/src/agents/defs.rs b/poc-memory/src/agents/defs.rs index 68e8a74..a3cd7f4 100644 --- a/poc-memory/src/agents/defs.rs +++ b/poc-memory/src/agents/defs.rs @@ -319,13 +319,31 @@ fn resolve( let included_keys: std::collections::HashSet<&str> = included.iter() .map(|(k, _, _)| k.as_str()).collect(); + // Budget: stop adding full content when prompt gets large. + // Remaining neighbors get header-only (key + first line). + const NEIGHBORHOOD_BUDGET: usize = 600_000; // ~150K tokens + let mut budget_exceeded = false; + for (nbr, strength, _score) in &included { if let Some(n) = store.nodes.get(nbr.as_str()) { - out.push_str(&format!("#### {} (link: {:.2})\n\n{}\n\n", - nbr, strength, n.content)); + if budget_exceeded || out.len() > NEIGHBORHOOD_BUDGET { + // Header-only: key + first non-empty line + budget_exceeded = true; + let first_line = n.content.lines() + .find(|l| !l.trim().is_empty()) + .unwrap_or("(empty)"); + out.push_str(&format!("#### {} (link: {:.2}) — {}\n", + nbr, strength, first_line)); + } else { + out.push_str(&format!("#### {} (link: {:.2})\n\n{}\n\n", + nbr, strength, n.content)); + } all_keys.push(nbr.to_string()); } } + if budget_exceeded { + out.push_str("\n(remaining neighbors shown as headers only — prompt budget)\n\n"); + } // Cross-links between included neighbors let mut cross_links = Vec::new();