@owasp-aghast/aghast 0.8.4 → 0.9.0-rc.1

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 (107) hide show
  1. package/dist/build-config.d.ts.map +1 -1
  2. package/dist/build-config.js +101 -2
  3. package/dist/build-config.js.map +1 -1
  4. package/dist/check-library.d.ts +25 -0
  5. package/dist/check-library.d.ts.map +1 -1
  6. package/dist/check-library.js +165 -0
  7. package/dist/check-library.js.map +1 -1
  8. package/dist/ci-metadata.d.ts +42 -0
  9. package/dist/ci-metadata.d.ts.map +1 -0
  10. package/dist/ci-metadata.js +131 -0
  11. package/dist/ci-metadata.js.map +1 -0
  12. package/dist/cli.js +4 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/concurrency.d.ts +18 -0
  15. package/dist/concurrency.d.ts.map +1 -0
  16. package/dist/concurrency.js +39 -0
  17. package/dist/concurrency.js.map +1 -0
  18. package/dist/cost-tracker.d.ts +45 -0
  19. package/dist/cost-tracker.d.ts.map +1 -0
  20. package/dist/cost-tracker.js +56 -0
  21. package/dist/cost-tracker.js.map +1 -0
  22. package/dist/discoveries/glob-discovery.d.ts +21 -0
  23. package/dist/discoveries/glob-discovery.d.ts.map +1 -0
  24. package/dist/discoveries/glob-discovery.js +215 -0
  25. package/dist/discoveries/glob-discovery.js.map +1 -0
  26. package/dist/discoveries/script-discovery.d.ts +117 -0
  27. package/dist/discoveries/script-discovery.d.ts.map +1 -0
  28. package/dist/discoveries/script-discovery.js +593 -0
  29. package/dist/discoveries/script-discovery.js.map +1 -0
  30. package/dist/docs-url.d.ts +14 -0
  31. package/dist/docs-url.d.ts.map +1 -0
  32. package/dist/docs-url.js +17 -0
  33. package/dist/docs-url.js.map +1 -0
  34. package/dist/error-codes.d.ts +12 -1
  35. package/dist/error-codes.d.ts.map +1 -1
  36. package/dist/error-codes.js +16 -2
  37. package/dist/error-codes.js.map +1 -1
  38. package/dist/formatters/csv-formatter.d.ts +12 -1
  39. package/dist/formatters/csv-formatter.d.ts.map +1 -1
  40. package/dist/formatters/csv-formatter.js +64 -2
  41. package/dist/formatters/csv-formatter.js.map +1 -1
  42. package/dist/formatters/html-formatter.d.ts.map +1 -1
  43. package/dist/formatters/html-formatter.js +43 -3
  44. package/dist/formatters/html-formatter.js.map +1 -1
  45. package/dist/formatters/index.d.ts.map +1 -1
  46. package/dist/formatters/index.js +2 -0
  47. package/dist/formatters/index.js.map +1 -1
  48. package/dist/formatters/markdown-formatter.d.ts +61 -0
  49. package/dist/formatters/markdown-formatter.d.ts.map +1 -0
  50. package/dist/formatters/markdown-formatter.js +557 -0
  51. package/dist/formatters/markdown-formatter.js.map +1 -0
  52. package/dist/formatters/sarif-formatter.d.ts +7 -0
  53. package/dist/formatters/sarif-formatter.d.ts.map +1 -1
  54. package/dist/formatters/sarif-formatter.js +80 -0
  55. package/dist/formatters/sarif-formatter.js.map +1 -1
  56. package/dist/formatters/types.d.ts +24 -0
  57. package/dist/formatters/types.d.ts.map +1 -1
  58. package/dist/index.d.ts +4 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +342 -9
  61. package/dist/index.js.map +1 -1
  62. package/dist/issue-file-writer.d.ts +21 -0
  63. package/dist/issue-file-writer.d.ts.map +1 -0
  64. package/dist/issue-file-writer.js +307 -0
  65. package/dist/issue-file-writer.js.map +1 -0
  66. package/dist/judge.d.ts +62 -0
  67. package/dist/judge.d.ts.map +1 -0
  68. package/dist/judge.js +305 -0
  69. package/dist/judge.js.map +1 -0
  70. package/dist/mock-agent-provider.d.ts +3 -0
  71. package/dist/mock-agent-provider.d.ts.map +1 -1
  72. package/dist/mock-agent-provider.js +13 -0
  73. package/dist/mock-agent-provider.js.map +1 -1
  74. package/dist/new-check.d.ts.map +1 -1
  75. package/dist/new-check.js +322 -13
  76. package/dist/new-check.js.map +1 -1
  77. package/dist/opencode-provider.d.ts.map +1 -1
  78. package/dist/opencode-provider.js +33 -0
  79. package/dist/opencode-provider.js.map +1 -1
  80. package/dist/repo-scan.d.ts +80 -0
  81. package/dist/repo-scan.d.ts.map +1 -0
  82. package/dist/repo-scan.js +250 -0
  83. package/dist/repo-scan.js.map +1 -0
  84. package/dist/result-handlers/pr-comment-handler.d.ts +136 -0
  85. package/dist/result-handlers/pr-comment-handler.d.ts.map +1 -0
  86. package/dist/result-handlers/pr-comment-handler.js +381 -0
  87. package/dist/result-handlers/pr-comment-handler.js.map +1 -0
  88. package/dist/retry.d.ts +128 -0
  89. package/dist/retry.d.ts.map +1 -0
  90. package/dist/retry.js +261 -0
  91. package/dist/retry.js.map +1 -0
  92. package/dist/runtime-config.d.ts.map +1 -1
  93. package/dist/runtime-config.js +62 -0
  94. package/dist/runtime-config.js.map +1 -1
  95. package/dist/scan-runner.d.ts +31 -22
  96. package/dist/scan-runner.d.ts.map +1 -1
  97. package/dist/scan-runner.js +145 -100
  98. package/dist/scan-runner.js.map +1 -1
  99. package/dist/semgrep-runner.js +6 -4
  100. package/dist/semgrep-runner.js.map +1 -1
  101. package/dist/stats.d.ts.map +1 -1
  102. package/dist/stats.js +4 -1
  103. package/dist/stats.js.map +1 -1
  104. package/dist/types.d.ts +149 -2
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js.map +1 -1
  107. package/package.json +1 -1
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Individual issue file writer (Spec E.3.2).
3
+ *
4
+ * Generates one file per `SecurityIssue` in `security_issues_<project>/<check-id>/`,
5
+ * named `issue_<NNN>_<filename>.<ext>`. Three output formats are supported:
6
+ * `markdown` (default), `json`, and `html`.
7
+ *
8
+ * HTML output escapes user-controlled fields (descriptions, code snippets,
9
+ * file paths, recommendations, data flow steps) to prevent XSS via injected
10
+ * markup in AI responses or source code snippets.
11
+ */
12
+ import type { ScanResults } from './types.js';
13
+ export type IndividualIssueFormat = 'markdown' | 'json' | 'html';
14
+ export interface WriteIndividualIssueFilesResult {
15
+ /** Absolute path of the root output directory (`security_issues_<project>/`). */
16
+ rootDir: string;
17
+ /** Absolute paths of every issue file written. */
18
+ files: string[];
19
+ }
20
+ export declare function writeIndividualIssueFiles(results: ScanResults, outputDir: string, format?: IndividualIssueFormat): Promise<WriteIndividualIssueFilesResult>;
21
+ //# sourceMappingURL=issue-file-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-file-writer.d.ts","sourceRoot":"","sources":["../src/issue-file-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,YAAY,CAAC;AAS3E,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AA2LjE,MAAM,WAAW,+BAA+B;IAC9C,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAqED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,qBAAkC,GACzC,OAAO,CAAC,+BAA+B,CAAC,CAsC1C"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Individual issue file writer (Spec E.3.2).
3
+ *
4
+ * Generates one file per `SecurityIssue` in `security_issues_<project>/<check-id>/`,
5
+ * named `issue_<NNN>_<filename>.<ext>`. Three output formats are supported:
6
+ * `markdown` (default), `json`, and `html`.
7
+ *
8
+ * HTML output escapes user-controlled fields (descriptions, code snippets,
9
+ * file paths, recommendations, data flow steps) to prevent XSS via injected
10
+ * markup in AI responses or source code snippets.
11
+ */
12
+ import { mkdir, writeFile, readdir, unlink } from 'node:fs/promises';
13
+ import { basename, resolve, sep } from 'node:path';
14
+ // Reuse the shared escaper from the HTML report formatter rather than keeping a
15
+ // second copy — it also handles null/undefined, which a local `string`-only
16
+ // version did not.
17
+ import { escapeHtml } from './formatters/html-formatter.js';
18
+ import { logDebug } from './logging.js';
19
+ const TAG = 'issue-files';
20
+ const FORMAT_EXTENSIONS = {
21
+ markdown: 'md',
22
+ json: 'json',
23
+ html: 'html',
24
+ };
25
+ /**
26
+ * Windows reserved device names (case-insensitive, base name with or without
27
+ * extension). Files with these names cannot be created on Windows even from
28
+ * cross-platform code, so we prefix them with an underscore to make them safe.
29
+ */
30
+ const WINDOWS_RESERVED_NAMES = new Set([
31
+ 'CON', 'PRN', 'AUX', 'NUL',
32
+ 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
33
+ 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9',
34
+ ]);
35
+ /**
36
+ * Replace characters that are unsafe in filenames across Windows / macOS / Linux
37
+ * with underscores. Strips leading dots so we never produce dotfiles by accident.
38
+ * Also escapes Windows reserved device names (CON, PRN, NUL, etc.) by prefixing
39
+ * with an underscore so the writer doesn't fail on Windows.
40
+ */
41
+ function safeFilename(name) {
42
+ if (!name)
43
+ return 'unknown';
44
+ // Use only the basename — issues may carry full paths like "src/foo/bar.ts"
45
+ const base = basename(name.replace(/[\\/]+/g, '/'));
46
+ // Replace anything that's not alphanumeric, dash, dot, underscore.
47
+ let cleaned = base.replace(/[^A-Za-z0-9._-]+/g, '_');
48
+ // Avoid leading dots (would create hidden files on POSIX).
49
+ cleaned = cleaned.replace(/^\.+/, '');
50
+ // Collapse runs of underscores for readability.
51
+ cleaned = cleaned.replace(/_+/g, '_');
52
+ if (cleaned.length === 0)
53
+ return 'unknown';
54
+ // Escape Windows reserved device names (CON, PRN, NUL, COM1-9, LPT1-9).
55
+ // Match either the bare name or "name.ext" (case-insensitive).
56
+ const stem = cleaned.split('.')[0].toUpperCase();
57
+ if (WINDOWS_RESERVED_NAMES.has(stem)) {
58
+ cleaned = `_${cleaned}`;
59
+ }
60
+ return cleaned;
61
+ }
62
+ /**
63
+ * Derive a project name for the output directory. Prefers the basename of
64
+ * the repository path (when it appears to be a filesystem path), otherwise
65
+ * falls back to the last path segment of a remote URL.
66
+ */
67
+ function deriveProjectName(results) {
68
+ const repoPath = results.repository?.path;
69
+ if (repoPath) {
70
+ // Use basename — repoPath may be absolute on Windows or POSIX.
71
+ const normalised = repoPath.replace(/[\\/]+$/, '');
72
+ const base = basename(normalised.split(sep).join('/'));
73
+ if (base)
74
+ return safeFilename(base);
75
+ }
76
+ const remote = results.repository?.remoteUrl;
77
+ if (remote) {
78
+ const stripped = remote.replace(/\.git$/i, '').replace(/[\\/]+$/, '');
79
+ const tail = stripped.split('/').pop();
80
+ if (tail)
81
+ return safeFilename(tail);
82
+ }
83
+ return 'project';
84
+ }
85
+ /** Pad an integer to 3 digits with leading zeros (e.g. 1 -> "001"). */
86
+ function pad3(n) {
87
+ return String(n).padStart(3, '0');
88
+ }
89
+ function formatLineRange(issue) {
90
+ if (issue.startLine === issue.endLine)
91
+ return String(issue.startLine);
92
+ return `${issue.startLine}-${issue.endLine}`;
93
+ }
94
+ function renderMarkdown(issue) {
95
+ const lines = [];
96
+ lines.push(`# ${issue.checkName} (${issue.checkId})`);
97
+ lines.push('');
98
+ lines.push(`- **File**: \`${issue.file}\``);
99
+ lines.push(`- **Lines**: ${formatLineRange(issue)}`);
100
+ if (issue.severity)
101
+ lines.push(`- **Severity**: ${issue.severity}`);
102
+ if (issue.confidence)
103
+ lines.push(`- **Confidence**: ${issue.confidence}`);
104
+ lines.push('');
105
+ lines.push('## Description');
106
+ lines.push('');
107
+ lines.push(issue.description);
108
+ if (issue.codeSnippet) {
109
+ lines.push('');
110
+ lines.push('## Code Snippet');
111
+ lines.push('');
112
+ // CommonMark allows variable-length fences: pick a length one longer than
113
+ // the longest run of backticks in the snippet so embedded fences don't
114
+ // break out of the code block.
115
+ const longest = (issue.codeSnippet.match(/`+/g) ?? []).reduce((m, s) => Math.max(m, s.length), 0);
116
+ const fence = '`'.repeat(Math.max(3, longest + 1));
117
+ lines.push(fence);
118
+ lines.push(issue.codeSnippet);
119
+ lines.push(fence);
120
+ }
121
+ if (issue.recommendation) {
122
+ lines.push('');
123
+ lines.push('## Recommendation');
124
+ lines.push('');
125
+ lines.push(issue.recommendation);
126
+ }
127
+ if (issue.dataFlow && issue.dataFlow.length > 0) {
128
+ lines.push('');
129
+ lines.push('## Data Flow Trace');
130
+ lines.push('');
131
+ issue.dataFlow.forEach((step, idx) => {
132
+ lines.push(`${idx + 1}. \`${step.file}:${step.lineNumber}\` — ${step.label}`);
133
+ });
134
+ }
135
+ lines.push('');
136
+ return lines.join('\n');
137
+ }
138
+ function renderJson(issue) {
139
+ // Pretty-printed for human review, includes all SecurityIssue fields.
140
+ return JSON.stringify(issue, null, 2) + '\n';
141
+ }
142
+ function renderHtml(issue) {
143
+ const parts = [];
144
+ parts.push('<!doctype html>');
145
+ parts.push('<html lang="en">');
146
+ parts.push('<head>');
147
+ parts.push('<meta charset="utf-8">');
148
+ parts.push(`<title>${escapeHtml(issue.checkName)} — ${escapeHtml(issue.file)}</title>`);
149
+ parts.push('<style>');
150
+ parts.push('body{font-family:sans-serif;max-width:900px;margin:2em auto;padding:0 1em;}');
151
+ parts.push('pre{background:#f4f4f4;padding:1em;overflow:auto;}');
152
+ parts.push('dt{font-weight:bold;}dd{margin:0 0 .5em 1em;}');
153
+ parts.push('</style>');
154
+ parts.push('</head>');
155
+ parts.push('<body>');
156
+ parts.push(`<h1>${escapeHtml(issue.checkName)} <small>(${escapeHtml(issue.checkId)})</small></h1>`);
157
+ parts.push('<dl>');
158
+ parts.push(`<dt>File</dt><dd><code>${escapeHtml(issue.file)}</code></dd>`);
159
+ parts.push(`<dt>Lines</dt><dd>${escapeHtml(formatLineRange(issue))}</dd>`);
160
+ if (issue.severity)
161
+ parts.push(`<dt>Severity</dt><dd>${escapeHtml(issue.severity)}</dd>`);
162
+ if (issue.confidence)
163
+ parts.push(`<dt>Confidence</dt><dd>${escapeHtml(issue.confidence)}</dd>`);
164
+ parts.push('</dl>');
165
+ parts.push('<h2>Description</h2>');
166
+ parts.push(`<p>${escapeHtml(issue.description)}</p>`);
167
+ if (issue.codeSnippet) {
168
+ parts.push('<h2>Code Snippet</h2>');
169
+ parts.push(`<pre><code>${escapeHtml(issue.codeSnippet)}</code></pre>`);
170
+ }
171
+ if (issue.recommendation) {
172
+ parts.push('<h2>Recommendation</h2>');
173
+ parts.push(`<p>${escapeHtml(issue.recommendation)}</p>`);
174
+ }
175
+ if (issue.dataFlow && issue.dataFlow.length > 0) {
176
+ parts.push('<h2>Data Flow Trace</h2>');
177
+ parts.push('<ol>');
178
+ for (const step of issue.dataFlow) {
179
+ parts.push(`<li><code>${escapeHtml(step.file)}:${escapeHtml(String(step.lineNumber))}</code> — ${escapeHtml(step.label)}</li>`);
180
+ }
181
+ parts.push('</ol>');
182
+ }
183
+ parts.push('</body>');
184
+ parts.push('</html>');
185
+ parts.push('');
186
+ return parts.join('\n');
187
+ }
188
+ function renderIssue(issue, format) {
189
+ switch (format) {
190
+ case 'markdown':
191
+ return renderMarkdown(issue);
192
+ case 'json':
193
+ return renderJson(issue);
194
+ case 'html':
195
+ return renderHtml(issue);
196
+ default:
197
+ // Fail fast: rather than silently writing the literal string "undefined"
198
+ // to disk, throw if a programmatic caller passes an unknown format.
199
+ throw new Error(`Unsupported individual issue format: ${String(format)}`);
200
+ }
201
+ }
202
+ /**
203
+ * Write one file per issue in `outputDir/security_issues_<project>/<check-id>/`.
204
+ *
205
+ * - File names follow `issue_<NNN>_<filename>.<ext>` with NNN zero-padded to 3.
206
+ * - Numbering is per check (each check directory restarts at 001).
207
+ * - When two issues would produce the same filename (e.g. multiple issues in
208
+ * the same source file), the index disambiguates them — they remain unique
209
+ * on disk because NNN is different.
210
+ *
211
+ * @param results Scan results containing the issues to externalize.
212
+ * @param outputDir Parent directory under which `security_issues_<project>/` is created.
213
+ * @param format Output format (`markdown` | `json` | `html`).
214
+ * @returns Root directory and the list of files written.
215
+ */
216
+ /**
217
+ * Matches only the files this module generates: `issue_<NNN>_<slug>.<ext>` with
218
+ * one of the three known extensions.
219
+ *
220
+ * Deliberately strict. The output directory is a normal directory a user may
221
+ * keep other things in — notes, a README, a previous run they copied aside — and
222
+ * a loose glob would delete them. Anything not matching this exact shape is
223
+ * left alone, and directories are never removed.
224
+ */
225
+ const GENERATED_ISSUE_FILE = /^issue_\d{3,}_.*\.(?:md|json|html)$/;
226
+ /**
227
+ * Remove issue files left by a previous run.
228
+ *
229
+ * Without this, a run that produces fewer findings than the last one leaves the
230
+ * surplus behind: the writer numbers from 1 each time, so old `issue_004_*`
231
+ * files survive and read as current findings. Stale results in a security
232
+ * report are worse than no results.
233
+ *
234
+ * Best-effort by design — a directory that cannot be read is skipped rather
235
+ * than failing the scan, since the report itself has already been written.
236
+ */
237
+ async function clearStaleIssueFiles(rootDir) {
238
+ let removed = 0;
239
+ let entries;
240
+ try {
241
+ entries = await readdir(rootDir, { withFileTypes: true });
242
+ }
243
+ catch {
244
+ return 0; // First run: nothing to clear.
245
+ }
246
+ for (const entry of entries) {
247
+ if (!entry.isDirectory())
248
+ continue;
249
+ const checkDir = resolve(rootDir, entry.name);
250
+ let files;
251
+ try {
252
+ files = await readdir(checkDir, { withFileTypes: true });
253
+ }
254
+ catch {
255
+ continue;
256
+ }
257
+ for (const file of files) {
258
+ if (!file.isFile() || !GENERATED_ISSUE_FILE.test(file.name))
259
+ continue;
260
+ try {
261
+ await unlink(resolve(checkDir, file.name));
262
+ removed++;
263
+ }
264
+ catch {
265
+ // Locked or already gone — the write below will overwrite what it can.
266
+ }
267
+ }
268
+ }
269
+ return removed;
270
+ }
271
+ export async function writeIndividualIssueFiles(results, outputDir, format = 'markdown') {
272
+ const projectName = deriveProjectName(results);
273
+ const rootDir = resolve(outputDir, `security_issues_${projectName}`);
274
+ await mkdir(rootDir, { recursive: true });
275
+ // Clear before writing, so a run with fewer findings than the last one does
276
+ // not leave the surplus behind looking current.
277
+ const removed = await clearStaleIssueFiles(rootDir);
278
+ if (removed > 0) {
279
+ logDebug(TAG, `Removed ${removed} issue file(s) from a previous run in ${rootDir}`);
280
+ }
281
+ // Group issues by checkId, preserving order (the order issues were collected).
282
+ const grouped = new Map();
283
+ for (const issue of results.issues) {
284
+ const list = grouped.get(issue.checkId);
285
+ if (list)
286
+ list.push(issue);
287
+ else
288
+ grouped.set(issue.checkId, [issue]);
289
+ }
290
+ const ext = FORMAT_EXTENSIONS[format];
291
+ const files = [];
292
+ for (const [checkId, issues] of grouped) {
293
+ const checkDir = resolve(rootDir, safeFilename(checkId));
294
+ await mkdir(checkDir, { recursive: true });
295
+ let n = 1;
296
+ for (const issue of issues) {
297
+ const fileSlug = safeFilename(issue.file);
298
+ const fileName = `issue_${pad3(n)}_${fileSlug}.${ext}`;
299
+ const fullPath = resolve(checkDir, fileName);
300
+ await writeFile(fullPath, renderIssue(issue, format), 'utf-8');
301
+ files.push(fullPath);
302
+ n++;
303
+ }
304
+ }
305
+ return { rootDir, files };
306
+ }
307
+ //# sourceMappingURL=issue-file-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-file-writer.js","sourceRoot":"","sources":["../src/issue-file-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * LLM judge stage: re-evaluates aggregated SecurityIssues after all checks have run.
3
+ * Annotates each issue with a verdict (true_positive / false_positive / uncertain),
4
+ * confidence, and rationale. Runs as a separate pipeline stage in runMultiScanWithCost.
5
+ */
6
+ import { type AgentProvider, type SecurityIssue, type JudgeVerdict } from './types.js';
7
+ import { type RetryOptions, type CircuitBreaker } from './retry.js';
8
+ import { type ScanCostTracker } from './cost-tracker.js';
9
+ export interface JudgeOptions {
10
+ provider: AgentProvider;
11
+ providerName: string;
12
+ model: string;
13
+ concurrency?: number;
14
+ dropFalsePositives?: boolean;
15
+ minConfidence?: number;
16
+ /**
17
+ * Retry settings for the judge's own AI calls. The scan runner passes the
18
+ * same resolved options it uses for check analysis, so opting into retry
19
+ * covers judging too. Omitted means the caller did not opt in, and
20
+ * `DEFAULT_RETRY` (one attempt) applies.
21
+ */
22
+ retry?: RetryOptions;
23
+ /** Circuit breaker shared with the scan, when retry is enabled. */
24
+ breaker?: CircuitBreaker;
25
+ }
26
+ /** Map from check ID to the check's markdown instructions (used in judge prompt). */
27
+ export type CheckInstructionsMap = Map<string, string>;
28
+ /**
29
+ * Parse a raw judge response into a JudgeVerdict.
30
+ * Returns undefined if the response is not parseable or lacks required fields.
31
+ */
32
+ export declare function parseJudgeResponse(raw: string): Pick<JudgeVerdict, 'verdict' | 'confidence' | 'rationale'> | undefined;
33
+ /**
34
+ * Run the judge stage over all collected issues.
35
+ * Mutates each issue in place by attaching a `judge` field.
36
+ * Returns the issues array (same reference, mutated).
37
+ */
38
+ export declare function runJudge(issues: SecurityIssue[], checksById: Map<string, {
39
+ check: {
40
+ judge?: boolean;
41
+ };
42
+ instructions: string | undefined;
43
+ }>, repositoryPath: string, options: JudgeOptions, costTracker: ScanCostTracker): Promise<SecurityIssue[]>;
44
+ /**
45
+ * Recompute per-check statuses and summary counts after the judge stage.
46
+ *
47
+ * Recomputation order (per issue 290 design):
48
+ * 1. Apply minConfidence demotion (already done in runJudge per-issue)
49
+ * 2. Drop false positives if dropFalsePositives is set
50
+ * 3. Escalate checks whose remaining issues are all uncertain → FLAG
51
+ * 4. Set flagSource on issues
52
+ * 5. Recompute summary counts
53
+ *
54
+ * Returns the filtered issues array and updated check summaries.
55
+ */
56
+ export declare function applyJudgeResults(allIssues: SecurityIssue[], allCheckSummaries: import('./types.js').CheckExecutionSummary[], options: Pick<JudgeOptions, 'dropFalsePositives'>): {
57
+ filteredIssues: SecurityIssue[];
58
+ judgedIssues: number;
59
+ falsePositives: number;
60
+ uncertainJudgements: number;
61
+ };
62
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAsB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAmE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAErI,OAAO,EAAE,KAAK,eAAe,EAAgC,MAAM,mBAAmB,CAAC;AAqBvF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC,GAAG,SAAS,CA+BtH;AA6CD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,EACzF,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,eAAe,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAuI1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EAAE,EAC1B,iBAAiB,EAAE,OAAO,YAAY,EAAE,qBAAqB,EAAE,EAC/D,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,oBAAoB,CAAC,GAChD;IACD,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAmEA"}