@triedotdev/mcp 1.0.157 → 1.0.161
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.
- package/dist/{chunk-BLQ3Z6O3.js → chunk-MPHYM7M6.js} +135 -50
- package/dist/chunk-MPHYM7M6.js.map +1 -0
- package/dist/{chunk-UKIDAMAG.js → chunk-OWYOC5DX.js} +2 -2
- package/dist/{chunk-5PTA7A2E.js → chunk-XBXII4FC.js} +3 -3
- package/dist/{chunk-FNZPMR62.js → chunk-XMW2WTZB.js} +45 -5
- package/dist/chunk-XMW2WTZB.js.map +1 -0
- package/dist/{chunk-M4CGCPHR.js → chunk-ZGVPZZFM.js} +17 -3
- package/dist/chunk-ZGVPZZFM.js.map +1 -0
- package/dist/cli/main.js +2 -2
- package/dist/cli/yolo-daemon.js +4 -4
- package/dist/index.js +5 -5
- package/dist/server/mcp-server.js +5 -5
- package/dist/{terminal-spawn-P5M5PHAV.js → terminal-spawn-5YXDMUCF.js} +32 -1
- package/dist/{terminal-spawn-P5M5PHAV.js.map → terminal-spawn-5YXDMUCF.js.map} +1 -1
- package/dist/{tiered-storage-SUYPBYJL.js → tiered-storage-THHKROJF.js} +2 -2
- package/dist/{trie-agent-XWEJSIYH.js → trie-agent-VRV6GKJP.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-BLQ3Z6O3.js.map +0 -1
- package/dist/chunk-FNZPMR62.js.map +0 -1
- package/dist/chunk-M4CGCPHR.js.map +0 -1
- /package/dist/{chunk-UKIDAMAG.js.map → chunk-OWYOC5DX.js.map} +0 -0
- /package/dist/{chunk-5PTA7A2E.js.map → chunk-XBXII4FC.js.map} +0 -0
- /package/dist/{tiered-storage-SUYPBYJL.js.map → tiered-storage-THHKROJF.js.map} +0 -0
- /package/dist/{trie-agent-XWEJSIYH.js.map → trie-agent-VRV6GKJP.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/tiered-storage.ts"],"sourcesContent":["/**\n * Tiered Storage System\n * \n * Three-tier architecture for context management:\n * - HOT: In-memory, current session data\n * - WARM: SQLite DB, queryable governance/facts/blockers\n * - COLD: Full history, indexed but not actively queried\n * \n * This prevents context pollution by keeping agents focused on\n * relevant signal rather than dumping everything into context.\n */\n\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'node:crypto';\nimport Database = require('better-sqlite3');\nimport type {\n Governance,\n Blocker,\n ExtractedSignal,\n ContextQuery,\n Nudge,\n Gotcha,\n} from '../types/signal.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport class TieredStorage {\n private workDir: string;\n private hotCache: Map<string, any> = new Map();\n private warmDb: Database.Database | null = null;\n\n constructor(workDir: string) {\n this.workDir = workDir;\n }\n\n /**\n * Initialize storage directories and database\n */\n async initialize(): Promise<void> {\n const trieDir = getTrieDirectory(this.workDir);\n \n // Create directories\n await mkdir(join(trieDir, 'hot'), { recursive: true });\n await mkdir(join(trieDir, 'warm'), { recursive: true });\n await mkdir(join(trieDir, 'cold'), { recursive: true });\n\n // Initialize warm database\n const dbPath = join(trieDir, 'warm', 'governance.db');\n this.warmDb = new Database(dbPath);\n \n // Create tables\n this.warmDb.exec(`\n CREATE TABLE IF NOT EXISTS governance (\n id TEXT PRIMARY KEY,\n decision TEXT NOT NULL,\n context TEXT NOT NULL,\n reasoning TEXT,\n timestamp TEXT NOT NULL,\n who TEXT,\n files TEXT NOT NULL, -- JSON array\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n relatedTo TEXT, -- JSON array\n tradeoffs TEXT, -- JSON array\n status TEXT NOT NULL,\n supersededBy TEXT,\n hash TEXT, -- SHA-256 fingerprint (first 16 hex chars)\n dependencies TEXT, -- JSON array (npm packages, services)\n codebaseArea TEXT, -- JSON array (frontend, backend, auth, etc.)\n domain TEXT, -- JSON array (payments, compliance, etc.)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS facts (\n id TEXT PRIMARY KEY,\n fact TEXT NOT NULL,\n source TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n relatedGovernance TEXT, -- JSON array\n confidence REAL NOT NULL,\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS blockers (\n id TEXT PRIMARY KEY,\n blocker TEXT NOT NULL,\n impact TEXT NOT NULL,\n affectedAreas TEXT NOT NULL, -- JSON array\n timestamp TEXT NOT NULL,\n resolvedAt TEXT,\n resolution TEXT,\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS questions (\n id TEXT PRIMARY KEY,\n question TEXT NOT NULL,\n context TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n answeredAt TEXT,\n answer TEXT,\n relatedGovernance TEXT, -- JSON array\n tags TEXT NOT NULL, -- JSON array\n expandedTags TEXT, -- JSON array (with synonyms)\n lastAccessed TEXT NOT NULL,\n accessCount INTEGER DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS nudges (\n id TEXT PRIMARY KEY,\n message TEXT NOT NULL,\n severity TEXT NOT NULL, -- 'critical', 'high', 'warning', 'info'\n file TEXT,\n category TEXT, -- 'quality', 'security', 'performance', etc.\n goalId TEXT, -- Related goal ID if this is a goal violation\n timestamp TEXT NOT NULL,\n resolved BOOLEAN NOT NULL DEFAULT 0,\n resolvedAt TEXT,\n resolution TEXT, -- How it was resolved: 'dismissed', 'fixed', 'auto-fixed'\n dismissed BOOLEAN NOT NULL DEFAULT 0,\n priority INTEGER DEFAULT 5, -- 1-10 priority score\n suggestedAction TEXT,\n relatedIssues TEXT, -- JSON array\n metadata TEXT -- JSON object for additional data\n );\n\n CREATE TABLE IF NOT EXISTS gotchas (\n id TEXT PRIMARY KEY,\n message TEXT NOT NULL,\n confidence REAL NOT NULL, -- 0-1 confidence score\n riskLevel TEXT NOT NULL, -- 'low', 'medium', 'high', 'critical'\n recommendation TEXT NOT NULL,\n file TEXT,\n timestamp TEXT NOT NULL,\n precedentId TEXT, -- ID of related historical incident/governance record\n tags TEXT NOT NULL, -- JSON array\n evidence TEXT NOT NULL, -- JSON object with pastIncidents, matchingPatterns, relatedTickets\n resolved BOOLEAN NOT NULL DEFAULT 0,\n resolvedAt TEXT,\n resolution TEXT -- 'confirmed', 'false-positive', 'dismissed'\n );\n\n CREATE INDEX IF NOT EXISTS idx_governance_tags ON governance(tags);\n CREATE INDEX IF NOT EXISTS idx_governance_expanded ON governance(expandedTags);\n CREATE INDEX IF NOT EXISTS idx_governance_timestamp ON governance(timestamp);\n CREATE INDEX IF NOT EXISTS idx_governance_status ON governance(status);\n CREATE INDEX IF NOT EXISTS idx_governance_area ON governance(codebaseArea);\n CREATE INDEX IF NOT EXISTS idx_governance_domain ON governance(domain);\n CREATE INDEX IF NOT EXISTS idx_facts_tags ON facts(tags);\n CREATE INDEX IF NOT EXISTS idx_facts_expanded ON facts(expandedTags);\n CREATE INDEX IF NOT EXISTS idx_blockers_impact ON blockers(impact);\n CREATE INDEX IF NOT EXISTS idx_blockers_resolved ON blockers(resolvedAt);\n CREATE INDEX IF NOT EXISTS idx_nudges_timestamp ON nudges(timestamp);\n CREATE INDEX IF NOT EXISTS idx_nudges_resolved ON nudges(resolved);\n CREATE INDEX IF NOT EXISTS idx_nudges_severity ON nudges(severity);\n CREATE INDEX IF NOT EXISTS idx_nudges_file ON nudges(file);\n CREATE INDEX IF NOT EXISTS idx_gotchas_timestamp ON gotchas(timestamp);\n CREATE INDEX IF NOT EXISTS idx_gotchas_resolved ON gotchas(resolved);\n CREATE INDEX IF NOT EXISTS idx_gotchas_riskLevel ON gotchas(riskLevel);\n CREATE INDEX IF NOT EXISTS idx_gotchas_file ON gotchas(file);\n CREATE INDEX IF NOT EXISTS idx_gotchas_tags ON gotchas(tags);\n `);\n }\n\n /**\n * Store extracted signal with enriched metadata in warm storage\n */\n async storeSignal(signal: ExtractedSignal, metadata?: {\n expandedTags?: string[];\n dependencies?: string[];\n codebaseArea?: string[];\n domain?: string[];\n }): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const now = new Date().toISOString();\n \n // Log what we're storing for debugging\n const totalSignals = signal.governance.length + signal.facts.length + \n signal.blockers.length + signal.questions.length;\n if (totalSignals > 0) {\n console.debug(`[Storage] Storing ${totalSignals} signals: ${signal.governance.length}g, ${signal.facts.length}f, ${signal.blockers.length}b, ${signal.questions.length}q`);\n }\n\n // Store governance records\n const governanceStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO governance \n (id, decision, context, reasoning, timestamp, who, files, tags, expandedTags, relatedTo, tradeoffs, status, supersededBy, hash, dependencies, codebaseArea, domain, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n const governanceRecords = signal.governance;\n for (const gov of governanceRecords) {\n const hash = gov.hash || createHash('sha256')\n .update(`${gov.decision}|${gov.context}|${gov.when}`)\n .digest('hex')\n .slice(0, 16);\n governanceStmt.run(\n gov.id,\n gov.decision,\n gov.context,\n gov.reasoning || null,\n gov.when,\n gov.who || null,\n JSON.stringify(gov.files),\n JSON.stringify(gov.tags),\n JSON.stringify(metadata?.expandedTags || []),\n JSON.stringify(gov.relatedTo || []),\n JSON.stringify(gov.tradeoffs || []),\n gov.status,\n gov.supersededBy || null,\n hash,\n JSON.stringify(metadata?.dependencies || []),\n JSON.stringify(metadata?.codebaseArea || []),\n JSON.stringify(metadata?.domain || []),\n now\n );\n }\n\n // Store facts\n const factStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO facts\n (id, fact, source, timestamp, tags, expandedTags, relatedGovernance, confidence, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const fact of signal.facts) {\n factStmt.run(\n fact.id,\n fact.fact,\n fact.source,\n fact.when,\n JSON.stringify(fact.tags),\n JSON.stringify(metadata?.expandedTags || []),\n JSON.stringify(fact.relatedGovernance || []),\n fact.confidence,\n now\n );\n }\n\n // Store blockers\n const blockerStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO blockers\n (id, blocker, impact, affectedAreas, timestamp, resolvedAt, resolution, tags, expandedTags, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const blocker of signal.blockers) {\n blockerStmt.run(\n blocker.id,\n blocker.blocker,\n blocker.impact,\n JSON.stringify(blocker.affectedAreas),\n blocker.when,\n blocker.resolvedAt || null,\n blocker.resolution || null,\n JSON.stringify(blocker.tags),\n JSON.stringify(metadata?.expandedTags || []),\n now\n );\n }\n\n // Store questions\n const questionStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO questions\n (id, question, context, timestamp, answeredAt, answer, relatedGovernance, tags, expandedTags, lastAccessed, accessCount)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)\n `);\n\n for (const q of signal.questions) {\n questionStmt.run(\n q.id,\n q.question,\n q.context,\n q.when,\n q.answeredAt || null,\n q.answer || null,\n JSON.stringify(q.relatedGovernance || []),\n JSON.stringify(q.tags),\n JSON.stringify(metadata?.expandedTags || []),\n now\n );\n }\n\n // Store gotchas if present\n if (signal.gotchas && signal.gotchas.length > 0) {\n const gotchaStmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO gotchas\n (id, message, confidence, riskLevel, recommendation, file, timestamp, precedentId, tags, evidence, resolved, resolvedAt, resolution)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n for (const g of signal.gotchas) {\n gotchaStmt.run(\n g.id,\n g.message,\n g.confidence,\n g.riskLevel,\n g.recommendation,\n g.file || null,\n g.timestamp,\n g.precedentId || null,\n JSON.stringify(g.tags || []),\n JSON.stringify(g.evidence || { pastIncidents: [], matchingPatterns: [], relatedTickets: [] }),\n g.resolved ? 1 : 0,\n g.resolvedAt || null,\n g.resolution || null\n );\n }\n }\n \n // Log successful storage\n const storedCount = signal.governance.length + signal.facts.length + \n signal.blockers.length + signal.questions.length +\n (signal.gotchas?.length || 0);\n if (storedCount > 0) {\n console.debug(`[Storage] ✓ Successfully stored ${storedCount} signals to governance.db`);\n }\n }\n\n /**\n * Query governance records from warm storage with expanded tag matching\n */\n async queryGovernance(query: ContextQuery): Promise<Governance[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM governance WHERE status = ?';\n const params: any[] = ['active'];\n\n // Add filters - search both tags and expandedTags for broader matching\n if (query.tags && query.tags.length > 0) {\n sql += ' AND (' + query.tags.map(() => '(tags LIKE ? OR expandedTags LIKE ?)').join(' OR ') + ')';\n for (const tag of query.tags) {\n params.push(`%\"${tag}\"%`, `%\"${tag}\"%`);\n }\n }\n\n // Filter by codebase area if specified\n if (query.filters?.codebaseArea) {\n sql += ' AND codebaseArea LIKE ?';\n params.push(`%\"${query.filters.codebaseArea}\"%`);\n }\n\n // Filter by domain if specified\n if (query.filters?.domain) {\n sql += ' AND domain LIKE ?';\n params.push(`%\"${query.filters.domain}\"%`);\n }\n\n if (query.timeWindow) {\n if (query.timeWindow.start) {\n sql += ' AND timestamp >= ?';\n params.push(query.timeWindow.start);\n }\n if (query.timeWindow.end) {\n sql += ' AND timestamp <= ?';\n params.push(query.timeWindow.end);\n }\n }\n\n sql += ' ORDER BY timestamp DESC';\n\n if (query.limit) {\n sql += ' LIMIT ?';\n params.push(query.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n decision: row.decision,\n context: row.context,\n reasoning: row.reasoning,\n when: row.when,\n who: row.who,\n files: JSON.parse(row.files),\n tags: JSON.parse(row.tags),\n relatedTo: JSON.parse(row.relatedTo || '[]'),\n tradeoffs: JSON.parse(row.tradeoffs || '[]'),\n status: row.status,\n supersededBy: row.supersededBy,\n hash: row.hash || undefined,\n }));\n }\n\n /**\n * Query blockers from warm storage with expanded tag matching\n */\n async queryBlockers(query: ContextQuery): Promise<Blocker[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM blockers WHERE resolvedAt IS NULL';\n const params: any[] = [];\n\n if (query.tags && query.tags.length > 0) {\n sql += ' AND (' + query.tags.map(() => '(tags LIKE ? OR expandedTags LIKE ?)').join(' OR ') + ')';\n for (const tag of query.tags) {\n params.push(`%\"${tag}\"%`, `%\"${tag}\"%`);\n }\n }\n\n sql += \" ORDER BY CASE impact WHEN 'critical' THEN 1 WHEN 'high' THEN 2 WHEN 'medium' THEN 3 ELSE 4 END, timestamp DESC\";\n\n if (query.limit) {\n sql += ' LIMIT ?';\n params.push(query.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n blocker: row.blocker,\n impact: row.impact,\n affectedAreas: JSON.parse(row.affectedAreas),\n when: row.when,\n resolvedAt: row.resolvedAt,\n resolution: row.resolution,\n tags: JSON.parse(row.tags)\n }));\n }\n\n /**\n * Get hot cache item\n */\n getHot<T>(key: string): T | undefined {\n return this.hotCache.get(key);\n }\n\n /**\n * Set hot cache item\n */\n setHot<T>(key: string, value: T): void {\n this.hotCache.set(key, value);\n }\n\n /**\n * Clear hot cache\n */\n clearHot(): void {\n this.hotCache.clear();\n }\n\n /**\n * Store a nudge in warm storage\n */\n async storeNudge(nudge: Nudge): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const stmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO nudges\n (id, message, severity, file, category, goalId, timestamp, resolved, resolvedAt, resolution, dismissed, priority, suggestedAction, relatedIssues, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n nudge.id,\n nudge.message,\n nudge.severity,\n nudge.file || null,\n nudge.category || null,\n nudge.goalId || null,\n nudge.timestamp,\n nudge.resolved ? 1 : 0,\n nudge.resolvedAt || null,\n nudge.resolution || null,\n nudge.dismissed ? 1 : 0,\n nudge.priority,\n nudge.suggestedAction || null,\n JSON.stringify(nudge.relatedIssues || []),\n JSON.stringify(nudge.metadata || {})\n );\n }\n\n /**\n * Query nudges from warm storage\n */\n async queryNudges(filters?: {\n resolved?: boolean;\n severity?: string;\n file?: string;\n category?: string;\n goalId?: string;\n limit?: number;\n }): Promise<Nudge[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM nudges WHERE 1=1';\n const params: any[] = [];\n\n if (filters?.resolved !== undefined) {\n sql += ' AND resolved = ?';\n params.push(filters.resolved ? 1 : 0);\n }\n\n if (filters?.severity) {\n sql += ' AND severity = ?';\n params.push(filters.severity);\n }\n\n if (filters?.file) {\n sql += ' AND file = ?';\n params.push(filters.file);\n }\n\n if (filters?.category) {\n sql += ' AND category = ?';\n params.push(filters.category);\n }\n\n if (filters?.goalId) {\n sql += ' AND goalId = ?';\n params.push(filters.goalId);\n }\n\n sql += ' ORDER BY timestamp DESC';\n\n if (filters?.limit) {\n sql += ' LIMIT ?';\n params.push(filters.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n message: row.message,\n severity: row.severity,\n file: row.file || undefined,\n category: row.category || undefined,\n goalId: row.goalId || undefined,\n timestamp: row.timestamp,\n resolved: Boolean(row.resolved),\n resolvedAt: row.resolvedAt || undefined,\n resolution: row.resolution || undefined,\n dismissed: Boolean(row.dismissed),\n priority: row.priority,\n suggestedAction: row.suggestedAction || undefined,\n relatedIssues: JSON.parse(row.relatedIssues || '[]'),\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n }\n\n /**\n * Mark a nudge as resolved\n */\n async resolveNudge(nudgeId: string, resolution: 'dismissed' | 'fixed' | 'auto-fixed'): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const now = new Date().toISOString();\n \n this.warmDb.prepare(`\n UPDATE nudges \n SET resolved = 1, resolvedAt = ?, resolution = ?, dismissed = ?\n WHERE id = ?\n `).run(now, resolution, resolution === 'dismissed' ? 1 : 0, nudgeId);\n }\n\n /**\n * Mark a nudge as dismissed\n */\n async dismissNudge(nudgeId: string): Promise<void> {\n await this.resolveNudge(nudgeId, 'dismissed');\n }\n\n /**\n * Store a gotcha in warm storage\n */\n async storeGotcha(gotcha: Gotcha): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const stmt = this.warmDb.prepare(`\n INSERT OR REPLACE INTO gotchas\n (id, message, confidence, riskLevel, recommendation, file, timestamp, precedentId, tags, evidence, resolved, resolvedAt, resolution)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n gotcha.id,\n gotcha.message,\n gotcha.confidence,\n gotcha.riskLevel,\n gotcha.recommendation,\n gotcha.file || null,\n gotcha.timestamp,\n gotcha.precedentId || null,\n JSON.stringify(gotcha.tags || []),\n JSON.stringify(gotcha.evidence || { pastIncidents: [], matchingPatterns: [], relatedTickets: [] }),\n gotcha.resolved ? 1 : 0,\n gotcha.resolvedAt || null,\n gotcha.resolution || null\n );\n }\n\n /**\n * Query gotchas from warm storage\n */\n async queryGotchas(filters?: {\n resolved?: boolean;\n riskLevel?: string;\n file?: string;\n limit?: number;\n }): Promise<Gotcha[]> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n let sql = 'SELECT * FROM gotchas WHERE 1=1';\n const params: any[] = [];\n\n if (filters?.resolved !== undefined) {\n sql += ' AND resolved = ?';\n params.push(filters.resolved ? 1 : 0);\n }\n\n if (filters?.riskLevel) {\n sql += ' AND riskLevel = ?';\n params.push(filters.riskLevel);\n }\n\n if (filters?.file) {\n sql += ' AND file = ?';\n params.push(filters.file);\n }\n\n sql += ' ORDER BY timestamp DESC';\n\n if (filters?.limit) {\n sql += ' LIMIT ?';\n params.push(filters.limit);\n }\n\n const rows = this.warmDb.prepare(sql).all(...params) as any[];\n\n return rows.map(row => ({\n id: row.id,\n message: row.message,\n confidence: row.confidence,\n riskLevel: row.riskLevel,\n recommendation: row.recommendation,\n file: row.file || undefined,\n timestamp: row.timestamp,\n precedentId: row.precedentId || undefined,\n tags: JSON.parse(row.tags || '[]'),\n evidence: JSON.parse(row.evidence || '{\"pastIncidents\":[],\"matchingPatterns\":[],\"relatedTickets\":[]}'),\n resolved: Boolean(row.resolved),\n resolvedAt: row.resolvedAt || undefined,\n resolution: row.resolution || undefined,\n }));\n }\n\n /**\n * Get unresolved nudges count\n */\n async getUnresolvedNudgesCount(): Promise<number> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const result = this.warmDb.prepare('SELECT COUNT(*) as count FROM nudges WHERE resolved = 0').get() as { count: number };\n return result.count;\n }\n\n /**\n * Archive old data to cold storage\n */\n async archiveToCold(olderThanDays: number = 90): Promise<void> {\n if (!this.warmDb) await this.initialize();\n if (!this.warmDb) throw new Error('Database not initialized');\n\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);\n const cutoff = cutoffDate.toISOString();\n\n // Export to cold storage\n const coldDir = join(getTrieDirectory(this.workDir), 'cold');\n const archivePath = join(coldDir, `archive-${Date.now()}.json`);\n\n const governance = this.warmDb.prepare('SELECT * FROM governance WHERE timestamp < ? AND accessCount < 3').all(cutoff);\n const facts = this.warmDb.prepare('SELECT * FROM facts WHERE timestamp < ? AND accessCount < 3').all(cutoff);\n const blockers = this.warmDb.prepare('SELECT * FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL').all(cutoff);\n const questions = this.warmDb.prepare('SELECT * FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL').all(cutoff);\n const nudges = this.warmDb.prepare('SELECT * FROM nudges WHERE timestamp < ? AND resolved = 1').all(cutoff);\n const gotchas = this.warmDb.prepare('SELECT * FROM gotchas WHERE timestamp < ? AND resolved = 1').all(cutoff);\n\n await writeFile(archivePath, JSON.stringify({ governance, facts, blockers, questions, nudges, gotchas }, null, 2));\n\n // Delete from warm storage\n this.warmDb.prepare('DELETE FROM governance WHERE timestamp < ? AND accessCount < 3').run(cutoff);\n this.warmDb.prepare('DELETE FROM facts WHERE timestamp < ? AND accessCount < 3').run(cutoff);\n this.warmDb.prepare('DELETE FROM blockers WHERE timestamp < ? AND resolvedAt IS NOT NULL').run(cutoff);\n this.warmDb.prepare('DELETE FROM questions WHERE timestamp < ? AND answeredAt IS NOT NULL').run(cutoff);\n this.warmDb.prepare('DELETE FROM nudges WHERE timestamp < ? AND resolved = 1').run(cutoff);\n this.warmDb.prepare('DELETE FROM gotchas WHERE timestamp < ? AND resolved = 1').run(cutoff);\n }\n\n /**\n * Close database connection\n */\n close(): void {\n if (this.warmDb) {\n this.warmDb.close();\n this.warmDb = null;\n }\n }\n}\n\n/**\n * Get storage instance for working directory\n */\nconst storageInstances = new Map<string, TieredStorage>();\n\nexport function getStorage(workDir: string): TieredStorage {\n if (!storageInstances.has(workDir)) {\n storageInstances.set(workDir, new TieredStorage(workDir));\n }\n return storageInstances.get(workDir)!;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|