@theihtisham/agent-shadow-brain 2.1.0 → 4.0.0

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 (116) hide show
  1. package/README.md +443 -602
  2. package/dist/brain/accessibility-checker.d.ts +10 -0
  3. package/dist/brain/accessibility-checker.d.ts.map +1 -0
  4. package/dist/brain/accessibility-checker.js +379 -0
  5. package/dist/brain/accessibility-checker.js.map +1 -0
  6. package/dist/brain/adversarial-defense.d.ts +57 -0
  7. package/dist/brain/adversarial-defense.d.ts.map +1 -0
  8. package/dist/brain/adversarial-defense.js +303 -0
  9. package/dist/brain/adversarial-defense.js.map +1 -0
  10. package/dist/brain/api-contract-analyzer.d.ts +19 -0
  11. package/dist/brain/api-contract-analyzer.d.ts.map +1 -0
  12. package/dist/brain/api-contract-analyzer.js +251 -0
  13. package/dist/brain/api-contract-analyzer.js.map +1 -0
  14. package/dist/brain/ast-analyzer.d.ts +23 -0
  15. package/dist/brain/ast-analyzer.d.ts.map +1 -0
  16. package/dist/brain/ast-analyzer.js +462 -0
  17. package/dist/brain/ast-analyzer.js.map +1 -0
  18. package/dist/brain/code-age-analyzer.d.ts +11 -0
  19. package/dist/brain/code-age-analyzer.d.ts.map +1 -0
  20. package/dist/brain/code-age-analyzer.js +152 -0
  21. package/dist/brain/code-age-analyzer.js.map +1 -0
  22. package/dist/brain/cognitive-load.d.ts +27 -0
  23. package/dist/brain/cognitive-load.d.ts.map +1 -0
  24. package/dist/brain/cognitive-load.js +304 -0
  25. package/dist/brain/cognitive-load.js.map +1 -0
  26. package/dist/brain/config-drift-detector.d.ts +13 -0
  27. package/dist/brain/config-drift-detector.d.ts.map +1 -0
  28. package/dist/brain/config-drift-detector.js +198 -0
  29. package/dist/brain/config-drift-detector.js.map +1 -0
  30. package/dist/brain/cross-agent-protocol.d.ts +48 -0
  31. package/dist/brain/cross-agent-protocol.d.ts.map +1 -0
  32. package/dist/brain/cross-agent-protocol.js +306 -0
  33. package/dist/brain/cross-agent-protocol.js.map +1 -0
  34. package/dist/brain/dead-code-eliminator.d.ts +16 -0
  35. package/dist/brain/dead-code-eliminator.d.ts.map +1 -0
  36. package/dist/brain/dead-code-eliminator.js +359 -0
  37. package/dist/brain/dead-code-eliminator.js.map +1 -0
  38. package/dist/brain/env-analyzer.d.ts +13 -0
  39. package/dist/brain/env-analyzer.d.ts.map +1 -0
  40. package/dist/brain/env-analyzer.js +277 -0
  41. package/dist/brain/env-analyzer.js.map +1 -0
  42. package/dist/brain/i18n-detector.d.ts +12 -0
  43. package/dist/brain/i18n-detector.d.ts.map +1 -0
  44. package/dist/brain/i18n-detector.js +242 -0
  45. package/dist/brain/i18n-detector.js.map +1 -0
  46. package/dist/brain/influence-map.d.ts +31 -0
  47. package/dist/brain/influence-map.d.ts.map +1 -0
  48. package/dist/brain/influence-map.js +375 -0
  49. package/dist/brain/influence-map.js.map +1 -0
  50. package/dist/brain/knowledge-graph.d.ts +56 -0
  51. package/dist/brain/knowledge-graph.d.ts.map +1 -0
  52. package/dist/brain/knowledge-graph.js +427 -0
  53. package/dist/brain/knowledge-graph.js.map +1 -0
  54. package/dist/brain/learning-engine.d.ts +11 -0
  55. package/dist/brain/learning-engine.d.ts.map +1 -1
  56. package/dist/brain/learning-engine.js +44 -1
  57. package/dist/brain/learning-engine.js.map +1 -1
  58. package/dist/brain/license-compliance.d.ts +13 -0
  59. package/dist/brain/license-compliance.d.ts.map +1 -0
  60. package/dist/brain/license-compliance.js +213 -0
  61. package/dist/brain/license-compliance.js.map +1 -0
  62. package/dist/brain/llm-client.d.ts.map +1 -1
  63. package/dist/brain/llm-client.js +3 -0
  64. package/dist/brain/llm-client.js.map +1 -1
  65. package/dist/brain/mutation-advisor.d.ts +11 -0
  66. package/dist/brain/mutation-advisor.d.ts.map +1 -0
  67. package/dist/brain/mutation-advisor.js +154 -0
  68. package/dist/brain/mutation-advisor.js.map +1 -0
  69. package/dist/brain/neural-mesh.d.ts +9 -1
  70. package/dist/brain/neural-mesh.d.ts.map +1 -1
  71. package/dist/brain/neural-mesh.js +75 -16
  72. package/dist/brain/neural-mesh.js.map +1 -1
  73. package/dist/brain/orchestrator.d.ts +71 -2
  74. package/dist/brain/orchestrator.d.ts.map +1 -1
  75. package/dist/brain/orchestrator.js +383 -3
  76. package/dist/brain/orchestrator.js.map +1 -1
  77. package/dist/brain/pattern-memory.d.ts +8 -3
  78. package/dist/brain/pattern-memory.d.ts.map +1 -1
  79. package/dist/brain/pattern-memory.js +71 -3
  80. package/dist/brain/pattern-memory.js.map +1 -1
  81. package/dist/brain/predictive-engine.d.ts +45 -0
  82. package/dist/brain/predictive-engine.d.ts.map +1 -0
  83. package/dist/brain/predictive-engine.js +238 -0
  84. package/dist/brain/predictive-engine.js.map +1 -0
  85. package/dist/brain/security-audit.d.ts +20 -0
  86. package/dist/brain/security-audit.d.ts.map +1 -0
  87. package/dist/brain/security-audit.js +340 -0
  88. package/dist/brain/security-audit.js.map +1 -0
  89. package/dist/brain/self-evolution.d.ts +53 -0
  90. package/dist/brain/self-evolution.d.ts.map +1 -0
  91. package/dist/brain/self-evolution.js +278 -0
  92. package/dist/brain/self-evolution.js.map +1 -0
  93. package/dist/brain/sssp-router.d.ts +58 -0
  94. package/dist/brain/sssp-router.d.ts.map +1 -0
  95. package/dist/brain/sssp-router.js +295 -0
  96. package/dist/brain/sssp-router.js.map +1 -0
  97. package/dist/brain/swarm-intelligence.d.ts +48 -0
  98. package/dist/brain/swarm-intelligence.d.ts.map +1 -0
  99. package/dist/brain/swarm-intelligence.js +215 -0
  100. package/dist/brain/swarm-intelligence.js.map +1 -0
  101. package/dist/brain/turbo-memory.d.ts +56 -0
  102. package/dist/brain/turbo-memory.d.ts.map +1 -0
  103. package/dist/brain/turbo-memory.js +388 -0
  104. package/dist/brain/turbo-memory.js.map +1 -0
  105. package/dist/cli.js +744 -3
  106. package/dist/cli.js.map +1 -1
  107. package/dist/index.d.ts +19 -1
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +21 -1
  110. package/dist/index.js.map +1 -1
  111. package/dist/types.d.ts +422 -2
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/ui/dashboard.d.ts.map +1 -1
  114. package/dist/ui/dashboard.js +20 -3
  115. package/dist/ui/dashboard.js.map +1 -1
  116. package/package.json +16 -7
