@triedotdev/mcp 1.0.164 → 1.0.165

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 (62) hide show
  1. package/README.md +16 -2
  2. package/dist/{chunk-62JD7MIS.js → chunk-5LRDF2WB.js} +15 -35
  3. package/dist/chunk-5LRDF2WB.js.map +1 -0
  4. package/dist/{chunk-D6E4Q4I6.js → chunk-CDG2GVBP.js} +279 -57
  5. package/dist/chunk-CDG2GVBP.js.map +1 -0
  6. package/dist/{chunk-5BYSJ7XT.js → chunk-GTKYBOXL.js} +13 -2
  7. package/dist/{chunk-5BYSJ7XT.js.map → chunk-GTKYBOXL.js.map} +1 -1
  8. package/dist/{chunk-ACU3IXZG.js → chunk-HC5P6FZD.js} +7 -7
  9. package/dist/{chunk-HFVPHQL3.js → chunk-IPNPHPNN.js} +9 -9
  10. package/dist/{chunk-OKK4QNK3.js → chunk-IS5UBN2R.js} +86 -12
  11. package/dist/chunk-IS5UBN2R.js.map +1 -0
  12. package/dist/{chunk-LLDZDU2Y.js → chunk-LR5M4RTN.js} +79 -1
  13. package/dist/chunk-LR5M4RTN.js.map +1 -0
  14. package/dist/{chunk-ERMLZJTK.js → chunk-M7HMBZ3R.js} +13 -13
  15. package/dist/chunk-OBQ74FOU.js +27 -0
  16. package/dist/chunk-OBQ74FOU.js.map +1 -0
  17. package/dist/{chunk-5TRCQAOE.js → chunk-RQ6QZBIN.js} +16 -5
  18. package/dist/chunk-RQ6QZBIN.js.map +1 -0
  19. package/dist/{chunk-IRZXBQVQ.js → chunk-SS2O3MTC.js} +134 -101
  20. package/dist/chunk-SS2O3MTC.js.map +1 -0
  21. package/dist/{chunk-LR46VMIE.js → chunk-WRYQHVPD.js} +5 -5
  22. package/dist/{chunk-Y4B3VEL7.js → chunk-YAL3SUBG.js} +435 -202
  23. package/dist/chunk-YAL3SUBG.js.map +1 -0
  24. package/dist/cli/main.js +215 -57
  25. package/dist/cli/main.js.map +1 -1
  26. package/dist/cli/yolo-daemon.js +15 -14
  27. package/dist/cli/yolo-daemon.js.map +1 -1
  28. package/dist/{fast-analyzer-LLZ6FLP5.js → fast-analyzer-54AHLVO5.js} +3 -3
  29. package/dist/{goal-manager-D6XKE3FY.js → goal-manager-563BNILQ.js} +5 -5
  30. package/dist/{goal-validator-4DDL7NBP.js → goal-validator-FJEDIYU7.js} +5 -5
  31. package/dist/{hypothesis-RI3Q33JB.js → hypothesis-4KC7XRBZ.js} +5 -5
  32. package/dist/index.js +16 -15
  33. package/dist/index.js.map +1 -1
  34. package/dist/{issue-store-DUR5UTYK.js → issue-store-FOS4T736.js} +3 -3
  35. package/dist/{ledger-ZTR63P3L.js → ledger-EDLPF6SB.js} +8 -2
  36. package/dist/project-state-AHPA77SM.js +28 -0
  37. package/dist/server/mcp-server.js +16 -15
  38. package/dist/sync-M2FSWPBC.js +12 -0
  39. package/dist/{tiered-storage-FHHAJR4P.js → tiered-storage-OP74NPJY.js} +2 -2
  40. package/dist/tiered-storage-OP74NPJY.js.map +1 -0
  41. package/dist/{trie-agent-NYSPGZYS.js → trie-agent-TM6ATSNR.js} +12 -12
  42. package/dist/trie-agent-TM6ATSNR.js.map +1 -0
  43. package/package.json +1 -1
  44. package/dist/chunk-5TRCQAOE.js.map +0 -1
  45. package/dist/chunk-62JD7MIS.js.map +0 -1
  46. package/dist/chunk-D6E4Q4I6.js.map +0 -1
  47. package/dist/chunk-IRZXBQVQ.js.map +0 -1
  48. package/dist/chunk-LLDZDU2Y.js.map +0 -1
  49. package/dist/chunk-OKK4QNK3.js.map +0 -1
  50. package/dist/chunk-Y4B3VEL7.js.map +0 -1
  51. /package/dist/{chunk-ACU3IXZG.js.map → chunk-HC5P6FZD.js.map} +0 -0
  52. /package/dist/{chunk-HFVPHQL3.js.map → chunk-IPNPHPNN.js.map} +0 -0
  53. /package/dist/{chunk-ERMLZJTK.js.map → chunk-M7HMBZ3R.js.map} +0 -0
  54. /package/dist/{chunk-LR46VMIE.js.map → chunk-WRYQHVPD.js.map} +0 -0
  55. /package/dist/{fast-analyzer-LLZ6FLP5.js.map → fast-analyzer-54AHLVO5.js.map} +0 -0
  56. /package/dist/{goal-manager-D6XKE3FY.js.map → goal-manager-563BNILQ.js.map} +0 -0
  57. /package/dist/{goal-validator-4DDL7NBP.js.map → goal-validator-FJEDIYU7.js.map} +0 -0
  58. /package/dist/{hypothesis-RI3Q33JB.js.map → hypothesis-4KC7XRBZ.js.map} +0 -0
  59. /package/dist/{issue-store-DUR5UTYK.js.map → issue-store-FOS4T736.js.map} +0 -0
  60. /package/dist/{ledger-ZTR63P3L.js.map → ledger-EDLPF6SB.js.map} +0 -0
  61. /package/dist/{tiered-storage-FHHAJR4P.js.map → project-state-AHPA77SM.js.map} +0 -0
  62. /package/dist/{trie-agent-NYSPGZYS.js.map → sync-M2FSWPBC.js.map} +0 -0
