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