@@ -0,0 +1,303 @@
1
+ // src/brain/adversarial-defense.ts — Hallucination & Threat Guard
2
+ // Detects hallucinations, contradictions, and prompt injection in LLM outputs.
3
+ // Ensemble verification for critical insights.
4
+ // v4.0.0 — Hyper-Intelligence Edition
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ const DEFENSE_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '~', '.shadow-brain', 'defense');
8
+ const LOG_FILE = 'adversarial-log.json';
9
+ /**
10
+ * Adversarial Defense — the immune system of the brain.
11
+ *
12
+ * Hallucination Detection:
13
+ * Cross-reference LLM claims against actual file content.
14
+ * "function X exists in file Y" → verify with file reads.
15
+ * Contradiction detection: compare against stored knowledge.
16
+ *
17
+ * Ensemble Verification:
18
+ * Critical insights → send to 2+ models → majority vote.
19
+ * Split verdict → flag for human review.
20
+ *
21
+ * Injection Detection:
22
+ * Scan for prompt injection patterns in agent inputs.
23
+ * Block and log ThreatVector when detected.
24
+ * Rate limit: max 3 injections per session before alert.
25
+ */
26
+ export class AdversarialDefense {
27
+ constructor() {
28
+ this.log = {
29
+ timestamp: new Date(),
30
+ flagged: 0,
31
+ blocked: 0,
32
+ accuracy: 1.0,
33
+ totalChecked: 0,
34
+ falsePositives: 0,
35
+ };
36
+ this.injectionCount = 0;
37
+ this.MAX_INJECTIONS_PER_SESSION = 3;
38
+ this.loadFromDisk();
39
+ }
40
+ // ── Hallucination Detection ─────────────────────────────────────────────────
41
+ /**
42
+ * Verify an insight against actual project state.
43
+ * Cross-references claims with file content.
44
+ */
45
+ async verifyInsight(insight, projectDir) {
46
+ this.log.totalChecked++;
47
+ const contradictions = [];
48
+ const evidence = [];
49
+ let verifiedCount = 0;
50
+ let totalClaims = 0;
51
+ // Check file references in the insight
52
+ if (insight.files && insight.files.length > 0) {
53
+ for (const fileRef of insight.files) {
54
+ totalClaims++;
55
+ const fullPath = path.join(projectDir, fileRef);
56
+ if (fs.existsSync(fullPath)) {
57
+ verifiedCount++;
58
+ evidence.push(`File exists: ${fileRef}`);
59
+ // If insight mentions specific content, verify it
60
+ if (insight.content) {
61
+ try {
62
+ const fileContent = fs.readFileSync(fullPath, 'utf-8').toLowerCase();
63
+ const contentLower = insight.content.toLowerCase();
64
+ // Extract quoted strings from insight (potential claims about file content)
65
+ const quotedMatches = contentLower.match(/["'`]([^"'`]{3,50})["'`]/g) || [];
66
+ for (const match of quotedMatches) {
67
+ const claim = match.replace(/["'`]/g, '');
68
+ if (claim.length > 5 && !fileContent.includes(claim)) {
69
+ contradictions.push(`Claim "${claim}" not found in ${fileRef}`);
70
+ }
71
+ }
72
+ }
73
+ catch {
74
+ // Cannot verify content
75
+ }
76
+ }
77
+ }
78
+ else {
79
+ contradictions.push(`Referenced file does not exist: ${fileRef}`);
80
+ }
81
+ }
82
+ }
83
+ // Check confidence calibration
84
+ if (insight.confidence !== undefined) {
85
+ totalClaims++;
86
+ if (insight.confidence > 0.9 && contradictions.length > 0) {
87
+ contradictions.push(`High confidence (${insight.confidence}) but ${contradictions.length} unverified claims`);
88
+ }
89
+ else if (insight.confidence < 0.3) {
90
+ evidence.push('Low confidence claim — treated with appropriate uncertainty');
91
+ verifiedCount++;
92
+ }
93
+ else {
94
+ verifiedCount++;
95
+ }
96
+ }
97
+ // Calculate verification score
98
+ const confidence = totalClaims > 0 ? verifiedCount / totalClaims : 0.5;
99
+ const hasContradictions = contradictions.length > 0;
100
+ let verdict;
101
+ if (hasContradictions && confidence < 0.3) {
102
+ verdict = 'hallucinated';
103
+ this.log.flagged++;
104
+ }
105
+ else if (hasContradictions) {
106
+ verdict = 'uncertain';
107
+ this.log.flagged++;
108
+ }
109
+ else {
110
+ verdict = 'real';
111
+ }
112
+ // Update accuracy
113
+ this.log.accuracy = this.log.totalChecked > 0
114
+ ? (this.log.totalChecked - this.log.flagged) / this.log.totalChecked
115
+ : 1.0;
116
+ await this.saveToDisk();
117
+ return {
118
+ claim: insight.title,
119
+ confidence,
120
+ verified: verdict === 'real',
121
+ contradictions,
122
+ verdict,
123
+ evidence,
124
+ checkedAt: new Date(),
125
+ };
126
+ }
127
+ // ── Ensemble Verification ───────────────────────────────────────────────────
128
+ /**
129
+ * Send a question to multiple models and collect votes.
130
+ * Majority consensus required for acceptance.
131
+ */
132
+ ensembleVerify(question, modelAnswers) {
133
+ if (modelAnswers.length === 0) {
134
+ return {
135
+ question,
136
+ votes: [],
137
+ consensus: 'none',
138
+ agreedAnswer: '',
139
+ confidence: 0,
140
+ };
141
+ }
142
+ // Find majority answer (by similarity, not exact match)
143
+ const answerGroups = new Map();
144
+ for (const vote of modelAnswers) {
145
+ let matched = false;
146
+ for (const [key, group] of answerGroups) {
147
+ // Simple similarity: check if answers share key words
148
+ const similarity = this.textSimilarity(vote.answer, key);
149
+ if (similarity > 0.6) {
150
+ group.push(vote);
151
+ matched = true;
152
+ break;
153
+ }
154
+ }
155
+ if (!matched) {
156
+ answerGroups.set(vote.answer, [vote]);
157
+ }
158
+ }
159
+ // Find largest group
160
+ let largestGroup = [];
161
+ for (const group of answerGroups.values()) {
162
+ if (group.length > largestGroup.length) {
163
+ largestGroup = group;
164
+ }
165
+ }
166
+ const totalVotes = modelAnswers.length;
167
+ const agreeingVotes = largestGroup.length;
168
+ const ratio = agreeingVotes / totalVotes;
169
+ let consensus;
170
+ if (ratio === 1)
171
+ consensus = 'unanimous';
172
+ else if (ratio > 0.5)
173
+ consensus = 'majority';
174
+ else if (ratio === 0.5)
175
+ consensus = 'split';
176
+ else
177
+ consensus = 'none';
178
+ const avgConfidence = largestGroup.reduce((s, v) => s + v.confidence, 0) / largestGroup.length;
179
+ return {
180
+ question,
181
+ votes: modelAnswers,
182
+ consensus,
183
+ agreedAnswer: largestGroup[0]?.answer ?? '',
184
+ confidence: avgConfidence,
185
+ };
186
+ }
187
+ // ── Injection Detection ─────────────────────────────────────────────────────
188
+ /**
189
+ * Scan input for prompt injection patterns.
190
+ * Returns ThreatVector if detected, null otherwise.
191
+ */
192
+ scanForInjection(input) {
193
+ for (const { pattern, type, severity } of AdversarialDefense.INJECTION_PATTERNS) {
194
+ if (pattern.test(input)) {
195
+ return {
196
+ type,
197
+ severity,
198
+ blocked: true,
199
+ source: 'input-scan',
200
+ pattern: pattern.source,
201
+ timestamp: new Date(),
202
+ };
203
+ }
204
+ }
205
+ // Check for encoded injection attempts
206
+ const decodedInput = this.decodeCommonEncodings(input);
207
+ if (decodedInput !== input) {
208
+ for (const { pattern, type, severity } of AdversarialDefense.INJECTION_PATTERNS) {
209
+ if (pattern.test(decodedInput)) {
210
+ return {
211
+ type,
212
+ severity,
213
+ blocked: true,
214
+ source: 'encoded-injection',
215
+ pattern: `encoded:${pattern.source}`,
216
+ timestamp: new Date(),
217
+ };
218
+ }
219
+ }
220
+ }
221
+ return null;
222
+ }
223
+ /** Block and log a detected threat */
224
+ blockAndLog(threat) {
225
+ this.injectionCount++;
226
+ this.log.blocked++;
227
+ if (this.injectionCount >= this.MAX_INJECTIONS_PER_SESSION) {
228
+ threat.severity = 'critical';
229
+ }
230
+ this.saveToDisk();
231
+ }
232
+ /** Get defense statistics */
233
+ getDefenseStats() {
234
+ return { ...this.log, timestamp: new Date() };
235
+ }
236
+ /** Get injection count for current session */
237
+ getSessionInjectionCount() {
238
+ return this.injectionCount;
239
+ }
240
+ // ── Utility ─────────────────────────────────────────────────────────────────
241
+ /** Simple text similarity based on shared words */
242
+ textSimilarity(a, b) {
243
+ const wordsA = new Set(a.toLowerCase().split(/\s+/));
244
+ const wordsB = new Set(b.toLowerCase().split(/\s+/));
245
+ const intersection = new Set([...wordsA].filter(w => wordsB.has(w)));
246
+ const union = new Set([...wordsA, ...wordsB]);
247
+ return union.size > 0 ? intersection.size / union.size : 0;
248
+ }
249
+ /** Attempt to decode common encoding schemes */
250
+ decodeCommonEncodings(input) {
251
+ try {
252
+ // Base64
253
+ if (/^[A-Za-z0-9+/]+=*$/.test(input) && input.length > 20) {
254
+ return Buffer.from(input, 'base64').toString('utf-8');
255
+ }
256
+ }
257
+ catch { /* not base64 */ }
258
+ try {
259
+ // URL encoding
260
+ if (input.includes('%')) {
261
+ return decodeURIComponent(input);
262
+ }
263
+ }
264
+ catch { /* not URL encoded */ }
265
+ return input;
266
+ }
267
+ // ── Persistence ─────────────────────────────────────────────────────────────
268
+ async saveToDisk() {
269
+ try {
270
+ if (!fs.existsSync(DEFENSE_DIR)) {
271
+ fs.mkdirSync(DEFENSE_DIR, { recursive: true });
272
+ }
273
+ fs.writeFileSync(path.join(DEFENSE_DIR, LOG_FILE), JSON.stringify(this.log));
274
+ }
275
+ catch { /* non-blocking */ }
276
+ }
277
+ loadFromDisk() {
278
+ try {
279
+ const logFile = path.join(DEFENSE_DIR, LOG_FILE);
280
+ if (!fs.existsSync(logFile))
281
+ return;
282
+ const data = JSON.parse(fs.readFileSync(logFile, 'utf-8'));
283
+ this.log = { ...this.log, ...data, timestamp: new Date(data.timestamp) };
284
+ }
285
+ catch { /* fresh start */ }
286
+ }
287
+ }
288
+ // Common prompt injection patterns
289
+ AdversarialDefense.INJECTION_PATTERNS = [
290
+ { pattern: /ignore\s+(all\s+)?previous\s+instructions/i, type: 'prompt-injection', severity: 'critical' },
291
+ { pattern: /forget\s+(your|all)\s+rules/i, type: 'prompt-injection', severity: 'critical' },
292
+ { pattern: /pretend\s+you\s+are/i, type: 'prompt-injection', severity: 'high' },
293
+ { pattern: /you\s+are\s+now\s+a/i, type: 'prompt-injection', severity: 'high' },
294
+ { pattern: /disregard\s+(your|all)\s+(training|instructions)/i, type: 'prompt-injection', severity: 'critical' },
295
+ { pattern: /override\s+safety/i, type: 'prompt-injection', severity: 'critical' },
296
+ { pattern: /system\s*:\s*/i, type: 'prompt-injection', severity: 'high' },
297
+ { pattern: /<\|im_start\|>/i, type: 'prompt-injection', severity: 'high' },
298
+ { pattern: /jailbreak/i, type: 'prompt-injection', severity: 'medium' },
299
+ { pattern: /DAN\s+mode/i, type: 'prompt-injection', severity: 'high' },
300
+ { pattern: /bypass\s+(all\s+)?filters/i, type: 'prompt-injection', severity: 'critical' },
301
+ { pattern: /extract\s+(the\s+)?(prompt|system|instructions)/i, type: 'data-poisoning', severity: 'high' },
302
+ ];
303
+ //# sourceMappingURL=adversarial-defense.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adversarial-defense.js","sourceRoot":"","sources":["../../src/brain/adversarial-defense.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { BrainInsight } from '../types.js';
2
+ export declare class APIContractAnalyzer {
3
+ private projectDir;
4
+ constructor(projectDir: string);
5
+ analyzeProject(maxFiles?: number): Promise<BrainInsight[]>;
6
+ private discoverEndpoints;
7
+ private extractEndpoints;
8
+ private auditEndpoint;
9
+ private checkValidation;
10
+ private checkAuth;
11
+ private checkRateLimit;
12
+ private checkDocs;
13
+ private checkTests;
14
+ private extractStatusCodes;
15
+ private getBlock;
16
+ private endpointToInsight;
17
+ private collectFiles;
18
+ }
19
+ //# sourceMappingURL=api-contract-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-contract-analyzer.d.ts","sourceRoot":"","sources":["../../src/brain/api-contract-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAQxD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,cAAc,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwCrE,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;IAiFxB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,YAAY;CAqBrB"}
@@ -0,0 +1,251 @@
1
+ // src/brain/api-contract-analyzer.ts — API endpoint contract analysis
2
+ // v3.0.0 — Detects API endpoints, checks for validation, auth, rate limiting, docs, tests
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ const IGNORE_DIRS = new Set([
6
+ 'node_modules', '.git', 'dist', 'build', 'out', 'coverage', '.next', '.nuxt', '.cache',
7
+ ]);
8
+ export class APIContractAnalyzer {
9
+ constructor(projectDir) {
10
+ this.projectDir = projectDir;
11
+ }
12
+ async analyzeProject(maxFiles = 200) {
13
+ const endpoints = this.discoverEndpoints(maxFiles);
14
+ const insights = [];
15
+ for (const ep of endpoints) {
16
+ const issues = this.auditEndpoint(ep);
17
+ if (issues.length > 0) {
18
+ insights.push(this.endpointToInsight(ep, issues));
19
+ }
20
+ }
21
+ // Summary insight
22
+ if (endpoints.length > 0) {
23
+ const noAuth = endpoints.filter(e => !e.hasAuth).length;
24
+ const noValidation = endpoints.filter(e => !e.hasValidation).length;
25
+ const noDocs = endpoints.filter(e => !e.hasDocs).length;
26
+ if (noAuth > 0 || noValidation > 0) {
27
+ insights.push({
28
+ type: 'api-contract',
29
+ priority: noAuth > endpoints.length * 0.5 ? 'critical' : 'high',
30
+ title: `[api-contract] API audit: ${endpoints.length} endpoints found (${noAuth} without auth, ${noValidation} without validation)`,
31
+ content: `API Contract Audit Summary:\n` +
32
+ ` Total endpoints: ${endpoints.length}\n` +
33
+ ` Without authentication: ${noAuth}\n` +
34
+ ` Without input validation: ${noValidation}\n` +
35
+ ` Without documentation: ${noDocs}\n` +
36
+ ` Ensure all endpoints have proper auth, validation, and documentation.`,
37
+ files: endpoints.map(e => e.file).filter((v, i, a) => a.indexOf(v) === i).slice(0, 10),
38
+ timestamp: new Date(),
39
+ confidence: 0.85,
40
+ metadata: { totalEndpoints: endpoints.length, noAuth, noValidation, noDocs },
41
+ });
42
+ }
43
+ }
44
+ return insights;
45
+ }
46
+ discoverEndpoints(maxFiles) {
47
+ const endpoints = [];
48
+ const files = this.collectFiles(this.projectDir, maxFiles);
49
+ for (const filePath of files) {
50
+ let content;
51
+ try {
52
+ content = fs.readFileSync(filePath, 'utf-8');
53
+ }
54
+ catch {
55
+ continue;
56
+ }
57
+ const relPath = path.relative(this.projectDir, filePath);
58
+ endpoints.push(...this.extractEndpoints(content, relPath));
59
+ }
60
+ return endpoints;
61
+ }
62
+ extractEndpoints(content, filePath) {
63
+ const endpoints = [];
64
+ const lines = content.split('\n');
65
+ // Express.js patterns
66
+ const expressPattern = /\.(get|post|put|patch|delete)\s*\(\s*['"`]([^'"`]+)['"`]/gi;
67
+ let match;
68
+ while ((match = expressPattern.exec(content)) !== null) {
69
+ const method = match[1].toUpperCase();
70
+ const routePath = match[2];
71
+ const line = content.substring(0, match.index).split('\n').length;
72
+ const block = this.getBlock(lines, line - 1);
73
+ endpoints.push({
74
+ path: routePath,
75
+ method,
76
+ file: filePath,
77
+ line,
78
+ hasValidation: this.checkValidation(block),
79
+ hasAuth: this.checkAuth(block, content),
80
+ hasRateLimit: this.checkRateLimit(content),
81
+ hasDocs: this.checkDocs(content, line),
82
+ hasTests: this.checkTests(filePath, routePath),
83
+ statusCode: this.extractStatusCodes(block),
84
+ issues: [],
85
+ });
86
+ }
87
+ // Next.js API route pattern (files in pages/api or app/api)
88
+ if (filePath.includes('/api/') || filePath.includes('\\api\\')) {
89
+ // Infer route from file path
90
+ const apiPath = filePath
91
+ .replace(/^(.*?[/\\])api([/\\])/, '/api/')
92
+ .replace(/\.(ts|tsx|js|jsx)$/, '')
93
+ .replace(/\/index$/, '')
94
+ .replace(/\[([^\]]+)\]/g, ':$1');
95
+ if (!endpoints.some(e => e.file === filePath)) {
96
+ const content2 = content;
97
+ endpoints.push({
98
+ path: apiPath || '/api/unknown',
99
+ method: 'GET', // default, could be POST etc.
100
+ file: filePath,
101
+ line: 1,
102
+ hasValidation: this.checkValidation(content2),
103
+ hasAuth: this.checkAuth(content2, content),
104
+ hasRateLimit: this.checkRateLimit(content),
105
+ hasDocs: this.checkDocs(content, 1),
106
+ hasTests: this.checkTests(filePath, apiPath),
107
+ statusCode: this.extractStatusCodes(content2),
108
+ issues: [],
109
+ });
110
+ }
111
+ }
112
+ // Fastify pattern
113
+ const fastifyPattern = /\.(get|post|put|patch|delete)\s*\(\s*\{\s*url\s*:\s*['"`]([^'"`]+)['"`]/gi;
114
+ while ((match = fastifyPattern.exec(content)) !== null) {
115
+ const method = match[1].toUpperCase();
116
+ const routePath = match[2];
117
+ const line = content.substring(0, match.index).split('\n').length;
118
+ const block = this.getBlock(lines, line - 1);
119
+ endpoints.push({
120
+ path: routePath,
121
+ method,
122
+ file: filePath,
123
+ line,
124
+ hasValidation: this.checkValidation(block),
125
+ hasAuth: this.checkAuth(block, content),
126
+ hasRateLimit: this.checkRateLimit(content),
127
+ hasDocs: this.checkDocs(content, line),
128
+ hasTests: this.checkTests(filePath, routePath),
129
+ statusCode: this.extractStatusCodes(block),
130
+ issues: [],
131
+ });
132
+ }
133
+ return endpoints;
134
+ }
135
+ auditEndpoint(ep) {
136
+ const issues = [];
137
+ if (!ep.hasAuth && !ep.path.includes('public') && !ep.path.includes('health')) {
138
+ issues.push('No authentication detected');
139
+ }
140
+ if (!ep.hasValidation && ['POST', 'PUT', 'PATCH'].includes(ep.method)) {
141
+ issues.push('No input validation for write endpoint');
142
+ }
143
+ if (!ep.hasDocs) {
144
+ issues.push('No API documentation found');
145
+ }
146
+ if (ep.statusCode.length === 0) {
147
+ issues.push('No explicit status codes returned');
148
+ }
149
+ return issues;
150
+ }
151
+ checkValidation(block) {
152
+ return /\b(validate|schema|joi|zod|yup|ajv|validator|check|sanitize|parse)\b/i.test(block);
153
+ }
154
+ checkAuth(block, fullContent) {
155
+ return /\b(auth|jwt|token|session|passport|bearer|apikey|api[_-]?key|middleware)\b/i.test(block) ||
156
+ /\b(auth|authenticate|authorize|verifyToken|isAuthenticated)\b/i.test(fullContent.substring(0, fullContent.indexOf(block) + block.length));
157
+ }
158
+ checkRateLimit(content) {
159
+ return /\b(rate[_-]?limit|rateLimit|throttle|slow[_-]?down|slowDown)\b/i.test(content);
160
+ }
161
+ checkDocs(content, line) {
162
+ // Check for JSDoc, OpenAPI/Swagger, or comment above the route
163
+ const lines = content.split('\n');
164
+ for (let i = Math.max(0, line - 5); i < line - 1; i++) {
165
+ if (/\/\*\*|@route|@api|swagger|openapi/i.test(lines[i]))
166
+ return true;
167
+ }
168
+ return false;
169
+ }
170
+ checkTests(filePath, routePath) {
171
+ // Heuristic: check if a test file exists for this route handler
172
+ const testPatterns = [
173
+ filePath.replace(/\.(ts|tsx|js|jsx)$/, '.test.$1'),
174
+ filePath.replace(/\.(ts|tsx|js|jsx)$/, '.spec.$1'),
175
+ filePath.replace(/\/src\//, '/tests/').replace(/\.(ts|tsx|js|jsx)$/, '.test.ts'),
176
+ ];
177
+ for (const p of testPatterns) {
178
+ try {
179
+ fs.accessSync(p);
180
+ return true;
181
+ }
182
+ catch { /* continue */ }
183
+ }
184
+ return false;
185
+ }
186
+ extractStatusCodes(block) {
187
+ const codes = [];
188
+ const statusPattern = /status\s*\(\s*(\d{3})\s*\)|statusCode\s*=\s*(\d{3})|\.send\s*\(\s*\{[^}]*status\s*:\s*(\d{3})/g;
189
+ let m;
190
+ while ((m = statusPattern.exec(block)) !== null) {
191
+ const code = parseInt(m[1] || m[2] || m[3]);
192
+ if (code >= 100 && code < 600)
193
+ codes.push(code);
194
+ }
195
+ return [...new Set(codes)];
196
+ }
197
+ getBlock(lines, startLine) {
198
+ // Get ~20 lines around the endpoint definition
199
+ const start = Math.max(0, startLine - 2);
200
+ const end = Math.min(lines.length, startLine + 20);
201
+ return lines.slice(start, end).join('\n');
202
+ }
203
+ endpointToInsight(ep, issues) {
204
+ return {
205
+ type: 'api-contract',
206
+ priority: issues.some(i => i.includes('authentication')) ? 'critical' :
207
+ issues.some(i => i.includes('validation')) ? 'high' : 'medium',
208
+ title: `[api-contract] ${ep.method} ${ep.path} — ${issues.length} issues`,
209
+ content: `API endpoint ${ep.method} ${ep.path} in ${ep.file}:${ep.line}\n` +
210
+ ` Issues:\n${issues.map(i => ` - ${i}`).join('\n')}\n` +
211
+ ` Auth: ${ep.hasAuth ? 'yes' : 'NO'} | Validation: ${ep.hasValidation ? 'yes' : 'NO'} | Docs: ${ep.hasDocs ? 'yes' : 'NO'} | Tests: ${ep.hasTests ? 'yes' : 'NO'}\n` +
212
+ ` Status codes: ${ep.statusCode.length > 0 ? ep.statusCode.join(', ') : 'none detected'}`,
213
+ files: [ep.file],
214
+ timestamp: new Date(),
215
+ confidence: 0.8,
216
+ metadata: { method: ep.method, path: ep.path, issues },
217
+ };
218
+ }
219
+ collectFiles(dir, maxFiles) {
220
+ const results = [];
221
+ const walk = (currentDir, depth) => {
222
+ if (results.length >= maxFiles || depth > 10)
223
+ return;
224
+ let entries;
225
+ try {
226
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
227
+ }
228
+ catch {
229
+ return;
230
+ }
231
+ for (const entry of entries) {
232
+ if (results.length >= maxFiles)
233
+ return;
234
+ if (entry.name.startsWith('.'))
235
+ continue;
236
+ const fullPath = path.join(currentDir, entry.name);
237
+ if (entry.isDirectory()) {
238
+ if (IGNORE_DIRS.has(entry.name))
239
+ continue;
240
+ walk(fullPath, depth + 1);
241
+ }
242
+ else if (entry.isFile() && /\.(ts|tsx|js|jsx)$/.test(entry.name)) {
243
+ results.push(fullPath);
244
+ }
245
+ }
246
+ };
247
+ walk(dir, 0);
248
+ return results;
249
+ }
250
+ }
251
+ //# sourceMappingURL=api-contract-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-contract-analyzer.js","sourceRoot":"","sources":["../../src/brain/api-contract-analyzer.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0FAA0F;AAG1F,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;CACvF,CAAC,CAAC;AAEH,MAAM,OAAO,mBAAmB;IAG9B,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,GAAG;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAmB,EAAE,CAAC;QAEpC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YACxD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAExD,IAAI,MAAM,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;oBAC/D,KAAK,EAAE,6BAA6B,SAAS,CAAC,MAAM,qBAAqB,MAAM,kBAAkB,YAAY,sBAAsB;oBACnI,OAAO,EACL,+BAA+B;wBAC/B,sBAAsB,SAAS,CAAC,MAAM,IAAI;wBAC1C,6BAA6B,MAAM,IAAI;wBACvC,+BAA+B,YAAY,IAAI;wBAC/C,4BAA4B,MAAM,IAAI;wBACtC,yEAAyE;oBAC3E,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;oBACtF,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE;iBAC7E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE3D,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAEzE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACzD,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,QAAgB;QACxD,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,sBAAsB;QACtB,MAAM,cAAc,GAAG,4DAA4D,CAAC;QACpF,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAA2B,CAAC;YAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAE7C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,SAAS;gBACf,MAAM;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;gBACvC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC;gBACtC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;gBAC9C,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBAC1C,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC;QAED,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,6BAA6B;YAC7B,MAAM,OAAO,GAAG,QAAQ;iBACrB,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;iBACzC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;iBACjC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACvB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;YAEnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC;gBACzB,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,OAAO,IAAI,cAAc;oBAC/B,MAAM,EAAE,KAAK,EAAE,8BAA8B;oBAC7C,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC;oBACP,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;oBAC7C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAC1C,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;oBAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAC5C,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;oBAC7C,MAAM,EAAE,EAAE;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,cAAc,GAAG,2EAA2E,CAAC;QACnG,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAA2B,CAAC;YAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAE7C,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,SAAS;gBACf,MAAM;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;gBACvC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC;gBACtC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;gBAC9C,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBAC1C,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,EAAe;QACnC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,OAAO,uEAAuE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,CAAC;IAEO,SAAS,CAAC,KAAa,EAAE,WAAmB;QAClD,OAAO,6EAA6E,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9F,gEAAgE,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/I,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,OAAO,iEAAiE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC;IAEO,SAAS,CAAC,OAAe,EAAE,IAAY;QAC7C,+DAA+D;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,IAAI,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,QAAgB,EAAE,SAAiB;QACpD,gEAAgE;QAChE,MAAM,YAAY,GAAG;YACnB,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC;YAClD,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC;YAClD,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC;SACjF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,gGAAgG,CAAC;QACvH,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IAEO,QAAQ,CAAC,KAAe,EAAE,SAAiB;QACjD,+CAA+C;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAEO,iBAAiB,CAAC,EAAe,EAAE,MAAgB;QACzD,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAChE,KAAK,EAAE,kBAAkB,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,SAAS;YACzE,OAAO,EACL,gBAAgB,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI;gBACjE,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAC1D,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;gBACrK,mBAAmB,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE;YAC5F,KAAK,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE;SACvD,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,GAAW,EAAE,QAAgB;QAChD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,UAAkB,EAAE,KAAa,EAAQ,EAAE;YACvD,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,IAAI,KAAK,GAAG,EAAE;gBAAE,OAAO;YACrD,IAAI,OAAoB,CAAC;YACzB,IAAI,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;oBAAE,OAAO;gBACvC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;wBAAE,SAAS;oBAC1C,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACb,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { BrainInsight, ASTFunctionInfo } from '../types.js';
2
+ export declare class ASTAnalyzer {
3
+ private projectDir;
4
+ constructor(projectDir: string);
5
+ analyzeProject(maxFiles?: number): Promise<BrainInsight[]>;
6
+ extractFunctionInfo(filePath: string): ASTFunctionInfo[];
7
+ private extractJSFunctions;
8
+ private extractPythonFunctions;
9
+ private analyzeFunction;
10
+ private analyzeFileStructure;
11
+ private calculateCyclomaticComplexity;
12
+ private calculateCognitiveComplexity;
13
+ private calculateNestingDepth;
14
+ private countReturnPaths;
15
+ private assessPurity;
16
+ private findFunctionEnd;
17
+ private findPythonFunctionEnd;
18
+ private calculatePythonNesting;
19
+ private calculatePythonComplexity;
20
+ private calculatePythonCognitiveComplexity;
21
+ private collectFiles;
22
+ }
23
+ //# sourceMappingURL=ast-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-analyzer.d.ts","sourceRoot":"","sources":["../../src/brain/ast-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY5D,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,cAAc,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBrE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAUxD,OAAO,CAAC,kBAAkB;IAiE1B,OAAO,CAAC,sBAAsB;IAyC9B,OAAO,CAAC,eAAe;IAsGvB,OAAO,CAAC,oBAAoB;IAsE5B,OAAO,CAAC,6BAA6B;IAerC,OAAO,CAAC,4BAA4B;IAiCpC,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,kCAAkC;IAI1C,OAAO,CAAC,YAAY;CAqBrB"}