package/README.md CHANGED
@@ -105,7 +105,7 @@ Tools like Cursor Bugbot flag issues—but flagging doesn't help you avoid simil
105
105
  ### Built for Agent + Human Collaboration
106
106
 
107
107
  - **Shared governance ledger** - Single source of truth that agents and humans both read from and write to
108
- - **Digital signatures** - Ed25519 signatures prove who (human or agent) created each entry, automatic and zero-config
108
+ - **Digital signatures** - Ed25519 signatures prove who (human or agent) created each entry (`trie keys generate`)
109
109
  - **Accountability trail** - See exactly what decisions agents made and when, verify authenticity
110
110
  - **Cross-tool context** - Works in Cursor, Claude Code, CLI, CI/CD—same ledger everywhere
111
111
  - **Tamper detection** - Signatures and Git history make modifications visible
@@ -882,11 +882,25 @@ This is the **core governance layer** that:
882
882
  - Auto-commits to Git for distributed backup
883
883
 
884
884
  **How it works:**
885
- - Every entry gets signed with Ed25519 (automatic, zero config)
885
+ - **Daily blocks** - One block per calendar day; all issues detected that day go into the same block
886
+ - Every entry gets signed with Ed25519 (automatic once key exists)
886
887
  - Signatures prove who created each entry and detect modifications
887
888
  - Git integration provides distributed backup and history
888
889
  - Think: **double-entry bookkeeping**, not blockchain
889
890
 
891
+ **Setting up Ed25519 signing:**
892
+ ```bash
893
+ # Option 1: Automatic (trie init generates a key)
894
+ trie init
895
+
896
+ # Option 2: Manual
897
+ trie keys generate # Generate Ed25519 signing key
898
+ trie keys status # Check if signing is configured
899
+ trie keys public # Get your public key for verification
900
+ ```
901
+
902
+ Once a key exists, all new ledger entries are signed automatically. Keys are stored in `.trie/keys/` (never committed to git). Each team member generates their own key.
903
+
890
904
  **Security model:**
891
905
  - ✅ **Tamper-evident**: Signatures detect if entries are modified
892
906
  - ✅ **Accountability**: See who (human or agent) made each decision
