claude_agent/context/
mod.rs

1//! Context management with progressive disclosure for optimal token usage.
2
3pub mod builder;
4pub mod level;
5pub mod memory_loader;
6pub mod orchestrator;
7pub mod provider;
8pub mod routing;
9pub mod rule_index;
10pub mod static_context;
11
12pub use crate::types::TokenUsage;
13pub use builder::ContextBuilder;
14pub use level::{LeveledMemoryProvider, enterprise_base_path, user_base_path};
15pub use memory_loader::MemoryContent;
16pub use memory_loader::MemoryLoader;
17pub use orchestrator::PromptOrchestrator;
18pub use provider::{FileMemoryProvider, InMemoryProvider, MAX_IMPORT_DEPTH, MemoryProvider};
19pub use routing::RoutingStrategy;
20pub use rule_index::RuleIndex;
21pub use static_context::{McpToolMeta, StaticContext};
22
23// Re-export SkillIndex from skills module for convenience
24pub use crate::skills::SkillIndex;
25
26use thiserror::Error;
27
28#[derive(Error, Debug)]
29pub enum ContextError {
30    #[error("Source error: {message}")]
31    Source { message: String },
32
33    #[error("Token budget exceeded: {current} > {limit}")]
34    TokenBudgetExceeded { current: u64, limit: u64 },
35
36    #[error("Skill not found: {name}")]
37    SkillNotFound { name: String },
38
39    #[error("Rule not found: {name}")]
40    RuleNotFound { name: String },
41
42    #[error("Parse error: {message}")]
43    Parse { message: String },
44
45    #[error("IO error: {0}")]
46    Io(#[from] std::io::Error),
47}
48
49pub type ContextResult<T> = std::result::Result<T, ContextError>;
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn test_context_error_display() {
57        let err = ContextError::SkillNotFound {
58            name: "test-skill".to_string(),
59        };
60        assert!(err.to_string().contains("test-skill"));
61    }
62
63    #[test]
64    fn test_token_budget_error() {
65        let err = ContextError::TokenBudgetExceeded {
66            current: 250_000,
67            limit: 200_000,
68        };
69        assert!(err.to_string().contains("250000"));
70        assert!(err.to_string().contains("200000"));
71    }
72}