Skip to main content
Glama
cbunting99

MCP Code Analysis & Quality Server

by cbunting99
ContextAwareAnalysisService.ts49.4 kB
// Copyright 2025 Chris Bunting // Brief: Context-aware analysis service for MCP Code Analysis & Quality Server // Scope: Manages context-sensitive analysis with adaptive filtering and prioritization import { EventEmitter } from 'events'; import { AnalysisContext, UnifiedAnalysisResult, LoggerInterface, CacheInterface, PriorityLevel, SeverityLevel } from '@mcp-code-analysis/shared-types'; export interface ContextAwareAnalysisConfig { enableAdaptiveFiltering: boolean; enableContextPrioritization: boolean; enableCrossProjectAnalysis: boolean; maxContextDepth: number; contextRetention: number; relevanceThreshold: number; enableRealTimeAdaptation: boolean; enablePredictiveAnalysis: boolean; } export interface ContextAnalysisRequest { projectId: string; analysisResults: UnifiedAnalysisResult[]; context: ExtendedAnalysisContext; options: AnalysisOptions; } export interface ContextAnalysisResponse { success: boolean; contextualResults: ContextualResult[]; filteredResults: FilteredResult[]; prioritizedResults: PrioritizedResult[]; crossProjectInsights: CrossProjectInsight[]; recommendations: ContextRecommendation[]; metadata: AnalysisMetadata; } export interface ExtendedAnalysisContext extends AnalysisContext { temporalContext: TemporalAnalysisContext; spatialContext: SpatialAnalysisContext; domainContext: DomainAnalysisContext; teamContext: TeamAnalysisContext; projectContext: ProjectAnalysisContext; userContext: UserAnalysisContext; } export interface ContextualResult { id: string; originalResult: UnifiedAnalysisResult; contextScore: number; relevanceScore: number; confidence: number; contextFactors: ContextFactor[]; adaptations: ContextAdaptation[]; insights: ContextInsight[]; } export interface FilteredResult { id: string; originalResult: UnifiedAnalysisResult; filterReason: FilterReason; relevance: number; context: FilterContext; recommendation: FilterRecommendation; } export interface PrioritizedResult { id: string; originalResult: UnifiedAnalysisResult; priority: PriorityLevel; urgency: UrgencyLevel; impact: ImpactAssessment; dependencies: string[]; timeline: PriorityTimeline; } export interface CrossProjectInsight { id: string; type: InsightType; sourceProjects: string[]; targetProjects: string[]; pattern: CrossProjectPattern; impact: CrossProjectImpact; recommendation: CrossProjectRecommendation; confidence: number; } export interface ContextRecommendation { id: string; type: RecommendationType; description: string; priority: PriorityLevel; effort: number; expectedOutcome: string; context: RecommendationContext; confidence: number; } export interface AnalysisMetadata { totalResults: number; contextualResults: number; filteredResults: number; prioritizedResults: number; crossProjectInsights: number; averageContextScore: number; averageRelevance: number; processingTime: number; adaptationsApplied: boolean; } export interface TemporalAnalysisContext { timeframe: Timeframe; urgency: UrgencyLevel; deadline: Date | null; availableTime: number; historicalPerformance: HistoricalPerformance[]; seasonalPatterns: SeasonalPattern[]; } export interface SpatialAnalysisContext { files: string[]; modules: string[]; components: string[]; architectures: string[]; dependencies: DependencyMap; coupling: CouplingAnalysis; } export interface DomainAnalysisContext { businessDomain: string; technicalDomain: string; industry: string; regulations: string[]; standards: string[]; bestPractices: string[]; } export interface TeamAnalysisContext { teamSize: number; experience: ExperienceLevel; expertise: ExpertiseDistribution; collaboration: CollaborationMetrics; productivity: ProductivityMetrics; } export interface ProjectAnalysisContext { phase: ProjectPhase; complexity: number; maturity: ProjectMaturity; methodology: Methodology; risk: RiskAssessment; } export interface UserAnalysisContext { role: UserRole; expertise: ExpertiseLevel; preferences: UserPreferences; focus: FocusArea; cognitiveLoad: CognitiveLoad; } export interface ContextFactor { id: string; type: FactorType; name: string; value: number; weight: number; description: string; source: FactorSource; } export interface ContextAdaptation { id: string; type: AdaptationType; originalValue: any; adaptedValue: any; reason: string; effectiveness: number; } export interface ContextInsight { id: string; type: InsightType; description: string; confidence: number; evidence: string[]; implications: string[]; } export interface FilterContext { reason: FilterReason; contextScore: number; relevanceScore: number; threshold: number; factors: string[]; } export interface FilterRecommendation { action: FilterAction; reasoning: string; confidence: number; timeline: Date; } export interface ImpactAssessment { technicalImpact: number; businessImpact: number; userImpact: number; teamImpact: number; overallImpact: number; timeline: ImpactTimeline; } export interface PriorityTimeline { immediate: string[]; shortTerm: string[]; mediumTerm: string[]; longTerm: string[]; } export interface CrossProjectPattern { type: PatternType; description: string; frequency: number; consistency: number; impact: number; } export interface CrossProjectImpact { technical: number; business: number; operational: number; strategic: number; } export interface CrossProjectRecommendation { action: CrossProjectAction; description: string; priority: PriorityLevel; effort: number; expectedOutcome: string; confidence: number; } export interface RecommendationContext { projects: string[]; teams: string[]; technologies: string[]; domains: string[]; timeframe: Timeframe; } export interface HistoricalPerformance { period: Timeframe; metrics: PerformanceMetrics; trends: Trend[]; anomalies: Anomaly[]; } export interface SeasonalPattern { type: SeasonalType; period: Timeframe; pattern: PatternData; confidence: number; } export interface DependencyMap { direct: Dependency[]; indirect: Dependency[]; circular: Dependency[]; external: Dependency[]; } export interface CouplingAnalysis { structural: number; functional: number; data: number; control: number; } export interface ExpertiseDistribution { beginner: number; intermediate: number; advanced: number; expert: number; } export interface CollaborationMetrics { communication: number; coordination: number; knowledgeSharing: number; conflictResolution: number; } export interface ProductivityMetrics { velocity: number; quality: number; efficiency: number; innovation: number; } export interface ProjectMaturity { level: MaturityLevel; practices: string[]; metrics: MaturityMetrics; } export interface RiskAssessment { technical: number; business: number; operational: number; strategic: number; mitigation: string[]; } export interface UserPreferences { detailLevel: DetailLevel; visualization: VisualizationType; notification: NotificationPreference; collaboration: CollaborationPreference; } export interface FocusArea { type: FocusType; target: string; priority: number; duration: number; } export interface CognitiveLoad { current: number; capacity: number; factors: CognitiveFactor[]; } export interface PerformanceMetrics { throughput: number; quality: number; efficiency: number; satisfaction: number; } export interface Trend { direction: TrendDirection; magnitude: number; significance: number; timeframe: Timeframe; } export interface Anomaly { type: AnomalyType; severity: SeverityLevel; description: string; timestamp: Date; impact: number; } export interface PatternData { values: number[]; timestamps: Date[]; pattern: string; confidence: number; } export interface Dependency { source: string; target: string; type: DependencyType; strength: number; impact: number; } export interface MaturityMetrics { coverage: number; consistency: number; effectiveness: number; efficiency: number; } export interface ImpactTimeline { immediate: number; shortTerm: number; mediumTerm: number; longTerm: number; } export interface AnalysisOptions { maxDepth: number; includeCrossProject: boolean; includePredictive: boolean; adaptationStrategy: AdaptationStrategy; prioritizationStrategy: PrioritizationStrategy; } export enum FactorType { TEMPORAL = 'temporal', SPATIAL = 'spatial', DOMAIN = 'domain', TEAM = 'team', PROJECT = 'project', USER = 'user', TECHNICAL = 'technical', BUSINESS = 'business' } export enum FactorSource { ANALYSIS = 'analysis', METRICS = 'metrics', USER_INPUT = 'user-input', HISTORICAL = 'historical', PREDICTIVE = 'predictive' } export enum AdaptationType { SIMPLIFICATION = 'simplification', ABSTRACTION = 'abstraction', PRIORITIZATION = 'prioritization', FILTERING = 'filtering', AGGREGATION = 'aggregation' } export enum InsightType { PATTERN = 'pattern', ANOMALY = 'anomaly', CORRELATION = 'correlation', PREDICTION = 'prediction', RECOMMENDATION = 'recommendation' } export enum FilterReason { LOW_RELEVANCE = 'low-relevance', HIGH_COMPLEXITY = 'high-complexity', LOW_PRIORITY = 'low-priority', CONTEXT_MISMATCH = 'context-mismatch', DUPLICATE = 'duplicate', OUTDATED = 'outdated' } export enum FilterAction { IGNORE = 'ignore', DEFER = 'defer', SIMPLIFY = 'simplify', ESCALATE = 'escalate', AUTOMATE = 'automate' } export enum RecommendationType { ACTION = 'action', IMPROVEMENT = 'improvement', OPTIMIZATION = 'optimization', PREVENTION = 'prevention', AUTOMATION = 'automation' } export enum Timeframe { IMMEDIATE = 'immediate', SHORT_TERM = 'short-term', MEDIUM_TERM = 'medium-term', LONG_TERM = 'long-term' } export enum UrgencyLevel { LOW = 'low', MEDIUM = 'medium', HIGH = 'high', CRITICAL = 'critical' } export enum ExperienceLevel { JUNIOR = 'junior', MID = 'mid', SENIOR = 'senior', EXPERT = 'expert' } export enum ProjectPhase { PLANNING = 'planning', DEVELOPMENT = 'development', TESTING = 'testing', DEPLOYMENT = 'deployment', MAINTENANCE = 'maintenance' } export enum MaturityLevel { INITIAL = 'initial', MANAGED = 'managed', DEFINED = 'defined', QUANTIFIED = 'quantified', OPTIMIZED = 'optimized' } export enum Methodology { AGILE = 'agile', WATERFALL = 'waterfall', HYBRID = 'hybrid', DEVOPS = 'devops', LEAN = 'lean' } export enum UserRole { DEVELOPER = 'developer', ARCHITECT = 'architect', QA_ENGINEER = 'qa-engineer', DEVOPS_ENGINEER = 'devops-engineer', PRODUCT_MANAGER = 'product-manager', PROJECT_MANAGER = 'project-manager' } export enum DetailLevel { OVERVIEW = 'overview', BASIC = 'basic', DETAILED = 'detailed', COMPREHENSIVE = 'comprehensive' } export enum VisualizationType { TEXT = 'text', GRAPH = 'graph', TABLE = 'table', DIAGRAM = 'diagram' } export enum NotificationPreference { IMMEDIATE = 'immediate', DIGEST = 'digest', WEEKLY = 'weekly', NONE = 'none' } export enum CollaborationPreference { INDEPENDENT = 'independent', COLLABORATIVE = 'collaborative', PAIR_PROGRAMMING = 'pair-programming', MOB_PROGRAMMING = 'mob-programming' } export enum FocusType { CODE = 'code', ARCHITECTURE = 'architecture', BUSINESS_LOGIC = 'business-logic', DATA = 'data', API = 'api', TESTING = 'testing', DOCUMENTATION = 'documentation' } export enum CognitiveFactorType { WORKING_MEMORY = 'working-memory', ATTENTION = 'attention', PROCESSING_SPEED = 'processing-speed', COMPREHENSION = 'comprehension' } export enum TrendDirection { IMPROVING = 'improving', STABLE = 'stable', DECLINING = 'declining' } export enum AnomalyType { OUTLIER = 'outlier', DEVIATION = 'deviation', ANOMALY = 'anomaly', EXCEPTION = 'exception' } export enum SeasonalType { DAILY = 'daily', WEEKLY = 'weekly', MONTHLY = 'monthly', QUARTERLY = 'quarterly', YEARLY = 'yearly' } export enum DependencyType { CODE = 'code', DATA = 'data', CONFIGURATION = 'configuration', DEPLOYMENT = 'deployment', BUSINESS = 'business' } export enum PatternType { CODE_PATTERN = 'code-pattern', ARCHITECTURAL_PATTERN = 'architectural-pattern', BEHAVIORAL_PATTERN = 'behavioral-pattern', PERFORMANCE_PATTERN = 'performance-pattern' } export enum CrossProjectAction { SHARE = 'share', STANDARDIZE = 'standardize', CONSOLIDATE = 'consolidate', INTEGRATE = 'integrate' } export enum AdaptationStrategy { CONSERVATIVE = 'conservative', MODERATE = 'moderate', AGGRESSIVE = 'aggressive', ADAPTIVE = 'adaptive' } export enum PrioritizationStrategy { IMPACT_BASED = 'impact-based', URGENCY_BASED = 'urgency-based', VALUE_BASED = 'value-based', RISK_BASED = 'risk-based' } export class ContextAwareAnalysisService extends EventEmitter { private config: ContextAwareAnalysisConfig; private cache: CacheInterface; private logger: LoggerInterface; private contextModels: Map<string, ContextModel> = new Map(); private analysisAlgorithms: Map<AnalysisAlgorithmType, AnalysisAlgorithm> = new Map(); private predictionAlgorithms: Map<PredictionAlgorithmType, PredictionAlgorithm> = new Map(); constructor(config: ContextAwareAnalysisConfig, cache: CacheInterface, logger: LoggerInterface) { super(); this.config = config; this.cache = cache; this.logger = logger; this.setupEventHandlers(); this.initializeAlgorithms(); } private setupEventHandlers(): void { this.on('context-analyzed', this.handleContextAnalyzed.bind(this)); this.on('result-filtered', this.handleResultFiltered.bind(this)); this.on('result-prioritized', this.handleResultPrioritized.bind(this)); this.on('cross-project-insight', this.handleCrossProjectInsight.bind(this)); } private initializeAlgorithms(): void { // Initialize analysis algorithms this.analysisAlgorithms.set(AnalysisAlgorithmType.CONTEXTUAL, new ContextualAnalysisAlgorithm()); this.analysisAlgorithms.set(AnalysisAlgorithmType.RELEVANCE_BASED, new RelevanceBasedAnalysisAlgorithm()); this.analysisAlgorithms.set(AnalysisAlgorithmType.IMPACT_BASED, new ImpactBasedAnalysisAlgorithm()); this.analysisAlgorithms.set(AnalysisAlgorithmType.PATTERN_BASED, new PatternBasedAnalysisAlgorithm()); this.analysisAlgorithms.set(AnalysisAlgorithmType.PREDICTIVE, new PredictiveAnalysisAlgorithm()); // Initialize prediction algorithms this.predictionAlgorithms.set(PredictionAlgorithmType.TREND_ANALYSIS, new TrendAnalysisAlgorithm()); this.predictionAlgorithms.set(PredictionAlgorithmType.ANOMALY_DETECTION, new AnomalyDetectionAlgorithm()); this.predictionAlgorithms.set(PredictionAlgorithmType.CORRELATION_ANALYSIS, new CorrelationAnalysisAlgorithm()); this.predictionAlgorithms.set(PredictionAlgorithmType.CLASSIFICATION, new ClassificationAlgorithm()); this.predictionAlgorithms.set(PredictionAlgorithmType.REGRESSION, new RegressionAlgorithm()); } async initialize(): Promise<void> { this.logger.info('Initializing Context-Aware Analysis Service'); // Load existing context models from cache await this.loadContextModels(); this.logger.info('Context-Aware Analysis Service initialized successfully'); } async analyzeWithContext(request: ContextAnalysisRequest): Promise<ContextAnalysisResponse> { try { this.logger.info(`Analyzing with context for project: ${request.projectId}`); const startTime = Date.now(); // Get or create context model let contextModel = this.contextModels.get(request.projectId); if (!contextModel) { contextModel = await this.createContextModel(request.projectId, request.context); } // Apply context-aware analysis const contextualResults = await this.applyContextualAnalysis(request, contextModel); // Apply adaptive filtering if enabled let filteredResults: FilteredResult[] = []; if (this.config.enableAdaptiveFiltering) { filteredResults = await this.applyAdaptiveFiltering(request, contextualResults, contextModel); } // Apply context prioritization if enabled let prioritizedResults: PrioritizedResult[] = []; if (this.config.enableContextPrioritization) { prioritizedResults = await this.applyContextPrioritization(request, contextualResults, contextModel); } // Apply cross-project analysis if enabled let crossProjectInsights: CrossProjectInsight[] = []; if (this.config.enableCrossProjectAnalysis) { crossProjectInsights = await this.applyCrossProjectAnalysis(request, contextModel); } // Generate context recommendations const recommendations = await this.generateContextRecommendations(request, contextualResults, contextModel); // Update context model with new data await this.updateContextModel(contextModel, request, contextualResults); // Create response const response: ContextAnalysisResponse = { success: true, contextualResults, filteredResults, prioritizedResults, crossProjectInsights, recommendations, metadata: { totalResults: request.analysisResults.length, contextualResults: contextualResults.length, filteredResults: filteredResults.length, prioritizedResults: prioritizedResults.length, crossProjectInsights: crossProjectInsights.length, averageContextScore: this.calculateAverageContextScore(contextualResults), averageRelevance: this.calculateAverageRelevance(contextualResults), processingTime: Date.now() - startTime, adaptationsApplied: this.config.enableAdaptiveFiltering } }; // Save updated context model await this.saveContextModel(request.projectId); this.emit('context-analyzed', { projectId: request.projectId, contextualResults: contextualResults.length, filteredResults: filteredResults.length, prioritizedResults: prioritizedResults.length }); this.logger.info(`Successfully analyzed with context for project: ${request.projectId}`); return response; } catch (error) { this.logger.error('Failed to analyze with context:', error); return { success: false, contextualResults: [], filteredResults: [], prioritizedResults: [], crossProjectInsights: [], recommendations: [], metadata: { totalResults: 0, contextualResults: 0, filteredResults: 0, prioritizedResults: 0, crossProjectInsights: 0, averageContextScore: 0, averageRelevance: 0, processingTime: 0, adaptationsApplied: false } }; } } async getContextModel(projectId: string): Promise<ContextModel | null> { return this.contextModels.get(projectId) || null; } async updateContextPreferences(projectId: string, preferences: Partial<ContextPreferences>): Promise<boolean> { try { const contextModel = this.contextModels.get(projectId); if (!contextModel) { throw new Error(`Context model not found: ${projectId}`); } contextModel.preferences = { ...contextModel.preferences, ...preferences }; contextModel.updatedAt = new Date(); await this.saveContextModel(projectId); this.logger.info(`Successfully updated context preferences for project: ${projectId}`); return true; } catch (error) { this.logger.error('Failed to update context preferences:', error); return false; } } private async createContextModel(projectId: string, context: ExtendedAnalysisContext): Promise<ContextModel> { const model: ContextModel = { id: projectId, context, preferences: this.createDefaultPreferences(), factors: [], patterns: [], insights: [], createdAt: new Date(), updatedAt: new Date() }; this.contextModels.set(projectId, model); await this.saveContextModel(projectId); this.emit('context-model-created', model); this.logger.info(`Context model created for project: ${projectId}`); return model; } private async applyContextualAnalysis(request: ContextAnalysisRequest, contextModel: ContextModel): Promise<ContextualResult[]> { const contextualResults: ContextualResult[] = []; for (const result of request.analysisResults) { const contextualResult = await this.analyzeSingleResult(result, request, contextModel); contextualResults.push(contextualResult); } return contextualResults; } private async analyzeSingleResult(result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel): Promise<ContextualResult> { // Apply analysis algorithms let contextScore = 0; let relevanceScore = 0; let confidence = 0.5; const contextFactors: ContextFactor[] = []; const adaptations: ContextAdaptation[] = []; const insights: ContextInsight[] = []; for (const [type, algorithm] of this.analysisAlgorithms) { try { const algorithmResult = await algorithm.analyze(result, request, contextModel); contextScore = Math.max(contextScore, algorithmResult.contextScore); relevanceScore = Math.max(relevanceScore, algorithmResult.relevanceScore); confidence = Math.max(confidence, algorithmResult.confidence); contextFactors.push(...algorithmResult.factors); adaptations.push(...algorithmResult.adaptations); insights.push(...algorithmResult.insights); } catch (error) { this.logger.warn(`Failed to apply analysis algorithm ${type}:`, error); } } // Apply prediction algorithms if enabled if (this.config.enablePredictiveAnalysis) { for (const [type, algorithm] of this.predictionAlgorithms) { try { const predictionResult = await algorithm.predict(result, request, contextModel); insights.push(...predictionResult.insights); } catch (error) { this.logger.warn(`Failed to apply prediction algorithm ${type}:`, error); } } } return { id: this.generateContextualResultId(), originalResult: result, contextScore, relevanceScore, confidence, contextFactors, adaptations, insights }; } private async applyAdaptiveFiltering(request: ContextAnalysisRequest, contextualResults: ContextualResult[], contextModel: ContextModel): Promise<FilteredResult[]> { const filteredResults: FilteredResult[] = []; for (const result of contextualResults) { if (result.relevanceScore < this.config.relevanceThreshold) { const filteredResult: FilteredResult = { id: this.generateFilteredResultId(), originalResult: result.originalResult, filterReason: FilterReason.LOW_RELEVANCE, relevance: result.relevanceScore, context: { reason: FilterReason.LOW_RELEVANCE, contextScore: result.contextScore, relevanceScore: result.relevanceScore, threshold: this.config.relevanceThreshold, factors: result.contextFactors.map(f => f.name) }, recommendation: { action: FilterAction.IGNORE, reasoning: 'Result relevance below threshold', confidence: 0.9, timeline: new Date() } }; filteredResults.push(filteredResult); } } this.emit('result-filtered', { projectId: request.projectId, filteredCount: filteredResults.length }); return filteredResults; } private async applyContextPrioritization(request: ContextAnalysisRequest, contextualResults: ContextualResult[], contextModel: ContextModel): Promise<PrioritizedResult[]> { const prioritizedResults: PrioritizedResult[] = []; for (const result of contextualResults) { const impact = await this.calculateImpact(result, request, contextModel); const urgency = await this.calculateUrgency(result, request, contextModel); const priority = this.determinePriority(impact, urgency); const prioritizedResult: PrioritizedResult = { id: this.generatePrioritizedResultId(), originalResult: result.originalResult, priority, urgency, impact, dependencies: this.identifyDependencies(result, request), timeline: this.generateTimeline(priority, urgency) }; prioritizedResults.push(prioritizedResult); } // Sort by priority prioritizedResults.sort((a, b) => { const priorityOrder = { [PriorityLevel.HIGH]: 4, [PriorityLevel.MEDIUM]: 3, [PriorityLevel.LOW]: 2 }; return priorityOrder[b.priority] - priorityOrder[a.priority]; }); this.emit('result-prioritized', { projectId: request.projectId, prioritizedCount: prioritizedResults.length }); return prioritizedResults; } private async applyCrossProjectAnalysis(request: ContextAnalysisRequest, contextModel: ContextModel): Promise<CrossProjectInsight[]> { const insights: CrossProjectInsight[] = []; // Compare with other projects to find patterns and insights for (const [projectId, otherModel] of this.contextModels.entries()) { if (projectId !== request.projectId) { const crossProjectAnalysis = await this.analyzeCrossProject(request.projectId, projectId, contextModel, otherModel); insights.push(...crossProjectAnalysis); } } this.emit('cross-project-insight', { projectId: request.projectId, insightCount: insights.length }); return insights; } private async generateContextRecommendations(request: ContextAnalysisRequest, contextualResults: ContextualResult[], contextModel: ContextModel): Promise<ContextRecommendation[]> { const recommendations: ContextRecommendation[] = []; // Generate recommendations based on contextual analysis for (const result of contextualResults) { if (result.confidence < 0.7) { recommendations.push({ id: this.generateRecommendationId(), type: RecommendationType.IMPROVEMENT, description: 'Consider improving analysis confidence through additional context', priority: PriorityLevel.MEDIUM, effort: 3, expectedOutcome: 'Improved analysis accuracy and reliability', context: { projects: [request.projectId], teams: [], technologies: [], domains: [request.context.domainContext.businessDomain], timeframe: Timeframe.SHORT_TERM }, confidence: 0.8 }); } if (result.contextScore < 0.5) { recommendations.push({ id: this.generateRecommendationId(), type: RecommendationType.OPTIMIZATION, description: 'Consider optimizing context factors for better analysis', priority: PriorityLevel.LOW, effort: 2, expectedOutcome: 'Enhanced contextual understanding', context: { projects: [request.projectId], teams: [], technologies: [], domains: [request.context.domainContext.businessDomain], timeframe: Timeframe.MEDIUM_TERM }, confidence: 0.7 }); } } return recommendations; } private async updateContextModel(contextModel: ContextModel, request: ContextAnalysisRequest, contextualResults: ContextualResult[]): Promise<void> { // Update context model with new analysis data for (const result of contextualResults) { // Update factors for (const factor of result.contextFactors) { const existingFactor = contextModel.factors.find(f => f.type === factor.type && f.name === factor.name); if (existingFactor) { existingFactor.value = (existingFactor.value + factor.value) / 2; } else { contextModel.factors.push({ ...factor }); } } // Update patterns for (const insight of result.insights) { if (insight.type === InsightType.PATTERN) { const existingPattern = contextModel.patterns.find(p => p.description === insight.description); if (!existingPattern) { contextModel.patterns.push({ id: this.generatePatternId(), type: PatternType.CODE_PATTERN, description: insight.description, frequency: 1, consistency: insight.confidence, impact: this.calculatePatternImpact(insight) }); } else { existingPattern.frequency++; } } } // Update insights contextModel.insights.push(...result.insights); } contextModel.updatedAt = new Date(); } private async analyzeCrossProject(sourceProjectId: string, targetProjectId: string, sourceModel: ContextModel, targetModel: ContextModel): Promise<CrossProjectInsight[]> { const insights: CrossProjectInsight[] = []; // Compare context factors const commonFactors = sourceModel.factors.filter(sourceFactor => targetModel.factors.some(targetFactor => targetFactor.type === sourceFactor.type && targetFactor.name === sourceFactor.name ) ); if (commonFactors.length > 3) { insights.push({ id: this.generateCrossProjectInsightId(), type: InsightType.PATTERN, sourceProjects: [sourceProjectId], targetProjects: [targetProjectId], pattern: { type: PatternType.BEHAVIORAL_PATTERN, description: 'Common contextual factors detected', frequency: commonFactors.length, consistency: 0.8, impact: 0.7 }, impact: { technical: 0.6, business: 0.5, operational: 0.7, strategic: 0.4 }, recommendation: { action: CrossProjectAction.SHARE, description: 'Consider sharing contextual insights between projects', priority: PriorityLevel.MEDIUM, effort: 2, expectedOutcome: 'Improved cross-project understanding', confidence: 0.8 }, confidence: 0.8 }); } return insights; } private async calculateImpact(result: ContextualResult, request: ContextAnalysisRequest, contextModel: ContextModel): Promise<ImpactAssessment> { // Calculate impact based on context factors and result characteristics const technicalImpact = result.contextScore * 0.8; const businessImpact = result.relevanceScore * 0.6; const userImpact = this.calculateUserImpact(result, request); const teamImpact = this.calculateTeamImpact(result, request); return { technicalImpact, businessImpact, userImpact, teamImpact, overallImpact: (technicalImpact + businessImpact + userImpact + teamImpact) / 4, timeline: { immediate: technicalImpact * 0.7, shortTerm: businessImpact * 0.8, mediumTerm: userImpact * 0.6, longTerm: teamImpact * 0.5 } }; } private async calculateUrgency(result: ContextualResult, request: ContextAnalysisRequest, contextModel: ContextModel): Promise<UrgencyLevel> { // Calculate urgency based on temporal context and result characteristics const temporalUrgency = request.context.temporalContext.urgency === UrgencyLevel.HIGH ? 1.0 : 0.5; const relevanceUrgency = result.relevanceScore > 0.8 ? 1.0 : 0.5; const impactUrgency = result.contextScore > 0.7 ? 1.0 : 0.5; const urgencyScore = (temporalUrgency + relevanceUrgency + impactUrgency) / 3; if (urgencyScore > 0.8) return UrgencyLevel.CRITICAL; if (urgencyScore > 0.6) return UrgencyLevel.HIGH; if (urgencyScore > 0.4) return UrgencyLevel.MEDIUM; return UrgencyLevel.LOW; } private determinePriority(impact: ImpactAssessment, urgency: UrgencyLevel): PriorityLevel { const impactScore = impact.overallImpact; const urgencyScore = { [UrgencyLevel.LOW]: 0.25, [UrgencyLevel.MEDIUM]: 0.5, [UrgencyLevel.HIGH]: 0.75, [UrgencyLevel.CRITICAL]: 1.0 }[urgency]; const priorityScore = (impactScore + urgencyScore) / 2; if (priorityScore > 0.8) return PriorityLevel.HIGH; if (priorityScore > 0.6) return PriorityLevel.MEDIUM; return PriorityLevel.LOW; } private identifyDependencies(result: ContextualResult, request: ContextAnalysisRequest): string[] { // Identify dependencies based on spatial context and result characteristics const dependencies: string[] = []; for (const file of request.context.spatialContext.files) { if (result.originalResult.affectedFiles?.includes(file)) { dependencies.push(file); } } return dependencies; } private generateTimeline(priority: PriorityLevel, urgency: UrgencyLevel): PriorityTimeline { const baseTimeline = { immediate: [], shortTerm: [], mediumTerm: [], longTerm: [] }; if (priority === PriorityLevel.HIGH || urgency === UrgencyLevel.CRITICAL) { baseTimeline.immediate.push('High priority action required'); } if (priority === PriorityLevel.MEDIUM || urgency === UrgencyLevel.HIGH) { baseTimeline.shortTerm.push('Medium priority action planned'); } if (priority === PriorityLevel.LOW || urgency === UrgencyLevel.MEDIUM) { baseTimeline.mediumTerm.push('Low priority action scheduled'); } baseTimeline.longTerm.push('Long-term monitoring recommended'); return baseTimeline; } private calculateUserImpact(result: ContextualResult, request: ContextAnalysisRequest): number { // Calculate user impact based on user context and result characteristics const userExpertise = this.expertiseToValue(request.context.userContext.expertise); const cognitiveLoadRatio = request.context.userContext.cognitiveLoad.current / request.context.userContext.cognitiveLoad.capacity; return result.contextScore * (1 - cognitiveLoadRatio) * userExpertise; } private calculateTeamImpact(result: ContextualResult, request: ContextAnalysisRequest): number { // Calculate team impact based on team context and result characteristics const teamExperience = this.experienceToValue(request.context.teamContext.experience); const collaborationScore = request.context.teamContext.collaboration.communication; return result.relevanceScore * teamExperience * collaborationScore; } private calculatePatternImpact(insight: ContextInsight): number { // Calculate pattern impact based on insight characteristics return insight.confidence * insight.evidence.length * 0.1; } private expertiseToValue(expertise: ExperienceLevel): number { const valueMap = { [ExperienceLevel.JUNIOR]: 0.2, [ExperienceLevel.MID]: 0.5, [ExperienceLevel.SENIOR]: 0.8, [ExperienceLevel.EXPERT]: 1.0 }; return valueMap[expertise]; } private calculateAverageContextScore(results: ContextualResult[]): number { if (results.length === 0) return 0; const totalScore = results.reduce((sum, result) => sum + result.contextScore, 0); return totalScore / results.length; } private calculateAverageRelevance(results: ContextualResult[]): number { if (results.length === 0) return 0; const totalRelevance = results.reduce((sum, result) => sum + result.relevanceScore, 0); return totalRelevance / results.length; } private createDefaultPreferences(): ContextPreferences { return { maxDepth: 3, includeCrossProject: true, includePredictive: true, adaptationStrategy: AdaptationStrategy.MODERATE, prioritizationStrategy: PrioritizationStrategy.IMPACT_BASED }; } private async loadContextModels(): Promise<void> { try { const cachedModels = await this.cache.get<Map<string, any>>('context-models'); if (cachedModels) { for (const [projectId, modelData] of Object.entries(cachedModels)) { this.contextModels.set(projectId, modelData); } } this.logger.info(`Loaded ${this.contextModels.size} context models`); } catch (error) { this.logger.warn('Failed to load context models:', error); } } private async saveContextModel(projectId: string): Promise<void> { try { const model = this.contextModels.get(projectId); if (model) { await this.cache.set(`context-model-${projectId}`, model, 3600); // Also save to global models index const modelsIndex: Record<string, any> = {}; for (const [pid, m] of this.contextModels.entries()) { modelsIndex[pid] = m; } await this.cache.set('context-models', modelsIndex, 3600); } } catch (error) { this.logger.warn(`Failed to save context model for project ${projectId}:`, error); } } // ID generation methods private generateContextualResultId(): string { return `contextual_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } private generateFilteredResultId(): string { return `filtered_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } private generatePrioritizedResultId(): string { return `prioritized_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } private generateCrossProjectInsightId(): string { return `cross-project_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } private generateRecommendationId(): string { return `recommendation_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } private generatePatternId(): string { return `pattern_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } // Event handlers private handleContextAnalyzed(data: any): void { this.logger.debug(`Context analyzed event handled for project: ${data.projectId}`); } private handleResultFiltered(data: any): void { this.logger.debug(`Result filtered event handled for project: ${data.projectId}`); } private handleResultPrioritized(data: any): void { this.logger.debug(`Result prioritized event handled for project: ${data.projectId}`); } private handleCrossProjectInsight(data: any): void { this.logger.debug(`Cross-project insight event handled`); } // Public API methods async updateConfig(config: Partial<ContextAwareAnalysisConfig>): Promise<void> { this.config = { ...this.config, ...config }; this.logger.info('Context-aware analysis configuration updated'); } async getAnalysisStats(): Promise<any> { const totalProjects = this.contextModels.size; const totalPatterns = Array.from(this.contextModels.values()) .reduce((sum, model) => sum + model.patterns.length, 0); const totalInsights = Array.from(this.contextModels.values()) .reduce((sum, model) => sum + model.insights.length, 0); const averageContextScore = Array.from(this.contextModels.values()) .reduce((sum, model) => { const modelScore = model.factors.reduce((factorSum, factor) => factorSum + factor.value, 0) / Math.max(1, model.factors.length); return sum + modelScore; }, 0) / Math.max(1, this.contextModels.size); return { totalProjects, totalPatterns, totalInsights, averageContextScore, adaptiveFilteringEnabled: this.config.enableAdaptiveFiltering, contextPrioritizationEnabled: this.config.enableContextPrioritization, crossProjectAnalysisEnabled: this.config.enableCrossProjectAnalysis, analysisAlgorithms: this.analysisAlgorithms.size, predictionAlgorithms: this.predictionAlgorithms.size }; } async shutdown(): Promise<void> { this.logger.info('Shutting down Context-Aware Analysis Service'); // Save all context models for (const projectId of this.contextModels.keys()) { await this.saveContextModel(projectId); } // Clear event listeners this.removeAllListeners(); this.logger.info('Context-Aware Analysis Service shutdown complete'); } } // Type definitions for intermediate results interface ContextModel { id: string; context: ExtendedAnalysisContext; preferences: ContextPreferences; factors: ContextFactor[]; patterns: Pattern[]; insights: ContextInsight[]; createdAt: Date; updatedAt: Date; } interface ContextPreferences { maxDepth: number; includeCrossProject: boolean; includePredictive: boolean; adaptationStrategy: AdaptationStrategy; prioritizationStrategy: PrioritizationStrategy; } interface Pattern { id: string; type: PatternType; description: string; frequency: number; consistency: number; impact: number; } // Algorithm type definitions enum AnalysisAlgorithmType { CONTEXTUAL = 'contextual', RELEVANCE_BASED = 'relevance-based', IMPACT_BASED = 'impact-based', PATTERN_BASED = 'pattern-based', PREDICTIVE = 'predictive' } enum PredictionAlgorithmType { TREND_ANALYSIS = 'trend-analysis', ANOMALY_DETECTION = 'anomaly-detection', CORRELATION_ANALYSIS = 'correlation-analysis', CLASSIFICATION = 'classification', REGRESSION = 'regression' } // Abstract base classes for algorithms abstract class AnalysisAlgorithm { abstract analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult>; } abstract class PredictionAlgorithm { abstract predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult>; } // Result type definitions interface AnalysisAlgorithmResult { contextScore: number; relevanceScore: number; confidence: number; factors: ContextFactor[]; adaptations: ContextAdaptation[]; insights: ContextInsight[]; } interface PredictionAlgorithmResult { insights: ContextInsight[]; } // Concrete algorithm implementations (simplified) class ContextualAnalysisAlgorithm extends AnalysisAlgorithm { async analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult> { // Implement contextual analysis logic return { contextScore: 0.7, relevanceScore: 0.8, confidence: 0.75, factors: [{ id: 'factor-1', type: FactorType.CONTEXT, name: 'Context Relevance', value: 0.8, weight: 0.5, description: 'Result is relevant to current context', source: FactorSource.ANALYSIS }], adaptations: [], insights: [] }; } } class RelevanceBasedAnalysisAlgorithm extends AnalysisAlgorithm { async analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult> { // Implement relevance-based analysis logic return { contextScore: 0.6, relevanceScore: 0.9, confidence: 0.8, factors: [{ id: 'factor-2', type: FactorType.BUSINESS, name: 'Business Relevance', value: 0.9, weight: 0.6, description: 'Result has high business relevance', source: FactorSource.ANALYSIS }], adaptations: [], insights: [] }; } } class ImpactBasedAnalysisAlgorithm extends AnalysisAlgorithm { async analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult> { // Implement impact-based analysis logic return { contextScore: 0.8, relevanceScore: 0.7, confidence: 0.85, factors: [{ id: 'factor-3', type: FactorType.TECHNICAL, name: 'Technical Impact', value: 0.8, weight: 0.7, description: 'Result has significant technical impact', source: FactorSource.ANALYSIS }], adaptations: [], insights: [] }; } } class PatternBasedAnalysisAlgorithm extends AnalysisAlgorithm { async analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult> { // Implement pattern-based analysis logic return { contextScore: 0.75, relevanceScore: 0.75, confidence: 0.7, factors: [{ id: 'factor-4', type: FactorType.TEMPORAL, name: 'Pattern Recognition', value: 0.75, weight: 0.4, description: 'Result matches known patterns', source: FactorSource.ANALYSIS }], adaptations: [], insights: [{ id: 'insight-1', type: InsightType.PATTERN, description: 'Pattern detected in analysis result', confidence: 0.7, evidence: ['Pattern matching algorithm'], implications: ['May indicate systemic issue'] }] }; } } class PredictiveAnalysisAlgorithm extends AnalysisAlgorithm { async analyze( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<AnalysisAlgorithmResult> { // Implement predictive analysis logic return { contextScore: 0.65, relevanceScore: 0.8, confidence: 0.6, factors: [{ id: 'factor-5', type: FactorType.PREDICTIVE, name: 'Predictive Relevance', value: 0.65, weight: 0.3, description: 'Result has predictive value', source: FactorSource.PREDICTIVE }], adaptations: [], insights: [{ id: 'insight-2', type: InsightType.PREDICTION, description: 'Future impact predicted', confidence: 0.6, evidence: ['Predictive model'], implications: ['May require future attention'] }] }; } } class TrendAnalysisAlgorithm extends PredictionAlgorithm { async predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult> { // Implement trend analysis logic return { insights: [{ id: 'insight-3', type: InsightType.PATTERN, description: 'Trend detected in historical data', confidence: 0.75, evidence: ['Historical analysis'], implications: ['Trend may continue'] }] }; } } class AnomalyDetectionAlgorithm extends PredictionAlgorithm { async predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult> { // Implement anomaly detection logic return { insights: [{ id: 'insight-4', type: InsightType.ANOMALY, description: 'Anomaly detected in analysis result', confidence: 0.8, evidence: ['Anomaly detection algorithm'], implications: ['May indicate unusual behavior'] }] }; } } class CorrelationAnalysisAlgorithm extends PredictionAlgorithm { async predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult> { // Implement correlation analysis logic return { insights: [{ id: 'insight-5', type: InsightType.CORRELATION, description: 'Correlation found with other factors', confidence: 0.7, evidence: ['Correlation analysis'], implications: ['May indicate causal relationship'] }] }; } } class ClassificationAlgorithm extends PredictionAlgorithm { async predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult> { // Implement classification logic return { insights: [{ id: 'insight-6', type: InsightType.PATTERN, description: 'Result classified into specific category', confidence: 0.85, evidence: ['Classification algorithm'], implications: ['Category-specific actions may be needed'] }] }; } } class RegressionAlgorithm extends PredictionAlgorithm { async predict( result: UnifiedAnalysisResult, request: ContextAnalysisRequest, contextModel: ContextModel ): Promise<PredictionAlgorithmResult> { // Implement regression logic return { insights: [{ id: 'insight-7', type: InsightType.PREDICTION, description: 'Future values predicted based on regression', confidence: 0.65, evidence: ['Regression model'], implications: ['Predictions may inform planning'] }] }; } }

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/cbunting99/mcp-code-analysis-server'

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