@triedotdev/mcp 1.0.113 → 1.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/auto-fix-apply-PCAHWLXF.js +10 -0
  2. package/dist/autonomy-config-O4H3Z7YV.js +30 -0
  3. package/dist/chunk-2GIAROBF.js +173 -0
  4. package/dist/chunk-2GIAROBF.js.map +1 -0
  5. package/dist/{chunk-33WL3D7A.js → chunk-2SIFK7OW.js} +7 -419
  6. package/dist/chunk-2SIFK7OW.js.map +1 -0
  7. package/dist/chunk-43X6JBEM.js +36 -0
  8. package/dist/chunk-43X6JBEM.js.map +1 -0
  9. package/dist/{chunk-2764KZZQ.js → chunk-4SBZXIMG.js} +133 -595
  10. package/dist/chunk-4SBZXIMG.js.map +1 -0
  11. package/dist/chunk-55DOQNHJ.js +772 -0
  12. package/dist/chunk-55DOQNHJ.js.map +1 -0
  13. package/dist/chunk-6LXSA2OZ.js +425 -0
  14. package/dist/chunk-6LXSA2OZ.js.map +1 -0
  15. package/dist/{chunk-SDS3UVFY.js → chunk-AOFYU6T3.js} +113 -559
  16. package/dist/chunk-AOFYU6T3.js.map +1 -0
  17. package/dist/{chunk-6QR6QZIX.js → chunk-D3EXBJE2.js} +25 -658
  18. package/dist/chunk-D3EXBJE2.js.map +1 -0
  19. package/dist/chunk-DJ2YAGHK.js +50 -0
  20. package/dist/chunk-DJ2YAGHK.js.map +1 -0
  21. package/dist/chunk-DRDEEF6G.js +328 -0
  22. package/dist/chunk-DRDEEF6G.js.map +1 -0
  23. package/dist/chunk-DZREHOGW.js +706 -0
  24. package/dist/chunk-DZREHOGW.js.map +1 -0
  25. package/dist/chunk-KRH642MT.js +947 -0
  26. package/dist/chunk-KRH642MT.js.map +1 -0
  27. package/dist/{chunk-QYOACM2C.js → chunk-MVNJPJBK.js} +22 -252
  28. package/dist/chunk-MVNJPJBK.js.map +1 -0
  29. package/dist/chunk-NS2MSZMB.js +394 -0
  30. package/dist/chunk-NS2MSZMB.js.map +1 -0
  31. package/dist/chunk-SWSK7ANT.js +340 -0
  32. package/dist/chunk-SWSK7ANT.js.map +1 -0
  33. package/dist/chunk-VRLMTOB6.js +566 -0
  34. package/dist/chunk-VRLMTOB6.js.map +1 -0
  35. package/dist/chunk-YR4BMGYO.js +130 -0
  36. package/dist/chunk-YR4BMGYO.js.map +1 -0
  37. package/dist/chunk-ZV2K6M7T.js +74 -0
  38. package/dist/chunk-ZV2K6M7T.js.map +1 -0
  39. package/dist/cli/main.js +107 -375
  40. package/dist/cli/main.js.map +1 -1
  41. package/dist/cli/yolo-daemon.js +18 -8
  42. package/dist/cli/yolo-daemon.js.map +1 -1
  43. package/dist/client-7XZHCMD3.js +28 -0
  44. package/dist/client-7XZHCMD3.js.map +1 -0
  45. package/dist/{goal-manager-AP4LTE6U.js → goal-manager-LMS6ZJB7.js} +7 -3
  46. package/dist/goal-manager-LMS6ZJB7.js.map +1 -0
  47. package/dist/goal-validator-7UPLOVAZ.js +184 -0
  48. package/dist/goal-validator-7UPLOVAZ.js.map +1 -0
  49. package/dist/graph-U5JWSAB5.js +10 -0
  50. package/dist/graph-U5JWSAB5.js.map +1 -0
  51. package/dist/guardian-agent-EXP7APLC.js +25 -0
  52. package/dist/guardian-agent-EXP7APLC.js.map +1 -0
  53. package/dist/hypothesis-KGC3P54C.js +19 -0
  54. package/dist/hypothesis-KGC3P54C.js.map +1 -0
  55. package/dist/incident-index-PNIVT47T.js +11 -0
  56. package/dist/incident-index-PNIVT47T.js.map +1 -0
  57. package/dist/index.js +285 -16
  58. package/dist/index.js.map +1 -1
  59. package/dist/ledger-SR6OEBLO.js +15 -0
  60. package/dist/ledger-SR6OEBLO.js.map +1 -0
  61. package/dist/output-manager-BOTMXSND.js +13 -0
  62. package/dist/output-manager-BOTMXSND.js.map +1 -0
  63. package/dist/pattern-discovery-F7LU5K6E.js +8 -0
  64. package/dist/pattern-discovery-F7LU5K6E.js.map +1 -0
  65. package/package.json +1 -1
  66. package/dist/chunk-2764KZZQ.js.map +0 -1
  67. package/dist/chunk-33WL3D7A.js.map +0 -1
  68. package/dist/chunk-6JPPYG7F.js +0 -1813
  69. package/dist/chunk-6JPPYG7F.js.map +0 -1
  70. package/dist/chunk-6QR6QZIX.js.map +0 -1
  71. package/dist/chunk-QYOACM2C.js.map +0 -1
  72. package/dist/chunk-SDS3UVFY.js.map +0 -1
  73. package/dist/guardian-agent-XEYNG7RH.js +0 -18
  74. /package/dist/{goal-manager-AP4LTE6U.js.map → auto-fix-apply-PCAHWLXF.js.map} +0 -0
  75. /package/dist/{guardian-agent-XEYNG7RH.js.map → autonomy-config-O4H3Z7YV.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/checkpoint.ts","../src/utils/trie-init.ts","../src/context/sync.ts","../src/context/incident-index.ts","../src/context/file-trie.ts","../src/utils/errors.ts","../src/skills/audit-logger.ts","../src/agent/git.ts","../src/utils/command-runner.ts","../src/agent/confidence.ts","../src/agent/pattern-discovery.ts","../src/agent/learning.ts","../src/guardian/learning-engine.ts","../src/agent/perceive.ts","../src/agent/diff-analyzer.ts","../src/agent/risk-scorer.ts","../src/agent/pattern-matcher.ts","../src/orchestrator/triager.ts","../src/utils/parallel-executor.ts","../src/utils/cache-manager.ts","../src/orchestrator/executor.ts","../src/agent/reason.ts"],"sourcesContent":["/**\n * Checkpoint CLI\n * \n * Save your work context to .trie/ without running a full scan.\n * Think of it as a quick save - captures what you're working on.\n */\n\nimport { existsSync } from 'fs';\nimport { mkdir, writeFile, readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\n\nexport interface Checkpoint {\n id: string;\n timestamp: string;\n message?: string;\n files: string[];\n notes?: string;\n createdBy: 'cli' | 'mcp';\n}\n\nexport interface CheckpointLog {\n checkpoints: Checkpoint[];\n lastCheckpoint?: string;\n}\n\n/**\n * Save a checkpoint\n */\nexport async function saveCheckpoint(options: {\n message?: string;\n files?: string[];\n notes?: string;\n workDir?: string;\n createdBy?: 'cli' | 'mcp';\n}): Promise<Checkpoint> {\n const workDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(workDir);\n const checkpointPath = join(trieDir, 'checkpoints.json');\n \n await mkdir(trieDir, { recursive: true });\n \n // Load existing checkpoints\n let log: CheckpointLog = { checkpoints: [] };\n try {\n if (existsSync(checkpointPath)) {\n log = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n }\n } catch {\n log = { checkpoints: [] };\n }\n \n // Create new checkpoint\n const checkpoint: Checkpoint = {\n id: `cp-${Date.now().toString(36)}`,\n timestamp: new Date().toISOString(),\n files: options.files || [],\n createdBy: options.createdBy || 'cli',\n };\n if (options.message) checkpoint.message = options.message;\n if (options.notes) checkpoint.notes = options.notes;\n \n // Add to log\n log.checkpoints.push(checkpoint);\n log.lastCheckpoint = checkpoint.id;\n \n // Keep last 50 checkpoints\n if (log.checkpoints.length > 50) {\n log.checkpoints = log.checkpoints.slice(-50);\n }\n \n // Save\n await writeFile(checkpointPath, JSON.stringify(log, null, 2));\n \n // Also update AGENTS.md with checkpoint note\n await updateAgentsMdWithCheckpoint(checkpoint, workDir);\n \n return checkpoint;\n}\n\n/**\n * List checkpoints\n */\nexport async function listCheckpoints(workDir?: string): Promise<Checkpoint[]> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const checkpointPath = join(getTrieDirectory(dir), 'checkpoints.json');\n \n try {\n if (existsSync(checkpointPath)) {\n const log: CheckpointLog = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n return log.checkpoints;\n }\n } catch {\n // File doesn't exist or is corrupted\n }\n \n return [];\n}\n\n/**\n * Get the last checkpoint\n */\nexport async function getLastCheckpoint(workDir?: string): Promise<Checkpoint | null> {\n const checkpoints = await listCheckpoints(workDir);\n const last = checkpoints[checkpoints.length - 1];\n return last ?? null;\n}\n\n/**\n * Update AGENTS.md with checkpoint info\n */\nasync function updateAgentsMdWithCheckpoint(checkpoint: Checkpoint, workDir: string): Promise<void> {\n const agentsPath = join(getTrieDirectory(workDir), 'AGENTS.md');\n \n let content = '';\n try {\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n }\n } catch {\n content = '';\n }\n \n // Find or create checkpoint section\n const checkpointSection = `\n## Last Checkpoint\n\n- **ID:** ${checkpoint.id}\n- **Time:** ${checkpoint.timestamp}\n${checkpoint.message ? `- **Message:** ${checkpoint.message}` : ''}\n${checkpoint.files.length > 0 ? `- **Files:** ${checkpoint.files.length} files` : ''}\n${checkpoint.notes ? `- **Notes:** ${checkpoint.notes}` : ''}\n`;\n \n // Replace existing checkpoint section or append\n const checkpointRegex = /## Last Checkpoint[\\s\\S]*?(?=\\n## |\\n---|\\Z)/;\n if (checkpointRegex.test(content)) {\n content = content.replace(checkpointRegex, checkpointSection.trim());\n } else {\n content = content.trim() + '\\n\\n' + checkpointSection.trim() + '\\n';\n }\n \n await writeFile(agentsPath, content);\n}\n\n/**\n * CLI handler for checkpoint command\n */\nexport async function handleCheckpointCommand(args: string[]): Promise<void> {\n const subcommand = args[0] || 'save';\n \n switch (subcommand) {\n case 'save': {\n // Parse options\n let message: string | undefined;\n let notes: string | undefined;\n const files: string[] = [];\n \n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg === '-m' || arg === '--message') {\n message = args[++i] ?? '';\n } else if (arg === '-n' || arg === '--notes') {\n notes = args[++i] ?? '';\n } else if (arg === '-f' || arg === '--file') {\n const file = args[++i];\n if (file) files.push(file);\n } else if (arg && !arg.startsWith('-')) {\n // Treat as message if no flag\n message = arg;\n }\n }\n \n const opts: { message?: string; files?: string[]; notes?: string } = { files };\n if (message) opts.message = message;\n if (notes) opts.notes = notes;\n const checkpoint = await saveCheckpoint(opts);\n \n console.log('\\n Checkpoint saved\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${checkpoint.timestamp}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('\\n Context saved to .trie/\\n');\n break;\n }\n \n case 'list': {\n const checkpoints = await listCheckpoints();\n \n if (checkpoints.length === 0) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Checkpoints:\\n');\n for (const cp of checkpoints.slice(-10).reverse()) {\n const date = new Date(cp.timestamp).toLocaleString();\n console.log(` ${cp.id} ${date} ${cp.message || '(no message)'}`);\n }\n console.log('');\n break;\n }\n \n case 'last': {\n const checkpoint = await getLastCheckpoint();\n \n if (!checkpoint) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Last Checkpoint:\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${new Date(checkpoint.timestamp).toLocaleString()}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.notes) {\n console.log(` Notes: ${checkpoint.notes}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('');\n break;\n }\n \n default:\n console.log(`\n Usage: trie checkpoint [command] [options]\n\n Commands:\n save [message] Save a checkpoint (default)\n list List recent checkpoints\n last Show the last checkpoint\n\n Options:\n -m, --message Checkpoint message\n -n, --notes Additional notes\n -f, --file File to include (can be repeated)\n\n Examples:\n trie checkpoint \"finished auth flow\"\n trie checkpoint save -m \"WIP: payment integration\" -n \"needs testing\"\n trie checkpoint list\n`);\n }\n}\n","import { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from './workspace.js';\n\nconst INIT_MARKERS = [\n 'PROJECT.md',\n 'RULES.md',\n 'TEAM.md',\n 'BOOTSTRAP.md',\n 'AGENTS.md',\n 'config.json',\n];\n\nexport function isTrieInitialized(workDir?: string): boolean {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(dir);\n return INIT_MARKERS.some((marker) => existsSync(join(trieDir, marker)));\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nimport { ContextGraph } from './graph.js';\nimport type { ContextSnapshot } from './types.js';\n\nconst DEFAULT_JSON_NAME = 'context.json';\n\nexport async function exportToJson(graph: ContextGraph, targetPath?: string): Promise<string> {\n const snapshot = await graph.getSnapshot();\n const json = JSON.stringify(snapshot, null, 2);\n\n const outputPath = targetPath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME);\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, json, 'utf8');\n\n return json;\n}\n\nexport async function importFromJson(\n graph: ContextGraph,\n json: string,\n sourcePath?: string\n): Promise<void> {\n const payload =\n json.trim().length > 0\n ? json\n : await fs.readFile(sourcePath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME), 'utf8');\n\n const snapshot = JSON.parse(payload) as ContextSnapshot;\n await graph.applySnapshot(snapshot);\n}\n","import path from 'node:path';\n\nimport type { IncidentNode } from './nodes.js';\nimport type { ContextGraph } from './graph.js';\nimport { FilePathTrie, type IncidentMetadata } from './file-trie.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport interface IncidentIndexOptions {\n persistPath?: string;\n}\n\nexport class IncidentIndex {\n private readonly graph: ContextGraph;\n private readonly trie: FilePathTrie;\n private readonly projectRoot: string;\n\n constructor(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions) {\n this.graph = graph;\n this.projectRoot = projectRoot;\n this.trie = new FilePathTrie(\n options?.persistPath ?? path.join(getTrieDirectory(projectRoot), 'incident-trie.json')\n );\n }\n\n static async build(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions): Promise<IncidentIndex> {\n const index = new IncidentIndex(graph, projectRoot, options);\n await index.rebuild();\n return index;\n }\n\n async rebuild(): Promise<void> {\n const nodes = await this.graph.listNodes();\n const incidents = nodes.filter((n) => n.type === 'incident') as IncidentNode[];\n\n for (const incident of incidents) {\n const files = await this.getFilesForIncident(incident.id);\n this.addIncidentToTrie(incident, files);\n }\n }\n\n addIncidentToTrie(incident: IncidentNode, files: string[]): void {\n const meta: IncidentMetadata = {\n id: incident.id,\n file: '',\n description: incident.data.description,\n severity: incident.data.severity,\n timestamp: incident.data.timestamp,\n };\n\n for (const file of files) {\n const normalized = this.normalizePath(file);\n this.trie.addIncident(normalized, { ...meta, file: normalized });\n }\n }\n\n getFileTrie(): FilePathTrie {\n return this.trie;\n }\n\n private async getFilesForIncident(incidentId: string): Promise<string[]> {\n const files = new Set<string>();\n const edges = await this.graph.getEdges(incidentId, 'both');\n\n // Traverse connected changes to pull file lists\n for (const edge of edges) {\n if (edge.type === 'causedBy' || edge.type === 'leadTo') {\n // Identify the change node id regardless of direction\n const changeId = edge.type === 'causedBy' ? edge.to_id : edge.from_id;\n const change = await this.graph.getNode('change', changeId);\n if (change?.data && 'files' in change.data && Array.isArray(change.data.files)) {\n (change.data.files as string[]).forEach((f: string) => files.add(f));\n }\n }\n\n // If there are direct file links, capture them as well\n if (edge.type === 'affects') {\n const fileNode =\n (await this.graph.getNode('file', edge.to_id)) ||\n (await this.graph.getNode('file', edge.from_id));\n if (fileNode && typeof (fileNode as any).data?.path === 'string') {\n files.add((fileNode as any).data.path);\n }\n }\n }\n\n return Array.from(files);\n }\n\n private normalizePath(filePath: string): string {\n const absolute = path.isAbsolute(filePath) ? filePath : path.join(this.projectRoot, filePath);\n const relative = path.relative(this.projectRoot, absolute);\n return relative.replace(/\\\\/g, '/');\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { Trie } from '../trie/trie.js';\n\nexport interface IncidentMetadata {\n id: string;\n file: string;\n description: string;\n severity: 'minor' | 'major' | 'critical' | string;\n timestamp: string;\n}\n\nexport interface HotZone {\n path: string;\n incidentCount: number;\n confidence: number;\n}\n\nfunction normalizePath(filePath: string): string {\n const normalized = filePath.replace(/\\\\/g, '/');\n return normalized.startsWith('./') ? normalized.slice(2) : normalized;\n}\n\nexport class FilePathTrie {\n private trie: Trie<IncidentMetadata[]> = new Trie();\n private persistPath?: string;\n\n constructor(persistPath?: string) {\n if (persistPath) this.persistPath = persistPath;\n if (persistPath && fs.existsSync(persistPath)) {\n try {\n const raw = fs.readFileSync(persistPath, 'utf-8');\n if (raw.trim().length > 0) {\n const json = JSON.parse(raw);\n this.trie = Trie.fromJSON<IncidentMetadata[]>(json);\n }\n } catch {\n this.trie = new Trie();\n }\n }\n }\n\n addIncident(filePath: string, incident: IncidentMetadata): void {\n const key = normalizePath(filePath);\n const existing = this.trie.search(key);\n const incidents = existing.found && Array.isArray(existing.value) ? existing.value : [];\n incidents.push(incident);\n this.trie.insert(key, incidents);\n this.persist();\n }\n\n getIncidents(filePath: string): IncidentMetadata[] {\n const key = normalizePath(filePath);\n const result = this.trie.search(key);\n return result.found && Array.isArray(result.value) ? result.value : [];\n }\n\n getDirectoryIncidents(prefix: string): IncidentMetadata[] {\n const normalizedPrefix = normalizePath(prefix);\n const matches = this.trie.getWithPrefix(normalizedPrefix);\n return matches.flatMap((m) => (Array.isArray(m.value) ? m.value : [])).filter(Boolean);\n }\n\n getHotZones(threshold: number): HotZone[] {\n const matches = this.trie.getWithPrefix('');\n const zones: HotZone[] = [];\n\n for (const match of matches) {\n const incidents = Array.isArray(match.value) ? match.value : [];\n if (incidents.length >= threshold) {\n zones.push({\n path: match.pattern,\n incidentCount: incidents.length,\n confidence: this.calculateConfidence(incidents.length),\n });\n }\n }\n\n return zones.sort((a, b) => b.incidentCount - a.incidentCount);\n }\n\n suggestPaths(partial: string, limit = 5): Array<{ path: string; incidentCount: number }> {\n const normalized = normalizePath(partial);\n const results = this.trie.getWithPrefix(normalized);\n return results\n .map((r) => ({\n path: r.pattern,\n incidentCount: Array.isArray(r.value) ? r.value.length : 0,\n }))\n .sort((a, b) => b.incidentCount - a.incidentCount)\n .slice(0, limit);\n }\n\n timeLookup(path: string): number {\n const start = performance.now();\n this.getIncidents(path);\n return performance.now() - start;\n }\n\n toJSON(): object {\n return this.trie.toJSON();\n }\n\n private calculateConfidence(count: number): number {\n const capped = Math.min(count, 10);\n return Math.round((capped / 10) * 100) / 100; // 0-1 scale\n }\n\n private persist(): void {\n if (!this.persistPath) return;\n try {\n const dir = path.dirname(this.persistPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.persistPath, JSON.stringify(this.trie.toJSON()), 'utf-8');\n } catch {\n // Persistence is best-effort; ignore failures\n }\n }\n}\n","export class TrieError extends Error {\n code: string;\n recoverable: boolean;\n userMessage: string;\n\n constructor(message: string, code: string, userMessage: string, recoverable = true) {\n super(message);\n this.code = code;\n this.recoverable = recoverable;\n this.userMessage = userMessage;\n }\n}\n\nexport class GraphError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'GRAPH_ERROR',\n 'Trie had trouble accessing its memory. Try again or re-run trie reconcile.',\n true\n );\n }\n}\n\nexport class GitError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'GIT_ERROR',\n 'Git info is unavailable. Is this a git repo? Commit once, or pass --files to trie check.',\n true\n );\n }\n}\n\nexport class NetworkError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'NETWORK_ERROR',\n 'Network unavailable. Running in offline mode; AI calls skipped.',\n true\n );\n }\n}\n\nexport class MissingAPIKeyError extends TrieError {\n constructor(message = 'Missing ANTHROPIC_API_KEY') {\n super(\n message,\n 'MISSING_API_KEY',\n 'No API key detected. Set ANTHROPIC_API_KEY for AI-powered analysis (deeper issue detection, smarter fixes). Running in pattern-only mode.',\n true\n );\n }\n}\n\nexport function formatFriendlyError(error: unknown): { userMessage: string; code: string } {\n if (error instanceof TrieError) {\n return { userMessage: error.userMessage, code: error.code };\n }\n return {\n userMessage: 'Something went wrong. Try again or run with --offline.',\n code: 'UNKNOWN'\n };\n}\n","/**\n * Audit logger stub\n * Audit functionality has been integrated into decision ledger\n */\n\nexport interface AuditStatistics {\n totalScans: number;\n totalIssues: number;\n criticalCount: number;\n seriousCount: number;\n moderateCount: number;\n lowCount: number;\n totalExecutions: number;\n successfulExecutions: number;\n failedExecutions: number;\n uniqueSkills: number;\n totalCommands: number;\n blockedCommands: number;\n totalNetworkCalls: number;\n blockedNetworkCalls: number;\n}\n\nexport interface AuditEntry {\n id: string;\n timestamp: string;\n command: string;\n status: string;\n commands?: ExecutedCommand[];\n}\n\nexport interface ExecutedCommand {\n command: string;\n timestamp: string;\n exitCode?: number;\n duration?: number;\n stdout?: string;\n stderr?: string;\n}\n\nexport interface SkillExecution {\n skillName: string;\n skillSource: string;\n triggeredBy: 'scan' | 'mcp' | 'cli' | 'watch' | 'manual';\n targetPath: string;\n startedAt: string;\n completedAt?: string;\n success?: boolean;\n error?: string;\n commands?: ExecutedCommand[];\n}\n\nexport function formatAuditLog(_entry: AuditEntry): string {\n return 'Audit logging has been integrated into the decision ledger';\n}\n\nexport function getAuditStatistics(): AuditStatistics {\n return {\n totalScans: 0,\n totalIssues: 0,\n criticalCount: 0,\n seriousCount: 0,\n moderateCount: 0,\n lowCount: 0,\n totalExecutions: 0,\n successfulExecutions: 0,\n failedExecutions: 0,\n uniqueSkills: 0,\n totalCommands: 0,\n blockedCommands: 0,\n totalNetworkCalls: 0,\n blockedNetworkCalls: 0,\n };\n}\n\nexport function createAuditEntry(\n skillName: string, \n skillSource: string, \n triggeredBy: SkillExecution['triggeredBy'], \n targetPath: string\n): SkillExecution {\n return {\n skillName,\n skillSource,\n triggeredBy,\n targetPath,\n startedAt: new Date().toISOString(),\n commands: [],\n };\n}\n\nexport function completeAuditEntry(\n entry: SkillExecution, \n success: boolean, \n error?: string\n): SkillExecution {\n const result: SkillExecution = {\n ...entry,\n completedAt: new Date().toISOString(),\n success,\n };\n if (error !== undefined) {\n result.error = error;\n }\n return result;\n}\n\nexport async function logSkillExecution(_execution: SkillExecution): Promise<void> {\n // Stub - no-op\n}\n\nexport async function getRecentAuditLogs(_limit: number = 10): Promise<AuditEntry[]> {\n return [];\n}\n\nexport async function getSkillAuditLogs(_skillName: string): Promise<AuditEntry[]> {\n return [];\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { runExecFile } from '../utils/command-runner.js';\n\nexport interface Commit {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface Change {\n path: string;\n status: string;\n oldPath?: string;\n}\n\nasync function execGit(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await runExecFile(\n 'git',\n ['-C', cwd, ...args],\n { actor: 'internal:git', triggeredBy: 'manual', targetPath: cwd },\n { maxBuffer: 10 * 1024 * 1024, captureOutput: false }\n );\n return stdout.trim();\n } catch (error: any) {\n const stderr: string | undefined = error?.stderr?.toString();\n // Gracefully handle non-git directories and repos with no commits\n if (stderr?.includes('not a git repository') || stderr?.includes('does not have any commits')) {\n return null;\n }\n throw error;\n }\n}\n\nasync function ensureRepo(projectPath: string): Promise<boolean> {\n const result = await execGit(['rev-parse', '--is-inside-work-tree'], projectPath);\n return result === 'true';\n}\n\nfunction parseNameStatus(output: string): Change[] {\n return output\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parts = line.split('\\t');\n const status = parts[0] ?? '';\n const filePath = parts[1] ?? '';\n const oldPath = parts[2];\n const change: Change = { status, path: filePath };\n if (oldPath) change.oldPath = oldPath;\n return change;\n })\n .filter((entry) => entry.path.length > 0);\n}\n\nexport async function getRecentCommits(projectPath: string, limit: number): Promise<Commit[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const output = await execGit(\n ['log', `-n`, String(limit), '--pretty=format:%H%x09%an%x09%ad%x09%s', '--date=iso'],\n projectPath\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [hash, author, date, message] = line.split('\\t');\n return { hash, author, date, message } as Commit;\n });\n}\n\nexport async function getLastCommit(projectPath: string): Promise<Commit | null> {\n const commits = await getRecentCommits(projectPath, 1);\n return commits[0] ?? null;\n}\n\nexport async function getStagedChanges(projectPath: string): Promise<Change[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const output = await execGit(['diff', '--cached', '--name-status'], projectPath);\n if (!output) return [];\n return parseNameStatus(output);\n}\n\nexport async function getUncommittedChanges(projectPath: string): Promise<Change[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const changes: Change[] = [];\n\n const unstaged = await execGit(['diff', '--name-status'], projectPath);\n if (unstaged) {\n changes.push(...parseNameStatus(unstaged));\n }\n\n const untracked = await execGit(['ls-files', '--others', '--exclude-standard'], projectPath);\n if (untracked) {\n changes.push(\n ...untracked\n .split('\\n')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => ({ status: '??', path: p }))\n );\n }\n\n return changes;\n}\n\n/**\n * Get a flat list of changed file paths in the working tree.\n * Convenience helper used by tooling (e.g. cache invalidation).\n *\n * Returns null if not a git repository.\n */\nexport async function getGitChangedFiles(projectPath: string): Promise<string[] | null> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return null;\n\n const [staged, uncommitted] = await Promise.all([\n getStagedChanges(projectPath).catch(() => []),\n getUncommittedChanges(projectPath).catch(() => []),\n ]);\n\n const paths = new Set<string>();\n for (const change of [...staged, ...uncommitted]) {\n if (change.path) paths.add(change.path);\n if (change.oldPath) paths.add(change.oldPath);\n }\n\n return [...paths];\n}\n\nexport async function getDiff(projectPath: string, commitHash: string): Promise<string> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return '';\n\n const diff = await execGit(['show', commitHash, '--unified=3', '--no-color'], projectPath);\n return diff ?? '';\n}\n\nexport async function getWorkingTreeDiff(projectPath: string, stagedOnly = false): Promise<string> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return '';\n\n const args = stagedOnly ? ['diff', '--cached', '--unified=3', '--no-color'] : ['diff', '--unified=3', '--no-color'];\n const diff = await execGit(args, projectPath);\n return diff ?? '';\n}\n\nexport async function getUnpushedCommits(projectPath: string): Promise<Commit[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n // Handles detached HEAD by falling back to HEAD if upstream missing\n const upstream = await execGit(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], projectPath);\n if (!upstream) {\n return getRecentCommits(projectPath, 10);\n }\n\n const output = await execGit(['log', `${upstream}..HEAD`, '--pretty=format:%H%x09%an%x09%ad%x09%s', '--date=iso'], projectPath);\n if (!output) return [];\n\n return output.split('\\n').filter(Boolean).map((line) => {\n const [hash, author, date, message] = line.split('\\t');\n return { hash, author, date, message } as Commit;\n });\n}\n\nexport function resolveRepoPath(projectPath: string): string {\n const gitDir = path.join(projectPath, '.git');\n if (existsSync(gitDir)) return projectPath;\n return projectPath;\n}\n\n/**\n * Check if the given path is inside a git repository\n */\nexport async function isGitRepo(projectPath: string): Promise<boolean> {\n const result = await execGit(['rev-parse', '--is-inside-work-tree'], projectPath);\n return result === 'true';\n}\n\n/**\n * Get files changed since a given timestamp\n * Uses git log to find commits after timestamp, then gets affected files\n * Returns null if not a git repo or on error\n */\nexport async function getChangedFilesSinceTimestamp(\n projectPath: string,\n timestamp: number\n): Promise<string[] | null> {\n const isRepo = await isGitRepo(projectPath);\n if (!isRepo) return null;\n\n try {\n // Convert timestamp to ISO date for git\n const sinceDate = new Date(timestamp).toISOString();\n \n // Set timeout for git operations (5 seconds total)\n const GIT_TIMEOUT_MS = 5000;\n const startTime = Date.now();\n \n // Get all files that changed in commits since the timestamp\n // Use Promise.race to timeout if git operations take too long\n const committedChangesPromise = execGit(\n ['log', `--since=${sinceDate}`, '--name-only', '--pretty=format:'],\n projectPath\n );\n const committedChangesTimeout = new Promise<string | null>((resolve) => {\n setTimeout(() => resolve(null), GIT_TIMEOUT_MS);\n });\n const committedChanges = await Promise.race([committedChangesPromise, committedChangesTimeout]);\n\n // Check if we've exceeded timeout\n if (Date.now() - startTime > GIT_TIMEOUT_MS) {\n return null;\n }\n\n // Get currently modified files (staged + unstaged) - run in parallel with timeout\n const stagedPromise = execGit(['diff', '--cached', '--name-only'], projectPath);\n const unstagedPromise = execGit(['diff', '--name-only'], projectPath);\n const untrackedPromise = execGit(\n ['ls-files', '--others', '--exclude-standard'],\n projectPath\n );\n \n const timeoutPromise = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), Math.max(0, GIT_TIMEOUT_MS - (Date.now() - startTime)));\n });\n \n const [stagedChanges, unstagedChanges, untrackedFiles] = await Promise.race([\n Promise.all([stagedPromise, unstagedPromise, untrackedPromise]),\n timeoutPromise.then(() => [null, null, null] as const)\n ]);\n\n // Combine all changed files\n const changedFiles = new Set<string>();\n \n const addFiles = (output: string | null) => {\n if (output) {\n output.split('\\n')\n .map(f => f.trim())\n .filter(Boolean)\n .forEach(f => changedFiles.add(path.join(projectPath, f)));\n }\n };\n\n addFiles(committedChanges);\n addFiles(stagedChanges);\n addFiles(unstagedChanges);\n addFiles(untrackedFiles);\n\n return Array.from(changedFiles);\n } catch {\n return null;\n }\n}\n","/**\n * Command Runner (with audit logging)\n *\n * Goal: Whenever Trie runs a shell command, record:\n * - command string\n * - exit code\n * - duration\n * - optional (redacted) stdout/stderr\n */\nimport { exec, execFile, execSync, type ExecException } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport {\n createAuditEntry,\n completeAuditEntry,\n logSkillExecution,\n type ExecutedCommand,\n type SkillExecution,\n} from '../skills/audit-logger.js';\n\nconst execAsync = promisify(exec);\nconst execFileAsync = promisify(execFile);\n\nexport type { ExecutedCommand, SkillExecution };\nexport type AuditTriggeredBy = SkillExecution['triggeredBy'];\n\nexport interface CommandAuditContext {\n /** Shown as `skillName` in audit logs; use something like `tool:pr-review` */\n actor: string;\n /** Where this came from in the product flow */\n triggeredBy: AuditTriggeredBy;\n /** Usually the working directory / repo path */\n targetPath: string;\n /** Optional string for `skillSource` */\n source?: string;\n}\n\nexport interface RunCommandOptions {\n cwd?: string;\n timeoutMs?: number;\n maxBuffer?: number;\n\n /** Capture stdout/stderr in the audit log */\n captureOutput?: boolean;\n /** Redact obvious secrets from captured output */\n redactOutput?: boolean;\n /** Max chars to keep per output stream */\n maxOutputChars?: number;\n}\n\nfunction redact(text: string): string {\n // Keep this conservative to avoid false redaction and avoid expensive processing.\n return text\n // Common key=value secrets\n .replace(/\\b(AWS|ANTHROPIC|OPENAI|GITHUB)_[A-Z0-9_]*\\s*=\\s*([^\\s\"'`]+)/gi, '$1_<REDACTED>=<REDACTED>')\n // Bearer tokens\n .replace(/\\bBearer\\s+[A-Za-z0-9\\-._~+/]+=*\\b/g, 'Bearer <REDACTED>')\n // GitHub tokens / generic tokens\n .replace(/\\bghp_[A-Za-z0-9]{20,}\\b/g, 'ghp_<REDACTED>')\n .replace(/\\b(?:xox[baprs]-)[A-Za-z0-9-]{10,}\\b/g, '<REDACTED_SLACK_TOKEN>')\n // AWS access key id (best-effort)\n .replace(/\\bAKIA[0-9A-Z]{16}\\b/g, 'AKIA<REDACTED>');\n}\n\nfunction clampOutput(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n return text.slice(0, maxChars) + `\\n…(truncated ${text.length - maxChars} chars)`;\n}\n\nfunction buildCommandRecord(command: string): ExecutedCommand {\n return {\n command,\n timestamp: new Date().toISOString(),\n };\n}\n\nasync function finalizeAndWrite(\n entry: SkillExecution,\n cmd: ExecutedCommand,\n outcome: { success: boolean; exitCode?: number; stdout?: string; stderr?: string; error?: string; startedAt: number },\n options?: Pick<RunCommandOptions, 'captureOutput' | 'redactOutput' | 'maxOutputChars'>\n): Promise<void> {\n const duration = Date.now() - outcome.startedAt;\n cmd.duration = duration;\n if (outcome.exitCode !== undefined) {\n cmd.exitCode = outcome.exitCode;\n }\n\n const captureOutput = options?.captureOutput ?? false;\n const redactOutput = options?.redactOutput ?? true;\n const maxOutputChars = options?.maxOutputChars ?? 2000;\n\n if (captureOutput) {\n const out = outcome.stdout ?? '';\n const err = outcome.stderr ?? '';\n cmd.stdout = redactOutput ? redact(clampOutput(out, maxOutputChars)) : clampOutput(out, maxOutputChars);\n cmd.stderr = redactOutput ? redact(clampOutput(err, maxOutputChars)) : clampOutput(err, maxOutputChars);\n }\n\n const completed = completeAuditEntry(entry, outcome.success, outcome.error);\n await logSkillExecution(completed);\n}\n\nexport async function runShellCommand(\n command: string,\n audit: CommandAuditContext,\n options?: RunCommandOptions\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const startedAt = Date.now();\n const entry = createAuditEntry(audit.actor, audit.source ?? 'trie', audit.triggeredBy, audit.targetPath);\n const cmd = buildCommandRecord(command);\n entry.commands?.push(cmd);\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: options?.cwd,\n timeout: options?.timeoutMs,\n maxBuffer: options?.maxBuffer,\n });\n\n await finalizeAndWrite(entry, cmd, { success: true, exitCode: 0, stdout, stderr, startedAt }, options);\n return { stdout: stdout ?? '', stderr: stderr ?? '', exitCode: 0 };\n } catch (e) {\n const err = e as ExecException & { stdout?: unknown; stderr?: unknown; code?: unknown };\n const stdout = typeof err.stdout === 'string' ? err.stdout : '';\n const stderr = typeof err.stderr === 'string' ? err.stderr : '';\n const exitCode = typeof err.code === 'number' ? err.code : 1;\n\n await finalizeAndWrite(\n entry,\n cmd,\n { success: false, exitCode, stdout, stderr, error: err.message, startedAt },\n // Capture output for failures by default (so audits are useful)\n { ...options, captureOutput: options?.captureOutput ?? true }\n );\n\n return { stdout, stderr, exitCode };\n }\n}\n\nexport function runShellCommandSync(\n command: string,\n audit: CommandAuditContext,\n options?: Omit<RunCommandOptions, 'timeoutMs'> & { timeoutMs?: number }\n): { stdout: string; exitCode: number } {\n const startedAt = Date.now();\n const entry = createAuditEntry(audit.actor, audit.source ?? 'trie', audit.triggeredBy, audit.targetPath);\n const cmd = buildCommandRecord(command);\n entry.commands?.push(cmd);\n\n try {\n const stdout = execSync(command, {\n cwd: options?.cwd,\n timeout: options?.timeoutMs,\n maxBuffer: options?.maxBuffer,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Fire-and-forget write; sync APIs can’t await.\n void finalizeAndWrite(entry, cmd, { success: true, exitCode: 0, stdout, stderr: '', startedAt }, options);\n return { stdout: stdout ?? '', exitCode: 0 };\n } catch (e) {\n const err = e as ExecException & { stdout?: unknown; stderr?: unknown; status?: unknown };\n const stdout = typeof err.stdout === 'string' ? err.stdout : '';\n const stderr = typeof err.stderr === 'string' ? err.stderr : '';\n const exitCode = typeof err.status === 'number' ? err.status : 1;\n\n void finalizeAndWrite(\n entry,\n cmd,\n { success: false, exitCode, stdout, stderr, error: err.message, startedAt },\n { ...options, captureOutput: options?.captureOutput ?? true }\n );\n\n return { stdout, exitCode };\n }\n}\n\nexport async function runExecFile(\n file: string,\n args: string[],\n audit: CommandAuditContext,\n options?: Omit<RunCommandOptions, 'timeoutMs'> & { timeoutMs?: number }\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const startedAt = Date.now();\n const command = [file, ...args].join(' ');\n const entry = createAuditEntry(audit.actor, audit.source ?? 'trie', audit.triggeredBy, audit.targetPath);\n const cmd = buildCommandRecord(command);\n entry.commands?.push(cmd);\n\n try {\n const { stdout, stderr } = await execFileAsync(file, args, {\n cwd: options?.cwd,\n timeout: options?.timeoutMs,\n maxBuffer: options?.maxBuffer,\n });\n\n await finalizeAndWrite(entry, cmd, { success: true, exitCode: 0, stdout: String(stdout ?? ''), stderr: String(stderr ?? ''), startedAt }, options);\n return { stdout: String(stdout ?? ''), stderr: String(stderr ?? ''), exitCode: 0 };\n } catch (e) {\n const err = e as ExecException & { stdout?: unknown; stderr?: unknown; code?: unknown };\n const stdout = typeof err.stdout === 'string' ? err.stdout : '';\n const stderr = typeof err.stderr === 'string' ? err.stderr : '';\n const exitCode = typeof err.code === 'number' ? err.code : 1;\n\n await finalizeAndWrite(\n entry,\n cmd,\n { success: false, exitCode, stdout, stderr, error: err.message, startedAt },\n { ...options, captureOutput: options?.captureOutput ?? true }\n );\n return { stdout, stderr, exitCode };\n }\n}\n\n","/**\n * Lightweight Bayesian-style confidence updater.\n * Treats confidence as probability in [0,1].\n */\n\nexport function bayesianUpdate(prior: number, evidence: number, weight = 1): number {\n const p = clamp(prior);\n const e = clamp(evidence);\n const w = Math.max(0, weight);\n // Blend prior with evidence weighted by w\n const posterior = (p * (1 - w)) + (e * w);\n return clamp(posterior);\n}\n\nexport function adjustConfidence(current: number, outcome: 'positive' | 'negative', step = 0.1): number {\n const delta = outcome === 'positive' ? step : -step;\n return clamp(current + delta);\n}\n\nfunction clamp(value: number): number {\n if (Number.isNaN(value)) return 0.5;\n return Math.min(1, Math.max(0, value));\n}\n","import { IncidentIndex } from '../context/incident-index.js';\nimport type { ContextGraph } from '../context/graph.js';\nimport type { ChangeNode, IncidentNode } from '../context/nodes.js';\n\nexport interface HotPattern {\n type: 'file' | 'directory';\n path: string;\n incidentCount: number;\n confidence: number;\n relatedFiles?: string[];\n}\n\nexport interface CoOccurrencePattern {\n files: [string, string];\n coOccurrences: number;\n confidence: number;\n}\n\nexport class TriePatternDiscovery {\n constructor(\n private graph: ContextGraph,\n private incidentIndex: IncidentIndex\n ) {}\n\n discoverHotPatterns(threshold = 3): HotPattern[] {\n const trie = this.incidentIndex.getFileTrie();\n const hotZones = trie.getHotZones(threshold);\n\n return hotZones.map((zone) => ({\n type: zone.path.endsWith('/') ? 'directory' : 'file',\n path: zone.path,\n incidentCount: zone.incidentCount,\n confidence: zone.confidence,\n relatedFiles: trie.getDirectoryIncidents(zone.path).map((i) => i.file)\n }));\n }\n\n async discoverCoOccurrences(minCount = 3): Promise<CoOccurrencePattern[]> {\n const incidents = await this.getAllIncidents();\n const coOccurrences: Map<string, Map<string, number>> = new Map();\n\n for (const inc of incidents) {\n const files = await this.getFilesForIncident(inc);\n for (let i = 0; i < files.length; i++) {\n for (let j = i + 1; j < files.length; j++) {\n const a = files[i]!;\n const b = files[j]!;\n if (!coOccurrences.has(a)) coOccurrences.set(a, new Map());\n const counts = coOccurrences.get(a)!;\n counts.set(b, (counts.get(b) || 0) + 1);\n }\n }\n }\n\n const patterns: CoOccurrencePattern[] = [];\n for (const [a, map] of coOccurrences.entries()) {\n for (const [b, count] of map.entries()) {\n if (count >= minCount) {\n const denom = Math.min(\n this.incidentIndex.getFileTrie().getIncidents(a).length || 1,\n this.incidentIndex.getFileTrie().getIncidents(b).length || 1\n );\n patterns.push({\n files: [a, b],\n coOccurrences: count,\n confidence: Math.min(1, count / denom)\n });\n }\n }\n }\n\n return patterns.sort((x, y) => y.confidence - x.confidence);\n }\n\n private async getAllIncidents(): Promise<IncidentNode[]> {\n const nodes = await this.graph.listNodes();\n return nodes.filter((n) => n.type === 'incident') as IncidentNode[];\n }\n\n private async getFilesForIncident(incident: IncidentNode): Promise<string[]> {\n const files = new Set<string>();\n const edges = await this.graph.getEdges(incident.id, 'both');\n\n for (const edge of edges) {\n if (edge.type === 'causedBy' || edge.type === 'leadTo') {\n const changeId = edge.type === 'causedBy' ? edge.to_id : edge.from_id;\n const change = await this.graph.getNode('change', changeId) as ChangeNode | null;\n if (change?.data?.files && Array.isArray(change.data.files)) {\n change.data.files.forEach((f: string) => files.add(f));\n }\n }\n }\n\n return Array.from(files).map((f) => f.replace(/\\\\/g, '/'));\n }\n}\n","import { ContextGraph } from '../context/graph.js';\nimport type { IncidentNode, PatternNode } from '../context/nodes.js';\nimport { IncidentIndex } from '../context/incident-index.js';\nimport { adjustConfidence } from './confidence.js';\nimport { TriePatternDiscovery } from './pattern-discovery.js';\n\nexport class LearningSystem {\n private incidentIndex: IncidentIndex;\n private discovery: TriePatternDiscovery;\n\n constructor(private graph: ContextGraph, projectPath: string) {\n this.incidentIndex = new IncidentIndex(graph, projectPath);\n this.discovery = new TriePatternDiscovery(graph, this.incidentIndex);\n }\n\n async onWarningHeeded(files: string[]): Promise<void> {\n await this.adjustPatterns(files, 'positive');\n }\n\n async onWarningIgnored(files: string[]): Promise<void> {\n await this.adjustPatterns(files, 'negative');\n }\n\n async onIncidentReported(incidentId: string, files: string[]): Promise<void> {\n const incident = await this.graph.getNode('incident', incidentId);\n if (incident && incident.type === 'incident') {\n this.incidentIndex.addIncidentToTrie(incident as IncidentNode, files);\n }\n await this.discoverAndStorePatterns();\n }\n\n async onFeedback(helpful: boolean, files: string[] = []): Promise<void> {\n await this.adjustPatterns(files, helpful ? 'positive' : 'negative');\n }\n\n private async adjustPatterns(files: string[], outcome: 'positive' | 'negative'): Promise<void> {\n if (!files.length) return;\n for (const file of files) {\n const patterns = await this.graph.getPatternsForFile(file);\n await Promise.all(patterns.map((p) => this.updatePatternConfidence(p, outcome)));\n }\n }\n\n private async updatePatternConfidence(pattern: PatternNode, outcome: 'positive' | 'negative'): Promise<void> {\n const current = pattern.data.confidence ?? 0.5;\n const updated = adjustConfidence(current, outcome, 0.05);\n await this.graph.updateNode('pattern', pattern.id, { confidence: updated, lastSeen: new Date().toISOString() });\n }\n\n private async discoverAndStorePatterns(): Promise<void> {\n const hotPatterns = this.discovery.discoverHotPatterns();\n for (const hot of hotPatterns) {\n await this.graph.addNode('pattern', {\n description: `${hot.type === 'directory' ? 'Directory' : 'File'} hot zone: ${hot.path}`,\n appliesTo: [hot.path],\n confidence: hot.confidence,\n occurrences: hot.incidentCount,\n firstSeen: new Date().toISOString(),\n lastSeen: new Date().toISOString(),\n isAntiPattern: true,\n source: 'local'\n });\n }\n }\n}\n","import { getRecentCommits, getDiff } from '../agent/git.js';\nimport { storeIssues } from '../memory/issue-store.js';\nimport { scanForVulnerabilities } from '../trie/vulnerability-signatures.js';\nimport { scanForVibeCodeIssues } from '../trie/vibe-code-signatures.js';\nimport type { Issue } from '../types/index.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { DecisionNodeData } from '../context/nodes.js';\nimport { LearningSystem } from '../agent/learning.js';\nimport path from 'node:path';\n\nexport interface LearningResult {\n learned: number;\n source: 'git-history' | 'manual-feedback';\n}\n\nexport class LearningEngine {\n private readonly projectPath: string;\n private readonly graph: ContextGraph;\n private readonly learningSystem: LearningSystem;\n\n constructor(projectPath: string, graph?: ContextGraph) {\n this.projectPath = projectPath;\n this.graph = graph || new ContextGraph(projectPath);\n this.learningSystem = new LearningSystem(this.graph, projectPath);\n }\n\n /**\n * Unified learning method: Scans history AND processes manual feedback\n */\n async learn(options: { \n limit?: number; \n manualFeedback?: { helpful: boolean; files: string[]; note?: string } \n } = {}): Promise<LearningResult[]> {\n const results: LearningResult[] = [];\n\n // 1. Implicit Learning from Git History\n if (!options.manualFeedback) {\n const implicitCount = await this.learnFromHistory(options.limit || 20);\n results.push({ learned: implicitCount, source: 'git-history' });\n }\n\n // 2. Manual Feedback Learning\n if (options.manualFeedback) {\n await this.recordManualFeedback(\n options.manualFeedback.helpful, \n options.manualFeedback.files, \n options.manualFeedback.note\n );\n results.push({ learned: options.manualFeedback.files.length || 1, source: 'manual-feedback' });\n }\n\n return results;\n }\n\n /**\n * Scan recent commits for implicit failure signals (reverts, fixes)\n */\n private async learnFromHistory(limit: number = 20): Promise<number> {\n const commits = await getRecentCommits(this.projectPath, limit);\n const issuesToStore: Issue[] = [];\n\n for (const commit of commits) {\n const isRevert = commit.message.toLowerCase().includes('revert') || commit.message.startsWith('Revert \"');\n const isFix = /fix(es|ed)?\\s+#\\d+/i.test(commit.message) || commit.message.toLowerCase().includes('bugfix');\n\n if (isRevert || isFix) {\n const type = isRevert ? 'revert' : 'fix';\n const diff = await getDiff(this.projectPath, commit.hash);\n const files = this.extractFilesFromDiff(diff);\n \n for (const file of files) {\n const learnedIssues = await this.extractIssuesFromDiff(diff, file, type, commit.message);\n issuesToStore.push(...learnedIssues);\n }\n }\n }\n\n if (issuesToStore.length > 0) {\n const result = await storeIssues(issuesToStore, path.basename(this.projectPath), this.projectPath);\n return result.stored;\n }\n\n return 0;\n }\n\n /**\n * Record manual feedback (trie ok/bad) and adjust pattern confidence\n */\n private async recordManualFeedback(helpful: boolean, files: string[], note?: string): Promise<void> {\n const context = files[0] ?? 'unspecified';\n const decision = await this.graph.addNode('decision', {\n context,\n decision: helpful ? 'helpful' : 'not helpful',\n reasoning: note ?? null,\n outcome: helpful ? 'good' : 'bad',\n timestamp: new Date().toISOString(),\n } satisfies DecisionNodeData);\n\n if (files.length > 0) {\n for (const file of files) {\n const fileNode = await this.graph.getNode('file', file);\n if (fileNode) {\n await this.graph.addEdge(decision.id, fileNode.id, 'affects');\n }\n }\n await this.learningSystem.onFeedback(helpful, files);\n }\n }\n\n private extractFilesFromDiff(diff: string): string[] {\n const files = new Set<string>();\n const lines = diff.split('\\n');\n for (const line of lines) {\n if (line.startsWith('+++ b/')) {\n files.add(line.slice(6));\n }\n }\n return Array.from(files);\n }\n\n private async extractIssuesFromDiff(diff: string, file: string, type: 'revert' | 'fix', message: string): Promise<Issue[]> {\n const issues: Issue[] = [];\n const badLines = this.getBadLinesFromDiff(diff, file, type);\n const content = badLines.join('\\n');\n\n if (!content) return [];\n\n const vulnerabilities = await scanForVulnerabilities(content, file);\n const vibeIssues = await scanForVibeCodeIssues(content, file);\n\n const allMatches = [...vulnerabilities, ...vibeIssues];\n\n for (const match of allMatches) {\n issues.push({\n id: `implicit-${type}-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n severity: 'serious',\n issue: `Implicit failure detected via ${type}: ${message}. Linked to pattern: ${match.category}`,\n fix: `Review the ${type} commit and avoid this pattern in ${file}.`,\n file: file,\n confidence: 0.7,\n autoFixable: false,\n agent: 'implicit-learning',\n category: match.category\n });\n }\n\n if (issues.length === 0) {\n issues.push({\n id: `implicit-${type}-${Date.now()}`,\n severity: 'moderate',\n issue: `Historical ${type} detected: ${message}`,\n fix: `Review the changes in ${file} from this commit to avoid regression.`,\n file: file,\n confidence: 0.5,\n autoFixable: false,\n agent: 'implicit-learning'\n });\n }\n\n return issues;\n }\n\n private getBadLinesFromDiff(diff: string, file: string, type: 'revert' | 'fix'): string[] {\n const badLines: string[] = [];\n const lines = diff.split('\\n');\n let inTargetFile = false;\n\n for (const line of lines) {\n if (line.startsWith('+++ b/') || line.startsWith('--- a/')) {\n inTargetFile = line.includes(file);\n continue;\n }\n\n if (!inTargetFile) continue;\n\n if (type === 'fix' && line.startsWith('-') && !line.startsWith('---')) {\n badLines.push(line.slice(1));\n } else if (type === 'revert' && line.startsWith('+') && !line.startsWith('+++')) {\n badLines.push(line.slice(1));\n }\n }\n\n return badLines;\n }\n}\n","import path from 'node:path';\n\nimport { analyzeDiff, type DiffSummary } from './diff-analyzer.js';\nimport {\n getStagedChanges,\n getUncommittedChanges,\n getWorkingTreeDiff,\n type Change\n} from './git.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { FileNode, FileNodeData } from '../context/nodes.js';\n\nexport interface PerceptionResult {\n staged: Change[];\n unstaged: Change[];\n diffSummary: DiffSummary;\n changeNodeId?: string;\n}\n\nexport async function perceiveCurrentChanges(\n projectPath: string,\n graph?: ContextGraph\n): Promise<PerceptionResult> {\n const ctxGraph = graph ?? new ContextGraph(projectPath);\n\n const [staged, unstaged] = await Promise.all([\n getStagedChanges(projectPath),\n getUncommittedChanges(projectPath)\n ]);\n\n const stagedDiff = await getWorkingTreeDiff(projectPath, true);\n const unstagedDiff = await getWorkingTreeDiff(projectPath, false);\n const combinedDiff = [stagedDiff, unstagedDiff].filter(Boolean).join('\\n');\n const diffSummary = analyzeDiff(combinedDiff);\n\n const filesTouched = new Set<string>();\n staged.forEach((c) => filesTouched.add(c.path));\n unstaged.forEach((c) => filesTouched.add(c.path));\n diffSummary.files.forEach((f) => filesTouched.add(f.filePath));\n\n const changeId = await upsertWorkingChange(ctxGraph, Array.from(filesTouched), projectPath);\n\n const result: PerceptionResult = {\n staged,\n unstaged,\n diffSummary\n };\n if (changeId) result.changeNodeId = changeId;\n return result;\n}\n\nasync function upsertWorkingChange(\n graph: ContextGraph,\n files: string[],\n projectPath: string\n): Promise<string | undefined> {\n if (files.length === 0) return undefined;\n\n const now = new Date().toISOString();\n const change = await graph.addNode('change', {\n commitHash: null,\n files,\n message: 'workspace changes',\n diff: null,\n author: null,\n timestamp: now,\n outcome: 'unknown'\n });\n\n for (const filePath of files) {\n const fileNode = await ensureFileNode(graph, filePath, projectPath);\n await graph.addEdge(change.id, fileNode.id, 'affects');\n }\n\n return change.id;\n}\n\nasync function ensureFileNode(\n graph: ContextGraph,\n filePath: string,\n projectPath: string\n): Promise<FileNode> {\n const normalized = path.resolve(projectPath, filePath);\n const existing = await graph.getNode('file', normalized);\n\n const now = new Date().toISOString();\n if (existing) {\n const data = existing.data as FileNodeData;\n await graph.updateNode('file', existing.id, {\n changeCount: (data.changeCount ?? 0) + 1,\n lastChanged: now\n });\n return (await graph.getNode('file', existing.id)) as FileNode;\n }\n\n const data: FileNodeData = {\n path: filePath,\n extension: path.extname(filePath),\n purpose: '',\n riskLevel: 'medium',\n whyRisky: null,\n changeCount: 1,\n lastChanged: now,\n incidentCount: 0,\n createdAt: now\n };\n\n return (await graph.addNode('file', data)) as FileNode;\n}\n","export interface DiffFileSummary {\n filePath: string;\n added: number;\n removed: number;\n functionsModified: string[];\n riskyPatterns: string[];\n}\n\nexport interface DiffSummary {\n files: DiffFileSummary[];\n totalAdded: number;\n totalRemoved: number;\n riskyFiles: string[];\n}\n\nconst RISKY_PATTERNS = [/auth/i, /token/i, /password/i, /secret/i, /validate/i, /sanitize/i];\n\nexport function analyzeDiff(diff: string): DiffSummary {\n const files: DiffFileSummary[] = [];\n let current: DiffFileSummary | null = null;\n\n const lines = diff.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('+++ b/')) {\n const filePath = line.replace('+++ b/', '').trim();\n current = {\n filePath,\n added: 0,\n removed: 0,\n functionsModified: [],\n riskyPatterns: []\n };\n files.push(current);\n continue;\n }\n\n if (!current) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n // Capture function names or signatures in hunk headers\n const match = line.match(/@@.*?(function\\s+([\\w$]+)|class\\s+([\\w$]+)|([\\w$]+\\s*\\())/i);\n const fnName = match?.[2] || match?.[3] || match?.[4];\n if (fnName) {\n current.functionsModified.push(fnName.replace('(', '').trim());\n }\n continue;\n }\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n current.added += 1;\n markRisk(line, current);\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n current.removed += 1;\n markRisk(line, current);\n }\n }\n\n const totalAdded = files.reduce((acc, f) => acc + f.added, 0);\n const totalRemoved = files.reduce((acc, f) => acc + f.removed, 0);\n const riskyFiles = files.filter((f) => f.riskyPatterns.length > 0).map((f) => f.filePath);\n\n return {\n files,\n totalAdded,\n totalRemoved,\n riskyFiles\n };\n}\n\nfunction markRisk(line: string, file: DiffFileSummary): void {\n for (const pattern of RISKY_PATTERNS) {\n if (pattern.test(line)) {\n const label = pattern.toString();\n if (!file.riskyPatterns.includes(label)) {\n file.riskyPatterns.push(label);\n }\n }\n }\n}\n","import path from 'node:path';\n\nimport type { RiskLevel } from '../types/index.js';\nimport type { PatternNode } from '../context/types.js';\nimport type { ContextGraph } from '../context/graph.js';\nimport type { FileNodeData, IncidentNode } from '../context/nodes.js';\n\nexport interface FileRiskResult {\n file: string;\n score: number;\n level: RiskLevel;\n reasons: string[];\n incidents: IncidentNode[];\n matchedPatterns: PatternNode[];\n}\n\nexport interface ChangeRiskResult {\n files: FileRiskResult[];\n overall: RiskLevel;\n score: number;\n shouldEscalate: boolean;\n}\n\nconst BASE_RISK: Record<RiskLevel, number> = {\n low: 10,\n medium: 35,\n high: 65,\n critical: 85\n};\n\nconst SENSITIVE_PATHS: { pattern: RegExp; weight: number; reason: string }[] = [\n { pattern: /auth|login|token|session/i, weight: 20, reason: 'touches authentication' },\n { pattern: /payment|billing|stripe|paypal|checkout/i, weight: 25, reason: 'touches payments' },\n { pattern: /secret|credential|env|config\\/security/i, weight: 15, reason: 'touches secrets/security config' },\n];\n\nfunction levelFromScore(score: number): RiskLevel {\n if (score >= 90) return 'critical';\n if (score >= 65) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n}\n\nexport async function scoreFile(\n graph: ContextGraph,\n filePath: string,\n matchedPatterns: PatternNode[] = []\n): Promise<FileRiskResult> {\n const reasons: string[] = [];\n const normalized = path.resolve(graph.projectRoot, filePath);\n const node = await graph.getNode('file', normalized);\n const incidents = await graph.getIncidentsForFile(filePath);\n\n let score = 10;\n const data = node?.data as FileNodeData | undefined;\n\n if (data) {\n score = BASE_RISK[data.riskLevel] ?? score;\n reasons.push(`baseline ${data.riskLevel}`);\n\n if (data.incidentCount > 0) {\n const incBoost = Math.min(data.incidentCount * 12, 36);\n score += incBoost;\n reasons.push(`historical incidents (+${incBoost})`);\n }\n\n if (data.changeCount > 5) {\n const changeBoost = Math.min((data.changeCount - 5) * 2, 12);\n score += changeBoost;\n reasons.push(`frequent changes (+${changeBoost})`);\n }\n\n if (data.lastChanged) {\n const lastChanged = new Date(data.lastChanged).getTime();\n const days = (Date.now() - lastChanged) / (1000 * 60 * 60 * 24);\n if (days > 60 && data.incidentCount === 0) {\n score -= 5;\n reasons.push('stable for 60d (-5)');\n }\n }\n }\n\n for (const { pattern, weight, reason } of SENSITIVE_PATHS) {\n if (pattern.test(filePath)) {\n score += weight;\n reasons.push(reason);\n }\n }\n\n if (matchedPatterns.length > 0) {\n const patternBoost = Math.min(\n matchedPatterns.reduce((acc, p) => acc + (p.data.confidence ?? 50) / 10, 0),\n 20\n );\n score += patternBoost;\n reasons.push(`pattern match (+${Math.round(patternBoost)})`);\n }\n\n if (incidents.length > 0) {\n const timestamps = incidents\n .map((i) => new Date(i.data.timestamp).getTime())\n .sort((a, b) => b - a);\n const recent = timestamps[0]!;\n const daysSince = (Date.now() - recent) / (1000 * 60 * 60 * 24);\n if (daysSince > 90) {\n score -= 5;\n reasons.push('no incidents in 90d (-5)');\n } else {\n score += 8;\n reasons.push('recent incident (+8)');\n }\n }\n\n const level = levelFromScore(score);\n return {\n file: filePath,\n score,\n level,\n reasons,\n incidents,\n matchedPatterns\n };\n}\n\nexport async function scoreChangeSet(\n graph: ContextGraph,\n files: string[],\n patternMatches: Record<string, PatternNode[]> = {}\n): Promise<ChangeRiskResult> {\n const fileResults: FileRiskResult[] = [];\n\n for (const file of files) {\n const patterns = patternMatches[file] ?? [];\n fileResults.push(await scoreFile(graph, file, patterns));\n }\n\n // Aggregate: use max file score, but boost if many files touched\n const maxScore = Math.max(...fileResults.map((f) => f.score), 10);\n const spreadBoost = files.length > 5 ? Math.min((files.length - 5) * 2, 10) : 0;\n const overallScore = maxScore + spreadBoost;\n const overall = levelFromScore(overallScore);\n\n const shouldEscalate = overall === 'critical' || overall === 'high';\n\n return {\n files: fileResults,\n overall,\n score: overallScore,\n shouldEscalate\n };\n}\n","import { ContextGraph } from '../context/graph.js';\nimport type { PatternNode } from '../context/nodes.js';\n\nexport interface PatternMatch {\n file: string;\n pattern: PatternNode;\n confidence: number;\n isAntiPattern: boolean;\n}\n\nexport async function matchPatternsForFiles(\n graph: ContextGraph,\n files: string[]\n): Promise<{ matches: PatternMatch[]; byFile: Record<string, PatternNode[]> }> {\n const matches: PatternMatch[] = [];\n const byFile: Record<string, PatternNode[]> = {};\n\n for (const file of files) {\n const patterns = await graph.getPatternsForFile(file);\n if (patterns.length === 0) continue;\n\n byFile[file] = patterns;\n\n for (const pattern of patterns) {\n matches.push({\n file,\n pattern,\n confidence: pattern.data.confidence,\n isAntiPattern: pattern.data.isAntiPattern\n });\n }\n }\n\n return { matches, byFile };\n}\n","import type { CodeContext, Agent, TriagingConfig } from '../types/index.js';\n\nexport class Triager {\n constructor(_config?: Partial<TriagingConfig>) {\n // Config no longer used - Trie is now purely a decision ledger\n }\n\n /**\n * Triage a change to select appropriate agents\n * Note: Skills/agents have been removed - Trie is now purely a decision ledger\n */\n async triage(\n _context: CodeContext,\n _forceAgents?: string[]\n ): Promise<Agent[]> {\n // No skills to triage - return empty array\n // Trie now focuses on decision ledger and learning from incidents\n return [];\n }\n\n /**\n * Get all available agent names (deprecated - returns empty array)\n */\n getAvailableAgents(): string[] {\n return [];\n }\n}\n","import { Worker } from 'worker_threads';\nimport { cpus } from 'os';\nimport { existsSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { StreamingManager } from './streaming.js';\nimport { CacheManager } from './cache-manager.js';\nimport { isInteractiveMode } from './progress.js';\n\ninterface ParallelTask {\n agent: Agent;\n files: string[];\n context: ScanContext;\n priority: number;\n timeoutMs: number;\n}\n\ninterface ParallelResult {\n agent: string;\n result: AgentResult;\n fromCache: boolean;\n executionTime: number;\n}\n\n/**\n * Parallel execution engine for Trie agents\n *\n * Features:\n * - True parallel execution using worker threads\n * - Intelligent scheduling based on agent priority\n * - Result caching and cache-aware scheduling\n * - Real-time progress streaming\n * - Dynamic resource management\n */\nexport class ParallelExecutor {\n private maxWorkers: number;\n private cache: CacheManager | null;\n private streaming?: StreamingManager;\n private activeWorkers: Set<Worker> = new Set();\n private cacheEnabled: boolean = true;\n private useWorkerThreads: boolean = false;\n private workerAvailable: boolean | null = null;\n private warnedWorkerFallback: boolean = false;\n\n constructor(\n cacheManager: CacheManager | null,\n maxWorkers: number = Math.max(2, Math.min(cpus().length - 1, 8)),\n options?: { cacheEnabled?: boolean; useWorkerThreads?: boolean }\n ) {\n this.maxWorkers = maxWorkers;\n this.cache = cacheManager;\n this.cacheEnabled = options?.cacheEnabled ?? true;\n this.useWorkerThreads = options?.useWorkerThreads ?? false;\n }\n\n /**\n * Set streaming manager for real-time updates\n */\n setStreaming(streaming: StreamingManager): void {\n this.streaming = streaming;\n }\n\n /**\n * Execute agents in parallel with intelligent scheduling\n */\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext\n ): Promise<Map<string, AgentResult>> {\n if (agents.length === 0) {\n return new Map();\n }\n\n // Initialize streaming\n if (this.streaming && this.streaming.getProgress().totalFiles === 0) {\n this.streaming.startScan(files.length);\n }\n\n // Check cache for existing results\n const cacheResults = new Map<string, AgentResult>();\n const uncachedTasks: ParallelTask[] = [];\n\n for (const agent of agents) {\n const cached = await this.checkAgentCache(agent, files);\n if (cached) {\n cacheResults.set(agent.name, cached);\n this.streaming?.completeAgent(agent.name, cached.issues);\n } else {\n uncachedTasks.push({\n agent,\n files,\n context,\n priority: agent.priority?.tier || 2,\n timeoutMs: context?.config?.timeoutMs || 120000\n });\n }\n }\n\n // Sort tasks by priority (tier 1 = highest priority)\n uncachedTasks.sort((a, b) => a.priority - b.priority);\n\n // Execute uncached tasks in parallel\n const parallelResults = await this.executeTasksParallel(uncachedTasks);\n\n // Cache new results\n await this.cacheResults(parallelResults);\n\n // Combine cached and new results\n const allResults = new Map<string, AgentResult>();\n\n // Add cached results\n for (const [agent, result] of cacheResults) {\n allResults.set(agent, result);\n }\n\n // Add new results\n for (const result of parallelResults) {\n allResults.set(result.agent, result.result);\n }\n\n // Complete streaming\n const allIssues = Array.from(allResults.values()).flatMap(r => r.issues);\n this.streaming?.completeScan(allIssues);\n\n return allResults;\n }\n\n /**\n * Check if agent has cached results for given files\n */\n private async checkAgentCache(agent: Agent, files: string[]): Promise<AgentResult | null> {\n if (!this.cacheEnabled || !this.cache) {\n return null;\n }\n\n const cachedIssues = await this.cache.getCachedBatch(files, agent.name);\n\n // Only use cache if we have results for ALL files\n if (cachedIssues.size === files.length) {\n const allIssues = Array.from(cachedIssues.values()).flat();\n return {\n agent: agent.name,\n issues: allIssues,\n executionTime: 0, // Cached\n success: true,\n metadata: {\n filesAnalyzed: files.length,\n linesAnalyzed: 0\n }\n };\n }\n\n return null;\n }\n\n /**\n * Execute tasks in parallel batches\n */\n private async executeTasksParallel(tasks: ParallelTask[]): Promise<ParallelResult[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult[] = [];\n const batches = this.createBatches(tasks, this.maxWorkers);\n\n for (const batch of batches) {\n const batchResults = await Promise.all(\n batch.map(task => this.executeTask(task))\n );\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Create batches for parallel execution\n */\n private createBatches(tasks: ParallelTask[], batchSize: number): ParallelTask[][] {\n const batches: ParallelTask[][] = [];\n\n for (let i = 0; i < tasks.length; i += batchSize) {\n batches.push(tasks.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(task: ParallelTask): Promise<ParallelResult> {\n const startTime = Date.now();\n\n this.streaming?.startAgent(task.agent.name);\n\n try {\n const result = this.canUseWorkers()\n ? await this.executeTaskInWorker(task)\n : await task.agent.scan(task.files, task.context);\n const executionTime = Date.now() - startTime;\n\n this.streaming?.completeAgent(task.agent.name, result.issues);\n\n return {\n agent: task.agent.name,\n result,\n fromCache: false,\n executionTime\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n this.streaming?.reportError(new Error(errorMessage), `Agent: ${task.agent.name}`);\n\n return {\n agent: task.agent.name,\n result: {\n agent: task.agent.name,\n issues: [],\n executionTime,\n success: false,\n error: errorMessage\n },\n fromCache: false,\n executionTime\n };\n }\n }\n\n private canUseWorkers(): boolean {\n if (!this.useWorkerThreads) {\n return false;\n }\n if (this.workerAvailable !== null) {\n return this.workerAvailable;\n }\n const workerUrl = this.getWorkerUrl();\n this.workerAvailable = existsSync(fileURLToPath(workerUrl));\n if (!this.workerAvailable && !this.warnedWorkerFallback && !isInteractiveMode()) {\n console.error('Worker threads unavailable; falling back to in-process agents.');\n this.warnedWorkerFallback = true;\n }\n return this.workerAvailable;\n }\n\n private getWorkerUrl(): URL {\n const distDir = new URL('.', import.meta.url);\n return new URL('workers/agent-worker.js', distDir);\n }\n\n private async executeTaskInWorker(task: ParallelTask): Promise<AgentResult> {\n // Use dirname to get the dist folder, then resolve to workers subfolder\n // This works whether the code is bundled into chunks or in utils/ folder\n const workerUrl = this.getWorkerUrl();\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(workerUrl, {\n workerData: {\n agentName: task.agent.name,\n files: task.files,\n context: task.context\n }\n } as ConstructorParameters<typeof Worker>[1]);\n\n this.activeWorkers.add(worker);\n\n const timeout = setTimeout(() => {\n worker.terminate().catch(() => undefined);\n reject(new Error(`Agent ${task.agent.name} timed out after ${task.timeoutMs}ms`));\n }, task.timeoutMs);\n\n worker.on('message', (message) => {\n if (message?.type === 'result') {\n clearTimeout(timeout);\n resolve(message.result as AgentResult);\n } else if (message?.type === 'error') {\n clearTimeout(timeout);\n reject(new Error(message.error));\n }\n });\n\n worker.on('error', (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n worker.on('exit', (code) => {\n this.activeWorkers.delete(worker);\n if (code !== 0) {\n clearTimeout(timeout);\n reject(new Error(`Worker stopped with exit code ${code}`));\n }\n });\n });\n }\n\n /**\n * Cache results for future use\n */\n private async cacheResults(results: ParallelResult[]): Promise<void> {\n if (!this.cacheEnabled || !this.cache) {\n return;\n }\n\n const cachePromises = results\n .filter(r => r.result.success && !r.fromCache)\n .map(r => {\n const issuesByFile = this.groupIssuesByFile(r.result.issues);\n const perFilePromises = Object.entries(issuesByFile).map(([file, issues]) =>\n this.cache!.setCached(file, r.agent, issues, r.executionTime)\n );\n return Promise.all(perFilePromises);\n });\n\n await Promise.allSettled(cachePromises);\n }\n\n /**\n * Cleanup resources\n */\n async cleanup(): Promise<void> {\n // Terminate any active workers\n const terminationPromises = Array.from(this.activeWorkers).map(worker =>\n worker.terminate()\n );\n\n await Promise.allSettled(terminationPromises);\n this.activeWorkers.clear();\n }\n\n private groupIssuesByFile(issues: AgentResult['issues']): Record<string, AgentResult['issues']> {\n const grouped: Record<string, AgentResult['issues']> = {};\n\n for (const issue of issues) {\n if (!grouped[issue.file]) {\n grouped[issue.file] = [];\n }\n grouped[issue.file]!.push(issue);\n }\n\n return grouped;\n }\n}\n\n/**\n * Smart agent prioritization based on dependencies and execution characteristics\n */\nexport function prioritizeAgents(agents: Agent[]): Agent[] {\n const prioritized = [...agents];\n\n // Sort by priority tier, then by estimated execution time\n prioritized.sort((a, b) => {\n const aTier = a.priority?.tier || 2;\n const bTier = b.priority?.tier || 2;\n\n if (aTier !== bTier) {\n return aTier - bTier; // Lower tier = higher priority\n }\n\n // Within same tier, prioritize faster agents\n const aTime = a.priority?.estimatedTimeMs || 1000;\n const bTime = b.priority?.estimatedTimeMs || 1000;\n\n return aTime - bTime;\n });\n\n return prioritized;\n}\n\n/**\n * Calculate optimal concurrency based on system resources and agent characteristics\n */\nexport function calculateOptimalConcurrency(): number {\n const numCPUs = cpus().length;\n const availableMemoryGB = process.memoryUsage().rss / 1024 / 1024 / 1024;\n\n // Conservative concurrency for stability\n let optimal = Math.max(2, Math.min(numCPUs - 1, 8));\n\n // Reduce concurrency if low memory\n if (availableMemoryGB < 2) {\n optimal = Math.max(2, Math.floor(optimal / 2));\n }\n\n // Increase slightly for systems with lots of CPU cores\n if (numCPUs > 8) {\n optimal = Math.min(optimal + 2, 12);\n }\n\n return optimal;\n}","import { readFile, writeFile, mkdir, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport type { Issue } from '../types/index.js';\nimport { isInteractiveMode } from './progress.js';\nimport { getTrieDirectory } from './workspace.js';\n\ninterface CacheEntry {\n version: string;\n timestamp: number;\n fileHash: string;\n fileSize: number;\n agent: string;\n issues: Issue[];\n executionTime: number;\n}\n\ninterface CacheIndex {\n version: string;\n created: number;\n entries: Record<string, CacheEntry>;\n}\n\nexport class CacheManager {\n private cacheDir: string;\n private indexPath: string;\n private readonly VERSION = '1.0.0';\n private readonly MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n private readonly MAX_ENTRIES = 1000;\n\n constructor(baseDir: string) {\n this.cacheDir = join(getTrieDirectory(baseDir), 'cache');\n this.indexPath = join(this.cacheDir, 'index.json');\n }\n\n /**\n * Generate cache key for a file and agent combination\n */\n private generateCacheKey(filePath: string, agent: string, fileHash: string): string {\n const key = `${filePath}:${agent}:${fileHash}`;\n return createHash('sha256').update(key).digest('hex').slice(0, 16);\n }\n\n /**\n * Get file hash for cache validation\n */\n private async getFileHash(filePath: string): Promise<{ hash: string; size: number; mtime: number }> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const stats = await stat(filePath);\n const hash = createHash('sha256').update(content).digest('hex').slice(0, 16);\n return {\n hash,\n size: stats.size,\n mtime: stats.mtime.getTime()\n };\n } catch {\n return { hash: '', size: 0, mtime: 0 };\n }\n }\n\n /**\n * Load cache index\n */\n private async loadIndex(): Promise<CacheIndex> {\n try {\n const content = await readFile(this.indexPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n }\n }\n\n /**\n * Save cache index\n */\n private async saveIndex(index: CacheIndex): Promise<void> {\n try {\n await mkdir(this.cacheDir, { recursive: true });\n await writeFile(this.indexPath, JSON.stringify(index, null, 2));\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to save cache index:', error);\n }\n }\n }\n\n /**\n * Clean up expired entries\n */\n private cleanupExpired(index: CacheIndex): CacheIndex {\n const now = Date.now();\n const validEntries: Record<string, CacheEntry> = {};\n\n for (const [key, entry] of Object.entries(index.entries)) {\n if (now - entry.timestamp < this.MAX_AGE_MS) {\n validEntries[key] = entry;\n }\n }\n\n // If still too many, keep the most recent ones\n const entries = Object.entries(validEntries);\n if (entries.length > this.MAX_ENTRIES) {\n entries.sort((a, b) => b[1].timestamp - a[1].timestamp);\n const limited = entries.slice(0, this.MAX_ENTRIES);\n return {\n ...index,\n entries: Object.fromEntries(limited)\n };\n }\n\n return {\n ...index,\n entries: validEntries\n };\n }\n\n /**\n * Get cached result for a file and agent\n * \n * Cache automatically invalidates when files change:\n * - Cache key includes file hash: hash(filePath:agent:fileHash)\n * - When file changes, hash changes, so cache key changes\n * - Old cache entry won't be found (different key)\n * - File is automatically rescanned\n * \n * This means cache auto-updates when Claude fixes code - no manual invalidation needed!\n */\n async getCached(filePath: string, agent: string): Promise<Issue[] | null> {\n try {\n const { hash, size: _size, mtime: _mtime } = await this.getFileHash(filePath);\n if (!hash) return null;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n const entry = index.entries[cacheKey];\n\n if (!entry) return null;\n\n // Validate entry is still fresh\n // Double-check hash matches (defense in depth)\n const isValid = entry.fileHash === hash &&\n entry.version === this.VERSION &&\n (Date.now() - entry.timestamp) < this.MAX_AGE_MS;\n\n if (!isValid) {\n delete index.entries[cacheKey];\n await this.saveIndex(index);\n return null;\n }\n\n return entry.issues;\n } catch {\n return null;\n }\n }\n\n /**\n * Cache result for a file and agent\n */\n async setCached(\n filePath: string,\n agent: string,\n issues: Issue[],\n executionTime: number\n ): Promise<void> {\n try {\n const { hash, size } = await this.getFileHash(filePath);\n if (!hash) return;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n\n index.entries[cacheKey] = {\n version: this.VERSION,\n timestamp: Date.now(),\n fileHash: hash,\n fileSize: size,\n agent,\n issues,\n executionTime\n };\n\n // Clean up old entries\n const cleanedIndex = this.cleanupExpired(index);\n await this.saveIndex(cleanedIndex);\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to cache result:', error);\n }\n }\n }\n\n /**\n * Check if multiple files have cached results\n */\n async getCachedBatch(files: string[], agent: string): Promise<Map<string, Issue[]>> {\n const results = new Map<string, Issue[]>();\n\n await Promise.all(\n files.map(async (file) => {\n const cached = await this.getCached(file, agent);\n if (cached) {\n results.set(file, cached);\n }\n })\n );\n\n return results;\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n totalEntries: number;\n totalSizeKB: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n agents: string[];\n hitRate?: number;\n }> {\n try {\n const index = await this.loadIndex();\n const entries = Object.values(index.entries);\n\n const totalSizeKB = entries.reduce((acc, entry) => acc + entry.fileSize, 0) / 1024;\n const timestamps = entries.map(e => e.timestamp);\n const agents = [...new Set(entries.map(e => e.agent))];\n\n return {\n totalEntries: entries.length,\n totalSizeKB: Math.round(totalSizeKB),\n oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,\n newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,\n agents\n };\n } catch {\n return {\n totalEntries: 0,\n totalSizeKB: 0,\n oldestEntry: null,\n newestEntry: null,\n agents: []\n };\n }\n }\n\n /**\n * Clean up stale cache entries by verifying file hashes\n * This removes entries where files have changed or no longer exist\n * Called periodically to keep cache clean\n * \n * Note: Since cache keys are hashed, we can't easily reverse-engineer file paths.\n * However, when getCached() is called, it naturally invalidates stale entries\n * by checking if the current file hash matches the cached hash. This method\n * proactively cleans up entries for known changed files.\n */\n async cleanupStaleEntries(filePaths?: string[]): Promise<number> {\n try {\n const index = await this.loadIndex();\n let removedCount = 0;\n const keysToRemove: string[] = [];\n\n // If specific files provided, check those files against all cache entries\n // We can't perfectly match entries to files without storing paths, but we can\n // try to identify likely matches by checking if regenerating keys matches\n if (filePaths && filePaths.length > 0) {\n // Get all unique agents from cache entries\n const agents = new Set<string>();\n for (const entry of Object.values(index.entries)) {\n agents.add(entry.agent);\n }\n\n // For each file+agent combination, check if cache entry is stale\n for (const filePath of filePaths) {\n try {\n const { hash: currentHash } = await this.getFileHash(filePath);\n if (!currentHash) {\n // File doesn't exist - can't clean up without knowing which entries are for it\n continue;\n }\n\n // Check each agent's potential cache entries for this file\n for (const agent of agents) {\n // Check all entries to find ones that might be for this file\n for (const [key, entry] of Object.entries(index.entries)) {\n if (entry.agent !== agent) continue;\n \n // If entry hash doesn't match current hash, it might be stale\n if (entry.fileHash !== currentHash) {\n // Check if this key was generated with the old hash for this file\n const oldKey = this.generateCacheKey(filePath, agent, entry.fileHash);\n if (oldKey === key) {\n // This entry is for this file but hash doesn't match - stale!\n keysToRemove.push(key);\n removedCount++;\n }\n }\n }\n }\n } catch {\n // File doesn't exist or can't be read - skip\n continue;\n }\n }\n }\n\n // Remove stale entries (avoid duplicates)\n const uniqueKeys = [...new Set(keysToRemove)];\n for (const key of uniqueKeys) {\n delete index.entries[key];\n }\n\n if (removedCount > 0) {\n await this.saveIndex(index);\n }\n\n return removedCount;\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to cleanup stale cache entries:', error);\n }\n return 0;\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise<void> {\n try {\n const emptyIndex: CacheIndex = {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n await this.saveIndex(emptyIndex);\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to clear cache:', error);\n }\n }\n }\n}","import type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { ParallelExecutor, calculateOptimalConcurrency } from '../utils/parallel-executor.js';\nimport { CacheManager } from '../utils/cache-manager.js';\nimport type { StreamingManager } from '../utils/streaming.js';\nimport { isInteractiveMode } from '../utils/progress.js';\n\nexport class Executor {\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext,\n options?: {\n streaming?: StreamingManager;\n parallel?: boolean;\n cacheEnabled?: boolean;\n maxConcurrency?: number;\n useWorkerThreads?: boolean;\n timeoutMs?: number;\n }\n ): Promise<AgentResult[]> {\n const parallel = options?.parallel ?? true;\n const cacheEnabled = options?.cacheEnabled ?? true;\n const maxConcurrency = options?.maxConcurrency ?? calculateOptimalConcurrency();\n const useWorkerThreads = options?.useWorkerThreads ?? false;\n\n if (!isInteractiveMode()) {\n console.error(`Executing ${agents.length} scouts ${parallel ? 'in parallel' : 'sequentially'}...`);\n }\n\n if (parallel) {\n const cacheManager = cacheEnabled ? new CacheManager(context.workingDir) : null;\n const executor = new ParallelExecutor(cacheManager, maxConcurrency, {\n cacheEnabled,\n useWorkerThreads\n });\n\n if (options?.streaming) {\n executor.setStreaming(options.streaming);\n }\n\n const results = await executor.executeAgents(agents, files, {\n ...context,\n config: { timeoutMs: options?.timeoutMs ?? 120000 }\n });\n\n return agents.map(agent => results.get(agent.name)!).filter(Boolean);\n }\n\n // Execute scouts in parallel with timeout\n const promises = agents.map(agent =>\n this.executeAgentWithTimeout(agent, files, context, options?.timeoutMs ?? 30000)\n );\n\n try {\n const results = await Promise.allSettled(promises);\n return results.map((result, index) => {\n if (result.status === 'fulfilled') {\n if (!isInteractiveMode()) {\n console.error(`${agents[index]!.name} completed in ${result.value.executionTime}ms`);\n }\n return result.value;\n } else {\n if (!isInteractiveMode()) {\n console.error(`${agents[index]!.name} failed:`, result.reason);\n }\n return {\n agent: agents[index]!.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason)\n };\n }\n });\n } catch (error) {\n if (!isInteractiveMode()) {\n console.error('Executor error:', error);\n }\n return agents.map(agent => ({\n agent: agent.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: 'Execution failed'\n }));\n }\n }\n\n private async executeAgentWithTimeout(\n agent: Agent,\n files: string[],\n context: ScanContext,\n timeoutMs: number = 30000 // 30 second timeout\n ): Promise<AgentResult> {\n return new Promise(async (resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Agent ${agent.name} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n try {\n const result = await agent.scan(files, context);\n clearTimeout(timeout);\n resolve(result);\n } catch (error) {\n clearTimeout(timeout);\n reject(error);\n }\n });\n }\n}","import { ContextGraph } from '../context/graph.js';\nimport type { IncidentNode, PatternNode } from '../context/nodes.js';\nimport type { RiskLevel, AgentResult, CodeContext, ScanContext } from '../types/index.js';\nimport { scoreChangeSet, type ChangeRiskResult, type FileRiskResult } from './risk-scorer.js';\nimport { matchPatternsForFiles } from './pattern-matcher.js';\nimport { Triager } from '../orchestrator/triager.js';\nimport { Executor } from '../orchestrator/executor.js';\n\nexport interface Reasoning {\n riskLevel: RiskLevel;\n shouldBlock: boolean;\n explanation: string;\n relevantIncidents: IncidentNode[];\n matchedPatterns: PatternNode[];\n recommendation: string;\n files: FileRiskResult[];\n agentResults?: AgentResult[];\n}\n\nexport interface ReasonOptions {\n runAgents?: boolean;\n codeContext?: CodeContext;\n scanContext?: Partial<ScanContext>;\n}\n\nfunction buildDefaultCodeContext(): CodeContext {\n return {\n changeType: 'general',\n isNewFeature: false,\n touchesUserData: false,\n touchesAuth: false,\n touchesPayments: false,\n touchesDatabase: false,\n touchesAPI: false,\n touchesUI: false,\n touchesHealthData: false,\n touchesSecurityConfig: false,\n linesChanged: 50,\n filePatterns: [],\n framework: 'unknown',\n language: 'typescript',\n touchesCrypto: false,\n touchesFileSystem: false,\n touchesThirdPartyAPI: false,\n touchesLogging: false,\n touchesErrorHandling: false,\n hasTests: false,\n complexity: 'medium',\n patterns: {\n hasAsyncCode: false,\n hasFormHandling: false,\n hasFileUploads: false,\n hasEmailHandling: false,\n hasRateLimiting: false,\n hasWebSockets: false,\n hasCaching: false,\n hasQueue: false\n }\n };\n}\n\nfunction buildExplanation(result: ChangeRiskResult): string {\n const top = [...result.files].sort((a, b) => b.score - a.score)[0];\n if (!top) return `Risk level ${result.overall} (no files provided)`;\n return `Risk level ${result.overall} because ${top.file} ${top.reasons.join(', ')}`;\n}\n\nfunction buildRecommendation(risk: RiskLevel, hasAntiPattern: boolean): string {\n if (hasAntiPattern || risk === 'critical') {\n return 'Block until reviewed: address anti-patterns and rerun targeted tests.';\n }\n if (risk === 'high') {\n return 'Require senior review and run full test suite before merge.';\n }\n if (risk === 'medium') {\n return 'Proceed with caution; run impacted tests and sanity checks.';\n }\n return 'Low risk; proceed but keep an eye on recent changes.';\n}\n\nexport async function reasonAboutChanges(\n projectPath: string,\n files: string[],\n options: ReasonOptions = {}\n): Promise<Reasoning> {\n const graph = new ContextGraph(projectPath);\n const { matches, byFile } = await matchPatternsForFiles(graph, files);\n const changeRisk = await scoreChangeSet(graph, files, byFile);\n\n const incidents: IncidentNode[] = [];\n for (const file of files) {\n const fileIncidents = await graph.getIncidentsForFile(file);\n incidents.push(...fileIncidents);\n }\n\n const hasAntiPattern = matches.some((m) => m.isAntiPattern);\n const riskLevel: RiskLevel = hasAntiPattern ? 'critical' : changeRisk.overall;\n const shouldBlock = hasAntiPattern || riskLevel === 'critical' || riskLevel === 'high';\n\n const reasoning: Reasoning = {\n riskLevel,\n shouldBlock,\n explanation: buildExplanation(changeRisk),\n relevantIncidents: incidents,\n matchedPatterns: matches.map((m) => m.pattern),\n recommendation: buildRecommendation(riskLevel, hasAntiPattern),\n files: changeRisk.files\n };\n\n if (options.runAgents) {\n const codeContext = options.codeContext ?? buildDefaultCodeContext();\n const triager = new Triager();\n // Skills removed - decision ledger now handles risk analysis\n const agents = await triager.triage(codeContext);\n\n if (agents.length > 0) {\n const executor = new Executor();\n const scanContext: ScanContext = {\n workingDir: projectPath,\n ...options.scanContext\n };\n if (codeContext.framework) scanContext.framework = codeContext.framework;\n if (codeContext.language) scanContext.language = codeContext.language;\n\n reasoning.agentResults = await executor.executeAgents(agents, files, scanContext, {\n parallel: true,\n timeoutMs: options.scanContext?.config?.timeoutMs ?? 60000\n });\n } else {\n reasoning.agentResults = [];\n }\n }\n\n return reasoning;\n}\n\n// Convenience wrapper to keep future CLI/MCP integration simple\nexport async function reasonAboutChangesHumanReadable(\n projectPath: string,\n files: string[],\n options: ReasonOptions = {}\n) {\n const reasoning = await reasonAboutChanges(projectPath, files, options);\n const { humanizeReasoning } = await import('../comprehension/index.js');\n return humanizeReasoning(reasoning);\n}\n"],"mappings":"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","names":["existsSync","join","existsSync","join","path","fs","path","fs","path","path","existsSync","path","path","path","path","data","path","existsSync","existsSync","readFile","writeFile","mkdir","join","join","readFile","mkdir","writeFile"]}