Skip to main content
Glama
MemoryUsageAnalyzer.ts13 kB
/** * Memory Usage Analyzer * * Analyzes current memory usage patterns and identifies optimization * opportunities for the forgetting system. */ import { ForgettingBenefit, IMemoryUsageAnalyzer, MemoryOptimizationRecommendation, MemoryUsageAnalysis, } from "../../interfaces/forgetting.js"; export interface MemoryUsageAnalyzerConfig { analysis_depth: "shallow" | "deep" | "comprehensive"; fragmentation_threshold: number; low_importance_threshold: number; rare_access_threshold_days: number; conflict_similarity_threshold: number; } export class MemoryUsageAnalyzer implements IMemoryUsageAnalyzer { private config: MemoryUsageAnalyzerConfig; constructor(config?: Partial<MemoryUsageAnalyzerConfig>) { this.config = { analysis_depth: "deep", fragmentation_threshold: 0.3, low_importance_threshold: 0.2, rare_access_threshold_days: 30, conflict_similarity_threshold: 0.8, ...config, }; } async analyzeMemoryUsage(): Promise<MemoryUsageAnalysis> { // In a real implementation, this would interface with the actual memory system // For now, we'll simulate memory analysis const analysis = await this.performMemoryAnalysis(); return analysis; } private async performMemoryAnalysis(): Promise<MemoryUsageAnalysis> { // Simulate memory system analysis const totalMemories = this.simulateMemoryCount(); const episodicMemories = Math.floor(totalMemories * 0.6); const semanticMemories = totalMemories - episodicMemories; const memorySizeBytes = this.estimateMemorySize(totalMemories); const averageAccessFrequency = this.calculateAverageAccessFrequency(); const memoryPressureLevel = this.calculateMemoryPressure( totalMemories, memorySizeBytes ); const fragmentationLevel = this.calculateFragmentation(); const ageAnalysis = this.analyzeMemoryAges(); const importanceAnalysis = this.analyzeImportanceDistribution(totalMemories); const accessAnalysis = this.analyzeAccessPatterns(totalMemories); const conflictAnalysis = this.analyzeMemoryConflicts(totalMemories); const optimizationPotential = this.calculateOptimizationPotential( memoryPressureLevel, fragmentationLevel, importanceAnalysis.lowImportanceCount, accessAnalysis.rarelyAccessedCount, conflictAnalysis.conflictingCount ); return { total_memories: totalMemories, episodic_memories: episodicMemories, semantic_memories: semanticMemories, memory_size_bytes: memorySizeBytes, average_access_frequency: averageAccessFrequency, memory_pressure_level: memoryPressureLevel, fragmentation_level: fragmentationLevel, oldest_memory_age_days: ageAnalysis.oldestAgeDays, newest_memory_age_days: ageAnalysis.newestAgeDays, low_importance_memories: importanceAnalysis.lowImportanceCount, rarely_accessed_memories: accessAnalysis.rarelyAccessedCount, conflicting_memories: conflictAnalysis.conflictingCount, optimization_potential: optimizationPotential, }; } async getOptimizationRecommendations( analysis: MemoryUsageAnalysis ): Promise<MemoryOptimizationRecommendation[]> { const recommendations: MemoryOptimizationRecommendation[] = []; // Forgetting recommendations if (analysis.low_importance_memories > 0) { recommendations.push(await this.createForgettingRecommendation(analysis)); } // Compression recommendations if (analysis.fragmentation_level > this.config.fragmentation_threshold) { recommendations.push( await this.createCompressionRecommendation(analysis) ); } // Archiving recommendations if (analysis.rarely_accessed_memories > 0) { recommendations.push(await this.createArchivingRecommendation(analysis)); } // Consolidation recommendations if (analysis.conflicting_memories > 0) { recommendations.push( await this.createConsolidationRecommendation(analysis) ); } // Sort by estimated benefit return recommendations.sort( (a, b) => this.calculateTotalBenefit(b.estimated_benefit) - this.calculateTotalBenefit(a.estimated_benefit) ); } private async createForgettingRecommendation( analysis: MemoryUsageAnalysis ): Promise<MemoryOptimizationRecommendation> { const targetMemoryIds = this.identifyLowImportanceMemories( analysis.low_importance_memories ); const estimatedBenefit: ForgettingBenefit = { memory_space_freed: analysis.low_importance_memories * 150, // Estimated bytes per memory processing_speed_improvement: Math.min( (analysis.low_importance_memories / analysis.total_memories) * 0.1, 0.05 ), interference_reduction: Math.min( (analysis.low_importance_memories / analysis.total_memories) * 0.15, 0.08 ), focus_improvement: Math.min( (analysis.low_importance_memories / analysis.total_memories) * 0.12, 0.06 ), }; return { type: "forget", target_memories: targetMemoryIds, estimated_benefit: estimatedBenefit, risk_level: analysis.low_importance_memories > analysis.total_memories * 0.3 ? "medium" : "low", description: `Forget ${analysis.low_importance_memories} low-importance memories to reduce clutter and improve performance`, requires_user_consent: analysis.low_importance_memories > 10, }; } private async createCompressionRecommendation( analysis: MemoryUsageAnalysis ): Promise<MemoryOptimizationRecommendation> { const compressionCandidates = Math.floor( analysis.total_memories * analysis.fragmentation_level ); const targetMemoryIds = this.identifyFragmentedMemories( compressionCandidates ); const estimatedBenefit: ForgettingBenefit = { memory_space_freed: compressionCandidates * 50, // Estimated compression savings processing_speed_improvement: analysis.fragmentation_level * 0.03, interference_reduction: analysis.fragmentation_level * 0.02, focus_improvement: analysis.fragmentation_level * 0.01, }; return { type: "compress", target_memories: targetMemoryIds, estimated_benefit: estimatedBenefit, risk_level: "low", description: `Compress ${compressionCandidates} fragmented memories to improve storage efficiency`, requires_user_consent: false, }; } private async createArchivingRecommendation( analysis: MemoryUsageAnalysis ): Promise<MemoryOptimizationRecommendation> { const targetMemoryIds = this.identifyRarelyAccessedMemories( analysis.rarely_accessed_memories ); const estimatedBenefit: ForgettingBenefit = { memory_space_freed: analysis.rarely_accessed_memories * 100, // Partial space savings processing_speed_improvement: Math.min( (analysis.rarely_accessed_memories / analysis.total_memories) * 0.08, 0.04 ), interference_reduction: Math.min( (analysis.rarely_accessed_memories / analysis.total_memories) * 0.06, 0.03 ), focus_improvement: Math.min( (analysis.rarely_accessed_memories / analysis.total_memories) * 0.04, 0.02 ), }; return { type: "archive", target_memories: targetMemoryIds, estimated_benefit: estimatedBenefit, risk_level: "low", description: `Archive ${analysis.rarely_accessed_memories} rarely accessed memories for potential future retrieval`, requires_user_consent: analysis.rarely_accessed_memories > 20, }; } private async createConsolidationRecommendation( analysis: MemoryUsageAnalysis ): Promise<MemoryOptimizationRecommendation> { const targetMemoryIds = this.identifyConflictingMemories( analysis.conflicting_memories ); const estimatedBenefit: ForgettingBenefit = { memory_space_freed: analysis.conflicting_memories * 75, // Consolidation savings processing_speed_improvement: Math.min( (analysis.conflicting_memories / analysis.total_memories) * 0.06, 0.03 ), interference_reduction: Math.min( (analysis.conflicting_memories / analysis.total_memories) * 0.2, 0.1 ), focus_improvement: Math.min( (analysis.conflicting_memories / analysis.total_memories) * 0.08, 0.04 ), }; return { type: "consolidate", target_memories: targetMemoryIds, estimated_benefit: estimatedBenefit, risk_level: "medium", description: `Consolidate ${analysis.conflicting_memories} conflicting memories to reduce interference`, requires_user_consent: true, }; } // Simulation and analysis helper methods private simulateMemoryCount(): number { // Simulate a memory system with 1000-5000 memories return Math.floor(Math.random() * 4000) + 1000; } private estimateMemorySize(totalMemories: number): number { // Estimate average 200 bytes per memory return ( totalMemories * 200 + Math.floor(Math.random() * totalMemories * 100) ); } private calculateAverageAccessFrequency(): number { // Simulate access frequency (accesses per day) return Math.random() * 5 + 0.5; } private calculateMemoryPressure( totalMemories: number, sizeBytes: number ): number { // Simulate memory pressure based on count and size const countPressure = Math.min(totalMemories / 10000, 1); const sizePressure = Math.min(sizeBytes / (10 * 1024 * 1024), 1); // 10MB threshold return (countPressure + sizePressure) / 2; } private calculateFragmentation(): number { // Simulate fragmentation level return Math.random() * 0.6 + 0.1; // 10-70% fragmentation } private analyzeMemoryAges(): { oldestAgeDays: number; newestAgeDays: number; } { return { oldestAgeDays: Math.random() * 365 + 30, // 30-395 days newestAgeDays: Math.random() * 7, // 0-7 days }; } private analyzeImportanceDistribution(totalMemories: number): { lowImportanceCount: number; } { // Simulate 20-40% of memories being low importance const lowImportanceRatio = Math.random() * 0.2 + 0.2; return { lowImportanceCount: Math.floor(totalMemories * lowImportanceRatio), }; } private analyzeAccessPatterns(totalMemories: number): { rarelyAccessedCount: number; } { // Simulate 30-50% of memories being rarely accessed const rarelyAccessedRatio = Math.random() * 0.2 + 0.3; return { rarelyAccessedCount: Math.floor(totalMemories * rarelyAccessedRatio), }; } private analyzeMemoryConflicts(totalMemories: number): { conflictingCount: number; } { // Simulate 5-15% of memories having conflicts const conflictingRatio = Math.random() * 0.1 + 0.05; return { conflictingCount: Math.floor(totalMemories * conflictingRatio), }; } private calculateOptimizationPotential( memoryPressure: number, fragmentation: number, lowImportanceCount: number, rarelyAccessedCount: number, conflictingCount: number ): number { // Combine factors to estimate optimization potential const pressureFactor = memoryPressure * 0.3; const fragmentationFactor = fragmentation * 0.2; const lowImportanceFactor = Math.min(lowImportanceCount / 1000, 1) * 0.25; const rareAccessFactor = Math.min(rarelyAccessedCount / 1000, 1) * 0.15; const conflictFactor = Math.min(conflictingCount / 100, 1) * 0.1; return Math.min( pressureFactor + fragmentationFactor + lowImportanceFactor + rareAccessFactor + conflictFactor, 1 ); } private identifyLowImportanceMemories(count: number): string[] { // Generate simulated memory IDs const memoryIds: string[] = []; for (let i = 0; i < count; i++) { memoryIds.push(`low_importance_${i}_${Date.now()}`); } return memoryIds; } private identifyFragmentedMemories(count: number): string[] { const memoryIds: string[] = []; for (let i = 0; i < count; i++) { memoryIds.push(`fragmented_${i}_${Date.now()}`); } return memoryIds; } private identifyRarelyAccessedMemories(count: number): string[] { const memoryIds: string[] = []; for (let i = 0; i < count; i++) { memoryIds.push(`rarely_accessed_${i}_${Date.now()}`); } return memoryIds; } private identifyConflictingMemories(count: number): string[] { const memoryIds: string[] = []; for (let i = 0; i < count; i++) { memoryIds.push(`conflicting_${i}_${Date.now()}`); } return memoryIds; } private calculateTotalBenefit(benefit: ForgettingBenefit): number { return ( benefit.memory_space_freed / 1000 + // Normalize to KB benefit.processing_speed_improvement * 100 + benefit.interference_reduction * 100 + benefit.focus_improvement * 100 ); } }

Latest Blog Posts

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/keyurgolani/ThoughtMcp'

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