use super::*;
#[derive(Debug, Clone)]
pub struct EvictionResult {
pub tokens_freed: usize,
pub needs_compaction: Vec<String>,
}
#[derive(Component, Debug, Clone, Default)]
pub struct InferenceConfig {
pub temperature: Option<f32>,
pub max_output_tokens: Option<usize>,
pub extra_params: serde_json::Map<String, serde_json::Value>,
pub batch_tool_hint: bool,
pub shell_hint: bool,
pub request_timeout_secs: Option<u64>,
}
#[derive(Component, Debug, Clone)]
pub struct ToolResultRoutingComponent {
pub routing: leviath_core::ToolResultRouting,
}
#[derive(Debug, Clone)]
pub struct AssembledContext {
pub system_blocks: Vec<leviath_providers::SystemBlock>,
pub messages: Vec<leviath_providers::Message>,
}
pub(super) fn cache_hint_sort_priority(hint: leviath_core::CacheHint) -> u8 {
use leviath_core::CacheHint;
match hint {
CacheHint::Always => 0, CacheHint::SlidingPrefix { .. } => 1, CacheHint::UntilChanged => 2, CacheHint::RecentlyChanged => 2,
CacheHint::Never => 3, }
}
const MAX_SYSTEM_CACHE_RUNS: usize = 3;
fn mark_recently_changed_run(blocks: &mut [leviath_providers::SystemBlock], recency: &[i64]) {
use leviath_core::CacheHint;
let mut volatile: Vec<usize> = Vec::new();
for (index, block) in blocks.iter().enumerate() {
if block.cache_hint == CacheHint::UntilChanged {
volatile.push(index);
}
}
let mut boundary = 0usize;
let mut newest = i64::MIN;
for (position, &stamp) in recency.iter().enumerate() {
if stamp > newest {
newest = stamp;
boundary = position;
}
}
if boundary == 0 {
return;
}
let mut runs = 0usize;
for index in 0..blocks.len() {
let hint = blocks[index].cache_hint;
if hint != CacheHint::Never && blocks.get(index + 1).map(|b| b.cache_hint) != Some(hint) {
runs += 1;
}
}
if runs >= MAX_SYSTEM_CACHE_RUNS {
return;
}
for &index in volatile.iter().skip(boundary) {
blocks[index].cache_hint = CacheHint::RecentlyChanged;
}
}
#[derive(Component, Debug, Clone)]
pub struct ContextWindow {
pub regions: Vec<Region>,
pub current_tokens: usize,
pub max_tokens: usize,
pub region_scripts: std::collections::HashMap<
String,
std::sync::Arc<leviath_scripting::region_hook::RegionScript>,
>,
pub hidden: std::collections::HashSet<String>,
}
impl ContextWindow {
pub fn new(max_tokens: usize) -> Self {
Self {
regions: Vec::new(),
hidden: std::collections::HashSet::new(),
current_tokens: 0,
max_tokens,
region_scripts: std::collections::HashMap::new(),
}
}
fn custom_script_for(
&self,
region_name: &str,
) -> Option<std::sync::Arc<leviath_scripting::region_hook::RegionScript>> {
let region = self.get_region(region_name)?;
let leviath_core::RegionKind::Custom { script, .. } = ®ion.kind else {
return None;
};
self.region_scripts.get(script).cloned()
}
fn on_write_outcome(
&self,
region_name: &str,
content: String,
tokens: usize,
kind: &leviath_core::EntryKind,
) -> Option<(String, usize)> {
let Some(script) = self.custom_script_for(region_name) else {
return Some((content, tokens));
};
if !script.has_on_write() {
return Some((content, tokens));
}
let region = self
.get_region(region_name)
.expect("custom_script_for resolved through this region");
match crate::custom_region::apply_on_write(&script, region, content, tokens, kind) {
crate::custom_region::OnWriteOutcome::Accept(content, tokens) => {
Some((content, tokens))
}
crate::custom_region::OnWriteOutcome::Drop => None,
}
}
fn try_custom_overflow(&mut self, region_name: &str, incoming_tokens: usize) -> bool {
let Some(script) = self.custom_script_for(region_name) else {
return false;
};
if !script.has_on_overflow() {
return false;
}
let region = self
.get_region_mut(region_name)
.expect("custom_script_for resolved through this region");
let needed = (region.current_tokens + incoming_tokens).saturating_sub(region.max_tokens);
let freed = crate::custom_region::apply_overflow(&script, region, needed);
self.current_tokens = self.calculate_tokens();
freed >= needed && needed > 0
}
pub fn get_region(&self, name: &str) -> Option<&Region> {
self.regions.iter().find(|r| r.name == name)
}
pub fn get_region_mut(&mut self, name: &str) -> Option<&mut Region> {
self.regions.iter_mut().find(|r| r.name == name)
}
pub fn add_region(&mut self, region: Region) {
self.regions.push(region);
self.current_tokens = self.calculate_tokens();
}
pub fn add_to_region(
&mut self,
region_name: &str,
content: String,
tokens: usize,
) -> leviath_core::Result<()> {
let Some((content, tokens)) =
self.on_write_outcome(region_name, content, tokens, &leviath_core::EntryKind::Text)
else {
return Ok(()); };
self.write_to_region(region_name, tokens, &mut |region, tokens| {
region.add_entry(content.clone(), tokens)
})
}
pub fn replace_region(&mut self, region_name: &str, content: String, tokens: usize) -> bool {
let Some((content, tokens)) =
self.on_write_outcome(region_name, content, tokens, &leviath_core::EntryKind::Text)
else {
return self.get_region(region_name).is_some();
};
if let Some(region) = self.get_region_mut(region_name) {
region.clear();
let _ = region.add_entry(content, tokens);
self.current_tokens = self.calculate_tokens();
true
} else {
false
}
}
pub fn add_typed_entry(
&mut self,
region_name: &str,
kind: leviath_core::EntryKind,
content: String,
tokens: usize,
) -> leviath_core::Result<()> {
let Some((content, tokens)) = self.on_write_outcome(region_name, content, tokens, &kind)
else {
return Ok(());
};
self.write_to_region(region_name, tokens, &mut |region, tokens| {
region.add_typed_entry(content.clone(), tokens, kind.clone())
})
}
fn write_to_region(
&mut self,
region_name: &str,
tokens: usize,
insert: &mut dyn FnMut(&mut Region, usize) -> leviath_core::Result<()>,
) -> leviath_core::Result<()> {
if self.get_region(region_name).is_none() {
return Err(leviath_core::Error::RegionNotFound(region_name.to_string()));
}
let first = {
let region = self.get_region_mut(region_name).expect("checked above");
insert(region, tokens)
};
match first {
Ok(()) => {
self.current_tokens = self.calculate_tokens();
Ok(())
}
Err(leviath_core::Error::TokenBudgetExceeded { .. })
if self.try_custom_overflow(region_name, tokens) =>
{
let region = self.get_region_mut(region_name).expect("checked above");
let retried = insert(region, tokens);
self.current_tokens = self.calculate_tokens();
retried
}
Err(e) => Err(e),
}
}
pub fn calculate_tokens(&self) -> usize {
self.regions.iter().map(|r| r.current_tokens).sum()
}
pub fn needs_eviction(&self, threshold: f32) -> bool {
let usage_ratio = self.current_tokens as f32 / self.max_tokens as f32;
usage_ratio >= threshold
}
pub fn try_evict(&mut self, target_free_tokens: usize) -> leviath_core::Result<EvictionResult> {
use leviath_core::RegionKind;
let initial_tokens = self.current_tokens;
let has_evictable = self.regions.iter().any(|r| {
matches!(
r.kind,
RegionKind::Clearable
| RegionKind::Temporary
| RegionKind::Custom {
persistent: false,
..
}
)
});
if !has_evictable {
tracing::warn!(
"Context window has no Clearable or Temporary regions. \
This may be intentional, but usually indicates a configuration error."
);
}
for region in &mut self.regions {
if matches!(region.kind, RegionKind::Clearable) && !region.content.is_empty() {
let freed = region.current_tokens;
region.clear();
self.current_tokens -= freed;
tracing::debug!(
region = %region.name,
tokens_freed = freed,
"Cleared Clearable region (all-or-nothing)"
);
if self.max_tokens.saturating_sub(self.current_tokens) >= target_free_tokens {
return Ok(EvictionResult {
tokens_freed: initial_tokens - self.current_tokens,
needs_compaction: Vec::new(),
});
}
}
}
let mut custom_freed = 0usize;
for i in 0..self.regions.len() {
let needed = target_free_tokens
.saturating_sub(self.max_tokens.saturating_sub(self.current_tokens));
if needed == 0 {
break;
}
let region = &self.regions[i];
if !matches!(
region.kind,
RegionKind::Custom {
persistent: false,
..
}
) || region.content.is_empty()
{
continue;
}
let Some(script) = self.custom_script_for(®ion.name.clone()) else {
continue;
};
if !script.has_on_overflow() {
continue;
}
let freed = crate::custom_region::apply_overflow(&script, &mut self.regions[i], needed);
self.current_tokens = self.current_tokens.saturating_sub(freed);
custom_freed += freed;
if freed > 0 {
tracing::debug!(
region = %self.regions[i].name,
tokens_freed = freed,
"custom region's on_overflow chose its own evictions"
);
}
}
if custom_freed > 0
&& self.max_tokens.saturating_sub(self.current_tokens) >= target_free_tokens
{
return Ok(EvictionResult {
tokens_freed: initial_tokens - self.current_tokens,
needs_compaction: Vec::new(),
});
}
loop {
let mut evicted_any = false;
for region in &mut self.regions {
if matches!(
region.kind,
RegionKind::Temporary
| RegionKind::Custom {
persistent: false,
..
}
) && let Some(entry) = region.remove_oldest()
{
let freed = entry.tokens;
self.current_tokens -= freed;
evicted_any = true;
tracing::debug!(
region = %region.name,
tokens_freed = freed,
"Evicted temporary region entry (oldest first)"
);
if self.max_tokens.saturating_sub(self.current_tokens) >= target_free_tokens {
return Ok(EvictionResult {
tokens_freed: initial_tokens - self.current_tokens,
needs_compaction: Vec::new(),
});
}
}
}
if !evicted_any {
break;
}
}
let mut needs_compaction = Vec::new();
if self.max_tokens.saturating_sub(self.current_tokens) < target_free_tokens {
for region in &self.regions {
if region.needs_compaction() {
needs_compaction.push(region.name.clone());
}
}
}
let pinned_tokens: usize = self
.regions
.iter()
.filter(|r| {
matches!(
r.kind,
RegionKind::Pinned
| RegionKind::CompactHistory { .. }
| RegionKind::Custom {
persistent: true,
..
}
)
})
.map(|r| r.current_tokens)
.sum();
if pinned_tokens > self.max_tokens {
return Err(leviath_core::Error::PinnedRegionsOverBudget {
pinned_tokens,
total_budget: self.max_tokens,
});
}
Ok(EvictionResult {
tokens_freed: initial_tokens - self.current_tokens,
needs_compaction,
})
}
pub fn assemble(&self) -> AssembledContext {
self.assemble_with_meta(&crate::custom_region::AssembleMeta::default())
}
pub fn assemble_with_meta(
&self,
meta: &crate::custom_region::AssembleMeta,
) -> AssembledContext {
use leviath_core::{CacheHint, EntryKind};
let mut system_blocks = Vec::new();
let mut messages: Vec<leviath_providers::Message> = Vec::new();
let mut volatile_recency: Vec<i64> = Vec::new();
for region in &self.regions {
if self.hidden.contains(®ion.name) {
continue;
}
let is_custom = matches!(region.kind, leviath_core::RegionKind::Custom { .. });
if region.content.is_empty() && !is_custom {
continue;
}
let first_new_block = system_blocks.len();
match ®ion.kind {
leviath_core::RegionKind::Pinned => {
let text = region
.content
.iter()
.map(|e| e.content.as_str())
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text,
cache_hint: CacheHint::Always,
});
}
leviath_core::RegionKind::Checklist => {
let text = region.render_checklist();
if !text.is_empty() {
system_blocks.push(leviath_providers::SystemBlock {
text,
cache_hint: CacheHint::UntilChanged,
});
}
}
leviath_core::RegionKind::CompactHistory { .. } => {
let text = region
.content
.iter()
.map(|e| e.content.as_str())
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text,
cache_hint: CacheHint::Always,
});
}
leviath_core::RegionKind::SlidingWindow { .. } => {
let mut pending_tool_results: Vec<leviath_providers::ContentBlock> = Vec::new();
for entry in ®ion.content {
if !matches!(entry.kind, EntryKind::ToolResult { .. })
&& !pending_tool_results.is_empty()
{
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: leviath_providers::MessageContent::Blocks(std::mem::take(
&mut pending_tool_results,
)),
cache_breakpoint: false,
});
}
match &entry.kind {
EntryKind::UserMessage => {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: entry.content.clone().into(),
cache_breakpoint: false,
});
}
EntryKind::AssistantTurn { tool_calls } => {
if tool_calls.is_empty() {
messages.push(leviath_providers::Message {
role: "assistant".to_string(),
content: entry.content.clone().into(),
cache_breakpoint: false,
});
} else {
let mut blocks = Vec::new();
if !entry.content.is_empty() {
blocks.push(leviath_providers::ContentBlock::Text {
text: entry.content.clone(),
});
}
for tc in tool_calls {
blocks.push(leviath_providers::ContentBlock::ToolUse {
id: tc.id.clone(),
name: tc.name.clone(),
input: tc.arguments.clone(),
thought_signature: tc.thought_signature.clone(),
});
}
messages.push(leviath_providers::Message {
role: "assistant".to_string(),
content: leviath_providers::MessageContent::Blocks(blocks),
cache_breakpoint: false,
});
}
}
EntryKind::ToolResult {
tool_call_id,
is_error,
..
} => {
pending_tool_results.push(
leviath_providers::ContentBlock::ToolResult {
tool_use_id: tool_call_id.clone(),
content: entry.content.clone(),
is_error: *is_error,
},
);
}
EntryKind::Text => {
let trimmed = entry.content.trim();
if let Some(rest) = trimmed.strip_prefix("Assistant: ") {
messages.push(leviath_providers::Message {
role: "assistant".to_string(),
content: rest.to_string().into(),
cache_breakpoint: false,
});
} else if let Some(rest) = trimmed.strip_prefix("User: ") {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: rest.to_string().into(),
cache_breakpoint: false,
});
} else {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: entry.content.clone().into(),
cache_breakpoint: false,
});
}
}
}
}
if !pending_tool_results.is_empty() {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: leviath_providers::MessageContent::Blocks(std::mem::take(
&mut pending_tool_results,
)),
cache_breakpoint: false,
});
}
}
leviath_core::RegionKind::Compacting { .. } => {
let text = region
.content
.iter()
.map(|e| e.content.as_str())
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text: format!("[{}]:\n{}", region.name, text),
cache_hint: CacheHint::UntilChanged,
});
}
leviath_core::RegionKind::Temporary => {
let text = region
.content
.iter()
.map(|e| e.content.as_str())
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text: format!("[{}]:\n{}", region.name, text),
cache_hint: CacheHint::Never,
});
}
leviath_core::RegionKind::Clearable => {
let text = region
.content
.iter()
.map(|e| e.content.as_str())
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text: format!("[{}]:\n{}", region.name, text),
cache_hint: CacheHint::Never,
});
}
leviath_core::RegionKind::Custom { script, persistent } => {
crate::custom_region::render_custom_region(
crate::custom_region::RegionRender {
region,
script: self.region_scripts.get(script),
persistent: *persistent,
meta,
window_current: self.current_tokens,
window_max: self.max_tokens,
},
crate::custom_region::RenderSink {
system_blocks: &mut system_blocks,
messages: &mut messages,
},
);
}
leviath_core::RegionKind::HashMap { .. } => {
let text = region
.content
.iter()
.map(|e| {
if let Some(key) = &e.key {
format!("### [{}]\n{}", key, e.content)
} else {
e.content.clone()
}
})
.collect::<Vec<_>>()
.join("\n\n");
system_blocks.push(leviath_providers::SystemBlock {
text: format!("[{}]:\n{}", region.name, text),
cache_hint: CacheHint::UntilChanged,
});
}
}
let mut newest = i64::MIN;
for entry in ®ion.content {
if entry.timestamp > newest {
newest = entry.timestamp;
}
}
for block in &system_blocks[first_new_block..] {
if block.cache_hint == CacheHint::UntilChanged {
volatile_recency.push(newest);
}
}
}
system_blocks.sort_by_key(|block| cache_hint_sort_priority(block.cache_hint));
mark_recently_changed_run(&mut system_blocks, &volatile_recency);
let mut tool_use_ids = std::collections::HashSet::new();
let mut tool_result_ids = std::collections::HashSet::new();
for msg in &messages {
if let leviath_providers::MessageContent::Blocks(blocks) = &msg.content {
for block in blocks {
match block {
leviath_providers::ContentBlock::ToolUse { id, .. } => {
tool_use_ids.insert(id.clone());
}
leviath_providers::ContentBlock::ToolResult { tool_use_id, .. } => {
tool_result_ids.insert(tool_use_id.clone());
}
_ => {}
}
}
}
}
let orphaned_tool_uses: std::collections::HashSet<_> =
tool_use_ids.difference(&tool_result_ids).cloned().collect();
let orphaned_tool_results: std::collections::HashSet<_> =
tool_result_ids.difference(&tool_use_ids).cloned().collect();
if !orphaned_tool_uses.is_empty() || !orphaned_tool_results.is_empty() {
tracing::warn!(
orphaned_tool_uses = orphaned_tool_uses.len(),
orphaned_tool_results = orphaned_tool_results.len(),
"Stripping orphaned tool_use/tool_result blocks from assembled context"
);
messages = messages
.into_iter()
.filter_map(|msg| {
if let leviath_providers::MessageContent::Blocks(blocks) = &msg.content {
let filtered: Vec<_> = blocks
.iter()
.filter(|block| match block {
leviath_providers::ContentBlock::ToolUse { id, .. } => {
!orphaned_tool_uses.contains(id)
}
leviath_providers::ContentBlock::ToolResult {
tool_use_id, ..
} => !orphaned_tool_results.contains(tool_use_id),
_ => true,
})
.cloned()
.collect();
if filtered.is_empty() {
None
} else {
Some(leviath_providers::Message {
role: msg.role.clone(),
content: leviath_providers::MessageContent::Blocks(filtered),
cache_breakpoint: msg.cache_breakpoint,
})
}
} else {
Some(msg)
}
})
.collect();
}
if messages.len() >= 5 {
let bp_idx = messages.len() - 4;
messages[bp_idx].cache_breakpoint = true;
} else if messages.len() >= 2 {
messages[0].cache_breakpoint = true;
}
if !messages.iter().any(|m| m.role == "user") {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: "Begin.".into(),
cache_breakpoint: false,
});
}
if messages.last().map(|m| m.role.as_str()) == Some("assistant") {
messages.push(leviath_providers::Message {
role: "user".to_string(),
content: "Continue.".into(),
cache_breakpoint: false,
});
}
AssembledContext {
system_blocks,
messages,
}
}
pub fn enable_taint_tracking(&mut self) {
for region in &mut self.regions {
region.enable_taint_tracking();
}
}
pub fn add_tainted_to_region(
&mut self,
region_name: &str,
content: String,
tokens: usize,
taint_level: leviath_core::TaintLevel,
) -> leviath_core::Result<()> {
let Some((content, tokens)) =
self.on_write_outcome(region_name, content, tokens, &leviath_core::EntryKind::Text)
else {
return Ok(());
};
self.write_to_region(region_name, tokens, &mut |region, tokens| {
region.add_tainted_entry(content.clone(), tokens, taint_level)
})
}
pub fn add_typed_tainted_to_region(
&mut self,
region_name: &str,
kind: leviath_core::EntryKind,
content: String,
tokens: usize,
taint_level: leviath_core::TaintLevel,
) -> leviath_core::Result<()> {
let Some((content, tokens)) = self.on_write_outcome(region_name, content, tokens, &kind)
else {
return Ok(());
};
self.write_to_region(region_name, tokens, &mut |region, tokens| {
region.add_typed_tainted_entry(content.clone(), tokens, kind.clone(), taint_level)
})
}
pub fn overall_taint(&self) -> Option<leviath_core::TaintLevel> {
let mut max_taint = None;
for region in &self.regions {
if let Some(level) = region.taint_level() {
max_taint = Some(match max_taint {
Some(current) => level.max(current),
None => level,
});
}
}
max_taint
}
pub fn taint_summary(&self) -> Vec<(String, leviath_core::TaintLevel)> {
self.regions
.iter()
.filter_map(|r| r.taint_level().map(|t| (r.name.clone(), t)))
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use leviath_core::{CacheHint, Region, RegionKind};
use leviath_providers::SystemBlock;
fn block(hint: CacheHint) -> SystemBlock {
SystemBlock {
text: "x".to_string(),
cache_hint: hint,
}
}
fn provider_system_breakpoints(blocks: &[SystemBlock]) -> usize {
let mut runs = 0;
for (index, block) in blocks.iter().enumerate() {
let hint = block.cache_hint;
if hint != CacheHint::Never && blocks.get(index + 1).map(|b| b.cache_hint) != Some(hint)
{
runs += 1;
}
}
runs
}
fn stamped_region(name: &str, kind: RegionKind, timestamp: i64) -> Region {
let mut region = Region::new(name.to_string(), kind, 10_000);
region.add_entry(format!("{name} contents"), 10).unwrap();
region.content[0].timestamp = timestamp;
region
}
fn hashmap_region(name: &str, timestamp: i64) -> Region {
stamped_region(
name,
RegionKind::HashMap {
max_entries: Some(16),
},
timestamp,
)
}
#[test]
fn recently_changed_sorts_with_until_changed() {
assert_eq!(
cache_hint_sort_priority(CacheHint::RecentlyChanged),
cache_hint_sort_priority(CacheHint::UntilChanged)
);
assert_eq!(cache_hint_sort_priority(CacheHint::RecentlyChanged), 2);
}
#[test]
fn mark_recently_changed_run_splits_at_the_newest_block() {
let mut blocks = vec![
block(CacheHint::Always),
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
block(CacheHint::Never),
];
mark_recently_changed_run(&mut blocks, &[10, 20, 90]);
let hints: Vec<CacheHint> = blocks.iter().map(|b| b.cache_hint).collect();
assert_eq!(
hints,
vec![
CacheHint::Always,
CacheHint::UntilChanged,
CacheHint::UntilChanged,
CacheHint::RecentlyChanged,
CacheHint::Never,
]
);
assert_eq!(provider_system_breakpoints(&blocks), 3);
}
#[test]
fn mark_recently_changed_run_retags_every_block_after_the_boundary() {
let mut blocks = vec![
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
];
mark_recently_changed_run(&mut blocks, &[1, 7, 5]);
let hints: Vec<CacheHint> = blocks.iter().map(|b| b.cache_hint).collect();
assert_eq!(
hints,
vec![
CacheHint::UntilChanged,
CacheHint::RecentlyChanged,
CacheHint::RecentlyChanged,
]
);
}
#[test]
fn mark_recently_changed_run_ties_resolve_to_the_earliest_block() {
let mut blocks = vec![
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
];
mark_recently_changed_run(&mut blocks, &[1, 9, 9]);
assert_eq!(blocks[0].cache_hint, CacheHint::UntilChanged);
assert_eq!(blocks[1].cache_hint, CacheHint::RecentlyChanged);
assert_eq!(blocks[2].cache_hint, CacheHint::RecentlyChanged);
}
#[test]
fn mark_recently_changed_run_leaves_a_headless_tier_alone() {
let mut blocks = vec![
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
];
mark_recently_changed_run(&mut blocks, &[42, 1]);
assert!(
blocks
.iter()
.all(|b| b.cache_hint == CacheHint::UntilChanged)
);
}
#[test]
fn mark_recently_changed_run_leaves_a_tierless_prompt_alone() {
let mut blocks = vec![block(CacheHint::Always), block(CacheHint::Never)];
mark_recently_changed_run(&mut blocks, &[]);
assert_eq!(blocks[0].cache_hint, CacheHint::Always);
assert_eq!(blocks[1].cache_hint, CacheHint::Never);
}
#[test]
fn mark_recently_changed_run_refuses_when_the_run_budget_is_full() {
let mut blocks = vec![
block(CacheHint::Always),
block(CacheHint::SlidingPrefix {
stable_fraction: 0.75,
}),
block(CacheHint::UntilChanged),
block(CacheHint::UntilChanged),
];
assert_eq!(provider_system_breakpoints(&blocks), 3);
mark_recently_changed_run(&mut blocks, &[1, 99]);
assert_eq!(blocks[2].cache_hint, CacheHint::UntilChanged);
assert_eq!(blocks[3].cache_hint, CacheHint::UntilChanged);
assert_eq!(provider_system_breakpoints(&blocks), 3);
}
#[test]
fn assemble_marks_the_volatile_tail_without_moving_any_block() {
let mut window = ContextWindow::new(100_000);
window.add_region(stamped_region("brief", RegionKind::Pinned, 1));
window.add_region(hashmap_region("spec", 100));
window.add_region(hashmap_region("data_preview", 200));
window.add_region(hashmap_region("results", 300));
window.add_region(stamped_region("scratch", RegionKind::Temporary, 400));
let assembled = window.assemble();
let texts: Vec<&str> = assembled
.system_blocks
.iter()
.map(|b| b.text.as_str())
.collect();
assert!(texts[0].contains("brief contents"));
assert!(texts[1].starts_with("[spec]:"));
assert!(texts[2].starts_with("[data_preview]:"));
assert!(texts[3].starts_with("[results]:"));
assert!(texts[4].starts_with("[scratch]:"));
let hints: Vec<CacheHint> = assembled
.system_blocks
.iter()
.map(|b| b.cache_hint)
.collect();
assert_eq!(
hints,
vec![
CacheHint::Always,
CacheHint::UntilChanged,
CacheHint::UntilChanged,
CacheHint::RecentlyChanged,
CacheHint::Never,
]
);
}
#[test]
fn assemble_leaves_a_flat_window_untouched() {
let mut window = ContextWindow::new(100_000);
window.add_region(stamped_region("brief", RegionKind::Pinned, 1));
window.add_region(hashmap_region("results", 300));
let assembled = window.assemble();
let hints: Vec<CacheHint> = assembled
.system_blocks
.iter()
.map(|b| b.cache_hint)
.collect();
assert_eq!(hints, vec![CacheHint::Always, CacheHint::UntilChanged]);
assert_eq!(provider_system_breakpoints(&assembled.system_blocks), 2);
}
#[test]
fn assemble_stays_within_four_cache_breakpoints() {
let mut window = ContextWindow::new(1_000_000);
window.add_region(stamped_region("brief", RegionKind::Pinned, 1));
window.add_region(stamped_region(
"history",
RegionKind::CompactHistory {
source_region: "conversation".to_string(),
},
2,
));
for (index, name) in ["spec", "data_preview", "scripts", "results"]
.iter()
.enumerate()
{
window.add_region(hashmap_region(name, 100 + index as i64));
}
window.add_region(stamped_region("scratch", RegionKind::Clearable, 500));
let mut conversation = Region::new(
"conversation".to_string(),
RegionKind::SlidingWindow {
max_items: 100,
eviction_strategy: leviath_core::EvictionStrategy::PerItem,
},
100_000,
);
for turn in 0..8 {
conversation
.add_entry(format!("User: turn {turn}"), 10)
.unwrap();
}
window.add_region(conversation);
let assembled = window.assemble();
let system = provider_system_breakpoints(&assembled.system_blocks);
let message = assembled
.messages
.iter()
.filter(|m| m.cache_breakpoint)
.count();
assert!(system <= MAX_SYSTEM_CACHE_RUNS, "system runs: {system}");
assert_eq!(message, 1);
let total = system + message;
assert!(total <= 4, "total breakpoints: {total}");
}
}