UNPKG

universal-ai-brain

Version:

🧠 UNIVERSAL AI BRAIN 3.3 - The world's most advanced cognitive architecture with 24 specialized systems, MongoDB 8.1 $rankFusion hybrid search, latest Voyage 3.5 embeddings, and framework-agnostic design. Works with Mastra, Vercel AI, LangChain, OpenAI A

965 lines (850 loc) • 32.9 kB
/** * @file SkillCapabilityManager - Advanced skill and capability management for AI agents * * This manager provides comprehensive skill tracking and capability management using MongoDB's * complex indexing and metadata management capabilities. Demonstrates MongoDB's advanced * features for multi-dimensional skill data, proficiency analytics, and capability matching. * * Features: * - Complex multi-field indexing for skill queries * - Proficiency tracking with statistical analysis * - Capability matching and recommendation algorithms * - Learning analytics and skill development tracking * - Skill gap analysis and development planning * - Real-time skill assessment and adaptation */ import { Db, ObjectId } from 'mongodb'; import { SkillCapabilityCollection, SkillCapability } from '../collections/SkillCapabilityCollection'; export interface SkillAssessmentRequest { agentId: string; sessionId?: string; skillId: string; skillName: string; category: string; subcategory: string; domain: string; context: { taskType: string; complexity: number; duration: number; outcome: 'successful' | 'partially_successful' | 'unsuccessful'; evidence?: string; feedback?: string; }; performance: { accuracy: number; // 0-1 efficiency: number; // 0-1 quality: number; // 0-1 creativity?: number; // 0-1 collaboration?: number; // 0-1 }; environment: { pressure: 'low' | 'medium' | 'high'; support: 'minimal' | 'moderate' | 'extensive'; resources: 'limited' | 'adequate' | 'abundant'; timeConstraints: 'relaxed' | 'moderate' | 'tight'; }; } export interface SkillDevelopmentPlan { agentId: string; targetSkills: Array<{ skillId: string; skillName: string; currentProficiency: number; targetProficiency: number; priority: 'critical' | 'high' | 'medium' | 'low'; estimatedTimeToTarget: number; // hours learningPath: Array<{ step: number; activity: string; duration: number; // hours resources: string[]; milestones: string[]; }>; }>; timeline: { startDate: Date; estimatedCompletionDate: Date; milestones: Array<{ date: Date; description: string; skillsToAssess: string[]; }>; }; recommendations: { learningStyle: string; practiceFrequency: string; focusAreas: string[]; potentialChallenges: string[]; successStrategies: string[]; }; } export interface CapabilityMatchingRequest { agentId: string; requiredSkills: Array<{ skillId: string; skillName: string; minimumProficiency: number; importance: number; // 0-1 category: string; }>; taskContext: { type: string; complexity: number; duration: number; domain: string; constraints?: string[]; }; preferences?: { prioritizeExperience?: boolean; allowSkillGaps?: boolean; maxGapTolerance?: number; }; } export interface CapabilityMatchResult { overallMatch: number; // 0-1 skillMatches: Array<{ skillId: string; skillName: string; required: number; current: number; gap: number; confidence: number; evidence: string[]; }>; strengths: string[]; gaps: string[]; recommendations: string[]; riskAssessment: { overallRisk: number; riskFactors: string[]; mitigationStrategies: string[]; }; } export interface SkillAnalytics { proficiencyDistribution: { beginner: number; intermediate: number; advanced: number; expert: number; }; learningMetrics: { averageLearningRate: number; skillsInDevelopment: number; completedSkills: number; totalPracticeHours: number; averageSessionDuration: number; }; performanceMetrics: { averageAccuracy: number; averageEfficiency: number; averageQuality: number; improvementTrend: number; consistencyScore: number; }; gapAnalysis: { criticalGaps: Array<{ skillName: string; currentGap: number; importance: number; priority: string; }>; developmentOpportunities: string[]; strengthAreas: string[]; }; recommendations: { focusAreas: string[]; learningPriorities: string[]; skillCombinations: string[]; nextSteps: string[]; }; } /** * SkillCapabilityManager - Advanced skill and capability management engine * * Provides comprehensive skill tracking, proficiency analysis, capability matching, * and learning analytics using MongoDB's complex indexing and aggregation capabilities. */ export class SkillCapabilityManager { private skillCapabilityCollection: SkillCapabilityCollection; private isInitialized = false; constructor(private db: Db) { this.skillCapabilityCollection = new SkillCapabilityCollection(db); } /** * Initialize the skill capability manager */ async initialize(): Promise<void> { try { await this.skillCapabilityCollection.createIndexes(); this.isInitialized = true; console.log('SkillCapabilityManager initialized successfully'); } catch (error) { console.error('Failed to initialize SkillCapabilityManager:', error); throw error; } } /** * Assess and record skill performance */ async assessSkill(request: SkillAssessmentRequest): Promise<ObjectId> { if (!this.isInitialized) { throw new Error('SkillCapabilityManager must be initialized first'); } // Calculate proficiency based on performance metrics const proficiency = this.calculateProficiency(request.performance, request.environment); // Determine confidence level based on evidence and context const confidence = this.calculateConfidence(request.context, request.performance); // Create skill capability record const skillCapability: Omit<SkillCapability, '_id' | 'createdAt' | 'updatedAt'> = { agentId: request.agentId, sessionId: request.sessionId, timestamp: new Date(), skill: { id: request.skillId, name: request.skillName, category: request.category, subcategory: request.subcategory, domain: request.domain, tags: this.generateSkillTags(request), hierarchy: { level: this.determineSkillLevel(request.category, request.subcategory), parent: this.determineParentSkill(request.category, request.subcategory), children: [], prerequisites: this.determinePrerequisites(request.skillId), related: this.findRelatedSkills(request.skillId, request.category) }, metadata: { difficulty: this.assessDifficulty(request.context.complexity), learningCurve: this.assessLearningCurve(request.skillId), practiceRequired: this.assessPracticeRequirement(request.skillId), transferability: this.assessTransferability(request.domain), marketDemand: this.assessMarketDemand(request.skillId), futureRelevance: this.assessFutureRelevance(request.skillId) } }, proficiency: { current: proficiency.overall, confidence: confidence, lastAssessed: new Date(), assessmentHistory: [{ date: new Date(), proficiency: proficiency.overall, context: request.context.taskType, evidence: request.context.evidence || 'Performance assessment' }], breakdown: { technical: proficiency.technical, practical: proficiency.practical, theoretical: proficiency.theoretical, creative: proficiency.creative || 0.5, collaborative: proficiency.collaborative || 0.5 }, calibration: { selfAssessment: proficiency.overall, externalAssessment: proficiency.overall, calibrationError: 0, overconfidenceIndex: 0 } }, learning: { progress: { startDate: new Date(), milestones: [{ date: new Date(), proficiency: proficiency.overall, description: `Initial assessment: ${request.context.outcome}`, evidence: request.context.evidence }], currentStreak: 1, totalPracticeTime: request.context.duration, sessionsCompleted: 1 }, preferences: { learningStyle: this.inferLearningStyle(request.performance), preferredPace: this.inferPreferredPace(request.context.duration), practiceFrequency: 'weekly', feedbackPreference: 'immediate' }, resources: { completed: [], recommended: [], inProgress: [] } }, application: { recentUsage: [{ date: new Date(), context: request.context.taskType, duration: request.context.duration, complexity: request.context.complexity, outcome: request.context.outcome, feedback: request.context.feedback, improvementAreas: this.identifyImprovementAreas(request.performance) }], patterns: { frequency: 1, contexts: [request.context.taskType], peakPerformanceTimes: ['current'], commonChallenges: this.identifyCommonChallenges(request.performance), successFactors: this.identifySuccessFactors(request.performance, request.environment) }, performance: { averageQuality: proficiency.overall, consistencyScore: proficiency.overall, improvementRate: 0.1, errorRate: request.context.outcome === 'successful' ? 0.1 : 0.3, speedMetrics: { averageTime: request.context.duration, bestTime: request.context.duration * 0.8, timeImprovement: 0.1 } } }, matching: { synergies: [], gaps: [], roleMatching: [] }, metadata: { framework: 'skill_assessment', version: '1.0.0', dataSource: 'assessment' as const, reliability: proficiency.overall, lastUpdated: new Date(), updateFrequency: 'real_time' as const, quality: { completeness: proficiency.overall, consistency: proficiency.overall, accuracy: proficiency.overall, freshness: 1.0 } }, analytics: { trends: { proficiencyTrend: 0.1, usageTrend: 0.1, qualityTrend: 0.1, learningVelocity: this.calculateLearningRate(proficiency.overall) }, benchmarks: { peerComparison: 0.5, industryStandard: 0.6, roleRequirement: 0.7, personalGoals: 0.8 }, predictions: { futureRelevance: 0.8, marketValue: 0.7, developmentPotential: proficiency.overall + 0.1, timeToMastery: 30 }, insights: [`Initial assessment shows ${proficiency.overall > 0.7 ? 'strong' : 'developing'} proficiency`], recommendations: [`Focus on ${request.context.taskType} practice`] } }; return await this.skillCapabilityCollection.recordSkillCapability(skillCapability); } /** * Generate skill development plan for an agent */ async generateDevelopmentPlan(agentId: string, targetSkills?: string[]): Promise<SkillDevelopmentPlan> { if (!this.isInitialized) { throw new Error('SkillCapabilityManager must be initialized first'); } // Get current skills const currentSkills = await this.skillCapabilityCollection.getAgentSkills(agentId); // Analyze skill gaps const gapAnalysis = await this.skillCapabilityCollection.analyzeSkillGaps(agentId); // Determine target skills (either provided or from gap analysis) const skillsToTarget = targetSkills || gapAnalysis.map(gap => gap.area); const targetSkillPlans = await Promise.all( skillsToTarget.map(async (skillName) => { const currentSkill = currentSkills.find(s => s.skill.name === skillName); const currentProficiency = currentSkill?.proficiency.current || 0; const targetProficiency = Math.min(currentProficiency + 0.3, 1.0); // Aim for 30% improvement return { skillId: currentSkill?.skill.id || `skill_${skillName.toLowerCase().replace(/\s+/g, '_')}`, skillName, currentProficiency, targetProficiency, priority: this.determinePriority(skillName, gapAnalysis), estimatedTimeToTarget: this.estimateTimeToTarget(currentProficiency, targetProficiency), learningPath: this.generateLearningPath(skillName, currentProficiency, targetProficiency) }; }) ); const timeline = this.generateTimeline(targetSkillPlans); const recommendations = this.generateLearningRecommendations(currentSkills, gapAnalysis); return { agentId, targetSkills: targetSkillPlans, timeline, recommendations }; } /** * Match agent capabilities to requirements */ async matchCapabilities(request: CapabilityMatchingRequest): Promise<CapabilityMatchResult> { if (!this.isInitialized) { throw new Error('SkillCapabilityManager must be initialized first'); } const agentSkills = await this.skillCapabilityCollection.getAgentSkills(request.agentId); const skillMatches = request.requiredSkills.map(required => { const agentSkill = agentSkills.find(s => s.skill.id === required.skillId || s.skill.name === required.skillName ); const current = agentSkill?.proficiency.current || 0; const gap = Math.max(0, required.minimumProficiency - current); const confidence = agentSkill?.proficiency.confidence || 0; return { skillId: required.skillId, skillName: required.skillName, required: required.minimumProficiency, current, gap, confidence, evidence: agentSkill?.proficiency.assessmentHistory.map(h => h.evidence) || [] }; }); const overallMatch = this.calculateOverallMatch(skillMatches, request.requiredSkills); const strengths = this.identifyStrengths(skillMatches); const gaps = this.identifyGaps(skillMatches); const recommendations = this.generateMatchingRecommendations(skillMatches, request); const riskAssessment = this.assessMatchingRisk(skillMatches, request); return { overallMatch, skillMatches, strengths, gaps, recommendations, riskAssessment }; } /** * Analyze skill patterns and generate analytics */ async analyzeSkillPatterns(agentId: string, timeframeDays: number = 30): Promise<SkillAnalytics> { if (!this.isInitialized) { throw new Error('SkillCapabilityManager must be initialized first'); } // Get skill portfolio analysis from collection const portfolioAnalysis = await this.skillCapabilityCollection.analyzeSkillPortfolio(agentId); // Transform to SkillAnalytics format const proficiencyDistribution = this.transformProficiencyDistribution(portfolioAnalysis.proficiencyLevels); const learningMetrics = await this.calculateLearningMetrics(agentId); const performanceMetrics = await this.calculatePerformanceMetrics(agentId); return { proficiencyDistribution, learningMetrics, performanceMetrics, gapAnalysis: { criticalGaps: portfolioAnalysis.gapAnalysis.filter(gap => gap.priority === 'critical').map(gap => ({ skillName: gap.area, currentGap: gap.gap, importance: 0.8, // Default importance priority: gap.priority })), developmentOpportunities: portfolioAnalysis.recommendations, strengthAreas: portfolioAnalysis.skillDistribution .filter(skill => skill.avgProficiency > 0.8) .map(skill => skill.category) }, recommendations: { focusAreas: portfolioAnalysis.gapAnalysis.slice(0, 3).map(gap => gap.area), learningPriorities: portfolioAnalysis.recommendations, skillCombinations: ['Technical + Communication', 'Leadership + Problem Solving'], nextSteps: ['Focus on critical gaps', 'Practice regularly', 'Seek feedback'] } }; } /** * Update skill proficiency based on new evidence */ async updateSkillProficiency( agentId: string, skillId: string, proficiencyUpdate: { newProficiency: number; evidence: string; context: string; } ): Promise<void> { if (!this.isInitialized) { throw new Error('SkillCapabilityManager must be initialized first'); } await this.skillCapabilityCollection.updateSkillProficiency(agentId, skillId, { current: proficiencyUpdate.newProficiency, lastAssessed: new Date(), assessmentHistory: [{ date: new Date(), proficiency: proficiencyUpdate.newProficiency, context: proficiencyUpdate.context, evidence: proficiencyUpdate.evidence }] }); } // Private helper methods private calculateProficiency(performance: any, environment: any): any { const baseScore = (performance.accuracy + performance.efficiency + performance.quality) / 3; // Adjust for environment difficulty const environmentMultiplier = this.getEnvironmentMultiplier(environment); const adjustedScore = Math.min(1.0, baseScore * environmentMultiplier); return { overall: adjustedScore, technical: performance.accuracy, practical: performance.efficiency, theoretical: performance.quality, creative: performance.creativity, collaborative: performance.collaboration }; } private calculateConfidence(context: any, performance: any): number { let confidence = 0.7; // Base confidence // Adjust based on outcome if (context.outcome === 'successful') confidence += 0.2; else if (context.outcome === 'unsuccessful') confidence -= 0.3; // Adjust based on evidence quality if (context.evidence) confidence += 0.1; // Adjust based on performance consistency const performanceValues = Object.values(performance).filter(v => typeof v === 'number') as number[]; const variance = this.calculateVariance(performanceValues); confidence -= variance * 0.2; return Math.max(0.1, Math.min(1.0, confidence)); } private generateSkillTags(request: SkillAssessmentRequest): string[] { const tags = [ request.category, request.subcategory, request.domain, request.context.taskType ]; // Add performance-based tags if (request.performance.accuracy > 0.8) tags.push('high-accuracy'); if (request.performance.efficiency > 0.8) tags.push('efficient'); if (request.performance.quality > 0.8) tags.push('high-quality'); return tags.filter(Boolean); } private determineSkillLevel(category: string, subcategory: string): number { // Simple hierarchy: category=1, subcategory=2 return subcategory ? 2 : 1; } private determineParentSkill(category: string, subcategory: string): string { return subcategory ? category : ''; } private determinePrerequisites(skillId: string): string[] { // Simplified prerequisite mapping const prerequisites: Record<string, string[]> = { 'advanced_programming': ['basic_programming', 'data_structures'], 'machine_learning': ['statistics', 'programming', 'mathematics'], 'project_management': ['communication', 'planning', 'leadership'] }; return prerequisites[skillId] || []; } private findRelatedSkills(skillId: string, category: string): string[] { // Simplified related skills mapping const relatedSkills: Record<string, string[]> = { 'programming': ['debugging', 'testing', 'code_review'], 'communication': ['presentation', 'writing', 'listening'], 'analysis': ['critical_thinking', 'problem_solving', 'research'] }; return relatedSkills[category] || []; } private assessDifficulty(complexity: number): 'beginner' | 'intermediate' | 'advanced' | 'expert' { if (complexity < 0.3) return 'beginner'; if (complexity < 0.6) return 'intermediate'; if (complexity < 0.8) return 'advanced'; return 'expert'; } private assessLearningCurve(skillId: string): 'gentle' | 'moderate' | 'steep' | 'exponential' { // Simplified mapping based on skill complexity const complexSkills = ['machine_learning', 'advanced_programming', 'system_design']; if (complexSkills.includes(skillId)) return 'steep'; return 'moderate'; } private assessPracticeRequirement(skillId: string): 'minimal' | 'regular' | 'intensive' | 'continuous' { const practiceIntensive = ['programming', 'communication', 'problem_solving']; if (practiceIntensive.includes(skillId)) return 'regular'; return 'minimal'; } private assessTransferability(domain: string): number { // Higher transferability for general skills const transferabilityMap: Record<string, number> = { 'general': 0.9, 'communication': 0.8, 'analytical': 0.7, 'technical': 0.5, 'domain_specific': 0.3 }; return transferabilityMap[domain] || 0.6; } private assessMarketDemand(skillId: string): number { // Simplified market demand assessment const highDemandSkills = ['programming', 'data_analysis', 'communication', 'problem_solving']; return highDemandSkills.includes(skillId) ? 0.8 : 0.6; } private assessFutureRelevance(skillId: string): number { // Simplified future relevance assessment const futureRelevantSkills = ['ai_literacy', 'data_analysis', 'critical_thinking', 'creativity']; return futureRelevantSkills.includes(skillId) ? 0.9 : 0.7; } private inferLearningStyle(performance: any): 'visual' | 'auditory' | 'kinesthetic' | 'reading' | 'mixed' { // Simplified inference based on performance patterns if (performance.creativity > 0.7) return 'visual'; if (performance.collaboration > 0.7) return 'auditory'; return 'mixed'; } private inferPreferredPace(duration: number): 'slow' | 'moderate' | 'fast' | 'adaptive' { // Infer pace preference from task duration if (duration > 120) return 'slow'; if (duration > 60) return 'moderate'; return 'fast'; } private calculateLearningRate(proficiency: number): number { // Higher initial proficiency suggests faster learning return Math.min(0.1, proficiency * 0.15); } private identifyMotivationFactors(outcome: string): string[] { const factors = ['achievement', 'learning', 'recognition']; if (outcome === 'successful') factors.push('success_driven'); return factors; } private identifyLearningPatterns(performance: any): string[] { const patterns = []; if (performance.accuracy > performance.efficiency) patterns.push('accuracy_focused'); if (performance.efficiency > performance.quality) patterns.push('speed_focused'); if (performance.quality > 0.8) patterns.push('quality_focused'); return patterns; } private identifyImprovementAreas(performance: any): string[] { const areas = []; if (performance.accuracy < 0.7) areas.push('accuracy'); if (performance.efficiency < 0.7) areas.push('efficiency'); if (performance.quality < 0.7) areas.push('quality'); return areas; } private identifyCommonChallenges(performance: any): string[] { const challenges = []; if (performance.accuracy < 0.6) challenges.push('precision_issues'); if (performance.efficiency < 0.6) challenges.push('time_management'); if (performance.quality < 0.6) challenges.push('quality_control'); return challenges; } private identifySuccessFactors(performance: any, environment: any): string[] { const factors = []; if (performance.accuracy > 0.8) factors.push('attention_to_detail'); if (performance.efficiency > 0.8) factors.push('time_management'); if (environment.support === 'extensive') factors.push('collaborative_environment'); return factors; } private calculateAdaptabilityScore(environment: any): number { let score = 0.5; if (environment.pressure === 'high') score += 0.2; if (environment.resources === 'limited') score += 0.2; if (environment.timeConstraints === 'tight') score += 0.1; return Math.min(1.0, score); } private generateInitialRecommendations(request: SkillAssessmentRequest, proficiency: any): string[] { const recommendations = []; if (proficiency.overall < 0.6) { recommendations.push('Focus on fundamental skill development'); } if (request.performance.accuracy < 0.7) { recommendations.push('Practice accuracy-focused exercises'); } if (request.performance.efficiency < 0.7) { recommendations.push('Work on time management and efficiency'); } return recommendations; } private getEnvironmentMultiplier(environment: any): number { let multiplier = 1.0; // Adjust for pressure if (environment.pressure === 'high') multiplier += 0.1; else if (environment.pressure === 'low') multiplier -= 0.1; // Adjust for support if (environment.support === 'extensive') multiplier += 0.1; else if (environment.support === 'minimal') multiplier -= 0.1; // Adjust for resources if (environment.resources === 'abundant') multiplier += 0.05; else if (environment.resources === 'limited') multiplier -= 0.1; return Math.max(0.5, Math.min(1.5, multiplier)); } private calculateVariance(values: number[]): number { if (values.length === 0) return 0; const mean = values.reduce((sum, val) => sum + val, 0) / values.length; const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length; return variance; } private determinePriority(skillName: string, gapAnalysis: any[]): 'critical' | 'high' | 'medium' | 'low' { const gap = gapAnalysis.find(g => g.area === skillName); if (!gap) return 'medium'; if (gap.importance > 0.8) return 'critical'; if (gap.importance > 0.6) return 'high'; if (gap.importance > 0.4) return 'medium'; return 'low'; } private estimateTimeToTarget(current: number, target: number): number { const gap = target - current; // Estimate 10 hours per 0.1 proficiency improvement return Math.max(5, gap * 100); } private generateLearningPath(skillName: string, current: number, target: number): any[] { const gap = target - current; const steps = Math.ceil(gap / 0.1); // Break into 0.1 increments return Array.from({ length: steps }, (_, i) => ({ step: i + 1, activity: `${skillName} practice session ${i + 1}`, duration: 10, // hours resources: [`${skillName} learning materials`, 'Practice exercises'], milestones: [`Achieve ${(current + (i + 1) * 0.1).toFixed(1)} proficiency`] })); } private generateTimeline(targetSkillPlans: any[]): any { const startDate = new Date(); const totalHours = targetSkillPlans.reduce((sum, plan) => sum + plan.estimatedTimeToTarget, 0); const estimatedCompletionDate = new Date(startDate.getTime() + totalHours * 60 * 60 * 1000); const milestones = targetSkillPlans.map((plan, index) => ({ date: new Date(startDate.getTime() + (index + 1) * (totalHours / targetSkillPlans.length) * 60 * 60 * 1000), description: `Complete ${plan.skillName} development`, skillsToAssess: [plan.skillName] })); return { startDate, estimatedCompletionDate, milestones }; } private generateLearningRecommendations(currentSkills: any[], gapAnalysis: any[]): any { return { learningStyle: 'mixed', // Could be inferred from current skills practiceFrequency: 'weekly', focusAreas: gapAnalysis.slice(0, 3).map(gap => gap.area), potentialChallenges: ['Time management', 'Consistency', 'Motivation'], successStrategies: ['Regular practice', 'Incremental progress', 'Feedback loops'] }; } private calculateOverallMatch(skillMatches: any[], requiredSkills: any[]): number { const weightedSum = skillMatches.reduce((sum, match, index) => { const weight = requiredSkills[index].importance; const matchScore = Math.max(0, 1 - match.gap); return sum + (matchScore * weight); }, 0); const totalWeight = requiredSkills.reduce((sum, skill) => sum + skill.importance, 0); return totalWeight > 0 ? weightedSum / totalWeight : 0; } private identifyStrengths(skillMatches: any[]): string[] { return skillMatches .filter(match => match.gap <= 0) .map(match => match.skillName); } private identifyGaps(skillMatches: any[]): string[] { return skillMatches .filter(match => match.gap > 0.1) .map(match => `${match.skillName} (gap: ${match.gap.toFixed(2)})`); } private generateMatchingRecommendations(skillMatches: any[], request: any): string[] { const recommendations = []; const significantGaps = skillMatches.filter(match => match.gap > 0.2); if (significantGaps.length > 0) { recommendations.push(`Address skill gaps in: ${significantGaps.map(g => g.skillName).join(', ')}`); } const lowConfidence = skillMatches.filter(match => match.confidence < 0.6); if (lowConfidence.length > 0) { recommendations.push(`Gain more experience in: ${lowConfidence.map(g => g.skillName).join(', ')}`); } return recommendations; } private assessMatchingRisk(skillMatches: any[], request: any): any { const criticalGaps = skillMatches.filter(match => match.gap > 0.3).length; const lowConfidence = skillMatches.filter(match => match.confidence < 0.5).length; let overallRisk = 0; const riskFactors = []; if (criticalGaps > 0) { overallRisk += criticalGaps * 0.3; riskFactors.push(`${criticalGaps} critical skill gaps`); } if (lowConfidence > 0) { overallRisk += lowConfidence * 0.2; riskFactors.push(`${lowConfidence} skills with low confidence`); } const mitigationStrategies = []; if (criticalGaps > 0) mitigationStrategies.push('Intensive skill development program'); if (lowConfidence > 0) mitigationStrategies.push('Supervised practice and mentoring'); return { overallRisk: Math.min(1.0, overallRisk), riskFactors, mitigationStrategies }; } private transformProficiencyDistribution(proficiencyLevels: any[]): any { const distribution = { beginner: 0, intermediate: 0, advanced: 0, expert: 0 }; proficiencyLevels.forEach(level => { if (level.level.toLowerCase().includes('beginner')) { distribution.beginner = level.count; } else if (level.level.toLowerCase().includes('intermediate')) { distribution.intermediate = level.count; } else if (level.level.toLowerCase().includes('advanced')) { distribution.advanced = level.count; } else if (level.level.toLowerCase().includes('expert')) { distribution.expert = level.count; } }); return distribution; } private async calculateLearningMetrics(agentId: string): Promise<any> { const skills = await this.skillCapabilityCollection.getAgentSkills(agentId); const totalPracticeHours = skills.reduce((sum, skill) => sum + (skill.learning.progress.totalPracticeTime || 0), 0 ); const skillsInDevelopment = skills.filter(skill => skill.learning.progress.currentStreak > 0 ).length; const completedSkills = skills.filter(skill => skill.proficiency.current >= 0.8 ).length; const averageSessionDuration = totalPracticeHours > 0 ? totalPracticeHours / Math.max(1, skills.length) : 0; return { averageLearningRate: 0.1, // Simplified skillsInDevelopment, completedSkills, totalPracticeHours, averageSessionDuration }; } private async calculatePerformanceMetrics(agentId: string): Promise<any> { const skills = await this.skillCapabilityCollection.getAgentSkills(agentId); if (skills.length === 0) { return { averageAccuracy: 0, averageEfficiency: 0, averageQuality: 0, improvementTrend: 0, consistencyScore: 0 }; } const averageAccuracy = skills.reduce((sum, skill) => sum + (skill.proficiency.breakdown.technical || 0), 0 ) / skills.length; const averageEfficiency = skills.reduce((sum, skill) => sum + (skill.proficiency.breakdown.practical || 0), 0 ) / skills.length; const averageQuality = skills.reduce((sum, skill) => sum + (skill.proficiency.breakdown.theoretical || 0), 0 ) / skills.length; return { averageAccuracy, averageEfficiency, averageQuality, improvementTrend: 0.05, // Simplified consistencyScore: 0.8 // Simplified }; } }