#!/usr/bin/env python3 """ Context Monitor Hook - UserPromptSubmit hook Monitors context usage and triggers backups when needed """ import sys import json import os from pathlib import Path # Add lib directory to path sys.path.insert(0, str(Path(__file__).parent.parent / "lib")) from context_monitor import ContextMonitor from backup_manager import BackupManager from session_state import SessionStateManager def main(): """Main hook entry point""" try: # Read input from Claude Code input_data = json.loads(sys.stdin.read()) # Initialize components context_monitor = ContextMonitor() backup_manager = BackupManager() session_manager = SessionStateManager() # Update context estimates from prompt context_monitor.update_from_prompt(input_data) # Check if backup should be triggered backup_decision = context_monitor.check_backup_triggers("UserPromptSubmit", input_data) if backup_decision.should_backup: # Execute backup session_state = session_manager.get_session_summary() backup_result = backup_manager.execute_backup(backup_decision, session_state) # Record backup in session session_manager.add_backup(backup_result.backup_id, { "reason": backup_decision.reason, "success": backup_result.success }) # Add context snapshot session_manager.add_context_snapshot({ "usage_ratio": context_monitor.get_context_usage_ratio(), "prompt_count": context_monitor.prompt_count, "tool_executions": context_monitor.tool_executions }) # Notify about backup if backup_result.success: message = f"Auto-backup created: {backup_decision.reason} (usage: {context_monitor.get_context_usage_ratio():.1%})" else: message = f"Backup attempted but failed: {backup_result.error}" else: message = f"Context usage: {context_monitor.get_context_usage_ratio():.1%}" # Always allow operation (this is a monitoring hook) response = { "allow": True, "message": message } print(json.dumps(response)) sys.exit(0) except Exception as e: # Never block on errors - always allow operation response = { "allow": True, "message": f"Context monitor error: {str(e)}" } print(json.dumps(response)) sys.exit(0) if __name__ == "__main__": main()