@@ -4,25 +4,25 @@ import {
4
4
  import {
5
5
  TriePatternDiscovery
6
6
  } from "./chunk-ZV2K6M7T.js";
7
- import {
8
- ContextGraph
9
- } from "./chunk-VUL52BQL.js";
10
- import {
11
- storeIssues
12
- } from "./chunk-IRZXBQVQ.js";
13
7
  import {
14
8
  scanForVulnerabilities
15
9
  } from "./chunk-SY6KQG44.js";
16
10
  import {
17
11
  scanForVibeCodeIssues
18
12
  } from "./chunk-OMR4YCBS.js";
13
+ import {
14
+ ContextGraph
15
+ } from "./chunk-VUL52BQL.js";
16
+ import {
17
+ storeIssues
18
+ } from "./chunk-SS2O3MTC.js";
19
19
  import {
20
20
  getDiff,
21
21
  getRecentCommits,
22
22
  getStagedChanges,
23
23
  getUncommittedChanges,
24
24
  getWorkingTreeDiff
25
- } from "./chunk-Y4B3VEL7.js";
25
+ } from "./chunk-YAL3SUBG.js";
26
26
  import {
27
27
  getTrieDirectory,
28
28
  getWorkingDirectory
@@ -219,24 +219,6 @@ function isTrieInitialized(workDir) {
219
219
  return INIT_MARKERS.some((marker) => existsSync2(join2(trieDir, marker)));
220
220
  }
221
221
 
222
- // src/context/sync.ts
223
- import fs from "fs/promises";
224
- import path from "path";
225
- var DEFAULT_JSON_NAME = "context.json";
226
- async function exportToJson(graph, targetPath) {
227
- const snapshot = await graph.getSnapshot();
228
- const json = JSON.stringify(snapshot, null, 2);
229
- const outputPath = targetPath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME);
230
- await fs.mkdir(path.dirname(outputPath), { recursive: true });
231
- await fs.writeFile(outputPath, json, "utf8");
232
- return json;
233
- }
234
- async function importFromJson(graph, json, sourcePath) {
235
- const payload = json.trim().length > 0 ? json : await fs.readFile(sourcePath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME), "utf8");
236
- const snapshot = JSON.parse(payload);
237
- await graph.applySnapshot(snapshot);
238
- }
239
-
240
222
  // src/utils/errors.ts
