@securecode-ai/mcp 0.5.4 → 0.5.6

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 (188) hide show
  1. package/dist/api/types.d.ts +7 -0
  2. package/dist/approval/auditLog.d.ts +1 -1
  3. package/dist/approval/auditLog.js +11 -3
  4. package/dist/approval/auditLog.js.map +1 -1
  5. package/dist/approval/broker.d.ts +7 -2
  6. package/dist/approval/broker.js +239 -110
  7. package/dist/approval/broker.js.map +1 -1
  8. package/dist/approval/policy.d.ts +10 -0
  9. package/dist/approval/policy.js +104 -0
  10. package/dist/approval/policy.js.map +1 -0
  11. package/dist/approval/types.d.ts +11 -2
  12. package/dist/approval/types.js +10 -1
  13. package/dist/approval/types.js.map +1 -1
  14. package/dist/attack/agentScanExecutor.d.ts +35 -1
  15. package/dist/attack/agentScanExecutor.js +405 -76
  16. package/dist/attack/agentScanExecutor.js.map +1 -1
  17. package/dist/attack/agentScanLoop.d.ts +20 -0
  18. package/dist/attack/agentScanLoop.js +1264 -60
  19. package/dist/attack/agentScanLoop.js.map +1 -1
  20. package/dist/attack/agentScanProtocol.d.ts +382 -6
  21. package/dist/attack/agentScanProtocol.js +110 -4
  22. package/dist/attack/agentScanProtocol.js.map +1 -1
  23. package/dist/attack/agentTrace.d.ts +73 -0
  24. package/dist/attack/agentTrace.js +228 -0
  25. package/dist/attack/agentTrace.js.map +1 -0
  26. package/dist/attack/architectureScoutExecutor.d.ts +18 -0
  27. package/dist/attack/architectureScoutExecutor.js +211 -0
  28. package/dist/attack/architectureScoutExecutor.js.map +1 -0
  29. package/dist/attack/architectureScoutLoop.d.ts +36 -0
  30. package/dist/attack/architectureScoutLoop.js +403 -0
  31. package/dist/attack/architectureScoutLoop.js.map +1 -0
  32. package/dist/attack/architectureScoutProtocol.d.ts +209 -0
  33. package/dist/attack/architectureScoutProtocol.js +47 -0
  34. package/dist/attack/architectureScoutProtocol.js.map +1 -0
  35. package/dist/attack/candidateStore.d.ts +95 -0
  36. package/dist/attack/candidateStore.js +231 -0
  37. package/dist/attack/candidateStore.js.map +1 -0
  38. package/dist/attack/evidenceLedger.d.ts +67 -0
  39. package/dist/attack/evidenceLedger.js +192 -0
  40. package/dist/attack/evidenceLedger.js.map +1 -0
  41. package/dist/attack/finishGate.d.ts +62 -0
  42. package/dist/attack/finishGate.js +209 -0
  43. package/dist/attack/finishGate.js.map +1 -0
  44. package/dist/attack/fixCodeMerge.d.ts +27 -0
  45. package/dist/attack/fixCodeMerge.js +42 -0
  46. package/dist/attack/fixCodeMerge.js.map +1 -0
  47. package/dist/attack/fixVerifyLoop.d.ts +55 -0
  48. package/dist/attack/fixVerifyLoop.js +187 -0
  49. package/dist/attack/fixVerifyLoop.js.map +1 -0
  50. package/dist/attack/investigationProfiles.d.ts +36 -0
  51. package/dist/attack/investigationProfiles.js +144 -0
  52. package/dist/attack/investigationProfiles.js.map +1 -0
  53. package/dist/attack/investigationState.d.ts +227 -0
  54. package/dist/attack/investigationState.js +666 -0
  55. package/dist/attack/investigationState.js.map +1 -0
  56. package/dist/attack/mutationOperators.d.ts +22 -0
  57. package/dist/attack/mutationOperators.js +170 -0
  58. package/dist/attack/mutationOperators.js.map +1 -0
  59. package/dist/attack/mutationTest.d.ts +33 -0
  60. package/dist/attack/mutationTest.js +110 -0
  61. package/dist/attack/mutationTest.js.map +1 -0
  62. package/dist/attack/proofGate.d.ts +20 -0
  63. package/dist/attack/proofGate.js +104 -0
  64. package/dist/attack/proofGate.js.map +1 -0
  65. package/dist/attack/proofTypes.d.ts +57 -0
  66. package/dist/attack/proofTypes.js +32 -0
  67. package/dist/attack/proofTypes.js.map +1 -0
  68. package/dist/attack/protocolValidator.d.ts +50 -0
  69. package/dist/attack/protocolValidator.js +427 -0
  70. package/dist/attack/protocolValidator.js.map +1 -0
  71. package/dist/attack/qualityMetrics.d.ts +133 -0
  72. package/dist/attack/qualityMetrics.js +226 -0
  73. package/dist/attack/qualityMetrics.js.map +1 -0
  74. package/dist/attack/scanScheduler.d.ts +52 -0
  75. package/dist/attack/scanScheduler.js +265 -0
  76. package/dist/attack/scanScheduler.js.map +1 -0
  77. package/dist/attack/scanState.d.ts +58 -0
  78. package/dist/attack/scanState.js +102 -0
  79. package/dist/attack/scanState.js.map +1 -0
  80. package/dist/attack/searchIntent.d.ts +16 -0
  81. package/dist/attack/searchIntent.js +57 -0
  82. package/dist/attack/searchIntent.js.map +1 -0
  83. package/dist/attack/verifyLoop.d.ts +43 -0
  84. package/dist/attack/verifyLoop.js +329 -15
  85. package/dist/attack/verifyLoop.js.map +1 -1
  86. package/dist/attack/workItem.d.ts +57 -0
  87. package/dist/attack/workItem.js +225 -0
  88. package/dist/attack/workItem.js.map +1 -0
  89. package/dist/audit/findingReviewQueue.d.ts +109 -0
  90. package/dist/audit/findingReviewQueue.js +335 -0
  91. package/dist/audit/findingReviewQueue.js.map +1 -0
  92. package/dist/audit/scanAuditLog.d.ts +160 -0
  93. package/dist/audit/scanAuditLog.js +404 -0
  94. package/dist/audit/scanAuditLog.js.map +1 -0
  95. package/dist/dependency/dependencyChecker.js +35 -9
  96. package/dist/dependency/dependencyChecker.js.map +1 -1
  97. package/dist/dependency/exploitPriority.d.ts +33 -0
  98. package/dist/dependency/exploitPriority.js +78 -0
  99. package/dist/dependency/exploitPriority.js.map +1 -0
  100. package/dist/dependency/finding.d.ts +16 -0
  101. package/dist/dependency/osvClient.js +2 -0
  102. package/dist/dependency/osvClient.js.map +1 -1
  103. package/dist/dependency/types.d.ts +12 -1
  104. package/dist/mcp/server.js +13 -2
  105. package/dist/mcp/server.js.map +1 -1
  106. package/dist/mcp/tools.d.ts +1 -0
  107. package/dist/mcp/tools.js +127 -6
  108. package/dist/mcp/tools.js.map +1 -1
  109. package/dist/project-map/agentMemory.d.ts +83 -1
  110. package/dist/project-map/agentMemory.js +197 -7
  111. package/dist/project-map/agentMemory.js.map +1 -1
  112. package/dist/project-map/architectureContext.d.ts +202 -0
  113. package/dist/project-map/architectureContext.js +421 -0
  114. package/dist/project-map/architectureContext.js.map +1 -0
  115. package/dist/project-map/blastRadius.d.ts +54 -0
  116. package/dist/project-map/blastRadius.js +196 -0
  117. package/dist/project-map/blastRadius.js.map +1 -0
  118. package/dist/project-map/callGraphExtractor.d.ts +13 -0
  119. package/dist/project-map/callGraphExtractor.js +222 -0
  120. package/dist/project-map/callGraphExtractor.js.map +1 -0
  121. package/dist/project-map/capabilityRegistry.d.ts +46 -0
  122. package/dist/project-map/capabilityRegistry.js +91 -0
  123. package/dist/project-map/capabilityRegistry.js.map +1 -0
  124. package/dist/project-map/findTests.d.ts +29 -0
  125. package/dist/project-map/findTests.js +236 -0
  126. package/dist/project-map/findTests.js.map +1 -0
  127. package/dist/project-map/handlerInventory.d.ts +112 -0
  128. package/dist/project-map/handlerInventory.js +184 -0
  129. package/dist/project-map/handlerInventory.js.map +1 -0
  130. package/dist/project-map/implementationResolver.d.ts +43 -0
  131. package/dist/project-map/implementationResolver.js +217 -0
  132. package/dist/project-map/implementationResolver.js.map +1 -0
  133. package/dist/project-map/mapContext.d.ts +6 -1
  134. package/dist/project-map/mapContext.js +1 -0
  135. package/dist/project-map/mapContext.js.map +1 -1
  136. package/dist/project-map/scanCache.d.ts +57 -3
  137. package/dist/project-map/scanCache.js +61 -2
  138. package/dist/project-map/scanCache.js.map +1 -1
  139. package/dist/project-map/symbolIndex.d.ts +39 -0
  140. package/dist/project-map/symbolIndex.js +385 -0
  141. package/dist/project-map/symbolIndex.js.map +1 -0
  142. package/dist/tooling/agentEvalScoring.d.ts +77 -0
  143. package/dist/tooling/agentEvalScoring.js +140 -0
  144. package/dist/tooling/agentEvalScoring.js.map +1 -0
  145. package/dist/tooling/agentRegression.d.ts +53 -0
  146. package/dist/tooling/agentRegression.js +99 -0
  147. package/dist/tooling/agentRegression.js.map +1 -0
  148. package/dist/tools/agentScan.d.ts +69 -0
  149. package/dist/tools/agentScan.js +702 -43
  150. package/dist/tools/agentScan.js.map +1 -1
  151. package/dist/tools/findingReviewTools.d.ts +22 -0
  152. package/dist/tools/findingReviewTools.js +121 -0
  153. package/dist/tools/findingReviewTools.js.map +1 -0
  154. package/dist/tools/fix.js +1 -1
  155. package/dist/tools/fix.js.map +1 -1
  156. package/dist/tools/map.js +191 -1
  157. package/dist/tools/map.js.map +1 -1
  158. package/dist/tools/runTests.d.ts +2 -0
  159. package/dist/tools/runTests.js +29 -0
  160. package/dist/tools/runTests.js.map +1 -0
  161. package/dist/utils/effectMock.d.ts +1 -0
  162. package/dist/utils/effectMock.js +162 -0
  163. package/dist/utils/effectMock.js.map +1 -0
  164. package/dist/utils/gitContext.d.ts +26 -0
  165. package/dist/utils/gitContext.js +317 -0
  166. package/dist/utils/gitContext.js.map +1 -0
  167. package/dist/utils/localTestRunner.d.ts +57 -2
  168. package/dist/utils/localTestRunner.js +122 -101
  169. package/dist/utils/localTestRunner.js.map +1 -1
  170. package/dist/utils/runtimeDetect.d.ts +12 -2
  171. package/dist/utils/runtimeDetect.js +247 -10
  172. package/dist/utils/runtimeDetect.js.map +1 -1
  173. package/dist/utils/securityConfig.d.ts +17 -0
  174. package/dist/utils/securityConfig.js +192 -0
  175. package/dist/utils/securityConfig.js.map +1 -0
  176. package/dist/utils/testCommandPolicy.d.ts +36 -0
  177. package/dist/utils/testCommandPolicy.js +252 -0
  178. package/dist/utils/testCommandPolicy.js.map +1 -0
  179. package/dist/utils/testRunner.d.ts +56 -0
  180. package/dist/utils/testRunner.js +246 -0
  181. package/dist/utils/testRunner.js.map +1 -0
  182. package/dist/utils/testSafety.d.ts +40 -2
  183. package/dist/utils/testSafety.js +205 -26
  184. package/dist/utils/testSafety.js.map +1 -1
  185. package/dist/utils/verificationSandbox.d.ts +113 -0
  186. package/dist/utils/verificationSandbox.js +656 -0
  187. package/dist/utils/verificationSandbox.js.map +1 -0
  188. package/package.json +1 -1
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ /**
3
+ * Symbol index — structural find_definition and find_references across the
4
+ * workspace. Replaces regex-based search_code for "where is X defined?" and
5
+ * "who calls X?" questions.
6
+ *
7
+ * Two providers:
8
+ * - TypeScriptProgramProvider: uses ts.createProgram for JS/TS/TSX —
9
+ * accurate cross-file definition + references via the type system.
10
+ * - TreeSitterProvider: uses tree-sitter AST for Python — intra-file
11
+ * definition + workspace-wide reference search via identifier matching.
12
+ *
13
+ * Both return SymbolLocation[] with provider + confidence metadata.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.findDefinition = findDefinition;
50
+ exports.findReferences = findReferences;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const parserLoader_1 = require("./parserLoader");
54
+ const astHelpers_1 = require("./astHelpers");
55
+ const files_1 = require("../utils/files");
56
+ const searchCode_1 = require("../utils/searchCode");
57
+ // ── TypeScript provider ────────────────────────────────────────────────────
58
+ class TypeScriptProgramProvider {
59
+ name = 'typescript';
60
+ isSupported(filePath) {
61
+ const ext = path.extname(filePath).toLowerCase();
62
+ return ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs';
63
+ }
64
+ async findDefinition(query, workspaceRoot) {
65
+ if (!this.isSupported(query.filePath))
66
+ return [];
67
+ const tsResult = this.runTypeScript(query, workspaceRoot, 'definition');
68
+ if (tsResult.length > 0)
69
+ return tsResult;
70
+ // Fall back to tree-sitter for same-file definitions when TS
71
+ // can't resolve (e.g. temp dirs without node_modules).
72
+ return treeSitterProvider.findDefinition(query, workspaceRoot);
73
+ }
74
+ async findReferences(query, workspaceRoot) {
75
+ if (!this.isSupported(query.filePath))
76
+ return [];
77
+ // For references, workspace-wide search is more reliable than
78
+ // ts.findAllReferences (which requires a full program with all
79
+ // files). The agent needs "who uses this name?" — regex search
80
+ // with word boundaries is precise enough for that question.
81
+ try {
82
+ const escaped = query.symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
83
+ const result = await (0, searchCode_1.searchCode)(workspaceRoot, `\\b${escaped}\\b`, undefined);
84
+ const out = [];
85
+ for (const hit of result.hits || []) {
86
+ out.push({
87
+ filePath: hit.path,
88
+ line: hit.line,
89
+ column: 0,
90
+ provider: 'typescript',
91
+ confidence: 0.9,
92
+ kind: 'reference',
93
+ });
94
+ }
95
+ return out;
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ }
101
+ runTypeScript(query, workspaceRoot, mode) {
102
+ try {
103
+ const ts = require('typescript');
104
+ const absPath = (0, files_1.resolveWorkspacePath)(workspaceRoot, query.filePath);
105
+ const program = ts.createProgram({
106
+ rootNames: [absPath],
107
+ options: {
108
+ allowJs: true,
109
+ jsx: ts.JsxEmit.React,
110
+ noEmit: true,
111
+ skipLibCheck: true,
112
+ target: ts.ScriptTarget.ES2022,
113
+ module: ts.ModuleKind.CommonJS,
114
+ moduleResolution: ts.ModuleResolutionKind.NodeJs,
115
+ },
116
+ host: ts.createCompilerHost({}),
117
+ });
118
+ const sourceFile = program.getSourceFile(absPath);
119
+ if (!sourceFile)
120
+ return [];
121
+ // Find the identifier position to search from
122
+ const pos = this.findSymbolPosition(sourceFile, query.symbol, query.line);
123
+ if (pos === -1)
124
+ return [];
125
+ const checker = program.getTypeChecker();
126
+ const out = [];
127
+ if (mode === 'definition') {
128
+ const symbol = checker.getSymbolAtLocation(sourceFile, pos);
129
+ if (!symbol)
130
+ return [];
131
+ const declarations = symbol.declarations || [];
132
+ for (const decl of declarations) {
133
+ const declFile = decl.getSourceFile();
134
+ const declPath = declFile.fileName;
135
+ const relPath = path.relative(workspaceRoot, declPath).replace(/\\/g, '/');
136
+ const start = decl.getStart ? decl.getStart() : 0;
137
+ const lineChar = declFile.getLineAndCharacterOfPosition(start);
138
+ out.push({
139
+ filePath: relPath,
140
+ line: lineChar.line + 1,
141
+ column: lineChar.character + 1,
142
+ provider: 'typescript',
143
+ confidence: 1.0,
144
+ kind: 'definition',
145
+ });
146
+ }
147
+ }
148
+ else {
149
+ // References
150
+ const symbol = checker.getSymbolAtLocation(sourceFile, pos);
151
+ if (!symbol)
152
+ return [];
153
+ const refs = checker.findAllReferences(symbol) || [];
154
+ for (const ref of refs) {
155
+ const refFile = ref.fileName;
156
+ const relPath = path.relative(workspaceRoot, refFile).replace(/\\/g, '/');
157
+ const lineChar = ts.getLineAndCharacterOfPosition(refFile, ref.textSpan.start);
158
+ if (!lineChar)
159
+ continue;
160
+ out.push({
161
+ filePath: relPath,
162
+ line: lineChar.line + 1,
163
+ column: lineChar.character + 1,
164
+ provider: 'typescript',
165
+ confidence: 1.0,
166
+ kind: 'reference',
167
+ });
168
+ }
169
+ }
170
+ return out;
171
+ }
172
+ catch {
173
+ return [];
174
+ }
175
+ }
176
+ findSymbolPosition(sourceFile, symbol, hintLine) {
177
+ let bestPos = -1;
178
+ let bestDist = Infinity;
179
+ const visit = (node) => {
180
+ if (node.kind === 79 /* Identifier */ && node.text === symbol) {
181
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
182
+ const dist = hintLine ? Math.abs(line - hintLine) : 0;
183
+ if (dist < bestDist) {
184
+ bestDist = dist;
185
+ bestPos = node.getStart();
186
+ }
187
+ }
188
+ tsForEachChild(node, visit);
189
+ };
190
+ visit(sourceFile);
191
+ return bestPos;
192
+ }
193
+ }
194
+ function tsForEachChild(node, cb) {
195
+ if (node && typeof node.forEachChild === 'function') {
196
+ node.forEachChild(cb);
197
+ }
198
+ }
199
+ // ── Tree-sitter provider (Python + fallback) ──────────────────────────────
200
+ class TreeSitterProvider {
201
+ name = 'tree-sitter';
202
+ async findDefinition(query, workspaceRoot) {
203
+ // For Python: search the file + its imports for the function definition
204
+ const grammar = (0, parserLoader_1.grammarForFile)(query.filePath);
205
+ if (grammar === 'unknown')
206
+ return [];
207
+ try {
208
+ const absPath = (0, files_1.resolveWorkspacePath)(workspaceRoot, query.filePath);
209
+ const content = fs.readFileSync(absPath, 'utf8');
210
+ const parsed = await (0, parserLoader_1.parseSource)(content, grammar);
211
+ if (!parsed)
212
+ return [];
213
+ const { root } = parsed;
214
+ const imports = (0, astHelpers_1.collectImports)(root, content);
215
+ // First: is the definition in THIS file?
216
+ const localDef = this.findLocalDefinition(root, content, query.symbol);
217
+ if (localDef) {
218
+ return [{
219
+ filePath: query.filePath,
220
+ line: localDef.line,
221
+ column: localDef.column,
222
+ provider: 'tree-sitter',
223
+ confidence: 0.8,
224
+ kind: 'definition',
225
+ }];
226
+ }
227
+ // Second: is it imported from another file?
228
+ const importSource = imports.get(query.symbol);
229
+ if (importSource) {
230
+ const resolvedFile = this.resolveImport(importSource, query.filePath, workspaceRoot);
231
+ if (resolvedFile) {
232
+ const resolvedContent = fs.readFileSync(resolvedFile, 'utf8');
233
+ const resolvedGrammar = (0, parserLoader_1.grammarForFile)(resolvedFile);
234
+ if (resolvedGrammar !== 'unknown') {
235
+ const resolvedParsed = await (0, parserLoader_1.parseSource)(resolvedContent, resolvedGrammar);
236
+ if (resolvedParsed) {
237
+ const defInImport = this.findLocalDefinition(resolvedParsed.root, resolvedContent, query.symbol);
238
+ if (defInImport) {
239
+ return [{
240
+ filePath: path.relative(workspaceRoot, resolvedFile).replace(/\\/g, '/'),
241
+ line: defInImport.line,
242
+ column: defInImport.column,
243
+ provider: 'tree-sitter',
244
+ confidence: 0.7,
245
+ kind: 'definition',
246
+ }];
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ return [];
253
+ }
254
+ catch {
255
+ return [];
256
+ }
257
+ }
258
+ async findReferences(query, workspaceRoot) {
259
+ // For Python: workspace-wide search for the symbol name
260
+ try {
261
+ const result = await (0, searchCode_1.searchCode)(workspaceRoot, `\\b${query.symbol.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, undefined);
262
+ const out = [];
263
+ for (const hit of result.hits || []) {
264
+ out.push({
265
+ filePath: hit.path,
266
+ line: hit.line,
267
+ column: 0,
268
+ provider: 'tree-sitter',
269
+ confidence: 0.6,
270
+ kind: 'reference',
271
+ });
272
+ }
273
+ return out;
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ findLocalDefinition(root, source, name) {
280
+ const FUNCTION_TYPES = new Set([
281
+ 'function_declaration', 'function_definition', 'method_definition',
282
+ 'async_function_declaration', 'async_function_definition',
283
+ 'arrow_function', 'function_expression',
284
+ 'generator_function_declaration', 'generator_declaration',
285
+ 'class_definition', 'class_declaration',
286
+ ]);
287
+ for (const n of (0, astHelpers_1.walk)(root)) {
288
+ if (!FUNCTION_TYPES.has(n.type))
289
+ continue;
290
+ for (const child of n.namedChildren) {
291
+ if ((0, astHelpers_1.isIdentifier)(child) || child.type === 'type_identifier') {
292
+ const text = source.slice(child.startIndex, child.endIndex);
293
+ if (text === name) {
294
+ return {
295
+ line: n.startPosition.row + 1,
296
+ column: n.startPosition.column + 1,
297
+ };
298
+ }
299
+ }
300
+ }
301
+ // const name = () => {} — check parent
302
+ const parent = n.parent;
303
+ if (parent && (parent.type === 'lexical_declaration' || parent.type === 'variable_declaration')) {
304
+ const decl = parent.namedChildren.find(c => c.type === 'variable_declarator');
305
+ if (decl) {
306
+ const id = decl.child(0);
307
+ if (id && (0, astHelpers_1.isIdentifier)(id) && source.slice(id.startIndex, id.endIndex) === name) {
308
+ return {
309
+ line: parent.startPosition.row + 1,
310
+ column: parent.startPosition.column + 1,
311
+ };
312
+ }
313
+ }
314
+ }
315
+ }
316
+ return null;
317
+ }
318
+ resolveImport(spec, fromFile, workspaceRoot) {
319
+ if (!spec.startsWith('.'))
320
+ return null;
321
+ const fromDir = path.dirname(path.resolve(workspaceRoot, fromFile));
322
+ const base = path.resolve(fromDir, spec);
323
+ const candidates = [
324
+ base, base + '.ts', base + '.tsx', base + '.js', base + '.jsx',
325
+ base + '.mjs', base + '.cjs', base + '.py',
326
+ path.join(base, 'index.ts'), path.join(base, 'index.js'),
327
+ path.join(base, '__init__.py'),
328
+ ];
329
+ for (const c of candidates) {
330
+ if (fs.existsSync(c))
331
+ return c;
332
+ }
333
+ return null;
334
+ }
335
+ }
336
+ // ── Provider registry ──────────────────────────────────────────────────────
337
+ const tsProvider = new TypeScriptProgramProvider();
338
+ const treeSitterProvider = new TreeSitterProvider();
339
+ function getProvider(filePath) {
340
+ const ext = path.extname(filePath).toLowerCase();
341
+ if (ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs') {
342
+ return tsProvider;
343
+ }
344
+ return treeSitterProvider;
345
+ }
346
+ // ── Public API ──────────────────────────────────────────────────────────────
347
+ async function findDefinition(workspaceRoot, filePath, symbol, line) {
348
+ try {
349
+ (0, files_1.resolveWorkspacePath)(workspaceRoot, filePath);
350
+ }
351
+ catch (e) {
352
+ return `Error: ${e.message}`;
353
+ }
354
+ const provider = getProvider(filePath);
355
+ const locations = await provider.findDefinition({ filePath, symbol, line }, workspaceRoot);
356
+ if (locations.length === 0) {
357
+ return `No definition found for "${symbol}" in ${filePath}.`;
358
+ }
359
+ const lines = [`Definition of "${symbol}" (${locations.length} location(s)):`];
360
+ for (const loc of locations) {
361
+ const prov = loc.provider === 'typescript' ? 'ts' : 'ast';
362
+ lines.push(` ${loc.filePath}:${loc.line}:${loc.column} [${prov}, confidence ${loc.confidence}]`);
363
+ }
364
+ return lines.join('\n');
365
+ }
366
+ async function findReferences(workspaceRoot, filePath, symbol, line) {
367
+ try {
368
+ (0, files_1.resolveWorkspacePath)(workspaceRoot, filePath);
369
+ }
370
+ catch (e) {
371
+ return `Error: ${e.message}`;
372
+ }
373
+ const provider = getProvider(filePath);
374
+ const locations = await provider.findReferences({ filePath, symbol, line }, workspaceRoot);
375
+ if (locations.length === 0) {
376
+ return `No references found for "${symbol}" in ${filePath}.`;
377
+ }
378
+ const lines = [`References to "${symbol}" (${locations.length} location(s)):`];
379
+ for (const loc of locations) {
380
+ const prov = loc.provider === 'typescript' ? 'ts' : 'ast';
381
+ lines.push(` ${loc.filePath}:${loc.line} [${prov}, confidence ${loc.confidence}]`);
382
+ }
383
+ return lines.join('\n');
384
+ }
385
+ //# sourceMappingURL=symbolIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolIndex.js","sourceRoot":"","sources":["../../src/project-map/symbolIndex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Agent eval scoring — pure functions for scoring Pipeline 2 scan results
3
+ * against a golden testset.
4
+ *
5
+ * Scoring model:
6
+ * - Each fixture has an expected verdict (vulnerable | safe) and optionally
7
+ * an expected line + type.
8
+ * - A finding "matches" a vulnerable fixture if it's at the expected line
9
+ * with the expected type (strict) or any finding at all (loose).
10
+ * - A finding on a safe fixture is a false positive.
11
+ * - Infrastructure failures (crash, timeout, spawn_failed) are tracked
12
+ * separately and never count as false negatives.
13
+ * - Verify verdicts (PROVEN/UNPROVEN/INCONCLUSIVE) are tracked as
14
+ * distribution metrics, not pass/fail.
15
+ */
16
+ export interface AgentEvalFixture {
17
+ id: string;
18
+ class: string;
19
+ language: string;
20
+ framework: string;
21
+ verdict: 'vulnerable' | 'safe';
22
+ expectLine?: number;
23
+ expectType?: string;
24
+ }
25
+ export interface AgentEvalFinding {
26
+ line: number;
27
+ type: string;
28
+ severity: string;
29
+ confidence: number;
30
+ proven: string;
31
+ evidenceLevel?: string;
32
+ }
33
+ export interface AgentEvalCaseResult {
34
+ fixtureId: string;
35
+ class: string;
36
+ language: string;
37
+ framework: string;
38
+ expected: 'vulnerable' | 'safe';
39
+ found: boolean;
40
+ strictFound: boolean;
41
+ findingCount: number;
42
+ reportedTypes: string[];
43
+ reportedLines: number[];
44
+ provenCount: number;
45
+ unprovenCount: number;
46
+ inconclusiveCount: number;
47
+ skippedCount: number;
48
+ infraFailure: boolean;
49
+ infraError?: string;
50
+ stepsUsed: number;
51
+ costSpentUsd: number;
52
+ latencyMs: number;
53
+ }
54
+ export interface AgentEvalMetrics {
55
+ tp: number;
56
+ fn: number;
57
+ fp: number;
58
+ tn: number;
59
+ recall: number;
60
+ precision: number;
61
+ fpr: number;
62
+ f1: number;
63
+ total: number;
64
+ totalRealVuln: number;
65
+ totalSafe: number;
66
+ infraFailures: number;
67
+ completionRate: number;
68
+ provenRate: number;
69
+ unprovenRate: number;
70
+ inconclusiveRate: number;
71
+ meanSteps: number;
72
+ meanCostUsd: number;
73
+ meanLatencyMs: number;
74
+ }
75
+ export declare function scoreCase(fixture: AgentEvalFixture, findings: AgentEvalFinding[], infraFailure?: boolean, infraError?: string, stepsUsed?: number, costSpentUsd?: number, latencyMs?: number): AgentEvalCaseResult;
76
+ export declare function aggregateMetrics(results: AgentEvalCaseResult[]): AgentEvalMetrics;
77
+ export declare function formatMetricsMarkdown(metrics: AgentEvalMetrics): string;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * Agent eval scoring — pure functions for scoring Pipeline 2 scan results
4
+ * against a golden testset.
5
+ *
6
+ * Scoring model:
7
+ * - Each fixture has an expected verdict (vulnerable | safe) and optionally
8
+ * an expected line + type.
9
+ * - A finding "matches" a vulnerable fixture if it's at the expected line
10
+ * with the expected type (strict) or any finding at all (loose).
11
+ * - A finding on a safe fixture is a false positive.
12
+ * - Infrastructure failures (crash, timeout, spawn_failed) are tracked
13
+ * separately and never count as false negatives.
14
+ * - Verify verdicts (PROVEN/UNPROVEN/INCONCLUSIVE) are tracked as
15
+ * distribution metrics, not pass/fail.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.scoreCase = scoreCase;
19
+ exports.aggregateMetrics = aggregateMetrics;
20
+ exports.formatMetricsMarkdown = formatMetricsMarkdown;
21
+ function normalizeType(t) {
22
+ return (t || '').toLowerCase().replace(/[\s-]+/g, '_');
23
+ }
24
+ function scoreCase(fixture, findings, infraFailure = false, infraError, stepsUsed = 0, costSpentUsd = 0, latencyMs = 0) {
25
+ const reportedTypes = findings.map(f => normalizeType(f.type));
26
+ const reportedLines = findings.map(f => f.line);
27
+ const found = findings.length > 0;
28
+ let strictFound = false;
29
+ if (fixture.verdict === 'vulnerable' && fixture.expectLine && fixture.expectType) {
30
+ const expectedType = normalizeType(fixture.expectType);
31
+ strictFound = findings.some(f => f.line === fixture.expectLine && normalizeType(f.type) === expectedType);
32
+ }
33
+ else if (fixture.verdict === 'vulnerable') {
34
+ strictFound = found;
35
+ }
36
+ const provenCount = findings.filter(f => f.proven === 'PROVEN').length;
37
+ const unprovenCount = findings.filter(f => f.proven === 'UNPROVEN').length;
38
+ const inconclusiveCount = findings.filter(f => f.proven === 'INCONCLUSIVE').length;
39
+ const skippedCount = findings.filter(f => f.proven === 'SKIPPED').length;
40
+ return {
41
+ fixtureId: fixture.id,
42
+ class: fixture.class,
43
+ language: fixture.language,
44
+ framework: fixture.framework,
45
+ expected: fixture.verdict,
46
+ found,
47
+ strictFound,
48
+ findingCount: findings.length,
49
+ reportedTypes,
50
+ reportedLines,
51
+ provenCount,
52
+ unprovenCount,
53
+ inconclusiveCount,
54
+ skippedCount,
55
+ infraFailure,
56
+ infraError,
57
+ stepsUsed,
58
+ costSpentUsd,
59
+ latencyMs,
60
+ };
61
+ }
62
+ function aggregateMetrics(results) {
63
+ let tp = 0, fn = 0, fp = 0, tn = 0;
64
+ let infraFailures = 0;
65
+ let totalSteps = 0;
66
+ let totalCost = 0;
67
+ let totalLatency = 0;
68
+ let totalProven = 0;
69
+ let totalUnproven = 0;
70
+ let totalInconclusive = 0;
71
+ let completedRuns = 0;
72
+ for (const r of results) {
73
+ if (r.infraFailure) {
74
+ infraFailures++;
75
+ continue;
76
+ }
77
+ totalSteps += r.stepsUsed;
78
+ totalCost += r.costSpentUsd;
79
+ totalLatency += r.latencyMs;
80
+ completedRuns++;
81
+ totalProven += r.provenCount;
82
+ totalUnproven += r.unprovenCount;
83
+ totalInconclusive += r.inconclusiveCount;
84
+ if (r.expected === 'vulnerable' && r.found)
85
+ tp++;
86
+ else if (r.expected === 'vulnerable' && !r.found)
87
+ fn++;
88
+ else if (r.expected === 'safe' && r.found)
89
+ fp++;
90
+ else
91
+ tn++;
92
+ }
93
+ const totalRealVuln = tp + fn;
94
+ const totalSafe = fp + tn;
95
+ const totalFindings = tp + fp;
96
+ const nonInfraTotal = results.length - infraFailures;
97
+ const recall = totalRealVuln ? tp / totalRealVuln : 0;
98
+ const precision = totalFindings ? tp / totalFindings : 1;
99
+ const fpr = totalSafe ? fp / totalSafe : 0;
100
+ const f1 = precision + recall ? (2 * precision * recall) / (precision + recall) : 0;
101
+ const totalVerdicts = totalProven + totalUnproven + totalInconclusive;
102
+ const verifyableRuns = results.filter(r => !r.infraFailure && r.expected === 'vulnerable' && r.found).length;
103
+ return {
104
+ tp, fn, fp, tn,
105
+ recall, precision, fpr, f1,
106
+ total: results.length,
107
+ totalRealVuln, totalSafe,
108
+ infraFailures,
109
+ completionRate: nonInfraTotal ? completedRuns / nonInfraTotal : 0,
110
+ provenRate: totalVerdicts ? totalProven / totalVerdicts : 0,
111
+ unprovenRate: totalVerdicts ? totalUnproven / totalVerdicts : 0,
112
+ inconclusiveRate: totalVerdicts ? totalInconclusive / totalVerdicts : 0,
113
+ meanSteps: completedRuns ? totalSteps / completedRuns : 0,
114
+ meanCostUsd: completedRuns ? totalCost / completedRuns : 0,
115
+ meanLatencyMs: completedRuns ? totalLatency / completedRuns : 0,
116
+ };
117
+ }
118
+ function formatMetricsMarkdown(metrics) {
119
+ const pct = (n) => (n * 100).toFixed(1) + '%';
120
+ const usd = (n) => '$' + n.toFixed(4);
121
+ const ms = (n) => n.toFixed(0) + 'ms';
122
+ return `## Agent Scan Golden Eval Results
123
+
124
+ | Metric | Value |
125
+ |--------|-------|
126
+ | **Recall** | ${pct(metrics.recall)} (${metrics.tp}/${metrics.totalRealVuln}) |
127
+ | **Precision** | ${pct(metrics.precision)} (${metrics.tp}/${metrics.tp + metrics.fp}) |
128
+ | **FPR** | ${pct(metrics.fpr)} (${metrics.fp}/${metrics.totalSafe}) |
129
+ | **F1** | ${metrics.f1.toFixed(3)} |
130
+ | **Completion Rate** | ${pct(metrics.completionRate)} |
131
+ | **Infra Failures** | ${metrics.infraFailures}/${metrics.total} |
132
+ | **Proven Rate** | ${pct(metrics.provenRate)} |
133
+ | **Unproven Rate** | ${pct(metrics.unprovenRate)} |
134
+ | **Inconclusive Rate** | ${pct(metrics.inconclusiveRate)} |
135
+ | **Mean Steps** | metrics.meanSteps.toFixed(1) |
136
+ | **Mean Cost** | ${usd(metrics.meanCostUsd)} |
137
+ | **Mean Latency** | ${ms(metrics.meanLatencyMs)} |
138
+ `;
139
+ }
140
+ //# sourceMappingURL=agentEvalScoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentEvalScoring.js","sourceRoot":"","sources":["../../src/tooling/agentEvalScoring.ts"],"names":[],"mappings":"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"}