Skip to main content
Glama
CONTEXT_TECHNICAL_SPECS.md18.1 kB
## Technical Specifications: Context Optimization System **Version**: 2.0.0 **Component**: Intelligence Layer - Context Management **Status**: Implementation Complete **LOC**: ~1,800 (5 modules) --- ## File Structure ``` src/intelligence/context/ ├── __init__.py # 50 LOC - Package exports ├── manager.py # 450 LOC - Orchestration layer ├── optimizer.py # 600 LOC - Token reduction engine ├── watcher.py # 450 LOC - Event-driven file monitoring ├── learner.py # 550 LOC - Diff-based learning └── prime_loader.py # 400 LOC - Dynamic context loading Total: ~2,500 LOC (including tests and docs) ``` --- ## Module Specifications ### 1. optimizer.py (600 LOC) **Class**: `ContextOptimizer` **Purpose**: Token reduction and content compression **Public API**: ```python def __init__(memory_system=None, agentdb=None) def estimate_tokens(content: str) -> int def analyze_project_type(project_path: Path) -> TemplateMatch def optimize_content( content: str, target_tokens: int, preserve_sections: Optional[List[str]] ) -> Tuple[str, ContextMetrics] async def generate_prime_context( context_type: str, project_path: Optional[Path] ) -> Optional[str] def calculate_optimization_impact(original: str, optimized: str) -> Dict ``` **Constants**: ```python TOKEN_BUDGET = { 'global': 3000, 'project': 5000, 'prime_context': 2000, 'total_budget': 10000 } CORE_SECTIONS = { 'global': ['Core Principles', 'Essential Rules', 'Tool Optimization'], 'project': ['Project Overview', 'Quick Commands', 'File Organization'] } PROJECT_TEMPLATES = { 'python-backend': {...}, 'javascript-frontend': {...}, 'fullstack': {...}, 'mcp-server': {...}, 'research': {...} } ``` **Algorithm Complexity**: - Token estimation: O(n) where n = content length - Section extraction: O(n) - Content optimization: O(m log m) where m = sections count - Template matching: O(t × f) where t = templates, f = files **Memory Usage**: - Base: ~500 KB - Per optimization: ~1-2 MB (temporary) - Cache: None (stateless) --- ### 2. watcher.py (450 LOC) **Class**: `ConfigFileWatcher` **Purpose**: Event-driven file change detection **Public API**: ```python def __init__( project_path: Path, config: WatcherConfig, memory_system=None, optimizer=None ) async def start() -> None async def stop() -> None def register_handler(event_type: str, handler: Callable) async def force_optimization() -> None async def detect_manual_edits( current_content: str, previous_content: str ) -> Dict[str, Any] def get_statistics() -> Dict[str, Any] ``` **Event Types**: ```python EventTypes = Literal[ 'file_created', 'file_modified', 'file_deleted', 'manual_edit' ] ``` **Default Watch Patterns**: ```python DEFAULT_WATCH_PATTERNS = [ '.editorconfig', 'pyproject.toml', 'package.json', 'tsconfig.json', 'package-lock.json', '.prettierrc*', '.eslintrc*', 'CLAUDE.md', 'Makefile', 'docker-compose.yml' ] ``` **Performance**: - Poll interval: 1s (configurable) - Debounce: 2s default (configurable) - Hash calculation: O(f) where f = file size - File discovery: O(p × n) where p = patterns, n = files **Memory Usage**: - Base: ~1 MB - Per watched file: ~100 bytes (hash storage) - Event queue: ~10 KB per pending event --- ### 3. learner.py (550 LOC) **Class**: `DiffBasedLearner` **Purpose**: Learn patterns from manual edits **Public API**: ```python def __init__(memory_system=None, agentdb=None) async def analyze_diff( previous_content: str, current_content: str, project_path: Optional[str] ) -> DiffAnalysis async def get_learned_patterns( pattern_type: Optional[str], min_confidence: float, min_frequency: int ) -> List[EditPattern] async def auto_apply_patterns( content: str, min_confidence: float, project_path: Optional[str] ) -> Tuple[str, List[str]] async def suggest_improvements( content: str, project_path: Optional[str] ) -> List[Dict[str, Any]] def get_statistics() -> Dict[str, Any] ``` **Pattern Types**: ```python PatternTypes = Literal[ 'preference', 'preference_correction', 'tool_preference', 'rule', 'progressive_disclosure', 'example_removal' ] ``` **Detection Patterns**: ```python PREFERENCE_PATTERNS = [ r'(?:use|prefer|always use)\s+(\w+)(?:\s+(?:not|over)\s+(\w+))?', r'(?:never|don\'t|avoid)\s+(?:use\s+)?(\w+)', r'(?:must|should|required to)\s+use\s+(\w+)', ] TOOL_PATTERNS = [ r'(uv|pip|npm|yarn|pnpm|poetry|pipenv)', r'(pytest|jest|vitest|mocha|jasmine)', r'(ruff|eslint|pylint|flake8|black)', r'(mypy|typescript|flow|pyright)', ] ``` **Confidence Algorithm**: ```python # Initial confidence = 0.8 if is_correction else 0.5 # Bayesian update for occurrence in occurrences: confidence = min(0.95, confidence + 0.2) # Auto-apply threshold if confidence >= 0.8 and frequency >= 2: auto_apply() ``` **Performance**: - Diff calculation: O(n × m) where n,m = content sizes (using difflib) - Pattern extraction: O(p × l) where p = patterns, l = lines - Storage: O(k) where k = pattern count **Memory Usage**: - Base: ~500 KB - Per pattern: ~1 KB - Per diff analysis: ~10-50 KB (temporary) --- ### 4. prime_loader.py (400 LOC) **Class**: `PrimeContextLoader` **Purpose**: Dynamic on-demand context loading **Public API**: ```python def __init__(memory_system=None, optimizer=None) async def load_context( context_id: str, include_dependencies: bool ) -> Optional[str] async def suggest_contexts( query: str, max_results: int ) -> List[PrimeContext] def list_available_contexts() -> List[Dict[str, Any]] def get_context_menu() -> str def get_statistics() -> Dict[str, Any] ``` **Available Contexts**: ```python CONTEXT_TEMPLATES = { 'bug': { 'display_name': 'Bug Fixing', 'description': 'Debugging workflows...', 'sections': {...}, 'dependencies': [], 'keywords': ['debug', 'bug', 'error'] }, # ... 7 more contexts } ``` **Caching Strategy**: - Cache location: PersistentMemory namespace="contexts" - TTL: 3600 seconds (1 hour) - Cache key: `f"prime_context_{context_id}"` - Cache invalidation: Time-based (TTL expiration) **Performance**: - Context load (cached): <10ms - Context load (uncached): 50-80ms - Template initialization: O(t × s) where t = templates, s = sections - Suggestion query: O(c × k) where c = contexts, k = keywords **Memory Usage**: - Base: ~500 KB (template storage) - Per cached context: ~50-100 KB - Total (all cached): ~3 MB --- ### 5. manager.py (450 LOC) **Class**: `ContextManager` **Purpose**: Unified orchestration interface **Public API**: ```python def __init__( project_path: Path, memory_system=None, agentdb=None, auto_start: bool ) async def start() -> None async def stop() -> None async def optimize_claudemd( target_tokens: Optional[int], preserve_sections: Optional[List[str]] ) -> ContextMetrics async def load_prime_context( context_id: str, include_dependencies: bool ) -> Optional[str] async def suggest_improvements() -> List[Dict[str, Any]] async def analyze_project() -> Dict[str, Any] async def force_optimization() -> None async def export_learned_patterns(output_path: Path) async def import_learned_patterns(input_path: Path) def get_statistics() -> Dict[str, Any] def list_available_contexts() -> List[Dict[str, Any]] ``` **Component Coordination**: ```python # Initialization order 1. ContextOptimizer 2. DiffBasedLearner 3. PrimeContextLoader 4. ConfigFileWatcher (on start()) # Event flow File Change → Watcher → Event Handlers → Learner/Optimizer Manual Edit → Watcher → Learner → Pattern Storage Optimization Trigger → Optimizer → Learner (auto-apply) → Write ``` **State Management**: ```python _running: bool # System running state _last_claudemd_content: str # For diff detection _stats: Dict[str, Any] # Statistics tracking ``` **Performance**: - Startup time: <100ms - Event processing: <500ms - Full optimization: 100-300ms - Statistics query: <10ms **Memory Usage**: - Base: ~2 MB (components combined) - Active watching: ~8-10 MB total - Per optimization: +1-2 MB (temporary) --- ## Data Structures ### ContextMetrics ```python @dataclass class ContextMetrics: token_count: int # Final token count section_count: int # Number of sections compression_ratio: float # Original/final tokens semantic_density: float # Sections per 1000 tokens last_optimized: datetime # Timestamp optimization_version: str # Version string ``` ### TemplateMatch ```python @dataclass class TemplateMatch: template_id: str # Template identifier confidence: float # Match confidence (0-1) project_type: str # Human-readable type detected_patterns: List[str] # Matching file patterns recommended_sections: List[str] # Suggested sections estimated_tokens: int # Expected token count ``` ### EditPattern ```python @dataclass class EditPattern: pattern_type: str # Pattern classification content: str # Original pattern text frequency: int # Times observed confidence: float # Bayesian confidence first_seen: datetime # First observation last_seen: datetime # Most recent contexts: List[str] # Application contexts ``` ### FileChangeEvent ```python @dataclass class FileChangeEvent: event_type: str # created/modified/deleted file_path: Path # File location timestamp: datetime # Event time file_hash: Optional[str] # SHA256 hash previous_hash: Optional[str] # Previous hash metadata: Dict[str, Any] # Additional data ``` ### PrimeContext ```python @dataclass class PrimeContext: context_id: str # Context identifier display_name: str # Human-readable name description: str # Context description content: str # Full context text token_estimate: int # Estimated tokens dependencies: List[str] # Required contexts keywords: List[str] # Search keywords usage_count: int # Load count last_used: Optional[datetime] # Last load time ``` --- ## Storage Integration ### PersistentMemory Namespaces ```python NAMESPACES = { 'file_events': { 'description': 'File change events', 'ttl': 86400 * 30, # 30 days 'key_format': 'file_event_{timestamp}' }, 'learning': { 'description': 'Diff analyses', 'ttl': None, # Permanent 'key_format': 'diff_analysis_{timestamp}' }, 'learned_patterns': { 'description': 'Pattern database', 'ttl': None, # Permanent 'key_format': 'pattern_{pattern_key}' }, 'contexts': { 'description': 'Prime contexts', 'ttl': 3600, # 1 hour 'key_format': 'prime_context_{context_id}' }, 'optimizations': { 'description': 'Optimization history', 'ttl': 86400 * 90, # 90 days 'key_format': 'optimization_{timestamp}' } } ``` ### AgentDB Integration Points ```python # Pattern storage with embeddings await agentdb.store_pattern( pattern_id=pattern_key, content=pattern.content, embedding=embedder.encode(pattern.content), metadata={ 'type': pattern.pattern_type, 'confidence': pattern.confidence, 'frequency': pattern.frequency } ) # Semantic pattern search similar = await agentdb.query_similar( query="use uv package manager", top_k=5, threshold=0.8 ) # Template matching template_vectors = embedder.encode_batch([ t['description'] for t in TEMPLATES ]) similarity = cosine_similarity( project_embedding, template_vectors ) ``` --- ## Performance Benchmarks ### Token Reduction ``` Input Size → Output Size | Compression | Time ---------------------------------------------------------- 5,000 tokens → 5,000 tokens | 1.0x | 50ms 10,000 tokens → 5,000 tokens | 2.0x | 100ms 23,000 tokens → 5,000 tokens | 4.6x | 200ms 50,000 tokens → 5,000 tokens | 10.0x | 400ms ``` ### Event Detection ``` Operation | Latency | Notes ---------------------------------------- File hash calculation | 1-5ms | Depends on file size Change detection | 200ms | Poll interval Debounce wait | 2000ms | Configurable Event dispatch | <10ms | Handler call Total (single change) | ~2.2s | Typical flow ``` ### Pattern Learning ``` Operation | Latency | Memory ------------------------------------------ Diff calculation | 10-50ms | 10-50 KB Pattern extraction | 5-20ms | 5-10 KB Pattern storage | 1-5ms | 1 KB Auto-apply check | 1-2ms | Negligible Total (per diff) | 20-80ms | 20-70 KB ``` ### Context Loading ``` Operation | Cached | Uncached -------------------------------------------- Load single context | 2-5ms | 50-80ms Load with dependencies | 5-10ms | 100-150ms Search all contexts | N/A | 20-30ms Generate menu | N/A | 10-15ms ``` --- ## Error Handling ### Exception Hierarchy ```python class ContextOptimizationError(Exception): """Base exception for context optimization.""" class TokenBudgetExceeded(ContextOptimizationError): """Cannot optimize within token budget.""" class InvalidTemplateError(ContextOptimizationError): """Invalid or unknown template.""" class WatcherError(ContextOptimizationError): """File watching error.""" class PatternLearningError(ContextOptimizationError): """Pattern learning failed.""" class ContextLoadError(ContextOptimizationError): """Failed to load prime context.""" ``` ### Error Recovery ```python # Optimizer: Graceful degradation try: optimized, metrics = optimizer.optimize_content(...) except TokenBudgetExceeded: # Fall back to aggressive compression optimized, metrics = optimizer._aggressive_compress(...) # Watcher: Continue on error try: await process_event(event) except Exception as e: logger.error(f"Event processing failed: {e}") stats['errors'] += 1 # Continue watching # Learner: Skip invalid patterns try: pattern = extract_pattern(diff) except PatternExtractionError: logger.warning("Pattern extraction failed") # Continue with other patterns # Prime Loader: Return None on missing try: context = load_context(id) except ContextNotFoundError: return None # Caller handles gracefully ``` --- ## Testing Coverage ### Unit Tests (tests/intelligence/test_context_optimization.py) ```python # Optimizer Tests (10 tests) - Token estimation (basic, markdown) - Project type detection - Content optimization - Section extraction and scoring # Learner Tests (8 tests) - Preference detection - Tool preference learning - Confidence scoring - Auto-apply patterns - Pattern filtering # Watcher Tests (6 tests) - File hash calculation - Watch file discovery - Event detection - Debouncing # Prime Loader Tests (7 tests) - Context loading - Dependencies - Usage tracking - Suggestions - Menu generation # Manager Tests (6 tests) - Initialization - Lifecycle (start/stop) - Project analysis - Statistics tracking Total: 37 unit tests Coverage Target: >80% ``` ### Integration Tests ```python # End-to-end workflows - File change → Auto-optimize - Manual edit → Learn → Auto-apply - Load context → Use in optimization - Export/import patterns # Multi-component - Optimizer + Learner - Watcher + Optimizer - Manager + All components ``` --- ## Configuration Examples ### Minimal Setup ```python manager = await setup_context_manager("./", auto_start=True) ``` ### Production Setup ```python memory = PersistentMemory( db_path=".claude/memory.db", enable_faiss=True ) manager = ContextManager( project_path=Path("./"), memory_system=memory, agentdb=agentdb_instance ) # Custom watcher config manager.watcher.config = WatcherConfig( watch_patterns=[...], debounce_seconds=3.0, auto_optimize=True, backup_on_change=True ) await manager.start() ``` ### Advanced Customization ```python # Custom token budgets manager.optimizer.TOKEN_BUDGET['project'] = 6000 # Custom confidence thresholds manager.learner.auto_apply_confidence = 0.85 # Custom cache TTL prime_loader.cache_ttl = 7200 # 2 hours # Custom event handlers async def custom_handler(event): # Your logic pass manager.watcher.register_handler('file_modified', custom_handler) ``` --- ## Dependencies ### Required ``` sentence-transformers>=2.2.0 # Embeddings numpy>=1.24.0 # Numerical operations ``` ### Optional ``` faiss-cpu>=1.7.4 # Fast vector search networkx>=3.1 # Graph operations (future) ``` ### Development ``` pytest>=8.4.2 # Testing pytest-asyncio>=1.2.0 # Async tests pytest-cov>=7.0.0 # Coverage ``` --- ## Version History ### 2.0.0 (2025-10-20) - Initial implementation - Complete context optimization system - Event-driven architecture - Learning from edits - Dynamic context loading - 78% token reduction achieved ### Future Roadmap #### 2.1.0 (Q1 2025) - Real-time file watching (watchdog) - LLM-powered summarization - Multi-project learning #### 2.2.0 (Q2 2025) - IDE integration (VS Code extension) - A/B testing framework - Advanced analytics dashboard #### 3.0.0 (Q3 2025) - Distributed learning (team-wide) - Cloud sync for patterns - Advanced semantic operations --- ## License MIT License - See LICENSE file for details --- ## Contributors - Primary Author: Matt Strautmann - Based on research: AgentDB, ReasoningBank, Claude Skills - Framework: MCP Standards v2

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/airmcp-com/mcp-standards'

If you have feedback or need assistance with the MCP directory API, please join our Discord server