@triedotdev/mcp 1.0.140 → 1.0.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +42 -7
  2. package/dist/{chunk-GXF6JOCN.js → chunk-4PAAGLKO.js} +7 -7
  3. package/dist/{chunk-OQ4A3RDY.js → chunk-N2EDZTKG.js} +6 -359
  4. package/dist/chunk-N2EDZTKG.js.map +1 -0
  5. package/dist/{chunk-75ADWWUF.js → chunk-T6PS3MXJ.js} +2 -2
  6. package/dist/{chunk-AF2APASP.js → chunk-V7AY2EJO.js} +4 -4
  7. package/dist/{chunk-UOSTOLU7.js → chunk-WMDFK7LI.js} +365 -10
  8. package/dist/chunk-WMDFK7LI.js.map +1 -0
  9. package/dist/{chunk-4O2KRHK4.js → chunk-Y2LYDCJD.js} +19 -19
  10. package/dist/cli/main.js +669 -441
  11. package/dist/cli/main.js.map +1 -1
  12. package/dist/cli/yolo-daemon.js +9 -9
  13. package/dist/{codebase-index-5SEOESWM.js → codebase-index-FMIULFZQ.js} +3 -3
  14. package/dist/{fast-analyzer-AYLZB5TW.js → fast-analyzer-MWKCDRGD.js} +5 -5
  15. package/dist/{goal-validator-HNXXUCPW.js → goal-validator-DA3JQ6JN.js} +2 -2
  16. package/dist/index.js +91 -31
  17. package/dist/index.js.map +1 -1
  18. package/dist/{trie-agent-M6PHM6UD.js → trie-agent-6A7YBNTQ.js} +6 -6
  19. package/package.json +1 -1
  20. package/dist/chunk-OQ4A3RDY.js.map +0 -1
  21. package/dist/chunk-UOSTOLU7.js.map +0 -1
  22. /package/dist/{chunk-GXF6JOCN.js.map → chunk-4PAAGLKO.js.map} +0 -0
  23. /package/dist/{chunk-75ADWWUF.js.map → chunk-T6PS3MXJ.js.map} +0 -0
  24. /package/dist/{chunk-AF2APASP.js.map → chunk-V7AY2EJO.js.map} +0 -0
  25. /package/dist/{chunk-4O2KRHK4.js.map → chunk-Y2LYDCJD.js.map} +0 -0
  26. /package/dist/{codebase-index-5SEOESWM.js.map → codebase-index-FMIULFZQ.js.map} +0 -0
  27. /package/dist/{fast-analyzer-AYLZB5TW.js.map → fast-analyzer-MWKCDRGD.js.map} +0 -0
  28. /package/dist/{goal-validator-HNXXUCPW.js.map → goal-validator-DA3JQ6JN.js.map} +0 -0
  29. /package/dist/{trie-agent-M6PHM6UD.js.map → trie-agent-6A7YBNTQ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/trie-agent.ts","../src/agent/risk-predictor.ts","../src/agent/escalation.ts","../src/agent/meta-learning.ts"],"sourcesContent":["/**\n * Trie Agent - A proactive, intelligent agent that watches over your codebase\n * \n * The Trie Agent:\n * - Synthesizes insights from multiple skills\n * - Speaks conversationally, like a helpful colleague\n * - Suggests specific actions, not just problems\n * - Tracks patterns over time and learns\n * - Anticipates issues before they become critical\n * \n * Integration:\n * - Uses existing memory infrastructure (issue-store, global-memory)\n * - Persistent insight storage (survives restarts)\n * - Goal tracking and hypothesis validation\n * - Optionally enhances with LLM when ANTHROPIC_API_KEY is available\n */\n\nimport type { Issue } from '../types/index.js';\nimport { storeIssues, autoResolveIssues, getIssueHash } from '../memory/issue-store.js';\nimport { recordToGlobalMemory, findCrossProjectPatterns } from '../memory/global-memory.js';\nimport { getHistoricalInsights } from '../memory/compactor.js';\nimport { isAIAvailable, runAIAnalysis } from '../ai/client.js';\nimport { basename } from 'path';\nimport { getInsightStore, type Insight } from './insight-store.js';\nimport { getProjectState } from './project-state.js';\nimport { getGoalManager } from './goal-manager.js';\nimport { getRiskPredictor } from './risk-predictor.js';\nimport { getHypothesisEngine } from './hypothesis.js';\nimport { getEscalationManager } from './escalation.js';\nimport { getMetaLearner } from './meta-learning.js';\nimport { GotchaPredictor } from './gotcha-predictor.js';\nimport { ContextGraph } from '../context/graph.js';\nimport { getStorage } from '../storage/tiered-storage.js';\nimport type { Gotcha } from '../types/signal.js';\n\nexport type { Insight } from './insight-store.js';\n\n// Personality phrases for different situations\nconst PERSONALITY = {\n greetings: [\n \"Hey, quick heads up...\",\n \"Noticed something while scanning...\",\n \"Worth mentioning...\",\n \"Just so you know...\",\n \"Spotted this...\",\n ],\n warnings: [\n \"This needs your attention:\",\n \"I'd pause on this:\",\n \"Before you push...\",\n \"Hold up —\",\n \"Important:\",\n ],\n celebrations: [\n \"Nice work!\",\n \"Good catch!\",\n \"That's better.\",\n \"Clean.\",\n \"Progress.\",\n ],\n suggestions: [\n \"You might want to\",\n \"Consider\",\n \"Suggestion:\",\n \"Quick win:\",\n \"Idea:\",\n ],\n questions: [\n \"Did you mean to\",\n \"Should this\",\n \"Is it intentional that\",\n \"Quick question:\",\n ],\n};\n\nexport class TrieAgent {\n private projectPath: string;\n private projectName: string;\n private lastIssueHashes: Set<string> = new Set();\n private initialized: boolean = false;\n \n // Persistent stores\n private insightStore;\n private projectState;\n \n // Agency modules\n private goalManager;\n private riskPredictor;\n private hypothesisEngine;\n private escalationManager;\n private metaLearner;\n private gotchaPredictor;\n \n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.projectName = basename(projectPath);\n \n // Initialize persistent stores\n this.insightStore = getInsightStore(projectPath);\n this.projectState = getProjectState(projectPath);\n \n // Initialize agency modules\n this.goalManager = getGoalManager(projectPath);\n this.riskPredictor = getRiskPredictor(projectPath);\n this.hypothesisEngine = getHypothesisEngine(projectPath);\n this.escalationManager = getEscalationManager(projectPath);\n this.metaLearner = getMetaLearner(projectPath);\n this.gotchaPredictor = new GotchaPredictor(projectPath, new ContextGraph(projectPath));\n }\n \n /**\n * Initialize the agent - loads persistent state and historical data\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n \n try {\n // Load persistent stores\n await this.insightStore.load();\n await this.projectState.load();\n \n // Update last active timestamp\n await this.projectState.touchActive();\n \n // Get historical context from existing memory infrastructure\n const historical = await getHistoricalInsights(this.projectPath);\n \n // If we have history, we can detect trends\n if (historical && historical.totalHistoricalIssues > 0) {\n const trend = historical.improvementTrend;\n if (trend === 'improving' && this.canCreateInsight('progress-trend')) {\n await this.addInsight(this.createInsight({\n type: 'celebration',\n message: `${this.pick(PERSONALITY.celebrations)} Your code quality has been improving over time.`,\n priority: 2,\n category: 'progress',\n }));\n await this.markInsightCreated('progress-trend');\n } else if (trend === 'declining' && this.canCreateInsight('progress-trend')) {\n await this.addInsight(this.createInsight({\n type: 'observation',\n message: `${this.pick(PERSONALITY.greetings)} Issue count has been trending up. Might be worth a focused cleanup session.`,\n suggestedAction: 'Run `trie scan` and address top issues',\n priority: 5,\n category: 'quality',\n }));\n await this.markInsightCreated('progress-trend');\n }\n }\n \n this.initialized = true;\n } catch {\n // Memory might not exist yet - that's fine\n this.initialized = true;\n }\n }\n \n /**\n * Add an insight to persistent storage\n */\n async addInsight(insight: Insight): Promise<boolean> {\n return this.insightStore.addInsight(insight);\n }\n \n /**\n * Restart the agent (reload state from disk)\n */\n async restart(): Promise<void> {\n this.initialized = false;\n await this.insightStore.reload();\n await this.projectState.reload();\n await this.initialize();\n }\n \n /**\n * Load state from disk (for testing)\n */\n async loadState(): Promise<{ goals: any[]; riskBudget: any }> {\n await this.projectState.load();\n return {\n goals: this.projectState.getAllGoals(),\n riskBudget: this.projectState.getRiskBudget(),\n };\n }\n \n /**\n * Process new issues from a scan and generate insights\n * Stores issues in memory and optionally uses LLM for deeper analysis\n */\n async processIssues(issues: Issue[], context: { filesChanged?: string[]; isWatchMode: boolean }): Promise<Insight[]> {\n const newInsights: Insight[] = [];\n \n // 1. Store issues in memory infrastructure\n try {\n await storeIssues(issues, this.projectName, this.projectPath);\n await recordToGlobalMemory(issues, this.projectName, this.projectPath);\n \n // Auto-resolve issues no longer detected in changed files\n if (context.filesChanged && context.filesChanged.length > 0) {\n const currentHashes = new Set(issues.map(i => getIssueHash(i)));\n await autoResolveIssues(currentHashes, context.filesChanged, this.projectPath);\n }\n } catch {\n // Memory errors shouldn't break the agent\n }\n \n // 2. Detect changes from last scan\n const currentHashes = new Set(issues.map(i => `${i.file}:${i.line}:${i.issue.slice(0, 50)}`));\n const newIssues = issues.filter(i => !this.lastIssueHashes.has(`${i.file}:${i.line}:${i.issue.slice(0, 50)}`));\n const fixedCount = [...this.lastIssueHashes].filter(h => !currentHashes.has(h)).length;\n \n // 3. Generate heuristic insights (with cooldowns to avoid duplicates)\n \n // Accessibility issues with visual QA recommendation\n const accessibilityIssues = issues.filter(i => \n i.agent === 'accessibility' && \n (i.severity === 'critical' || i.severity === 'serious')\n );\n \n if (accessibilityIssues.length >= 2 && this.canCreateInsight('accessibility-visual-qa')) {\n const critical = accessibilityIssues.filter(i => i.severity === 'critical');\n const serious = accessibilityIssues.filter(i => i.severity === 'serious');\n \n const breakdown: Record<string, number> = {};\n if (critical.length > 0) breakdown['critical'] = critical.length;\n if (serious.length > 0) breakdown['serious'] = serious.length;\n \n const affectedFiles = [...new Set(accessibilityIssues.map(i => i.file))];\n const examples = [...critical, ...serious]\n .slice(0, 3)\n .map(i => `${basename(i.file)}:${i.line} - ${i.issue.slice(0, 60)}`);\n \n const insight = this.createInsight({\n type: 'suggestion',\n message: `Found ${accessibilityIssues.length} accessibility issue${accessibilityIssues.length > 1 ? 's' : ''} that could block users. Screenshots would help validate real impact.`,\n suggestedAction: 'Capture screenshots for visual analysis',\n actionCommand: 'trie_visual_qa_browser url:\"http://localhost:3000\"',\n priority: 7,\n category: 'quality',\n relatedIssues: accessibilityIssues.map(i => i.id),\n details: {\n affectedFiles: affectedFiles.map(f => basename(f)),\n issueBreakdown: breakdown,\n examples,\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('accessibility-visual-qa');\n }\n \n // Security concerns get immediate attention\n const securityIssues = issues.filter(i => \n i.category === 'security' || \n i.issue.toLowerCase().includes('secret') ||\n i.issue.toLowerCase().includes('vulnerability') ||\n i.issue.toLowerCase().includes('injection') ||\n i.issue.toLowerCase().includes('xss')\n );\n \n if (securityIssues.length > 0 && this.canCreateInsight('security-warning')) {\n const critical = securityIssues.filter(i => i.severity === 'critical');\n const serious = securityIssues.filter(i => i.severity === 'serious');\n if (critical.length > 0 || serious.length >= 2) {\n // Build severity breakdown\n const breakdown: Record<string, number> = {};\n if (critical.length > 0) breakdown['critical'] = critical.length;\n if (serious.length > 0) breakdown['serious'] = serious.length;\n \n // Get unique affected files\n const affectedFiles = [...new Set(securityIssues.map(i => i.file))];\n \n // Get example issues (most severe first)\n const examples = [...critical, ...serious]\n .slice(0, 3)\n .map(i => `${basename(i.file)}:${i.line} - ${i.issue.slice(0, 60)}`);\n \n const insight = this.createInsight({\n type: 'warning',\n message: `Found ${securityIssues.length} security issue${securityIssues.length > 1 ? 's' : ''} that could expose your app.`,\n suggestedAction: `Review ${affectedFiles.length} file${affectedFiles.length > 1 ? 's' : ''} immediately`,\n actionCommand: 'trie scan --skill security',\n priority: 10,\n category: 'security',\n relatedIssues: securityIssues.map(i => i.id),\n details: {\n affectedFiles: affectedFiles.map(f => basename(f)),\n issueBreakdown: breakdown,\n examples,\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('security-warning');\n }\n }\n \n // New issues from recent changes\n if (newIssues.length >= 3 && context.filesChanged && context.filesChanged.length > 0 && this.canCreateInsight('new-issues')) {\n const affectedFiles = [...new Set(newIssues.map(i => basename(i.file)))];\n const filesChanged = context.filesChanged.map(f => basename(f));\n \n // Breakdown by severity\n const breakdown: Record<string, number> = {};\n const critical = newIssues.filter(i => i.severity === 'critical');\n const serious = newIssues.filter(i => i.severity === 'serious');\n const moderate = newIssues.filter(i => i.severity === 'moderate');\n if (critical.length > 0) breakdown['critical'] = critical.length;\n if (serious.length > 0) breakdown['serious'] = serious.length;\n if (moderate.length > 0) breakdown['moderate'] = moderate.length;\n \n // Get example issues\n const examples = newIssues\n .sort((a, b) => {\n const sev: Record<string, number> = { critical: 3, serious: 2, moderate: 1, minor: 0, low: 0 };\n return (sev[b.severity] || 0) - (sev[a.severity] || 0);\n })\n .slice(0, 3)\n .map(i => `${basename(i.file)}:${i.line} - ${i.issue.slice(0, 50)}`);\n \n const insight = this.createInsight({\n type: 'observation',\n message: `Recent changes introduced ${newIssues.length} new issues in ${affectedFiles.slice(0, 3).join(', ')}.`,\n suggestedAction: `Review ${affectedFiles.length} affected file${affectedFiles.length > 1 ? 's' : ''}`,\n priority: 6,\n category: 'quality',\n details: {\n affectedFiles: affectedFiles.slice(0, 8),\n issueBreakdown: breakdown,\n examples,\n comparison: `Changed: ${filesChanged.slice(0, 3).join(', ')}${filesChanged.length > 3 ? ` +${filesChanged.length - 3} more` : ''}`,\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('new-issues');\n }\n \n // Celebrate fixes\n if (fixedCount > 0 && newIssues.length === 0 && this.canCreateInsight('celebration')) {\n const insight = this.createInsight({\n type: 'celebration',\n message: `${this.pick(PERSONALITY.celebrations)} ${fixedCount} issue${fixedCount > 1 ? 's' : ''} resolved.`,\n priority: 3,\n category: 'progress',\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('celebration');\n }\n \n // === AUTONOMOUS HYPOTHESIS GENERATION ===\n // After every scan, check if Claude should generate new hypotheses\n // This enables the agent to continuously learn and form theories about code quality\n if (issues.length >= 10 && this.canCreateInsight('hypothesis-generation')) {\n try {\n const patterns: string[] = [];\n const observations: string[] = [];\n \n // Observe patterns from this scan\n if (newIssues.length > issues.length * 0.3) {\n observations.push(`High new issue rate: ${newIssues.length} new out of ${issues.length} total`);\n }\n \n const fileFreq: Record<string, number> = {};\n for (const issue of issues) {\n fileFreq[issue.file] = (fileFreq[issue.file] || 0) + 1;\n }\n const hotFiles = Object.entries(fileFreq).filter(([, count]) => count >= 3);\n if (hotFiles.length > 0) {\n patterns.push(`Hotspot files: ${hotFiles.map(([f]) => basename(f)).join(', ')}`);\n }\n \n // Try AI-powered hypothesis generation\n const generated = await this.hypothesisEngine.generateHypothesesWithAI({\n recentIssues: issues.map(i => ({ issue: i, score: 1 })),\n patterns,\n observations,\n });\n \n // Create insights for new hypotheses\n for (const hypothesis of generated) {\n const insight = this.createInsight({\n type: 'observation',\n message: `${this.pick(PERSONALITY.questions)} New hypothesis to test: \"${hypothesis.statement}\"`,\n context: `Confidence: ${Math.round(hypothesis.confidence * 100)}%`,\n suggestedAction: `Monitor this pattern over time`,\n priority: 4,\n category: 'pattern',\n details: {\n hypothesis: hypothesis.statement,\n testCriteria: hypothesis.testCriteria || 'Collecting evidence...',\n confidence: Math.round(hypothesis.confidence * 100),\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n }\n \n if (generated.length > 0) {\n await this.markInsightCreated('hypothesis-generation');\n }\n } catch (error) {\n // Hypothesis generation is best-effort, don't break the scan\n }\n }\n \n // === AUTONOMOUS PATTERN DISCOVERY ===\n // Discover patterns from accumulated issues automatically\n // This makes patterns appear naturally from your workflow\n if (issues.length >= 5 && this.canCreateInsight('pattern-discovery')) {\n try {\n const { IncidentIndex } = await import('../context/incident-index.js');\n const { TriePatternDiscovery } = await import('../agent/pattern-discovery.js');\n const { ContextGraph } = await import('../context/graph.js');\n \n const graph = new ContextGraph(this.projectPath);\n const incidentIndex = await IncidentIndex.build(graph, this.projectPath);\n const discovery = new TriePatternDiscovery(graph, incidentIndex);\n \n // Discover hot patterns with lower threshold for faster discovery\n const hotPatterns = discovery.discoverHotPatterns(2);\n let patternsAdded = 0;\n \n for (const hot of hotPatterns.slice(0, 5)) { // Top 5 hot patterns\n const existingPatterns = await graph.listNodes();\n const alreadyExists = existingPatterns.some(\n n => n.type === 'pattern' && (n.data as any).description?.includes(hot.path)\n );\n \n if (!alreadyExists) {\n await graph.addNode('pattern', {\n description: `${hot.type === 'directory' ? 'Directory' : 'File'} hot zone: ${hot.path}`,\n appliesTo: [hot.path],\n confidence: Math.min(0.95, hot.confidence),\n occurrences: hot.incidentCount,\n firstSeen: new Date().toISOString(),\n lastSeen: new Date().toISOString(),\n isAntiPattern: hot.incidentCount >= 3,\n source: 'local'\n });\n patternsAdded++;\n }\n }\n \n // Create insight if patterns were discovered\n if (patternsAdded > 0) {\n const insight = this.createInsight({\n type: 'observation',\n message: `${this.pick(PERSONALITY.greetings)} Discovered ${patternsAdded} pattern${patternsAdded > 1 ? 's' : ''} in your codebase.`,\n suggestedAction: `Check Memory → Learned Patterns to see`,\n priority: 5,\n category: 'pattern',\n details: {\n patternsCount: patternsAdded,\n topPattern: hotPatterns[0]?.path,\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('pattern-discovery');\n }\n } catch (error) {\n // Pattern discovery is best-effort\n }\n }\n \n // Check for recurring patterns across projects (from global memory)\n if (this.canCreateInsight('pattern-suggestion')) {\n try {\n const globalPatterns = await findCrossProjectPatterns();\n const crossProjectPattern = globalPatterns.find(p => p.projects.length > 1 && p.occurrences > 3);\n if (crossProjectPattern) {\n const insight = this.createInsight({\n type: 'suggestion',\n message: `\"${crossProjectPattern.description}\" appears in ${crossProjectPattern.projects.length} projects. Consider a shared lint rule.`,\n priority: 4,\n category: 'pattern',\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('pattern-suggestion');\n }\n } catch {\n // Global memory might not be available\n }\n }\n \n // Pre-push warning (with cooldown)\n if (context.isWatchMode && this.shouldWarnBeforePush(issues) && this.canCreateInsight('pre-push-warning')) {\n const criticalIssues = issues.filter(i => i.severity === 'critical');\n const seriousIssues = issues.filter(i => i.severity === 'serious');\n const moderateIssues = issues.filter(i => i.severity === 'moderate');\n \n // Build severity breakdown\n const breakdown: Record<string, number> = {};\n if (criticalIssues.length > 0) breakdown['critical'] = criticalIssues.length;\n if (seriousIssues.length > 0) breakdown['serious'] = seriousIssues.length;\n if (moderateIssues.length > 0) breakdown['moderate'] = moderateIssues.length;\n \n // Get affected files by severity\n const criticalFiles = [...new Set(criticalIssues.map(i => basename(i.file)))];\n const seriousFiles = [...new Set(seriousIssues.map(i => basename(i.file)))];\n const affectedFiles = [...new Set([...criticalFiles, ...seriousFiles])].slice(0, 5);\n \n // Get example issues (highest severity first)\n const examples = [...criticalIssues, ...seriousIssues]\n .slice(0, 4)\n .map(i => `${basename(i.file)}:${i.line} - ${i.issue.slice(0, 50)}`);\n \n // Determine trend if we have history\n const totalBlocking = criticalIssues.length + seriousIssues.length;\n const trend = this.lastIssueHashes.size > 0 \n ? (totalBlocking > this.lastIssueHashes.size ? 'worsening' : 'improving')\n : undefined;\n \n // Build details object, only including defined values\n const insightDetails: NonNullable<Insight['details']> = {\n affectedFiles,\n issueBreakdown: breakdown,\n examples,\n };\n if (trend) insightDetails.trend = trend;\n if (moderateIssues.length > 0) insightDetails.comparison = `+${moderateIssues.length} moderate (non-blocking)`;\n \n const insight = this.createInsight({\n type: 'warning',\n message: `${totalBlocking} issue${totalBlocking > 1 ? 's' : ''} need attention before pushing.`,\n suggestedAction: 'Run pre-push check',\n actionCommand: 'trie check',\n priority: 8,\n category: 'quality',\n details: insightDetails,\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('pre-push-warning');\n }\n \n // 4. Optionally enhance with LLM for deeper insights\n if (isAIAvailable() && issues.length > 0 && newIssues.length > 0) {\n const aiInsights = await this.generateAIInsights(issues, newIssues);\n newInsights.push(...aiInsights);\n }\n \n // ==========================================================================\n // 5. AGENCY: Goals, Hypotheses, Risk Prediction\n // ==========================================================================\n \n // Phase 2: Autonomous Goals - Analyze patterns and track progress\n if (this.canCreateInsight('goal-progress')) {\n try {\n const patterns = await this.goalManager.analyzeIncidentPatterns();\n \n // Generate goals from significant patterns (high confidence, enough occurrences)\n const significantPatterns = patterns.filter(p => p.confidence >= 0.6 && p.currentValue >= 3);\n if (significantPatterns.length > 0) {\n // Auto-generate goals which creates insights internally\n await this.goalManager.autoGenerateGoals();\n }\n \n // Update goal progress and check achievements\n await this.goalManager.updateGoalProgress();\n \n // Check goal progress and create insights for major milestones\n const goals = this.projectState.getAllGoals();\n for (const goal of goals.filter(g => g.status === 'active')) {\n // Calculate percent complete\n const startVal = goal.startValue ?? goal.currentValue;\n if (startVal > 0 && goal.currentValue <= startVal) {\n const percentComplete = Math.round((1 - goal.currentValue / startVal) * 100);\n if (percentComplete >= 50 && this.canCreateInsight(`goal-${goal.id}`)) {\n const insight = this.createInsight({\n type: 'celebration',\n message: `Goal \"${goal.description}\" is ${percentComplete}% complete! ${goal.currentValue} issues remaining (started at ${startVal}).`,\n priority: 4,\n category: 'progress',\n details: {\n affectedFiles: goal.category ? [goal.category] : [],\n comparison: `${startVal} → ${goal.currentValue}`,\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated(`goal-${goal.id}`);\n }\n }\n }\n \n await this.markInsightCreated('goal-progress');\n } catch {\n // Goal analysis is optional\n }\n }\n \n // Phase 3: Risk Prediction - Warn about high-risk files\n if (context.filesChanged && context.filesChanged.length > 0 && this.canCreateInsight('risk-prediction')) {\n try {\n const riskSummary = await this.riskPredictor.predictRiskTrend(context.filesChanged);\n \n if (riskSummary.overallRisk >= 50) {\n const highRiskFactors = riskSummary.factors.filter(f => f.reasons.length > 0);\n \n if (highRiskFactors.length > 0) {\n const topFile = highRiskFactors[0];\n const insight = this.createInsight({\n type: 'warning',\n message: `Risk score ${Math.round(riskSummary.overallRisk)}/100 for changed files (${riskSummary.trend}). ${topFile ? basename(topFile.file) + ' is high-risk.' : ''}`,\n suggestedAction: 'Consider extra review before pushing',\n priority: 7,\n category: 'quality',\n details: {\n affectedFiles: highRiskFactors.slice(0, 5).map(f => basename(f.file)),\n trend: riskSummary.trend === 'increasing' ? 'worsening' : riskSummary.trend === 'decreasing' ? 'improving' : 'stable',\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated('risk-prediction');\n }\n }\n } catch {\n // Risk prediction is optional\n }\n }\n\n // Phase 3b: Gotcha Prediction - Store potential risks in ledger (runs independently of risk-prediction)\n if (context.filesChanged && context.filesChanged.length > 0) {\n try {\n const gotchas = await this.gotchaPredictor.predictGotchas(context.filesChanged);\n const storage = getStorage(this.projectPath);\n for (const gotcha of gotchas) {\n if (this.canCreateInsight(`gotcha-${gotcha.id}`)) {\n const explanation = await this.gotchaPredictor.synthesizeGotchaExplanation(gotcha);\n const insight = this.createInsight({\n type: 'warning',\n message: `[Gotcha] ${gotcha.message}`,\n context: explanation,\n suggestedAction: gotcha.recommendation,\n priority: gotcha.riskLevel === 'critical' ? 9 : 7,\n category: 'quality',\n details: {\n affectedFiles: context.filesChanged.map(f => basename(f)),\n examples: [gotcha.message, explanation],\n }\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated(`gotcha-${gotcha.id}`);\n }\n // Store gotcha in ledger for Ledger view (always store, regardless of insight cooldown)\n const primaryFile = context.filesChanged?.[0];\n const ledgerGotcha: Gotcha = {\n id: gotcha.id,\n message: gotcha.message,\n confidence: gotcha.confidence,\n riskLevel: gotcha.riskLevel,\n recommendation: gotcha.recommendation,\n ...(primaryFile && { file: primaryFile }),\n timestamp: new Date().toISOString(),\n ...(gotcha.precedentId && { precedentId: gotcha.precedentId }),\n tags: gotcha.evidence.matchingPatterns,\n evidence: gotcha.evidence,\n resolved: false,\n };\n await storage.storeGotcha(ledgerGotcha);\n }\n } catch {\n // Gotcha prediction is optional\n }\n }\n \n // Phase 3: Hypothesis Validation - Check and update hypotheses\n if (this.canCreateInsight('hypothesis-update')) {\n try {\n // Auto-generate hypotheses if we don't have many\n const hypotheses = this.projectState.getAllHypotheses();\n const testingHypotheses = hypotheses.filter(h => h.status === 'testing');\n \n if (testingHypotheses.length < 3) {\n await this.hypothesisEngine.autoGenerateHypotheses();\n }\n \n // Check for newly validated/invalidated hypotheses and create insights\n const validatedHypotheses = hypotheses.filter(h => \n h.status === 'validated' && \n h.validatedAt && \n Date.now() - new Date(h.validatedAt).getTime() < 24 * 60 * 60 * 1000 // Within last 24h\n );\n \n for (const hypothesis of validatedHypotheses.slice(0, 2)) {\n if (this.canCreateInsight(`hypothesis-${hypothesis.id}`)) {\n const insight = this.createInsight({\n type: 'celebration',\n message: `Hypothesis validated: \"${hypothesis.statement}\" (${Math.round(hypothesis.confidence * 100)}% confidence)`,\n priority: 5,\n category: 'pattern',\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n await this.markInsightCreated(`hypothesis-${hypothesis.id}`);\n }\n }\n \n await this.markInsightCreated('hypothesis-update');\n } catch {\n // Hypothesis validation is optional\n }\n }\n \n // Phase 4: Auto-Escalation - Escalate critical security issues\n const criticalSecurityIssues = issues.filter(i => \n i.severity === 'critical' && \n (i.category === 'security' || i.issue.toLowerCase().includes('secret'))\n );\n \n if (criticalSecurityIssues.length > 0) {\n try {\n const result = await this.escalationManager.escalateIssues(criticalSecurityIssues);\n if (result.action === 'auto_escalated' && result.message) {\n const insight = this.createInsight({\n type: 'observation',\n message: `Auto-escalated ${criticalSecurityIssues.length} critical security issue(s). Check your notifications.`,\n priority: 9,\n category: 'security',\n details: {\n affectedFiles: criticalSecurityIssues.slice(0, 5).map(i => basename(i.file)),\n examples: criticalSecurityIssues.slice(0, 3).map(i => i.issue.slice(0, 60)),\n },\n });\n newInsights.push(insight);\n await this.addInsight(insight);\n }\n } catch {\n // Escalation is best-effort\n }\n }\n \n // Phase 4: Meta-Learning - Note: actual feedback recording happens when user interacts\n // Here we just track that insights were shown (for latency tracking)\n // The user feedback is recorded via markInsightHelpful/dismissInsight/markInsightActedOn\n \n // Update state\n this.lastIssueHashes = currentHashes;\n \n // Record scan timestamp\n await this.projectState.recordScan();\n \n // Adapt scan frequency based on risk (Phase 2)\n try {\n const riskLevel = issues.filter(i => i.severity === 'critical').length > 0 ? 'critical' :\n issues.filter(i => i.severity === 'serious').length >= 3 ? 'high' :\n issues.length > 10 ? 'medium' : 'low';\n \n // Calculate and store adaptive scan frequency\n const { calculateAdaptiveScanFrequency } = await import('./goal-manager.js');\n const result = await calculateAdaptiveScanFrequency(riskLevel);\n await this.projectState.setScanFrequency(result.frequencyMs);\n } catch {\n // Scan frequency adaptation is optional\n }\n \n return newInsights;\n }\n \n /**\n * Use LLM to generate deeper insights (optional, requires ANTHROPIC_API_KEY)\n */\n private async generateAIInsights(_allIssues: Issue[], newIssues: Issue[]): Promise<Insight[]> {\n const insights: Insight[] = [];\n \n try {\n // Only analyze if we have significant new issues\n if (newIssues.length < 2) return insights;\n \n const issuesSummary = newIssues.slice(0, 10).map(i => ({\n severity: i.severity,\n issue: i.issue.slice(0, 100),\n file: basename(i.file),\n agent: i.agent\n }));\n \n const result = await runAIAnalysis({\n systemPrompt: `You are a helpful code reviewer. Analyze these issues and provide ONE brief, conversational insight.\nBe specific and actionable. Speak like a helpful colleague, not a system.\nKeep your response under 100 words. Focus on the most important pattern or concern.`,\n userPrompt: `New issues found:\\n${JSON.stringify(issuesSummary, null, 2)}\n\nWhat's the most important thing the developer should know? Provide a brief, conversational insight.`,\n maxTokens: 200,\n temperature: 0.7\n });\n \n if (result.success && result.content) {\n const insight = this.createInsight({\n type: 'observation',\n message: result.content.trim(),\n priority: 5,\n category: 'general',\n });\n insights.push(insight);\n await this.addInsight(insight);\n }\n } catch {\n // AI analysis is optional, don't fail\n }\n \n return insights;\n }\n \n /**\n * Get active insights (not dismissed, still relevant)\n */\n getActiveInsights(): Insight[] {\n return this.insightStore.getActiveInsights();\n }\n \n /**\n * Dismiss an insight\n */\n async dismissInsight(insightId: string): Promise<boolean> {\n const result = await this.insightStore.dismissInsight(insightId);\n \n // Record feedback for meta-learning (Phase 4)\n if (result) {\n await this.projectState.recordInsightFeedback('dismissed');\n }\n \n return result;\n }\n \n /**\n * Record that a user found an insight helpful\n */\n async markInsightHelpful(_insightId: string): Promise<void> {\n await this.projectState.recordInsightFeedback('helpful');\n }\n \n /**\n * Record that a user acted on an insight\n */\n async markInsightActedOn(_insightId: string): Promise<void> {\n await this.projectState.recordInsightFeedback('acted');\n }\n \n /**\n * Get insight statistics\n */\n getInsightStats() {\n return this.insightStore.getStats();\n }\n \n /**\n * Get agent metrics (for dashboard display)\n */\n getAgentMetrics() {\n return this.projectState.getMetrics();\n }\n \n /**\n * Check if in quiet hours\n */\n isQuietHours(): boolean {\n return this.projectState.isQuietHours();\n }\n \n /**\n * Check if in crunch mode\n */\n isInCrunchMode(): boolean {\n return this.projectState.isInCrunchMode();\n }\n \n /**\n * Get the insight store (for advanced operations)\n */\n getInsightStore() {\n return this.insightStore;\n }\n \n /**\n * Get the project state (for advanced operations)\n */\n getProjectState() {\n return this.projectState;\n }\n \n /**\n * Get agency modules (for watch mode integration)\n */\n getGoalManager() {\n return this.goalManager;\n }\n \n getRiskPredictor() {\n return this.riskPredictor;\n }\n \n getHypothesisEngine() {\n return this.hypothesisEngine;\n }\n \n getEscalationManager() {\n return this.escalationManager;\n }\n \n getMetaLearner() {\n return this.metaLearner;\n }\n \n /**\n * Get a rich agency status for display in watch mode\n */\n async getAgencyStatus(): Promise<{\n goals: { active: number; completed: number; topGoal?: string };\n hypotheses: { testing: number; validated: number; topHypothesis?: string };\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n scanFrequency: number;\n effectiveness: number;\n isQuietHours: boolean;\n }> {\n const goals = this.projectState.getAllGoals();\n const activeGoals = goals.filter((g: { status: string }) => g.status === 'active');\n const completedGoals = goals.filter((g: { status: string }) => g.status === 'achieved');\n \n const hypotheses = this.projectState.getAllHypotheses();\n const testingHypotheses = hypotheses.filter((h: { status: string }) => h.status === 'testing');\n const validatedHypotheses = hypotheses.filter((h: { status: string }) => h.status === 'validated');\n \n const metrics = this.projectState.getMetrics();\n const budget = this.projectState.getRiskBudget();\n \n // Calculate daily actions remaining\n const dailyActionsRemaining = budget.daily - budget.usedToday;\n \n // Calculate overall risk level\n let riskLevel: 'low' | 'medium' | 'high' | 'critical' = 'low';\n if (dailyActionsRemaining <= 1) riskLevel = 'critical';\n else if (dailyActionsRemaining <= 3) riskLevel = 'high';\n else if (dailyActionsRemaining <= 5) riskLevel = 'medium';\n \n // Calculate effectiveness using correct property names\n const totalFeedback = metrics.helpfulInsights + metrics.dismissedInsights + metrics.actedOnInsights;\n const effectiveness = totalFeedback > 0 \n ? Math.round(((metrics.helpfulInsights + metrics.actedOnInsights) / totalFeedback) * 100)\n : 100; // Default to 100% if no feedback yet\n \n // Build result with conditional optional properties\n const topGoal = activeGoals[0]?.description;\n const topHypothesis = testingHypotheses[0]?.statement?.slice(0, 50);\n \n const result: {\n goals: { active: number; completed: number; topGoal?: string };\n hypotheses: { testing: number; validated: number; topHypothesis?: string };\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n scanFrequency: number;\n effectiveness: number;\n isQuietHours: boolean;\n } = {\n goals: {\n active: activeGoals.length,\n completed: completedGoals.length,\n },\n hypotheses: {\n testing: testingHypotheses.length,\n validated: validatedHypotheses.length,\n },\n riskLevel,\n scanFrequency: this.projectState.getScanFrequencyMs(),\n effectiveness,\n isQuietHours: this.projectState.isQuietHours(),\n };\n \n if (topGoal) result.goals.topGoal = topGoal;\n if (topHypothesis) result.hypotheses.topHypothesis = topHypothesis;\n \n return result;\n }\n \n /**\n * Get a summary for the current state\n */\n getSummary(issues: Issue[]): string {\n const critical = issues.filter(i => i.severity === 'critical').length;\n const serious = issues.filter(i => i.severity === 'serious').length;\n const total = issues.length;\n \n if (total === 0) {\n return \"All clear. Your code looks good.\";\n }\n \n if (critical > 0) {\n return `${critical} critical issue${critical > 1 ? 's' : ''} need${critical === 1 ? 's' : ''} immediate attention.`;\n }\n \n if (serious > 0) {\n return `${serious} serious issue${serious > 1 ? 's' : ''} worth reviewing before shipping.`;\n }\n \n return `${total} minor thing${total > 1 ? 's' : ''} to polish when you have time.`;\n }\n \n // === Private helpers ===\n \n private shouldWarnBeforePush(issues: Issue[]): boolean {\n const critical = issues.filter(i => i.severity === 'critical').length;\n const serious = issues.filter(i => i.severity === 'serious').length;\n return critical > 0 || serious >= 3;\n }\n \n /**\n * Check if we should create an insight of this type (cooldown not expired)\n */\n private canCreateInsight(insightKey: string): boolean {\n return this.insightStore.canCreateInsight(insightKey);\n }\n \n /**\n * Mark that we created an insight of this type\n */\n private async markInsightCreated(insightKey: string): Promise<void> {\n await this.insightStore.markInsightCreated(insightKey);\n }\n \n private createInsight(params: Omit<Insight, 'id' | 'timestamp' | 'dismissed' | 'relatedIssues'> & { relatedIssues?: string[] }): Insight {\n return {\n id: `insight-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: Date.now(),\n dismissed: false,\n relatedIssues: params.relatedIssues || [],\n ...params,\n };\n }\n \n private pick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)] as T;\n }\n}\n\n// Singleton instance per project\nconst agentInstances: Map<string, TrieAgent> = new Map();\n\nexport function getTrieAgent(projectPath: string): TrieAgent {\n let agent = agentInstances.get(projectPath);\n if (!agent) {\n agent = new TrieAgent(projectPath);\n agentInstances.set(projectPath, agent);\n }\n return agent;\n}\n\n","/**\n * Risk Predictor - Predictive risk scoring with trend analysis\n * \n * Features:\n * - Multi-factor risk scoring\n * - Trend analysis (increasing/stable/decreasing)\n * - File-level risk predictions\n * - Historical incident correlation\n * - Proactive risk warnings\n */\n\nimport type { Insight } from './insight-store.js';\nimport { getInsightStore } from './insight-store.js';\nimport { searchIssues, type StoredIssue } from '../memory/issue-store.js';\nimport { basename, dirname } from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Risk factor contributing to overall risk\n */\nexport interface RiskFactor {\n name: string;\n weight: number; // 0-1, contribution to risk\n value: number; // Current measured value\n description: string;\n trend?: 'increasing' | 'stable' | 'decreasing';\n}\n\n/**\n * Risk prediction for a file or directory\n */\nexport interface RiskPrediction {\n target: string; // File or directory path\n currentRisk: number; // 0-100\n predictedRisk: number; // 0-100 (future prediction)\n trend: 'increasing' | 'stable' | 'decreasing';\n factors: RiskFactor[];\n confidence: number; // 0-1\n recommendations: string[];\n lastIncidentDaysAgo?: number;\n incidentCount: number;\n}\n\n/**\n * Overall project risk summary\n */\nexport interface ProjectRiskSummary {\n overallRisk: number; // 0-100\n trend: 'increasing' | 'stable' | 'decreasing';\n hotspots: RiskPrediction[];\n lowRiskAreas: string[];\n predictions: RiskPrediction[];\n confidence: number;\n}\n\n/**\n * Risk prediction configuration\n */\nexport interface RiskPredictionConfig {\n historyDays: number; // Days of history to consider\n incidentThreshold: number; // Min incidents to flag as hotspot\n riskWeights: {\n incidentCount: number;\n recency: number;\n severity: number;\n complexity: number;\n churn: number;\n };\n}\n\nconst DEFAULT_CONFIG: RiskPredictionConfig = {\n historyDays: 30,\n incidentThreshold: 3,\n riskWeights: {\n incidentCount: 0.35,\n recency: 0.25,\n severity: 0.20,\n complexity: 0.10,\n churn: 0.10,\n },\n};\n\n// ============================================================================\n// RiskPredictor Class\n// ============================================================================\n\n/**\n * Predictive risk analysis engine\n */\nexport class RiskPredictor {\n private projectPath: string;\n private config: RiskPredictionConfig;\n private insightStore;\n \n constructor(projectPath: string, config: Partial<RiskPredictionConfig> = {}) {\n this.projectPath = projectPath;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.insightStore = getInsightStore(projectPath);\n }\n \n /**\n * Calculate risk for a specific file or directory\n */\n async calculateRisk(target: string): Promise<RiskPrediction> {\n const factors: RiskFactor[] = [];\n let totalRisk = 0;\n \n try {\n // Get historical issues for this target\n const issues = await searchIssues(target, {\n workDir: this.projectPath,\n limit: 500,\n includeResolved: true,\n });\n \n const targetIssues = issues.filter(r => \n r.issue.file === target || \n r.issue.file.startsWith(target + '/') ||\n dirname(r.issue.file) === target\n );\n \n // 1. Incident count factor\n const incidentCount = targetIssues.length;\n const incidentWeight = this.config.riskWeights.incidentCount;\n const incidentScore = Math.min(100, incidentCount * 10);\n factors.push({\n name: 'Incident Count',\n weight: incidentWeight,\n value: incidentCount,\n description: `${incidentCount} historical incidents`,\n trend: this.calculateTrend(targetIssues.map(i => i.issue)),\n });\n totalRisk += incidentScore * incidentWeight;\n \n // 2. Recency factor (when was the last incident?)\n let recencyScore = 0;\n let lastIncidentDaysAgo: number | undefined;\n if (targetIssues.length > 0) {\n const latestIssue = targetIssues\n .sort((a, b) => new Date(b.issue.timestamp).getTime() - new Date(a.issue.timestamp).getTime())[0];\n \n if (latestIssue) {\n const daysSince = (Date.now() - new Date(latestIssue.issue.timestamp).getTime()) / (1000 * 60 * 60 * 24);\n lastIncidentDaysAgo = Math.floor(daysSince);\n \n // More recent = higher risk\n if (daysSince < 1) recencyScore = 100;\n else if (daysSince < 7) recencyScore = 80;\n else if (daysSince < 14) recencyScore = 60;\n else if (daysSince < 30) recencyScore = 40;\n else recencyScore = 20;\n }\n }\n \n factors.push({\n name: 'Recency',\n weight: this.config.riskWeights.recency,\n value: lastIncidentDaysAgo ?? 999,\n description: lastIncidentDaysAgo !== undefined \n ? `Last incident ${lastIncidentDaysAgo} days ago`\n : 'No recent incidents',\n });\n totalRisk += recencyScore * this.config.riskWeights.recency;\n \n // 3. Severity factor\n const criticalCount = targetIssues.filter(r => r.issue.severity === 'critical').length;\n const seriousCount = targetIssues.filter(r => r.issue.severity === 'serious').length;\n const severityScore = Math.min(100, (criticalCount * 25) + (seriousCount * 10));\n \n factors.push({\n name: 'Severity',\n weight: this.config.riskWeights.severity,\n value: severityScore,\n description: `${criticalCount} critical, ${seriousCount} serious`,\n });\n totalRisk += severityScore * this.config.riskWeights.severity;\n \n // 4. Complexity factor (approximated by issue diversity)\n const uniqueAgents = new Set(targetIssues.map(r => r.issue.agent)).size;\n const complexityScore = Math.min(100, uniqueAgents * 20);\n \n factors.push({\n name: 'Complexity',\n weight: this.config.riskWeights.complexity,\n value: uniqueAgents,\n description: `Issues from ${uniqueAgents} different analysis types`,\n });\n totalRisk += complexityScore * this.config.riskWeights.complexity;\n \n // 5. Churn factor (how often this file has issues)\n // Approximate by counting unique dates with issues\n const uniqueDates = new Set(\n targetIssues.map(r => r.issue.timestamp.split('T')[0])\n ).size;\n const churnScore = Math.min(100, uniqueDates * 10);\n \n factors.push({\n name: 'Churn',\n weight: this.config.riskWeights.churn,\n value: uniqueDates,\n description: `Issues found on ${uniqueDates} different days`,\n });\n totalRisk += churnScore * this.config.riskWeights.churn;\n \n // Calculate trend\n const trend = this.calculateTrend(targetIssues.map(i => i.issue));\n \n // Predict future risk based on trend\n let predictedRisk = totalRisk;\n if (trend === 'increasing') {\n predictedRisk = Math.min(100, totalRisk * 1.2);\n } else if (trend === 'decreasing') {\n predictedRisk = Math.max(0, totalRisk * 0.8);\n }\n \n // Generate recommendations\n const recommendations = this.generateRecommendations(factors, totalRisk);\n \n // Calculate confidence based on data quality\n const confidence = Math.min(0.95, 0.3 + (incidentCount * 0.05));\n \n const prediction: RiskPrediction = {\n target,\n currentRisk: Math.round(totalRisk),\n predictedRisk: Math.round(predictedRisk),\n trend,\n factors,\n confidence,\n recommendations,\n incidentCount,\n };\n \n if (lastIncidentDaysAgo !== undefined) {\n prediction.lastIncidentDaysAgo = lastIncidentDaysAgo;\n }\n \n return prediction;\n \n } catch (error) {\n console.error(`Failed to calculate risk for ${target}:`, error);\n return {\n target,\n currentRisk: 50,\n predictedRisk: 50,\n trend: 'stable',\n factors: [],\n confidence: 0.1,\n recommendations: ['Unable to analyze - insufficient data'],\n incidentCount: 0,\n };\n }\n }\n \n /**\n * Calculate trend from issues\n */\n private calculateTrend(issues: StoredIssue[]): 'increasing' | 'stable' | 'decreasing' {\n if (issues.length < 3) return 'stable';\n \n const now = Date.now();\n const recentCutoff = now - (7 * 24 * 60 * 60 * 1000); // 7 days\n const olderCutoff = now - (30 * 24 * 60 * 60 * 1000); // 30 days\n \n const recentIssues = issues.filter(i => new Date(i.timestamp).getTime() > recentCutoff).length;\n const olderIssues = issues.filter(i => {\n const time = new Date(i.timestamp).getTime();\n return time > olderCutoff && time <= recentCutoff;\n }).length;\n \n // Normalize by time period\n const recentRate = recentIssues / 7;\n const olderRate = olderIssues / 23;\n \n if (recentRate > olderRate * 1.5) return 'increasing';\n if (recentRate < olderRate * 0.5) return 'decreasing';\n return 'stable';\n }\n \n /**\n * Generate recommendations based on risk factors\n */\n private generateRecommendations(factors: RiskFactor[], totalRisk: number): string[] {\n const recommendations: string[] = [];\n \n if (totalRisk >= 70) {\n recommendations.push('Consider extra code review before merging changes');\n }\n \n const incidentFactor = factors.find(f => f.name === 'Incident Count');\n if (incidentFactor && incidentFactor.value >= 5) {\n recommendations.push('This area has recurring issues - consider refactoring');\n }\n \n const recencyFactor = factors.find(f => f.name === 'Recency');\n if (recencyFactor && recencyFactor.value < 7) {\n recommendations.push('Recent incident activity - monitor closely');\n }\n \n const severityFactor = factors.find(f => f.name === 'Severity');\n if (severityFactor && severityFactor.value >= 25) {\n recommendations.push('High severity issues present - prioritize fixes');\n }\n \n const complexityFactor = factors.find(f => f.name === 'Complexity');\n if (complexityFactor && complexityFactor.value >= 4) {\n recommendations.push('Multiple issue types - consider comprehensive review');\n }\n \n if (recommendations.length === 0) {\n recommendations.push('No specific concerns - maintain normal review process');\n }\n \n return recommendations;\n }\n \n /**\n * Predict risk trend for files that have recently changed\n */\n async predictRiskTrend(changedFiles: string[]): Promise<{\n trend: 'increasing' | 'stable' | 'decreasing';\n factors: Array<{ file: string; reasons: string[] }>;\n overallRisk: number;\n }> {\n const predictions = await Promise.all(\n changedFiles.map(f => this.calculateRisk(f))\n );\n \n const highRiskFiles = predictions.filter(p => p.currentRisk >= 50);\n const totalRisk = predictions.reduce((sum, p) => sum + p.currentRisk, 0) / Math.max(1, predictions.length);\n \n // Determine overall trend\n const trends = predictions.map(p => p.trend);\n const increasingCount = trends.filter(t => t === 'increasing').length;\n const decreasingCount = trends.filter(t => t === 'decreasing').length;\n \n let overallTrend: 'increasing' | 'stable' | 'decreasing' = 'stable';\n if (increasingCount > decreasingCount + 1) {\n overallTrend = 'increasing';\n } else if (decreasingCount > increasingCount + 1) {\n overallTrend = 'decreasing';\n }\n \n // Collect factors for high-risk files\n const factors = highRiskFiles.map(p => ({\n file: p.target,\n reasons: p.incidentCount > 0 \n ? ['past incidents', ...p.recommendations.slice(0, 2)]\n : ['no historical data'],\n }));\n \n return {\n trend: overallTrend,\n factors,\n overallRisk: Math.round(totalRisk),\n };\n }\n \n /**\n * Get project-wide risk summary\n */\n async getProjectRiskSummary(): Promise<ProjectRiskSummary> {\n try {\n const issues = await searchIssues('', {\n workDir: this.projectPath,\n limit: 1000,\n includeResolved: true,\n });\n \n // Group by directory\n const dirIssueCount = new Map<string, StoredIssue[]>();\n for (const { issue } of issues) {\n const dir = dirname(issue.file);\n const existing = dirIssueCount.get(dir) || [];\n existing.push(issue);\n dirIssueCount.set(dir, existing);\n }\n \n // Find hotspots (directories with many issues)\n const hotspotDirs = [...dirIssueCount.entries()]\n .filter(([_, issues]) => issues.length >= this.config.incidentThreshold)\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 5);\n \n // Calculate risk for each hotspot\n const hotspots = await Promise.all(\n hotspotDirs.map(([dir]) => this.calculateRisk(dir))\n );\n \n // Find low-risk areas\n const allDirs = [...dirIssueCount.keys()];\n const lowRiskPredictions = await Promise.all(\n allDirs.map(dir => this.calculateRisk(dir))\n );\n const lowRiskAreas = lowRiskPredictions\n .filter(p => p.currentRisk < 20 && p.incidentCount === 0)\n .map(p => p.target)\n .slice(0, 5);\n \n // Calculate overall risk\n const overallRisk = hotspots.length > 0\n ? hotspots.reduce((sum, p) => sum + p.currentRisk, 0) / hotspots.length\n : 0;\n \n // Determine trend\n const trends = hotspots.map(p => p.trend);\n const increasingCount = trends.filter(t => t === 'increasing').length;\n const decreasingCount = trends.filter(t => t === 'decreasing').length;\n \n let trend: 'increasing' | 'stable' | 'decreasing' = 'stable';\n if (increasingCount > decreasingCount) {\n trend = 'increasing';\n } else if (decreasingCount > increasingCount) {\n trend = 'decreasing';\n }\n \n // Calculate confidence\n const confidence = Math.min(0.9, 0.4 + (issues.length * 0.001));\n \n return {\n overallRisk: Math.round(overallRisk),\n trend,\n hotspots,\n lowRiskAreas,\n predictions: hotspots,\n confidence,\n };\n \n } catch (error) {\n console.error('Failed to get project risk summary:', error);\n return {\n overallRisk: 0,\n trend: 'stable',\n hotspots: [],\n lowRiskAreas: [],\n predictions: [],\n confidence: 0.1,\n };\n }\n }\n \n /**\n * Create risk prediction insight\n */\n async generateRiskInsight(): Promise<Insight | null> {\n if (!this.insightStore.canCreateInsight('risk-prediction')) {\n return null;\n }\n \n const summary = await this.getProjectRiskSummary();\n \n // Only generate insight if there's meaningful risk\n if (summary.hotspots.length === 0 || summary.overallRisk < 30) {\n return null;\n }\n \n const topHotspot = summary.hotspots[0];\n if (!topHotspot) return null;\n \n // Convert trend format for insight display\n const trendMap: Record<'increasing' | 'stable' | 'decreasing', 'worsening' | 'stable' | 'improving'> = {\n 'increasing': 'worsening',\n 'stable': 'stable',\n 'decreasing': 'improving',\n };\n \n const insight: Insight = {\n id: `insight-risk-${Date.now()}`,\n type: 'warning',\n message: `[!] ${basename(topHotspot.target)}/ has elevated risk (${topHotspot.currentRisk}/100)`,\n context: `${topHotspot.incidentCount} past incidents. ${topHotspot.recommendations[0]}`,\n suggestedAction: 'Request extra review before merging changes to this area',\n relatedIssues: [],\n priority: Math.min(9, 5 + Math.floor(topHotspot.currentRisk / 20)),\n timestamp: Date.now(),\n dismissed: false,\n category: 'security',\n details: {\n affectedFiles: summary.hotspots.map(h => basename(h.target)),\n trend: trendMap[summary.trend],\n examples: topHotspot.recommendations,\n },\n };\n \n await this.insightStore.addInsight(insight);\n await this.insightStore.markInsightCreated('risk-prediction');\n \n return insight;\n }\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst riskPredictors: Map<string, RiskPredictor> = new Map();\n\n/**\n * Get the RiskPredictor for a project (singleton per project)\n */\nexport function getRiskPredictor(projectPath: string): RiskPredictor {\n let predictor = riskPredictors.get(projectPath);\n if (!predictor) {\n predictor = new RiskPredictor(projectPath);\n riskPredictors.set(projectPath, predictor);\n }\n return predictor;\n}\n\n/**\n * Clear all RiskPredictor instances (for testing)\n */\nexport function clearRiskPredictors(): void {\n riskPredictors.clear();\n}\n","/**\n * Auto-Escalation System - Autonomous issue escalation\n * \n * Features:\n * - Auto-escalate critical security issues\n * - Respect quiet hours and cooldowns\n * - Multi-channel support (Slack, email, webhook)\n * - Escalation tracking and history\n * - Fallback to draft mode during quiet hours\n */\n\nimport type { Issue } from '../types/index.js';\nimport type { Insight } from './insight-store.js';\nimport { getInsightStore } from './insight-store.js';\nimport { getProjectState } from './project-state.js';\nimport { SlackIntegration } from '../integrations/slack.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Escalation target configuration\n */\nexport interface EscalationTarget {\n type: 'slack' | 'email' | 'webhook';\n config: {\n webhookUrl?: string;\n email?: string;\n channel?: string;\n username?: string;\n };\n enabled: boolean;\n forSeverities: ('critical' | 'serious' | 'moderate')[];\n forCategories: ('security' | 'quality' | 'performance' | 'all')[];\n}\n\n/**\n * Escalation message\n */\nexport interface EscalationMessage {\n id: string;\n severity: 'critical' | 'serious' | 'moderate';\n title: string;\n body: string;\n issues: Issue[];\n timestamp: number;\n sent: boolean;\n sentAt?: number;\n channel?: string;\n error?: string;\n}\n\n/**\n * Escalation result\n */\nexport interface EscalationResult {\n action: 'auto_escalated' | 'draft_only' | 'blocked' | 'failed' | 'no_action';\n reason: string;\n message?: EscalationMessage;\n draftLocation?: string;\n}\n\n/**\n * Escalation configuration\n */\nexport interface EscalationConfig {\n enabled: boolean;\n targets: EscalationTarget[];\n cooldownMinutes: number;\n maxEscalationsPerHour: number;\n respectQuietHours: boolean;\n criticalBypassQuietHours: boolean;\n draftFallbackEnabled: boolean;\n}\n\nconst DEFAULT_CONFIG: EscalationConfig = {\n enabled: true,\n targets: [],\n cooldownMinutes: 15,\n maxEscalationsPerHour: 5,\n respectQuietHours: true,\n criticalBypassQuietHours: true,\n draftFallbackEnabled: true,\n};\n\n// ============================================================================\n// EscalationManager Class\n// ============================================================================\n\n/**\n * Manages autonomous escalation of critical issues\n */\nexport class EscalationManager {\n private projectPath: string;\n private config: EscalationConfig;\n private projectState;\n private insightStore;\n private escalationHistory: EscalationMessage[] = [];\n private slackClient?: SlackIntegration;\n \n constructor(projectPath: string, config: Partial<EscalationConfig> = {}) {\n this.projectPath = projectPath;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.projectState = getProjectState(projectPath);\n this.insightStore = getInsightStore(projectPath);\n \n // Initialize Slack client if configured\n const slackTarget = this.config.targets.find(t => t.type === 'slack' && t.enabled);\n if (slackTarget?.config.webhookUrl) {\n this.slackClient = new SlackIntegration({\n webhookUrl: slackTarget.config.webhookUrl,\n channel: slackTarget.config.channel,\n username: slackTarget.config.username,\n });\n }\n }\n \n /**\n * Check if an issue should be auto-escalated\n */\n shouldAutoEscalate(issue: Issue): boolean {\n // Must be enabled\n if (!this.config.enabled) {\n return false;\n }\n \n // Must be critical severity\n if (issue.severity !== 'critical') {\n return false;\n }\n \n // Check category (security issues get priority)\n const isSecurityIssue = \n issue.category === 'security' ||\n issue.agent === 'security' ||\n issue.issue.toLowerCase().includes('security') ||\n issue.issue.toLowerCase().includes('vulnerability') ||\n issue.issue.toLowerCase().includes('injection') ||\n issue.issue.toLowerCase().includes('xss') ||\n issue.issue.toLowerCase().includes('secret');\n \n if (!isSecurityIssue) {\n return false;\n }\n \n // Check quiet hours (unless critical bypasses)\n if (this.projectState.isQuietHours()) {\n if (!this.config.criticalBypassQuietHours) {\n return false;\n }\n }\n \n // Check cooldown\n if (!this.insightStore.canCreateInsight('auto-escalation')) {\n return false;\n }\n \n // Check hourly limit\n const recentEscalations = this.escalationHistory.filter(e => \n e.timestamp > Date.now() - (60 * 60 * 1000)\n );\n if (recentEscalations.length >= this.config.maxEscalationsPerHour) {\n return false;\n }\n \n // Check if recently escalated same file\n const recentlyEscalated = this.escalationHistory.some(e =>\n e.issues.some(i => i.file === issue.file) &&\n e.timestamp > Date.now() - (this.config.cooldownMinutes * 60 * 1000)\n );\n if (recentlyEscalated) {\n return false;\n }\n \n // Must have a valid target\n return this.hasValidEscalationTarget('critical', 'security');\n }\n \n /**\n * Check if we have a valid escalation target\n */\n private hasValidEscalationTarget(severity: string, category: string): boolean {\n return this.config.targets.some(t => \n t.enabled &&\n t.forSeverities.includes(severity as any) &&\n (t.forCategories.includes(category as any) || t.forCategories.includes('all'))\n );\n }\n \n /**\n * Auto-escalate if issue is critical\n */\n async autoEscalateIfCritical(issue: Issue): Promise<EscalationResult> {\n // Check if should escalate\n if (!this.shouldAutoEscalate(issue)) {\n // Check if we should create a draft instead\n if (issue.severity === 'critical' && this.config.draftFallbackEnabled) {\n if (this.projectState.isQuietHours()) {\n return this.createDraftEscalation([issue], 'Blocked by quiet hours');\n }\n }\n \n return {\n action: 'no_action',\n reason: 'Issue does not meet escalation criteria',\n };\n }\n \n // Create escalation message\n const message = this.createEscalationMessage([issue]);\n \n // Try to send\n try {\n await this.sendEscalation(message);\n \n // Record escalation\n this.escalationHistory.push(message);\n await this.insightStore.markInsightCreated('auto-escalation');\n \n // Create insight about escalation\n await this.createEscalationInsight(message);\n \n // Use risk budget\n await this.projectState.useRiskBudget(1);\n \n return {\n action: 'auto_escalated',\n reason: 'Critical security issue auto-escalated',\n message,\n };\n \n } catch (error) {\n console.error('Failed to send escalation:', error);\n \n // Fallback to draft\n if (this.config.draftFallbackEnabled) {\n return this.createDraftEscalation([issue], String(error));\n }\n \n return {\n action: 'failed',\n reason: `Send failed: ${error}`,\n message,\n };\n }\n }\n \n /**\n * Escalate multiple issues at once\n */\n async escalateIssues(issues: Issue[]): Promise<EscalationResult> {\n // Filter to only critical security issues\n const criticalSecurityIssues = issues.filter(i => \n i.severity === 'critical' &&\n (i.category === 'security' || i.agent === 'security')\n );\n \n if (criticalSecurityIssues.length === 0) {\n return {\n action: 'no_action',\n reason: 'No critical security issues to escalate',\n };\n }\n \n // Check quiet hours\n if (this.projectState.isQuietHours() && !this.config.criticalBypassQuietHours) {\n return this.createDraftEscalation(criticalSecurityIssues, 'Blocked by quiet hours');\n }\n \n // Create and send message\n const message = this.createEscalationMessage(criticalSecurityIssues);\n \n try {\n await this.sendEscalation(message);\n \n this.escalationHistory.push(message);\n await this.insightStore.markInsightCreated('auto-escalation');\n await this.createEscalationInsight(message);\n \n return {\n action: 'auto_escalated',\n reason: `Escalated ${criticalSecurityIssues.length} critical security issues`,\n message,\n };\n \n } catch (error) {\n if (this.config.draftFallbackEnabled) {\n return this.createDraftEscalation(criticalSecurityIssues, String(error));\n }\n \n return {\n action: 'failed',\n reason: `Send failed: ${error}`,\n message,\n };\n }\n }\n \n /**\n * Create an escalation message\n */\n private createEscalationMessage(issues: Issue[]): EscalationMessage {\n const severity = issues.some(i => i.severity === 'critical') ? 'critical' : 'serious';\n \n return {\n id: `esc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n severity,\n title: `${severity.toUpperCase()} Security Alert: ${issues.length} issue${issues.length > 1 ? 's' : ''} detected`,\n body: this.formatEscalationBody(issues),\n issues,\n timestamp: Date.now(),\n sent: false,\n };\n }\n \n /**\n * Format escalation body text\n */\n private formatEscalationBody(issues: Issue[]): string {\n const lines: string[] = [\n `**Critical Security Issues Detected**`,\n ``,\n `**Project:** ${this.projectPath.split('/').pop()}`,\n `**Issues:** ${issues.length}`,\n `**Detected:** ${new Date().toISOString()}`,\n ``,\n `**Summary:**`,\n ];\n \n for (const issue of issues.slice(0, 5)) {\n lines.push(`- \\`${issue.file}:${issue.line || '?'}\\`: ${issue.issue.slice(0, 100)}`);\n }\n \n if (issues.length > 5) {\n lines.push(`- ... and ${issues.length - 5} more`);\n }\n \n lines.push('');\n lines.push('**Action Required:** Review and address these issues immediately.');\n \n return lines.join('\\n');\n }\n \n /**\n * Send escalation through configured channels\n */\n private async sendEscalation(message: EscalationMessage): Promise<void> {\n const enabledTargets = this.config.targets.filter(t => t.enabled);\n \n if (enabledTargets.length === 0) {\n throw new Error('No enabled escalation targets configured');\n }\n \n const errors: string[] = [];\n \n for (const target of enabledTargets) {\n try {\n switch (target.type) {\n case 'slack':\n await this.sendToSlack(message, target);\n break;\n case 'email':\n await this.sendToEmail(message, target);\n break;\n case 'webhook':\n await this.sendToWebhook(message, target);\n break;\n }\n message.sent = true;\n message.sentAt = Date.now();\n message.channel = target.type;\n } catch (error) {\n errors.push(`${target.type}: ${error}`);\n }\n }\n \n if (errors.length === enabledTargets.length) {\n // All failed\n throw new Error(`All escalation channels failed: ${errors.join('; ')}`);\n }\n }\n \n /**\n * Send to Slack\n */\n private async sendToSlack(message: EscalationMessage, target: EscalationTarget): Promise<void> {\n if (!target.config.webhookUrl) {\n throw new Error('Slack webhook URL not configured');\n }\n \n // Use existing SlackIntegration if available\n if (this.slackClient) {\n await this.slackClient.sendCriticalAlert(message.issues, this.projectPath.split('/').pop() || 'Unknown');\n } else {\n // Direct webhook call\n const slack = new SlackIntegration({\n webhookUrl: target.config.webhookUrl,\n channel: target.config.channel,\n username: target.config.username || 'Trie Agent',\n });\n \n await slack.sendCriticalAlert(message.issues, this.projectPath.split('/').pop() || 'Unknown');\n }\n }\n \n /**\n * Send to email (placeholder - would need email provider integration)\n */\n private async sendToEmail(message: EscalationMessage, target: EscalationTarget): Promise<void> {\n if (!target.config.email) {\n throw new Error('Email address not configured');\n }\n \n // In a real implementation, this would use an email provider (SendGrid, SES, etc.)\n // For now, we'll log and simulate success\n console.log(`[EMAIL ESCALATION] To: ${target.config.email}`);\n console.log(`Subject: ${message.title}`);\n console.log(`Body: ${message.body}`);\n \n // Note: In production, replace with actual email sending:\n // await sendEmail({\n // to: target.config.email,\n // subject: message.title,\n // body: message.body,\n // });\n }\n \n /**\n * Send to webhook\n */\n private async sendToWebhook(message: EscalationMessage, target: EscalationTarget): Promise<void> {\n if (!target.config.webhookUrl) {\n throw new Error('Webhook URL not configured');\n }\n \n const response = await fetch(target.config.webhookUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: message.id,\n severity: message.severity,\n title: message.title,\n body: message.body,\n issues: message.issues.map(i => ({\n file: i.file,\n line: i.line,\n severity: i.severity,\n issue: i.issue,\n agent: i.agent,\n })),\n timestamp: message.timestamp,\n project: this.projectPath,\n }),\n });\n \n if (!response.ok) {\n throw new Error(`Webhook returned ${response.status}: ${response.statusText}`);\n }\n }\n \n /**\n * Create a draft escalation (when sending is blocked)\n */\n private createDraftEscalation(issues: Issue[], reason: string): EscalationResult {\n const message = this.createEscalationMessage(issues);\n message.error = reason;\n \n // Store as draft\n this.escalationHistory.push(message);\n \n return {\n action: 'draft_only',\n reason,\n message,\n draftLocation: `.trie/drafts/escalation-${message.id}.json`,\n };\n }\n \n /**\n * Create insight about escalation\n */\n private async createEscalationInsight(message: EscalationMessage): Promise<void> {\n const insight: Insight = {\n id: `insight-esc-${message.id}`,\n type: 'warning',\n message: `Auto-escalated: ${message.issues.length} critical security issue${message.issues.length > 1 ? 's' : ''}`,\n context: `Sent to ${message.channel}. Issues in: ${[...new Set(message.issues.map(i => i.file))].slice(0, 3).join(', ')}`,\n relatedIssues: message.issues.map(i => i.id),\n priority: 10,\n timestamp: Date.now(),\n dismissed: false,\n category: 'security',\n details: {\n affectedFiles: [...new Set(message.issues.map(i => i.file))],\n },\n };\n \n await this.insightStore.addInsight(insight);\n }\n \n /**\n * Get escalation history\n */\n getEscalationHistory(): EscalationMessage[] {\n return [...this.escalationHistory];\n }\n \n /**\n * Get pending draft escalations\n */\n getPendingDrafts(): EscalationMessage[] {\n return this.escalationHistory.filter(e => !e.sent);\n }\n \n /**\n * Retry a failed/draft escalation\n */\n async retryEscalation(messageId: string): Promise<EscalationResult> {\n const message = this.escalationHistory.find(e => e.id === messageId);\n if (!message) {\n return {\n action: 'failed',\n reason: 'Escalation message not found',\n };\n }\n \n try {\n await this.sendEscalation(message);\n \n return {\n action: 'auto_escalated',\n reason: 'Retry successful',\n message,\n };\n } catch (error) {\n return {\n action: 'failed',\n reason: `Retry failed: ${error}`,\n message,\n };\n }\n }\n \n /**\n * Configure escalation targets\n */\n addEscalationTarget(target: EscalationTarget): void {\n this.config.targets.push(target);\n \n // Re-initialize Slack client if needed\n if (target.type === 'slack' && target.enabled && target.config.webhookUrl) {\n this.slackClient = new SlackIntegration({\n webhookUrl: target.config.webhookUrl,\n channel: target.config.channel,\n username: target.config.username,\n });\n }\n }\n \n /**\n * Get current configuration\n */\n getConfig(): EscalationConfig {\n return { ...this.config };\n }\n \n /**\n * Update configuration\n */\n setConfig(config: Partial<EscalationConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst escalationManagers: Map<string, EscalationManager> = new Map();\n\n/**\n * Get the EscalationManager for a project (singleton per project)\n */\nexport function getEscalationManager(projectPath: string): EscalationManager {\n let manager = escalationManagers.get(projectPath);\n if (!manager) {\n manager = new EscalationManager(projectPath);\n escalationManagers.set(projectPath, manager);\n }\n return manager;\n}\n\n/**\n * Clear all EscalationManager instances (for testing)\n */\nexport function clearEscalationManagers(): void {\n escalationManagers.clear();\n}\n","/**\n * Meta-Learning System - Self-improving agent behavior\n * \n * Features:\n * - Track user feedback on insights\n * - Adjust insight weights based on feedback\n * - Calculate agent effectiveness metrics\n * - Learn which insights are most valuable\n * - Improve prediction accuracy over time\n */\n\nimport type { Insight } from './insight-store.js';\nimport { getInsightStore } from './insight-store.js';\nimport { getProjectState, type AgentMetrics } from './project-state.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Feedback types from users\n */\nexport type FeedbackType = 'helpful' | 'dismissed' | 'acted' | 'ignored';\n\n/**\n * Insight feedback record\n */\nexport interface InsightFeedback {\n insightId: string;\n insightType: Insight['type'];\n insightCategory: Insight['category'];\n feedback: FeedbackType;\n timestamp: number;\n latencyMs?: number; // Time from insight shown to feedback\n}\n\n/**\n * Category effectiveness stats\n */\nexport interface CategoryEffectiveness {\n category: string;\n totalInsights: number;\n helpfulCount: number;\n dismissedCount: number;\n actedCount: number;\n effectivenessScore: number; // 0-1\n}\n\n/**\n * Learning weights for insight generation\n */\nexport interface InsightWeights {\n security: number;\n quality: number;\n performance: number;\n pattern: number;\n progress: number;\n general: number;\n}\n\n/**\n * Agent effectiveness report\n */\nexport interface EffectivenessReport {\n overallScore: number;\n predictiveAccuracy: number;\n userSatisfaction: number;\n falsePositiveRate: number;\n categoryBreakdown: CategoryEffectiveness[];\n recommendations: string[];\n trends: {\n period: string;\n direction: 'improving' | 'stable' | 'declining';\n };\n}\n\n// ============================================================================\n// MetaLearner Class\n// ============================================================================\n\n/**\n * Meta-learning engine for agent self-improvement\n */\nexport class MetaLearner {\n private projectState;\n private insightStore;\n private feedbackHistory: InsightFeedback[] = [];\n private weights: InsightWeights;\n \n constructor(projectPath: string) {\n this.projectState = getProjectState(projectPath);\n this.insightStore = getInsightStore(projectPath);\n \n // Initialize with default weights\n this.weights = {\n security: 1.0,\n quality: 1.0,\n performance: 1.0,\n pattern: 1.0,\n progress: 1.0,\n general: 1.0,\n };\n }\n \n /**\n * Record user feedback on an insight\n */\n async recordFeedback(\n feedback: FeedbackType,\n context: {\n insightId: string;\n latencyMs?: number;\n }\n ): Promise<void> {\n await this.insightStore.load();\n const insight = this.insightStore.getInsight(context.insightId);\n \n if (!insight) {\n console.error(`Insight not found: ${context.insightId}`);\n return;\n }\n \n // Record feedback\n const record: InsightFeedback = {\n insightId: context.insightId,\n insightType: insight.type,\n insightCategory: insight.category,\n feedback,\n timestamp: Date.now(),\n };\n \n if (context.latencyMs !== undefined) {\n record.latencyMs = context.latencyMs;\n }\n \n this.feedbackHistory.push(record);\n \n // Update project state metrics\n await this.projectState.recordInsightFeedback(\n feedback === 'dismissed' ? 'dismissed' : \n feedback === 'acted' ? 'acted' : 'helpful'\n );\n \n // Adjust weights based on feedback\n await this.adjustWeights(record);\n }\n \n /**\n * Adjust insight weights based on feedback\n */\n private async adjustWeights(feedback: InsightFeedback): Promise<void> {\n const category = feedback.insightCategory as keyof InsightWeights;\n const currentWeight = this.weights[category];\n \n if (currentWeight === undefined) return;\n \n // Positive feedback increases weight, dismissal decreases\n let adjustment = 0;\n switch (feedback.feedback) {\n case 'acted':\n adjustment = 0.05; // Strong positive signal\n break;\n case 'helpful':\n adjustment = 0.02; // Moderate positive\n break;\n case 'dismissed':\n adjustment = -0.03; // Negative signal\n break;\n case 'ignored':\n adjustment = -0.01; // Weak negative\n break;\n }\n \n // Apply adjustment with bounds\n this.weights[category] = Math.max(0.3, Math.min(1.5, currentWeight + adjustment));\n }\n \n /**\n * Get current insight weights\n */\n getWeights(): InsightWeights {\n return { ...this.weights };\n }\n \n /**\n * Get weight for a category (used to adjust insight priority)\n */\n getCategoryWeight(category: Insight['category']): number {\n return this.weights[category] ?? 1.0;\n }\n \n /**\n * Calculate category effectiveness\n */\n calculateCategoryEffectiveness(): CategoryEffectiveness[] {\n const categories = ['security', 'quality', 'performance', 'pattern', 'progress', 'general'];\n const effectiveness: CategoryEffectiveness[] = [];\n \n for (const category of categories) {\n const categoryFeedback = this.feedbackHistory.filter(f => f.insightCategory === category);\n \n if (categoryFeedback.length === 0) {\n effectiveness.push({\n category,\n totalInsights: 0,\n helpfulCount: 0,\n dismissedCount: 0,\n actedCount: 0,\n effectivenessScore: 0.5, // Neutral when no data\n });\n continue;\n }\n \n const helpfulCount = categoryFeedback.filter(f => f.feedback === 'helpful' || f.feedback === 'acted').length;\n const dismissedCount = categoryFeedback.filter(f => f.feedback === 'dismissed').length;\n const actedCount = categoryFeedback.filter(f => f.feedback === 'acted').length;\n \n // Effectiveness = (helpful + 2*acted) / (total + dismissed)\n const score = (helpfulCount + actedCount) / Math.max(1, categoryFeedback.length);\n \n effectiveness.push({\n category,\n totalInsights: categoryFeedback.length,\n helpfulCount,\n dismissedCount,\n actedCount,\n effectivenessScore: score,\n });\n }\n \n return effectiveness;\n }\n \n /**\n * Get agent effectiveness metrics\n */\n getEffectiveness(): AgentMetrics {\n return this.projectState.getMetrics();\n }\n \n /**\n * Generate a comprehensive effectiveness report\n */\n async generateEffectivenessReport(): Promise<EffectivenessReport> {\n await this.projectState.load();\n const metrics = this.projectState.getMetrics();\n const categoryBreakdown = this.calculateCategoryEffectiveness();\n \n // Calculate overall score (weighted average of metrics)\n const overallScore = (\n metrics.userSatisfaction * 0.4 +\n metrics.predictiveAccuracy * 0.3 +\n (1 - metrics.falsePositiveRate) * 0.3\n );\n \n // Generate recommendations\n const recommendations = this.generateRecommendations(metrics, categoryBreakdown);\n \n // Determine trend\n const trend = this.calculateTrend();\n \n return {\n overallScore,\n predictiveAccuracy: metrics.predictiveAccuracy,\n userSatisfaction: metrics.userSatisfaction,\n falsePositiveRate: metrics.falsePositiveRate,\n categoryBreakdown,\n recommendations,\n trends: trend,\n };\n }\n \n /**\n * Generate improvement recommendations\n */\n private generateRecommendations(\n metrics: AgentMetrics,\n categoryBreakdown: CategoryEffectiveness[]\n ): string[] {\n const recommendations: string[] = [];\n \n // Check false positive rate\n if (metrics.falsePositiveRate > 0.3) {\n recommendations.push('High dismissal rate detected. Consider raising insight thresholds.');\n }\n \n // Check user satisfaction\n if (metrics.userSatisfaction < 0.5) {\n recommendations.push('User satisfaction is low. Review insight quality and relevance.');\n }\n \n // Check category effectiveness\n const weakCategories = categoryBreakdown\n .filter(c => c.totalInsights >= 5 && c.effectivenessScore < 0.4)\n .map(c => c.category);\n \n if (weakCategories.length > 0) {\n recommendations.push(\n `Low effectiveness in: ${weakCategories.join(', ')}. Consider adjusting insight generation for these categories.`\n );\n }\n \n // Check for high-performing categories\n const strongCategories = categoryBreakdown\n .filter(c => c.totalInsights >= 5 && c.effectivenessScore > 0.7)\n .map(c => c.category);\n \n if (strongCategories.length > 0) {\n recommendations.push(\n `Strong performance in: ${strongCategories.join(', ')}. Consider emphasizing these insights.`\n );\n }\n \n // Check prediction accuracy\n if (metrics.predictiveAccuracy < 0.6 && metrics.totalPredictions >= 10) {\n recommendations.push('Prediction accuracy below target. Review risk scoring factors.');\n }\n \n // Positive reinforcement if doing well\n if (metrics.userSatisfaction >= 0.7 && metrics.falsePositiveRate <= 0.2) {\n recommendations.push('Agent performance is excellent. Keep up the good work!');\n }\n \n return recommendations;\n }\n \n /**\n * Calculate trend direction\n */\n private calculateTrend(): { period: string; direction: 'improving' | 'stable' | 'declining' } {\n // Compare recent feedback to older feedback\n const now = Date.now();\n const recentCutoff = now - (7 * 24 * 60 * 60 * 1000); // 7 days\n const olderCutoff = now - (30 * 24 * 60 * 60 * 1000); // 30 days\n \n const recentFeedback = this.feedbackHistory.filter(f => f.timestamp > recentCutoff);\n const olderFeedback = this.feedbackHistory.filter(f => \n f.timestamp > olderCutoff && f.timestamp <= recentCutoff\n );\n \n if (recentFeedback.length < 5 || olderFeedback.length < 5) {\n return { period: 'last 30 days', direction: 'stable' };\n }\n \n // Calculate satisfaction rates\n const recentPositive = recentFeedback.filter(f => \n f.feedback === 'helpful' || f.feedback === 'acted'\n ).length / recentFeedback.length;\n \n const olderPositive = olderFeedback.filter(f => \n f.feedback === 'helpful' || f.feedback === 'acted'\n ).length / olderFeedback.length;\n \n const diff = recentPositive - olderPositive;\n \n if (diff > 0.1) {\n return { period: 'last 30 days', direction: 'improving' };\n } else if (diff < -0.1) {\n return { period: 'last 30 days', direction: 'declining' };\n }\n \n return { period: 'last 30 days', direction: 'stable' };\n }\n \n /**\n * Should an insight be shown based on learning?\n * \n * Uses weights and user patterns to filter low-value insights.\n */\n shouldShowInsight(insight: Insight): boolean {\n const weight = this.getCategoryWeight(insight.category);\n \n // If weight is very low, filter out low-priority insights\n if (weight < 0.5 && insight.priority < 5) {\n return false;\n }\n \n // Adjust priority threshold based on category weight\n const adjustedPriority = insight.priority * weight;\n \n // Show if adjusted priority is above threshold\n return adjustedPriority >= 3;\n }\n \n /**\n * Adjust insight priority based on learning\n */\n adjustInsightPriority(insight: Insight): number {\n const weight = this.getCategoryWeight(insight.category);\n return Math.round(insight.priority * weight);\n }\n \n /**\n * Get feedback history stats\n */\n getFeedbackStats(): {\n total: number;\n helpful: number;\n dismissed: number;\n acted: number;\n ignored: number;\n averageLatencyMs: number | null;\n } {\n const stats = {\n total: this.feedbackHistory.length,\n helpful: 0,\n dismissed: 0,\n acted: 0,\n ignored: 0,\n averageLatencyMs: null as number | null,\n };\n \n let totalLatency = 0;\n let latencyCount = 0;\n \n for (const feedback of this.feedbackHistory) {\n switch (feedback.feedback) {\n case 'helpful': stats.helpful++; break;\n case 'dismissed': stats.dismissed++; break;\n case 'acted': stats.acted++; break;\n case 'ignored': stats.ignored++; break;\n }\n \n if (feedback.latencyMs !== undefined) {\n totalLatency += feedback.latencyMs;\n latencyCount++;\n }\n }\n \n if (latencyCount > 0) {\n stats.averageLatencyMs = Math.round(totalLatency / latencyCount);\n }\n \n return stats;\n }\n \n /**\n * Reset learning (for testing)\n */\n reset(): void {\n this.feedbackHistory = [];\n this.weights = {\n security: 1.0,\n quality: 1.0,\n performance: 1.0,\n pattern: 1.0,\n progress: 1.0,\n general: 1.0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst metaLearners: Map<string, MetaLearner> = new Map();\n\n/**\n * Get the MetaLearner for a project (singleton per project)\n */\nexport function getMetaLearner(projectPath: string): MetaLearner {\n let learner = metaLearners.get(projectPath);\n if (!learner) {\n learner = new MetaLearner(projectPath);\n metaLearners.set(projectPath, learner);\n }\n return learner;\n}\n\n/**\n * Clear all MetaLearner instances (for testing)\n */\nexport function clearMetaLearners(): void {\n metaLearners.clear();\n}\n"],"mappings":"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","names":["basename","issues","DEFAULT_CONFIG","basename","currentHashes","ContextGraph"]}
@@ -89,7 +89,7 @@ async function measureInitialGoalValue(description, projectPath) {
89
89
  }
90
90
  async function checkFilesForGoalViolations(goals, projectPath, filesToCheck, onProgress, signal) {
91
91
  const { isAIAvailable, runAIAnalysis } = await import("./client-INNE2GGZ.js");
92
- const { CodebaseIndex } = await import("./codebase-index-5SEOESWM.js");
92
+ const { CodebaseIndex } = await import("./codebase-index-FMIULFZQ.js");
93
93
  if (!isAIAvailable()) {
94
94
  throw new Error("AI not available - ANTHROPIC_API_KEY not set");
95
95
  }
@@ -351,4 +351,4 @@ export {
351
351
  measureInitialGoalValue,
352
352
  checkFilesForGoalViolations
353
353
  };
354
- //# sourceMappingURL=chunk-75ADWWUF.js.map
354
+ //# sourceMappingURL=chunk-T6PS3MXJ.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- atomicWriteJSON
3
- } from "./chunk-43X6JBEM.js";
4
1
  import {
5
2
  Trie
6
3
  } from "./chunk-6NLHFIYA.js";
4
+ import {
5
+ atomicWriteJSON
6
+ } from "./chunk-43X6JBEM.js";
7
7
  import {
8
8
  getTrieDirectory
9
9
  } from "./chunk-SH7H3WRU.js";
@@ -251,4 +251,4 @@ var CodebaseIndex = class {
251
251
  export {
252
252
  CodebaseIndex
253
253
  };
254
- //# sourceMappingURL=chunk-AF2APASP.js.map
254
+ //# sourceMappingURL=chunk-V7AY2EJO.js.map