pub mod bifrost;
pub mod delta;
pub mod driver;
pub mod lanes;
pub mod mcp;
pub mod verdict;
pub const LANE_REPORT_LIMIT: usize = 16 * 1024;
pub const INTENT_BRIEF_LIMIT: usize = 16 * 1024;
pub const USER_MESSAGES_LIMIT: usize = 128 * 1024;
pub const CHANGED_FUNCTIONS_LIMIT: usize = 32 * 1024;
pub const SYNTHESIS_LIMIT: usize = 32 * 1024;
pub const LANE_DIFF_LIMIT: usize = 96 * 1024;
#[must_use]
pub fn bound_review_section(text: &str, limit: usize, label: &str) -> String {
if text.len() <= limit {
return text.to_string();
}
let marker = format!("\n…[{label} omitted]…\n");
let available = limit.saturating_sub(marker.len());
let head = available.saturating_mul(3) / 4;
let tail = available.saturating_sub(head);
let head_end = text.floor_char_boundary(head);
let tail_start = text.ceil_char_boundary(text.len().saturating_sub(tail));
format!("{}{}{}", &text[..head_end], marker, &text[tail_start..])
}
#[must_use]
pub fn bound_tail(text: &str, limit: usize, label: &str) -> String {
if text.len() <= limit {
return text.to_string();
}
let marker = format!("\n…[{label} truncated]…");
let head = text.floor_char_boundary(limit.saturating_sub(marker.len()));
format!("{}{}", &text[..head], marker)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bounding_a_section_keeps_both_ends_and_marks_the_gap() {
let text = "a".repeat(400) + &"z".repeat(400);
let bounded = bound_review_section(&text, 200, "workspace diff");
assert!(bounded.len() <= 200);
assert!(bounded.starts_with("aaa"));
assert!(bounded.ends_with("zzz"));
assert!(bounded.contains("…[workspace diff omitted]…"));
}
#[test]
fn bounding_prose_keeps_the_head_where_conclusions_are() {
let text = format!("{}{}", "head".repeat(100), "tail".repeat(100));
let bounded = bound_tail(&text, 120, "synthesis");
assert!(bounded.starts_with("headhead"));
assert!(bounded.ends_with("…[synthesis truncated]…"));
assert!(!bounded.contains("tail"));
}
#[test]
fn bounding_leaves_short_text_untouched() {
assert_eq!(bound_review_section("short", 100, "diff"), "short");
assert_eq!(bound_tail("short", 100, "synthesis"), "short");
}
}