@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.
- package/dist/api/types.d.ts +7 -0
- package/dist/approval/auditLog.d.ts +1 -1
- package/dist/approval/auditLog.js +11 -3
- package/dist/approval/auditLog.js.map +1 -1
- package/dist/approval/broker.d.ts +7 -2
- package/dist/approval/broker.js +239 -110
- package/dist/approval/broker.js.map +1 -1
- package/dist/approval/policy.d.ts +10 -0
- package/dist/approval/policy.js +104 -0
- package/dist/approval/policy.js.map +1 -0
- package/dist/approval/types.d.ts +11 -2
- package/dist/approval/types.js +10 -1
- package/dist/approval/types.js.map +1 -1
- package/dist/attack/agentScanExecutor.d.ts +35 -1
- package/dist/attack/agentScanExecutor.js +405 -76
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.d.ts +20 -0
- package/dist/attack/agentScanLoop.js +1264 -60
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +382 -6
- package/dist/attack/agentScanProtocol.js +110 -4
- package/dist/attack/agentScanProtocol.js.map +1 -1
- package/dist/attack/agentTrace.d.ts +73 -0
- package/dist/attack/agentTrace.js +228 -0
- package/dist/attack/agentTrace.js.map +1 -0
- package/dist/attack/architectureScoutExecutor.d.ts +18 -0
- package/dist/attack/architectureScoutExecutor.js +211 -0
- package/dist/attack/architectureScoutExecutor.js.map +1 -0
- package/dist/attack/architectureScoutLoop.d.ts +36 -0
- package/dist/attack/architectureScoutLoop.js +403 -0
- package/dist/attack/architectureScoutLoop.js.map +1 -0
- package/dist/attack/architectureScoutProtocol.d.ts +209 -0
- package/dist/attack/architectureScoutProtocol.js +47 -0
- package/dist/attack/architectureScoutProtocol.js.map +1 -0
- package/dist/attack/candidateStore.d.ts +95 -0
- package/dist/attack/candidateStore.js +231 -0
- package/dist/attack/candidateStore.js.map +1 -0
- package/dist/attack/evidenceLedger.d.ts +67 -0
- package/dist/attack/evidenceLedger.js +192 -0
- package/dist/attack/evidenceLedger.js.map +1 -0
- package/dist/attack/finishGate.d.ts +62 -0
- package/dist/attack/finishGate.js +209 -0
- package/dist/attack/finishGate.js.map +1 -0
- package/dist/attack/fixCodeMerge.d.ts +27 -0
- package/dist/attack/fixCodeMerge.js +42 -0
- package/dist/attack/fixCodeMerge.js.map +1 -0
- package/dist/attack/fixVerifyLoop.d.ts +55 -0
- package/dist/attack/fixVerifyLoop.js +187 -0
- package/dist/attack/fixVerifyLoop.js.map +1 -0
- package/dist/attack/investigationProfiles.d.ts +36 -0
- package/dist/attack/investigationProfiles.js +144 -0
- package/dist/attack/investigationProfiles.js.map +1 -0
- package/dist/attack/investigationState.d.ts +227 -0
- package/dist/attack/investigationState.js +666 -0
- package/dist/attack/investigationState.js.map +1 -0
- package/dist/attack/mutationOperators.d.ts +22 -0
- package/dist/attack/mutationOperators.js +170 -0
- package/dist/attack/mutationOperators.js.map +1 -0
- package/dist/attack/mutationTest.d.ts +33 -0
- package/dist/attack/mutationTest.js +110 -0
- package/dist/attack/mutationTest.js.map +1 -0
- package/dist/attack/proofGate.d.ts +20 -0
- package/dist/attack/proofGate.js +104 -0
- package/dist/attack/proofGate.js.map +1 -0
- package/dist/attack/proofTypes.d.ts +57 -0
- package/dist/attack/proofTypes.js +32 -0
- package/dist/attack/proofTypes.js.map +1 -0
- package/dist/attack/protocolValidator.d.ts +50 -0
- package/dist/attack/protocolValidator.js +427 -0
- package/dist/attack/protocolValidator.js.map +1 -0
- package/dist/attack/qualityMetrics.d.ts +133 -0
- package/dist/attack/qualityMetrics.js +226 -0
- package/dist/attack/qualityMetrics.js.map +1 -0
- package/dist/attack/scanScheduler.d.ts +52 -0
- package/dist/attack/scanScheduler.js +265 -0
- package/dist/attack/scanScheduler.js.map +1 -0
- package/dist/attack/scanState.d.ts +58 -0
- package/dist/attack/scanState.js +102 -0
- package/dist/attack/scanState.js.map +1 -0
- package/dist/attack/searchIntent.d.ts +16 -0
- package/dist/attack/searchIntent.js +57 -0
- package/dist/attack/searchIntent.js.map +1 -0
- package/dist/attack/verifyLoop.d.ts +43 -0
- package/dist/attack/verifyLoop.js +329 -15
- package/dist/attack/verifyLoop.js.map +1 -1
- package/dist/attack/workItem.d.ts +57 -0
- package/dist/attack/workItem.js +225 -0
- package/dist/attack/workItem.js.map +1 -0
- package/dist/audit/findingReviewQueue.d.ts +109 -0
- package/dist/audit/findingReviewQueue.js +335 -0
- package/dist/audit/findingReviewQueue.js.map +1 -0
- package/dist/audit/scanAuditLog.d.ts +160 -0
- package/dist/audit/scanAuditLog.js +404 -0
- package/dist/audit/scanAuditLog.js.map +1 -0
- package/dist/dependency/dependencyChecker.js +35 -9
- package/dist/dependency/dependencyChecker.js.map +1 -1
- package/dist/dependency/exploitPriority.d.ts +33 -0
- package/dist/dependency/exploitPriority.js +78 -0
- package/dist/dependency/exploitPriority.js.map +1 -0
- package/dist/dependency/finding.d.ts +16 -0
- package/dist/dependency/osvClient.js +2 -0
- package/dist/dependency/osvClient.js.map +1 -1
- package/dist/dependency/types.d.ts +12 -1
- package/dist/mcp/server.js +13 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -0
- package/dist/mcp/tools.js +127 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +83 -1
- package/dist/project-map/agentMemory.js +197 -7
- package/dist/project-map/agentMemory.js.map +1 -1
- package/dist/project-map/architectureContext.d.ts +202 -0
- package/dist/project-map/architectureContext.js +421 -0
- package/dist/project-map/architectureContext.js.map +1 -0
- package/dist/project-map/blastRadius.d.ts +54 -0
- package/dist/project-map/blastRadius.js +196 -0
- package/dist/project-map/blastRadius.js.map +1 -0
- package/dist/project-map/callGraphExtractor.d.ts +13 -0
- package/dist/project-map/callGraphExtractor.js +222 -0
- package/dist/project-map/callGraphExtractor.js.map +1 -0
- package/dist/project-map/capabilityRegistry.d.ts +46 -0
- package/dist/project-map/capabilityRegistry.js +91 -0
- package/dist/project-map/capabilityRegistry.js.map +1 -0
- package/dist/project-map/findTests.d.ts +29 -0
- package/dist/project-map/findTests.js +236 -0
- package/dist/project-map/findTests.js.map +1 -0
- package/dist/project-map/handlerInventory.d.ts +112 -0
- package/dist/project-map/handlerInventory.js +184 -0
- package/dist/project-map/handlerInventory.js.map +1 -0
- package/dist/project-map/implementationResolver.d.ts +43 -0
- package/dist/project-map/implementationResolver.js +217 -0
- package/dist/project-map/implementationResolver.js.map +1 -0
- package/dist/project-map/mapContext.d.ts +6 -1
- package/dist/project-map/mapContext.js +1 -0
- package/dist/project-map/mapContext.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +57 -3
- package/dist/project-map/scanCache.js +61 -2
- package/dist/project-map/scanCache.js.map +1 -1
- package/dist/project-map/symbolIndex.d.ts +39 -0
- package/dist/project-map/symbolIndex.js +385 -0
- package/dist/project-map/symbolIndex.js.map +1 -0
- package/dist/tooling/agentEvalScoring.d.ts +77 -0
- package/dist/tooling/agentEvalScoring.js +140 -0
- package/dist/tooling/agentEvalScoring.js.map +1 -0
- package/dist/tooling/agentRegression.d.ts +53 -0
- package/dist/tooling/agentRegression.js +99 -0
- package/dist/tooling/agentRegression.js.map +1 -0
- package/dist/tools/agentScan.d.ts +69 -0
- package/dist/tools/agentScan.js +702 -43
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/tools/findingReviewTools.d.ts +22 -0
- package/dist/tools/findingReviewTools.js +121 -0
- package/dist/tools/findingReviewTools.js.map +1 -0
- package/dist/tools/fix.js +1 -1
- package/dist/tools/fix.js.map +1 -1
- package/dist/tools/map.js +191 -1
- package/dist/tools/map.js.map +1 -1
- package/dist/tools/runTests.d.ts +2 -0
- package/dist/tools/runTests.js +29 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/utils/effectMock.d.ts +1 -0
- package/dist/utils/effectMock.js +162 -0
- package/dist/utils/effectMock.js.map +1 -0
- package/dist/utils/gitContext.d.ts +26 -0
- package/dist/utils/gitContext.js +317 -0
- package/dist/utils/gitContext.js.map +1 -0
- package/dist/utils/localTestRunner.d.ts +57 -2
- package/dist/utils/localTestRunner.js +122 -101
- package/dist/utils/localTestRunner.js.map +1 -1
- package/dist/utils/runtimeDetect.d.ts +12 -2
- package/dist/utils/runtimeDetect.js +247 -10
- package/dist/utils/runtimeDetect.js.map +1 -1
- package/dist/utils/securityConfig.d.ts +17 -0
- package/dist/utils/securityConfig.js +192 -0
- package/dist/utils/securityConfig.js.map +1 -0
- package/dist/utils/testCommandPolicy.d.ts +36 -0
- package/dist/utils/testCommandPolicy.js +252 -0
- package/dist/utils/testCommandPolicy.js.map +1 -0
- package/dist/utils/testRunner.d.ts +56 -0
- package/dist/utils/testRunner.js +246 -0
- package/dist/utils/testRunner.js.map +1 -0
- package/dist/utils/testSafety.d.ts +40 -2
- package/dist/utils/testSafety.js +205 -26
- package/dist/utils/testSafety.js.map +1 -1
- package/dist/utils/verificationSandbox.d.ts +113 -0
- package/dist/utils/verificationSandbox.js +656 -0
- package/dist/utils/verificationSandbox.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Metadata-only scan audit log — samples per-scan metadata (no source code,
|
|
4
|
+
* no evidence strings) for quality auditing and regression tracking.
|
|
5
|
+
*
|
|
6
|
+
* Privacy contract (same as agentTrace.ts):
|
|
7
|
+
* - Source code NEVER leaves the machine.
|
|
8
|
+
* - Evidence strings, `why` explanations, fix code, and file content are
|
|
9
|
+
* NOT recorded. Only hashes, counts, verdicts, cost, steps, and action
|
|
10
|
+
* type histograms are stored.
|
|
11
|
+
* - The audit log is per-workspace, stored at
|
|
12
|
+
* `<workspaceRoot>/.securecode/scan-audit.jsonl`.
|
|
13
|
+
*
|
|
14
|
+
* Sampling:
|
|
15
|
+
* - Not every scan is recorded — a configurable sampling rate (default 1.0
|
|
16
|
+
* = 100% for local audit; the caller can lower it) gates which scans
|
|
17
|
+
* are persisted. Sampling is deterministic per scan (hash of file path
|
|
18
|
+
* + timestamp) so the same scan re-run doesn't double-count.
|
|
19
|
+
*
|
|
20
|
+
* Reuses metric vocabulary from agentEvalScoring.ts for aggregation:
|
|
21
|
+
* - provenRate, inconclusiveRate, meanSteps, meanCostUsd
|
|
22
|
+
*
|
|
23
|
+
* Retention:
|
|
24
|
+
* - 90-day TTL (longer than trace's 7 days — audit is long-term quality).
|
|
25
|
+
* - 1000 entries per workspace (3x the approval audit cap).
|
|
26
|
+
*/
|
|
27
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
30
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
31
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
32
|
+
}
|
|
33
|
+
Object.defineProperty(o, k2, desc);
|
|
34
|
+
}) : (function(o, m, k, k2) {
|
|
35
|
+
if (k2 === undefined) k2 = k;
|
|
36
|
+
o[k2] = m[k];
|
|
37
|
+
}));
|
|
38
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
39
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
40
|
+
}) : function(o, v) {
|
|
41
|
+
o["default"] = v;
|
|
42
|
+
});
|
|
43
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
44
|
+
var ownKeys = function(o) {
|
|
45
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
46
|
+
var ar = [];
|
|
47
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
48
|
+
return ar;
|
|
49
|
+
};
|
|
50
|
+
return ownKeys(o);
|
|
51
|
+
};
|
|
52
|
+
return function (mod) {
|
|
53
|
+
if (mod && mod.__esModule) return mod;
|
|
54
|
+
var result = {};
|
|
55
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
56
|
+
__setModuleDefault(result, mod);
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
})();
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.recordScanAuditSample = recordScanAuditSample;
|
|
62
|
+
exports.readScanAuditLog = readScanAuditLog;
|
|
63
|
+
exports.summarizeScanAuditLog = summarizeScanAuditLog;
|
|
64
|
+
exports.clearScanAuditLog = clearScanAuditLog;
|
|
65
|
+
exports.formatAuditSummary = formatAuditSummary;
|
|
66
|
+
exports.validateProvenInvariant = validateProvenInvariant;
|
|
67
|
+
const fs = __importStar(require("fs"));
|
|
68
|
+
const path = __importStar(require("path"));
|
|
69
|
+
const crypto = __importStar(require("crypto"));
|
|
70
|
+
const AUDIT_DIR = '.securecode';
|
|
71
|
+
const AUDIT_FILE = 'scan-audit.jsonl';
|
|
72
|
+
const MAX_ENTRIES = 1000;
|
|
73
|
+
const RETENTION_MS = 90 * 24 * 60 * 60 * 1000; // 90 days
|
|
74
|
+
function ensureAuditDir(workspaceRoot) {
|
|
75
|
+
const dir = path.join(workspaceRoot, AUDIT_DIR);
|
|
76
|
+
if (!fs.existsSync(dir))
|
|
77
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
78
|
+
return dir;
|
|
79
|
+
}
|
|
80
|
+
function getAuditPath(workspaceRoot) {
|
|
81
|
+
return path.join(ensureAuditDir(workspaceRoot), AUDIT_FILE);
|
|
82
|
+
}
|
|
83
|
+
function shouldSample(filePath, timestamp, samplingRate) {
|
|
84
|
+
if (samplingRate >= 1.0)
|
|
85
|
+
return true;
|
|
86
|
+
if (samplingRate <= 0.0)
|
|
87
|
+
return false;
|
|
88
|
+
const hash = crypto.createHash('sha256').update(`${filePath}:${timestamp}`).digest('hex');
|
|
89
|
+
const value = parseInt(hash.substring(0, 8), 16) / 0xffffffff;
|
|
90
|
+
return value < samplingRate;
|
|
91
|
+
}
|
|
92
|
+
function buildActionHistogram(transcript) {
|
|
93
|
+
const hist = {};
|
|
94
|
+
for (const step of transcript) {
|
|
95
|
+
const type = step?.action?.type;
|
|
96
|
+
if (!type)
|
|
97
|
+
continue;
|
|
98
|
+
hist[type] = (hist[type] || 0) + 1;
|
|
99
|
+
}
|
|
100
|
+
return hist;
|
|
101
|
+
}
|
|
102
|
+
function recordScanAuditSample(workspaceRoot, scanResult, options) {
|
|
103
|
+
const samplingRate = options?.samplingRate ?? 1.0;
|
|
104
|
+
const timestamp = Date.now();
|
|
105
|
+
if (!shouldSample(scanResult.filePath, timestamp, samplingRate)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const findings = (scanResult.agentFindings || []).map((f) => ({
|
|
109
|
+
type: f.type || 'unknown',
|
|
110
|
+
severity: f.severity || 'unknown',
|
|
111
|
+
line: f.line || 0,
|
|
112
|
+
confidence: f.confidence ?? 0,
|
|
113
|
+
proven: f.proven || 'UNKNOWN',
|
|
114
|
+
evidenceLevel: f.evidenceLevel,
|
|
115
|
+
verificationLevel: f.verificationLevel,
|
|
116
|
+
}));
|
|
117
|
+
const findingCounts = {
|
|
118
|
+
total: findings.length,
|
|
119
|
+
proven: findings.filter(f => f.proven === 'PROVEN').length,
|
|
120
|
+
unproven: findings.filter(f => f.proven === 'UNPROVEN').length,
|
|
121
|
+
inconclusive: findings.filter(f => f.proven === 'INCONCLUSIVE').length,
|
|
122
|
+
notReproducible: findings.filter(f => f.proven === 'NOT_REPRODUCIBLE').length,
|
|
123
|
+
skipped: findings.filter(f => f.proven === 'SKIPPED').length,
|
|
124
|
+
};
|
|
125
|
+
const verificationLevelDistribution = {};
|
|
126
|
+
for (const f of findings) {
|
|
127
|
+
const vl = f.verificationLevel || 'unspecified';
|
|
128
|
+
verificationLevelDistribution[vl] = (verificationLevelDistribution[vl] || 0) + 1;
|
|
129
|
+
}
|
|
130
|
+
const rootCauseIds = new Set();
|
|
131
|
+
for (const f of scanResult.agentFindings || []) {
|
|
132
|
+
if (f.rootCause?.rootCauseId)
|
|
133
|
+
rootCauseIds.add(f.rootCause.rootCauseId);
|
|
134
|
+
}
|
|
135
|
+
const proofGateFailures = {};
|
|
136
|
+
let provenStrictCount = 0;
|
|
137
|
+
let provenRejectedByGate = 0;
|
|
138
|
+
let syntheticProofCount = 0;
|
|
139
|
+
let realImportProofCount = 0;
|
|
140
|
+
let flakyProofCount = 0;
|
|
141
|
+
for (const f of scanResult.agentFindings || []) {
|
|
142
|
+
if (f.proven === 'PROVEN' && f.proofGateResult?.eligibleForProven)
|
|
143
|
+
provenStrictCount++;
|
|
144
|
+
if (f.proofGateResult && !f.proofGateResult.eligibleForProven && f.proven !== 'PROVEN')
|
|
145
|
+
provenRejectedByGate++;
|
|
146
|
+
if (f.proofEvidence?.sourceMode === 'synthetic')
|
|
147
|
+
syntheticProofCount++;
|
|
148
|
+
if (f.proofEvidence?.sourceMode === 'real-import')
|
|
149
|
+
realImportProofCount++;
|
|
150
|
+
if (f.proofGateResult?.failedGates.includes('flaky-proof'))
|
|
151
|
+
flakyProofCount++;
|
|
152
|
+
if (f.proofGateResult) {
|
|
153
|
+
for (const gate of f.proofGateResult.failedGates) {
|
|
154
|
+
proofGateFailures[gate] = (proofGateFailures[gate] || 0) + 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const precisionMetrics = {
|
|
159
|
+
investigationNotesCount: scanResult.investigationNotes?.length ?? 0,
|
|
160
|
+
coverageGapsCount: scanResult.coverageGaps?.length ?? 0,
|
|
161
|
+
verificationLevelDistribution,
|
|
162
|
+
rootCauseCount: rootCauseIds.size,
|
|
163
|
+
hasArchitectureContext: scanResult.hasArchitectureContext ?? false,
|
|
164
|
+
stepsGranted: scanResult.stepsGranted,
|
|
165
|
+
extensionsGranted: scanResult.extensionsGranted,
|
|
166
|
+
terminationReason: scanResult.terminationReason,
|
|
167
|
+
provenStrictCount,
|
|
168
|
+
provenRejectedByGate,
|
|
169
|
+
proofGateFailures,
|
|
170
|
+
syntheticProofCount,
|
|
171
|
+
realImportProofCount,
|
|
172
|
+
flakyProofCount,
|
|
173
|
+
};
|
|
174
|
+
const sample = {
|
|
175
|
+
timestamp: new Date(timestamp).toISOString(),
|
|
176
|
+
filePath: scanResult.filePath,
|
|
177
|
+
fileHash: scanResult.fileHash,
|
|
178
|
+
language: scanResult.language,
|
|
179
|
+
scanStatus: scanResult.scanStatus,
|
|
180
|
+
stepsUsed: scanResult.stepsUsed,
|
|
181
|
+
costSpentUsd: scanResult.costSpentUsd,
|
|
182
|
+
findings,
|
|
183
|
+
findingCounts,
|
|
184
|
+
precisionMetrics,
|
|
185
|
+
verifyUsage: scanResult.verifyUsage,
|
|
186
|
+
actionHistogram: buildActionHistogram(scanResult.transcript || []),
|
|
187
|
+
cached: scanResult.cached,
|
|
188
|
+
scope: scanResult.scope ? {
|
|
189
|
+
changedFiles: scanResult.scope.changedFiles?.length || 0,
|
|
190
|
+
blastRadius: scanResult.scope.blastRadius?.length || 0,
|
|
191
|
+
baseRef: scanResult.scope.baseRef,
|
|
192
|
+
} : undefined,
|
|
193
|
+
};
|
|
194
|
+
try {
|
|
195
|
+
const auditPath = getAuditPath(workspaceRoot);
|
|
196
|
+
const line = JSON.stringify(sample) + '\n';
|
|
197
|
+
fs.appendFileSync(auditPath, line, { encoding: 'utf8', mode: 0o600 });
|
|
198
|
+
pruneOldEntries(workspaceRoot);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function pruneOldEntries(workspaceRoot) {
|
|
206
|
+
try {
|
|
207
|
+
const auditPath = getAuditPath(workspaceRoot);
|
|
208
|
+
if (!fs.existsSync(auditPath))
|
|
209
|
+
return;
|
|
210
|
+
const content = fs.readFileSync(auditPath, 'utf8');
|
|
211
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
212
|
+
if (lines.length <= MAX_ENTRIES)
|
|
213
|
+
return;
|
|
214
|
+
const cutoff = Date.now() - RETENTION_MS;
|
|
215
|
+
const kept = [];
|
|
216
|
+
for (const line of lines) {
|
|
217
|
+
try {
|
|
218
|
+
const entry = JSON.parse(line);
|
|
219
|
+
const ts = new Date(entry.timestamp).getTime();
|
|
220
|
+
if (ts >= cutoff)
|
|
221
|
+
kept.push(line);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// keep unparseable lines (don't lose data on corruption)
|
|
225
|
+
kept.push(line);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (kept.length > MAX_ENTRIES) {
|
|
229
|
+
kept.splice(0, kept.length - MAX_ENTRIES);
|
|
230
|
+
}
|
|
231
|
+
fs.writeFileSync(auditPath, kept.join('\n') + '\n', { encoding: 'utf8', mode: 0o600 });
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// best-effort
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function readScanAuditLog(workspaceRoot, limit = 100) {
|
|
238
|
+
try {
|
|
239
|
+
const auditPath = getAuditPath(workspaceRoot);
|
|
240
|
+
if (!fs.existsSync(auditPath))
|
|
241
|
+
return [];
|
|
242
|
+
const content = fs.readFileSync(auditPath, 'utf8');
|
|
243
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
244
|
+
const samples = [];
|
|
245
|
+
for (const line of lines.slice(-limit)) {
|
|
246
|
+
try {
|
|
247
|
+
samples.push(JSON.parse(line));
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// skip corrupt
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return samples;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function summarizeScanAuditLog(workspaceRoot) {
|
|
260
|
+
const samples = readScanAuditLog(workspaceRoot, MAX_ENTRIES);
|
|
261
|
+
const summary = {
|
|
262
|
+
totalScans: samples.length,
|
|
263
|
+
cachedScans: samples.filter(s => s.cached).length,
|
|
264
|
+
freshScans: samples.filter(s => !s.cached).length,
|
|
265
|
+
totalFindings: 0,
|
|
266
|
+
byProven: {},
|
|
267
|
+
bySeverity: {},
|
|
268
|
+
byType: {},
|
|
269
|
+
provenRate: 0,
|
|
270
|
+
inconclusiveRate: 0,
|
|
271
|
+
meanSteps: 0,
|
|
272
|
+
meanCostUsd: 0,
|
|
273
|
+
meanFindingsPerScan: 0,
|
|
274
|
+
actionTypeUsage: {},
|
|
275
|
+
oldestEntry: null,
|
|
276
|
+
newestEntry: null,
|
|
277
|
+
};
|
|
278
|
+
if (samples.length === 0)
|
|
279
|
+
return summary;
|
|
280
|
+
let totalSteps = 0;
|
|
281
|
+
let totalCost = 0;
|
|
282
|
+
let totalFindings = 0;
|
|
283
|
+
let totalProven = 0;
|
|
284
|
+
let totalInconclusive = 0;
|
|
285
|
+
for (const s of samples) {
|
|
286
|
+
totalSteps += s.stepsUsed;
|
|
287
|
+
totalCost += s.costSpentUsd;
|
|
288
|
+
totalFindings += s.findingCounts.total;
|
|
289
|
+
totalProven += s.findingCounts.proven;
|
|
290
|
+
totalInconclusive += s.findingCounts.inconclusive;
|
|
291
|
+
for (const f of s.findings) {
|
|
292
|
+
summary.byProven[f.proven] = (summary.byProven[f.proven] || 0) + 1;
|
|
293
|
+
summary.bySeverity[f.severity] = (summary.bySeverity[f.severity] || 0) + 1;
|
|
294
|
+
summary.byType[f.type] = (summary.byType[f.type] || 0) + 1;
|
|
295
|
+
}
|
|
296
|
+
for (const [action, count] of Object.entries(s.actionHistogram)) {
|
|
297
|
+
summary.actionTypeUsage[action] = (summary.actionTypeUsage[action] || 0) + count;
|
|
298
|
+
}
|
|
299
|
+
if (!summary.oldestEntry || s.timestamp < summary.oldestEntry) {
|
|
300
|
+
summary.oldestEntry = s.timestamp;
|
|
301
|
+
}
|
|
302
|
+
if (!summary.newestEntry || s.timestamp > summary.newestEntry) {
|
|
303
|
+
summary.newestEntry = s.timestamp;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
summary.totalFindings = totalFindings;
|
|
307
|
+
summary.meanSteps = totalSteps / samples.length;
|
|
308
|
+
summary.meanCostUsd = totalCost / samples.length;
|
|
309
|
+
summary.meanFindingsPerScan = totalFindings / samples.length;
|
|
310
|
+
summary.provenRate = totalFindings > 0 ? totalProven / totalFindings : 0;
|
|
311
|
+
summary.inconclusiveRate = totalFindings > 0 ? totalInconclusive / totalFindings : 0;
|
|
312
|
+
return summary;
|
|
313
|
+
}
|
|
314
|
+
function clearScanAuditLog(workspaceRoot) {
|
|
315
|
+
try {
|
|
316
|
+
const auditPath = getAuditPath(workspaceRoot);
|
|
317
|
+
if (fs.existsSync(auditPath))
|
|
318
|
+
fs.unlinkSync(auditPath);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// best-effort
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function formatAuditSummary(summary) {
|
|
325
|
+
if (summary.totalScans === 0) {
|
|
326
|
+
return 'No scan audit data available.';
|
|
327
|
+
}
|
|
328
|
+
const lines = [
|
|
329
|
+
`Scan Audit Summary (${summary.totalScans} scans, ${summary.cachedScans} cached, ${summary.freshScans} fresh):`,
|
|
330
|
+
'',
|
|
331
|
+
`Findings: ${summary.totalFindings} total (${summary.meanFindingsPerScan.toFixed(1)}/scan)`,
|
|
332
|
+
` Proven: ${summary.byProven.PROVEN || 0} (${(summary.provenRate * 100).toFixed(1)}%)`,
|
|
333
|
+
` Inconclusive: ${summary.byProven.INCONCLUSIVE || 0} (${(summary.inconclusiveRate * 100).toFixed(1)}%)`,
|
|
334
|
+
` Unproven: ${summary.byProven.UNPROVEN || 0}`,
|
|
335
|
+
` Not Reproducible: ${summary.byProven.NOT_REPRODUCIBLE || 0}`,
|
|
336
|
+
` Skipped: ${summary.byProven.SKIPPED || 0}`,
|
|
337
|
+
'',
|
|
338
|
+
`Cost: $${summary.meanCostUsd.toFixed(4)}/scan (avg), $${(summary.meanCostUsd * summary.totalScans).toFixed(4)} total`,
|
|
339
|
+
`Steps: ${summary.meanSteps.toFixed(1)}/scan (avg)`,
|
|
340
|
+
'',
|
|
341
|
+
'By severity:',
|
|
342
|
+
];
|
|
343
|
+
for (const [sev, count] of Object.entries(summary.bySeverity).sort((a, b) => b[1] - a[1])) {
|
|
344
|
+
lines.push(` ${sev}: ${count}`);
|
|
345
|
+
}
|
|
346
|
+
lines.push('', 'By type:');
|
|
347
|
+
for (const [type, count] of Object.entries(summary.byType).sort((a, b) => b[1] - a[1])) {
|
|
348
|
+
lines.push(` ${type}: ${count}`);
|
|
349
|
+
}
|
|
350
|
+
lines.push('', 'Tool usage:');
|
|
351
|
+
for (const [action, count] of Object.entries(summary.actionTypeUsage).sort((a, b) => b[1] - a[1])) {
|
|
352
|
+
lines.push(` ${action}: ${count}`);
|
|
353
|
+
}
|
|
354
|
+
if (summary.oldestEntry && summary.newestEntry) {
|
|
355
|
+
lines.push('', `Range: ${summary.oldestEntry} → ${summary.newestEntry}`);
|
|
356
|
+
}
|
|
357
|
+
return lines.join('\n');
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Validate the PROVEN invariant: every PROVEN finding must have:
|
|
361
|
+
* - proofEvidence
|
|
362
|
+
* - proofGateResult.eligibleForProven === true
|
|
363
|
+
* - sourceMode = real-import or real-server
|
|
364
|
+
* - repeatedRuns >= 3
|
|
365
|
+
* - repeatPasses === repeatedRuns
|
|
366
|
+
* - mutation discrimination passed
|
|
367
|
+
*
|
|
368
|
+
* Returns an array of violations per finding. An empty array means all
|
|
369
|
+
* PROVEN findings satisfy the invariant.
|
|
370
|
+
*/
|
|
371
|
+
function validateProvenInvariant(findings) {
|
|
372
|
+
const checks = [];
|
|
373
|
+
findings.forEach((finding, i) => {
|
|
374
|
+
if (finding.proven !== 'PROVEN' && finding.verdict !== 'PROVEN')
|
|
375
|
+
return;
|
|
376
|
+
const violations = [];
|
|
377
|
+
if (!finding.proofEvidence) {
|
|
378
|
+
violations.push('missing proofEvidence');
|
|
379
|
+
}
|
|
380
|
+
if (!finding.proofGateResult || !finding.proofGateResult.eligibleForProven) {
|
|
381
|
+
violations.push('proofGateResult.eligibleForProven is not true');
|
|
382
|
+
}
|
|
383
|
+
const sourceMode = finding.proofEvidence?.sourceMode;
|
|
384
|
+
if (sourceMode && sourceMode !== 'real-import' && sourceMode !== 'real-server') {
|
|
385
|
+
violations.push(`sourceMode is ${sourceMode}, must be real-import or real-server`);
|
|
386
|
+
}
|
|
387
|
+
const repeatedRuns = finding.proofEvidence?.repeatedRuns ?? 0;
|
|
388
|
+
if (repeatedRuns < 3) {
|
|
389
|
+
violations.push(`repeatedRuns is ${repeatedRuns}, must be >= 3`);
|
|
390
|
+
}
|
|
391
|
+
const repeatPasses = finding.proofEvidence?.repeatPasses ?? 0;
|
|
392
|
+
if (repeatPasses !== repeatedRuns) {
|
|
393
|
+
violations.push(`repeatPasses (${repeatPasses}) !== repeatedRuns (${repeatedRuns}) — proof is flaky`);
|
|
394
|
+
}
|
|
395
|
+
if (finding.proofEvidence?.assumptions?.some((a) => a.includes('mutation-test'))) {
|
|
396
|
+
violations.push('mutation discrimination not passed');
|
|
397
|
+
}
|
|
398
|
+
if (violations.length > 0) {
|
|
399
|
+
checks.push({ findingIndex: i, violations });
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
return checks;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=scanAuditLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanAuditLog.js","sourceRoot":"","sources":["../../src/audit/scanAuditLog.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ exports.scanDependencies = scanDependencies;
|
|
|
4
4
|
const resolver_1 = require("./resolver");
|
|
5
5
|
const osvClient_1 = require("./osvClient");
|
|
6
6
|
const minSafeVersion_1 = require("./minSafeVersion");
|
|
7
|
+
const exploitPriority_1 = require("./exploitPriority");
|
|
7
8
|
const licensePolicy_1 = require("./licensePolicy");
|
|
8
9
|
/**
|
|
9
10
|
* Run the full dependency vulnerability check.
|
|
@@ -72,22 +73,34 @@ async function scanDependencies(opts) {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
|
-
// 6. Merge OSV + GHSA per package key, dedupe by vuln id.
|
|
76
|
+
// 6. Merge OSV + GHSA per package key, dedupe by vuln id, track provenance.
|
|
76
77
|
const matches = new Map();
|
|
77
78
|
const allKeys = new Set([...osvMap.keys(), ...ghsaMap.keys()]);
|
|
78
79
|
for (const key of allKeys) {
|
|
79
80
|
const osvList = osvMap.get(key) || [];
|
|
80
81
|
const ghsaList = ghsaMap.get(key) || [];
|
|
81
82
|
const merged = [];
|
|
82
|
-
const seenIds = new
|
|
83
|
+
const seenIds = new Map();
|
|
83
84
|
for (const v of [...osvList, ...ghsaList]) {
|
|
84
|
-
|
|
85
|
+
const existing = seenIds.get(v.id);
|
|
86
|
+
if (existing) {
|
|
87
|
+
existing.add(v.source);
|
|
85
88
|
continue;
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
}
|
|
90
|
+
const sources = new Set([v.source]);
|
|
91
|
+
seenIds.set(v.id, sources);
|
|
92
|
+
merged.push({ ...v, sources: [v.source] });
|
|
93
|
+
}
|
|
94
|
+
for (const v of merged) {
|
|
95
|
+
const srcs = seenIds.get(v.id);
|
|
96
|
+
if (srcs)
|
|
97
|
+
v.sources = Array.from(srcs);
|
|
88
98
|
}
|
|
89
|
-
// NVD enrichment (cached).
|
|
90
99
|
await (0, osvClient_1.enrichWithNvd)(merged, opts.state);
|
|
100
|
+
for (const v of merged) {
|
|
101
|
+
if (!v.sources || v.sources.length === 0)
|
|
102
|
+
v.sources = [v.source];
|
|
103
|
+
}
|
|
91
104
|
matches.set(key, merged);
|
|
92
105
|
}
|
|
93
106
|
// 7. Compute min-safe-version and build vulnerability findings.
|
|
@@ -106,12 +119,17 @@ async function scanDependencies(opts) {
|
|
|
106
119
|
const sortedVulns = vulns.slice().sort((a, b) => (b.cvssScore ?? 0) - (a.cvssScore ?? 0));
|
|
107
120
|
const worst = sortedVulns[0];
|
|
108
121
|
const minSafe = (0, minSafeVersion_1.computeMinSafeVersion)(pkg, sortedVulns);
|
|
109
|
-
const
|
|
122
|
+
const priority = (0, exploitPriority_1.computeExploitPriority)(sortedVulns, pkg);
|
|
123
|
+
const sevLabel = (0, exploitPriority_1.priorityLabel)(priority.score);
|
|
124
|
+
const severity = priority.score >= 50 ? 'ERROR' : 'WARNING';
|
|
110
125
|
const vulnCount = sortedVulns.length;
|
|
111
126
|
const cveList = sortedVulns.map(v => v.id).slice(0, 5).join(', ');
|
|
127
|
+
const sourceTag = priority.sourceCount >= 2 ? ` [confirmed by ${priority.sourceCount} sources]` : '';
|
|
128
|
+
const exploitTag = priority.knownExploited ? ' [KEV — known exploited]' : priority.exploitAvailable ? ' [exploit available]' : '';
|
|
129
|
+
const priorityTag = ` [priority: ${sevLabel}]`;
|
|
112
130
|
const message = minSafe
|
|
113
|
-
? `${(0, minSafeVersion_1.upgradeSuggestion)(pkg, minSafe)} — ${vulnCount} vulnerable ${vulnCount === 1 ? 'advisory' : 'advisories'}: ${cveList}`
|
|
114
|
-
: `${pkg.name}@${pkg.version} has ${vulnCount} vulnerable ${vulnCount === 1 ? 'advisory' : 'advisories'} with NO known fix: ${cveList}`;
|
|
131
|
+
? `${(0, minSafeVersion_1.upgradeSuggestion)(pkg, minSafe)} — ${vulnCount} vulnerable ${vulnCount === 1 ? 'advisory' : 'advisories'}: ${cveList}${sourceTag}${exploitTag}${priorityTag}`
|
|
132
|
+
: `${pkg.name}@${pkg.version} has ${vulnCount} vulnerable ${vulnCount === 1 ? 'advisory' : 'advisories'} with NO known fix: ${cveList}${sourceTag}${exploitTag}${priorityTag}`;
|
|
115
133
|
findings.push({
|
|
116
134
|
check_id: `dep.${worst.id}`,
|
|
117
135
|
severity,
|
|
@@ -127,6 +145,14 @@ async function scanDependencies(opts) {
|
|
|
127
145
|
license: pkg.license,
|
|
128
146
|
manifestPath: pkg.manifestPath,
|
|
129
147
|
unresolved: pkg.unresolved,
|
|
148
|
+
sourceCount: priority.sourceCount,
|
|
149
|
+
confirmedBy: priority.confirmedBy,
|
|
150
|
+
exploitPriority: priority.score,
|
|
151
|
+
knownExploited: priority.knownExploited,
|
|
152
|
+
exploitAvailable: priority.exploitAvailable,
|
|
153
|
+
epssPercentile: priority.epssPercentile,
|
|
154
|
+
isDirect: priority.isDirect,
|
|
155
|
+
advisoryCount: vulnCount,
|
|
130
156
|
},
|
|
131
157
|
});
|
|
132
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencyChecker.js","sourceRoot":"","sources":["../../src/dependency/dependencyChecker.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"dependencyChecker.js","sourceRoot":"","sources":["../../src/dependency/dependencyChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exploit-priority scoring for dependency vulnerabilities.
|
|
3
|
+
*
|
|
4
|
+
* Computes a 0-100 priority score that helps users fix the most dangerous
|
|
5
|
+
* issues first. The score combines:
|
|
6
|
+
*
|
|
7
|
+
* - CVSS base score (0-10 → 0-40 points)
|
|
8
|
+
* - EPSS percentile (0-100 → 0-25 points) — exploit probability
|
|
9
|
+
* - CISA KEV catalog (known exploited → +20 points)
|
|
10
|
+
* - Public exploit/PoC available (+10 points)
|
|
11
|
+
* - Direct dependency (+5 points) — you can fix it directly
|
|
12
|
+
*
|
|
13
|
+
* The score is capped at 100. The intent is NOT to be a perfect risk model
|
|
14
|
+
* — it's a triage signal that says "fix this before that".
|
|
15
|
+
*
|
|
16
|
+
* Confidence levels:
|
|
17
|
+
* - 3/3 sources (OSV + GHSA + NVD) → "high confidence"
|
|
18
|
+
* - 2/3 → "medium confidence"
|
|
19
|
+
* - 1/3 → "low confidence"
|
|
20
|
+
*/
|
|
21
|
+
import type { Vulnerability, ResolvedPackage } from './types';
|
|
22
|
+
export interface ExploitPriorityResult {
|
|
23
|
+
score: number;
|
|
24
|
+
knownExploited: boolean;
|
|
25
|
+
exploitAvailable: boolean;
|
|
26
|
+
epssPercentile: number;
|
|
27
|
+
isDirect: boolean;
|
|
28
|
+
sourceCount: number;
|
|
29
|
+
confirmedBy: string;
|
|
30
|
+
confidence: 'high' | 'medium' | 'low';
|
|
31
|
+
}
|
|
32
|
+
export declare function computeExploitPriority(vulns: Vulnerability[], pkg: ResolvedPackage): ExploitPriorityResult;
|
|
33
|
+
export declare function priorityLabel(score: number): 'critical' | 'high' | 'medium' | 'low';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Exploit-priority scoring for dependency vulnerabilities.
|
|
4
|
+
*
|
|
5
|
+
* Computes a 0-100 priority score that helps users fix the most dangerous
|
|
6
|
+
* issues first. The score combines:
|
|
7
|
+
*
|
|
8
|
+
* - CVSS base score (0-10 → 0-40 points)
|
|
9
|
+
* - EPSS percentile (0-100 → 0-25 points) — exploit probability
|
|
10
|
+
* - CISA KEV catalog (known exploited → +20 points)
|
|
11
|
+
* - Public exploit/PoC available (+10 points)
|
|
12
|
+
* - Direct dependency (+5 points) — you can fix it directly
|
|
13
|
+
*
|
|
14
|
+
* The score is capped at 100. The intent is NOT to be a perfect risk model
|
|
15
|
+
* — it's a triage signal that says "fix this before that".
|
|
16
|
+
*
|
|
17
|
+
* Confidence levels:
|
|
18
|
+
* - 3/3 sources (OSV + GHSA + NVD) → "high confidence"
|
|
19
|
+
* - 2/3 → "medium confidence"
|
|
20
|
+
* - 1/3 → "low confidence"
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.computeExploitPriority = computeExploitPriority;
|
|
24
|
+
exports.priorityLabel = priorityLabel;
|
|
25
|
+
const ALL_SOURCES = ['osv', 'ghsa', 'nvd'];
|
|
26
|
+
function computeExploitPriority(vulns, pkg) {
|
|
27
|
+
const worst = vulns.reduce((acc, v) => {
|
|
28
|
+
const score = v.cvssScore ?? 0;
|
|
29
|
+
return score > acc.maxScore ? { maxScore: score, v } : acc;
|
|
30
|
+
}, { maxScore: 0, v: vulns[0] });
|
|
31
|
+
if (!worst.v) {
|
|
32
|
+
return {
|
|
33
|
+
score: 0,
|
|
34
|
+
knownExploited: false,
|
|
35
|
+
exploitAvailable: false,
|
|
36
|
+
epssPercentile: 0,
|
|
37
|
+
isDirect: false,
|
|
38
|
+
sourceCount: 0,
|
|
39
|
+
confirmedBy: '',
|
|
40
|
+
confidence: 'low',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const allSources = new Set();
|
|
44
|
+
for (const v of vulns) {
|
|
45
|
+
for (const s of v.sources || [v.source]) {
|
|
46
|
+
allSources.add(s);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const cvssComponent = Math.min((worst.maxScore / 10) * 40, 40);
|
|
50
|
+
const epssComponent = Math.min((worst.v.epssPercentile ?? 0) / 100 * 25, 25);
|
|
51
|
+
const kevComponent = worst.v.knownExploited ? 20 : 0;
|
|
52
|
+
const exploitComponent = worst.v.exploitAvailable ? 10 : 0;
|
|
53
|
+
const directComponent = pkg.direct ? 5 : 0;
|
|
54
|
+
const score = Math.min(Math.round(cvssComponent + epssComponent + kevComponent + exploitComponent + directComponent), 100);
|
|
55
|
+
const sourceCount = allSources.size;
|
|
56
|
+
const confirmedBy = ALL_SOURCES.filter(s => allSources.has(s)).join(', ');
|
|
57
|
+
const confidence = sourceCount >= 3 ? 'high' : sourceCount === 2 ? 'medium' : 'low';
|
|
58
|
+
return {
|
|
59
|
+
score,
|
|
60
|
+
knownExploited: worst.v.knownExploited ?? false,
|
|
61
|
+
exploitAvailable: worst.v.exploitAvailable ?? false,
|
|
62
|
+
epssPercentile: worst.v.epssPercentile ?? 0,
|
|
63
|
+
isDirect: pkg.direct ?? false,
|
|
64
|
+
sourceCount,
|
|
65
|
+
confirmedBy,
|
|
66
|
+
confidence,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function priorityLabel(score) {
|
|
70
|
+
if (score >= 75)
|
|
71
|
+
return 'critical';
|
|
72
|
+
if (score >= 50)
|
|
73
|
+
return 'high';
|
|
74
|
+
if (score >= 25)
|
|
75
|
+
return 'medium';
|
|
76
|
+
return 'low';
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=exploitPriority.js.map
|