241
223
  var TrieError = class extends Error {
242
224
  code;
@@ -324,7 +306,7 @@ var LearningSystem = class {
324
306
  };
325
307
 
326
308
  // src/agent/learning-engine.ts
327
- import path2 from "path";
309
+ import path from "path";
328
310
  var LearningEngine = class {
329
311
  projectPath;
330
312
  graph;
@@ -373,7 +355,7 @@ var LearningEngine = class {
373
355
  }
374
356
  }
375
357
  if (issuesToStore.length > 0) {
376
- const result = await storeIssues(issuesToStore, path2.basename(this.projectPath), this.projectPath);
358
+ const result = await storeIssues(issuesToStore, path.basename(this.projectPath), this.projectPath);
377
359
  return result.stored;
378
360
  }
379
361
  return 0;
@@ -466,7 +448,7 @@ var LearningEngine = class {
466
448
  };
467
449
 
468
450
  // src/agent/perceive.ts
469
- import path3 from "path";
451
+ import path2 from "path";
470
452
 
471
453
  // src/agent/diff-analyzer.ts
472
454
  var RISKY_PATTERNS = [/auth/i, /token/i, /password/i, /secret/i, /validate/i, /sanitize/i];
@@ -570,7 +552,7 @@ async function upsertWorkingChange(graph, files, projectPath) {
570
552
  return change.id;
571
553
  }
572
554
  async function ensureFileNode(graph, filePath, projectPath) {
573
- const normalized = path3.resolve(projectPath, filePath);
555
+ const normalized = path2.resolve(projectPath, filePath);
574
556
  const existing = await graph.getNode("file", normalized);
575
557
  const now = (/* @__PURE__ */ new Date()).toISOString();
576
558
  if (existing) {
@@ -583,7 +565,7 @@ async function ensureFileNode(graph, filePath, projectPath) {
583
565
  }
584
566
  const data = {
585
567
  path: filePath,
586
- extension: path3.extname(filePath),
568
+ extension: path2.extname(filePath),
587
569
  purpose: "",
588
570
  riskLevel: "medium",
589
571
  whyRisky: null,
@@ -596,7 +578,7 @@ async function ensureFileNode(graph, filePath, projectPath) {
596
578
  }
597
579
 
598
580
  // src/agent/risk-scorer.ts
599
- import * as path4 from "path";
581
+ import * as path3 from "path";
600
582
  var BASE_RISK = {
601
583
  low: 10,
602
584
  medium: 35,
@@ -616,7 +598,7 @@ function levelFromScore(score) {
616
598
  }
617
599
  async function scoreFile(graph, filePath, matchedPatterns = []) {
618
600
  const reasons = [];
619
- const normalized = path4.resolve(graph.projectRoot, filePath);
601
+ const normalized = path3.resolve(graph.projectRoot, filePath);
620
602
  const node = await graph.getNode("file", normalized);
621
603
  const incidents = await graph.getIncidentsForFile(filePath);
622
604
  let score = 10;
@@ -1469,8 +1451,6 @@ async function reasonAboutChangesHumanReadable(projectPath, files, options = {})
1469
1451
  }
1470
1452
 
1471
1453
  export {
1472
- exportToJson,
1473
- importFromJson,
1474
1454
  formatFriendlyError,
1475
1455
  LearningEngine,
1476
1456
  perceiveCurrentChanges,
@@ -1481,4 +1461,4 @@ export {
1481
1461
  handleCheckpointCommand,
1482
1462
  isTrieInitialized
1483
1463
  };
1484
- //# sourceMappingURL=chunk-62JD7MIS.js.map
1464
+ //# sourceMappingURL=chunk-5LRDF2WB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/checkpoint.ts","../src/utils/trie-init.ts","../src/utils/errors.ts","../src/agent/confidence.ts","../src/agent/learning.ts","../src/agent/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","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 * 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 { 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 * as 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 Array.from(cacheResults.entries())) {\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 = Array.from(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 Array.from(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 = Array.from(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 HumanReadableReasoning {\n summary: string;\n whatIFound: string;\n howBad: string;\n whatToDo: string;\n original: Reasoning;\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): Promise<HumanReadableReasoning> {\n const reasoning = await reasonAboutChanges(projectPath, files, options);\n\n const topFile = [...reasoning.files].sort((a, b) => b.score - a.score)[0];\n const topReasons = topFile?.reasons?.slice(0, 3) ?? [];\n\n const summaryParts: string[] = [];\n summaryParts.push(`Risk ${reasoning.riskLevel.toUpperCase()} (${reasoning.shouldBlock ? 'block' : 'allow'})`);\n if (topFile) summaryParts.push(`Most sensitive file: ${topFile.file}`);\n if (topReasons.length) summaryParts.push(`Top reasons: ${topReasons.join('; ')}`);\n\n const patterns = reasoning.matchedPatterns;\n const incidents = reasoning.relevantIncidents;\n\n const firstPattern = patterns[0];\n const patternLine = firstPattern\n ? `Pattern match: ${firstPattern.data.description}`\n : 'No known risky patterns matched.';\n\n const incidentLine = incidents[0]\n ? `Relevant prior incident: ${incidents[0].data.description} (${incidents[0].data.severity})`\n : 'No prior incidents linked to these files.';\n\n const howBad = [\n `Overall risk is ${reasoning.riskLevel}.`,\n reasoning.shouldBlock ? 'This is likely to break things or violate policy if pushed without review.' : 'This is unlikely to cause major issues if you follow normal review/testing.',\n incidentLine,\n ].join(' ');\n\n const whatToDo = [\n reasoning.recommendation,\n patterns.length ? `Double-check the pattern(s): ${patterns.slice(0, 2).map((p) => p.data.description).join(' | ')}.` : '',\n ].filter(Boolean).join(' ');\n\n return {\n summary: summaryParts.join(' — '),\n whatIFound: [patternLine, `Incidents considered: ${incidents.length}. Patterns considered: ${patterns.length}.`].join(' '),\n howBad,\n whatToDo,\n original: reasoning,\n };\n}\n"],"mappings":"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","names":["existsSync","join","existsSync","join","path","path","data","path","existsSync","existsSync","resolve","readFile","writeFile","mkdir","join","join","readFile","mkdir","writeFile","resolve"]}