#!/usr/bin/env python3
"""
Auto-compact sessions over 40k tokens.
Called from heartbeat to prevent token accumulation.
"""

import json
import os
from datetime import datetime

def auto_compact_sessions():
    """Compact any session over 40k tokens"""
    
    agents = ['main', 'anton', 'ogilvy', 'tatiana', 'gerri', 'julia', 'jessica', 'thibault']
    compacted = []
    total_freed = 0
    
    for agent in agents:
        path = f'/root/.openclaw/agents/{agent}/sessions/sessions.json'
        if not os.path.exists(path):
            continue
            
        try:
            with open(path) as f:
                data = json.load(f)
            
            changed = False
            for k, v in data.items():
                tokens = v.get('totalTokens', 0) or 0
                
                # Compact sessions over 40k tokens
                if tokens > 40000:
                    old_tokens = tokens
                    # Reset to minimal state but keep some context
                    v['totalTokens'] = 2000
                    v['systemSent'] = False  # Force system reload on next use
                    
                    compacted.append({
                        'agent': agent,
                        'session': k[-30:],  # Last 30 chars of session key
                        'old_tokens': old_tokens,
                        'new_tokens': 2000
                    })
                    total_freed += (old_tokens - 2000)
                    changed = True
            
            if changed:
                # Write back the compacted sessions
                with open(path, 'w') as f:
                    json.dump(data, f, indent=2)
                    
        except Exception as e:
            print(f"Error processing {agent}: {e}")
            continue
    
    # Report results
    if compacted:
        print(f"🧹 AUTO-COMPACTED {len(compacted)} sessions:")
        for item in compacted:
            print(f"  {item['agent']:12s} {item['session']:30s} {item['old_tokens']:>6,}→{item['new_tokens']:>6,}")
        print(f"📊 Total freed: {total_freed:,} tokens (${total_freed * 0.000003:.2f} saved)")
        
        # Log to daily memory
        log_entry = f"""
## Auto-Compaction - {datetime.now().strftime('%H:%M UTC')}
- Compacted {len(compacted)} sessions over 40k tokens
- Freed {total_freed:,} tokens (${total_freed * 0.000003:.2f} saved)
- Largest session: {max(compacted, key=lambda x: x['old_tokens'])['old_tokens']:,} tokens
"""
        
        try:
            date_str = datetime.now().strftime('%Y-%m-%d')
            with open(f'/root/.openclaw/workspace/memory/{date_str}.md', 'a') as f:
                f.write(log_entry)
        except:
            pass
            
        return len(compacted)
    else:
        print("✅ No sessions over 40k tokens - system healthy")
        return 0

if __name__ == '__main__':
    auto_compact_sessions()