@clear-capabilities/agentic-security-scanner 0.144.0 → 0.147.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +390 -0
- package/bin/agentic-security.js +3813 -83
- package/dist/1122.index.js +702 -0
- package/dist/{301.index.js → 1301.index.js} +2 -2
- package/dist/1379.index.js +591 -0
- package/dist/{444.index.js → 1444.index.js} +13 -4
- package/dist/{660.index.js → 1660.index.js} +2 -2
- package/dist/{700.index.js → 1700.index.js} +2 -2
- package/dist/{905.index.js → 1905.index.js} +3 -3
- package/dist/{920.index.js → 1920.index.js} +3 -3
- package/dist/{238.index.js → 2238.index.js} +3 -3
- package/dist/2271.index.js +165 -0
- package/dist/{985.index.js → 2376.index.js} +1260 -340
- package/dist/2432.index.js +793 -0
- package/dist/2659.index.js +93 -0
- package/dist/{826.index.js → 2826.index.js} +2 -2
- package/dist/{830.index.js → 2830.index.js} +2 -2
- package/dist/2923.index.js +298 -0
- package/dist/{1.index.js → 3001.index.js} +5 -5
- package/dist/{117.index.js → 3117.index.js} +3 -3
- package/dist/3180.index.js +307 -0
- package/dist/3276.index.js +117 -0
- package/dist/{415.index.js → 3415.index.js} +2 -2
- package/dist/{499.index.js → 3499.index.js} +2 -2
- package/dist/3518.index.js +450 -0
- package/dist/{526.index.js → 3526.index.js} +14 -6
- package/dist/{736.index.js → 3736.index.js} +4 -4
- package/dist/{839.index.js → 3839.index.js} +4 -4
- package/dist/{113.index.js → 4113.index.js} +14 -6
- package/dist/{265.index.js → 4265.index.js} +2 -2
- package/dist/{384.index.js → 4384.index.js} +3 -3
- package/dist/4547.index.js +268 -0
- package/dist/4863.index.js +422 -0
- package/dist/{970.index.js → 4970.index.js} +67 -3
- package/dist/5051.index.js +770 -0
- package/dist/{144.index.js → 5144.index.js} +5 -5
- package/dist/{333.index.js → 5333.index.js} +3 -3
- package/dist/5343.index.js +185 -0
- package/dist/5350.index.js +866 -0
- package/dist/5561.index.js +436 -0
- package/dist/{637.index.js → 5637.index.js} +29 -7
- package/dist/{449.index.js → 5830.index.js} +78 -14
- package/dist/6626.index.js +532 -0
- package/dist/6662.index.js +297 -0
- package/dist/{675.index.js → 6675.index.js} +5 -5
- package/dist/{730.index.js → 6730.index.js} +6 -6
- package/dist/6829.index.js +225 -0
- package/dist/6944.index.js +130 -0
- package/dist/{178.index.js → 7178.index.js} +26 -8
- package/dist/{227.index.js → 7227.index.js} +2 -2
- package/dist/7310.index.js +520 -0
- package/dist/{552.index.js → 7552.index.js} +4 -4
- package/dist/7709.index.js +78 -0
- package/dist/8218.index.js +160 -0
- package/dist/{476.index.js → 8476.index.js} +4 -4
- package/dist/{513.index.js → 8513.index.js} +5 -5
- package/dist/{520.index.js → 8520.index.js} +2 -2
- package/dist/{718.index.js → 8718.index.js} +2 -2
- package/dist/{752.index.js → 8752.index.js} +2 -2
- package/dist/8846.index.js +100 -0
- package/dist/{435.index.js → 9091.index.js} +580 -187
- package/dist/{207.index.js → 9207.index.js} +2 -2
- package/dist/{220.index.js → 9220.index.js} +2 -2
- package/dist/9390.index.js +163 -0
- package/dist/{503.index.js → 9503.index.js} +2 -2
- package/dist/{801.index.js → 9801.index.js} +2 -2
- package/dist/{824.index.js → 9824.index.js} +2 -2
- package/dist/agentic-security.mjs +16 -16
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/dist/compliance-frameworks/hipaa-security-rule.json +3 -2
- package/package.json +23 -10
- package/src/compare.js +6 -1
- package/src/dataflow/CLAUDE.md +2 -2
- package/src/dataflow/catalog.js +42 -0
- package/src/dataflow/orm-write-catalog.js +175 -0
- package/src/engine.js +580 -30
- package/src/fix/apply-fix-service.js +1 -0
- package/src/history-scan.js +22 -5
- package/src/ir/CLAUDE.md +2 -1
- package/src/ir/chrome-probe.mjs +150 -0
- package/src/ir/parser-js.js +94 -7
- package/src/lineage/CLAUDE.md +1203 -0
- package/src/lineage/DESIGN_DESTINATION_RESOLVER.md +156 -0
- package/src/lineage/DESIGN_GRAPH_BUILDER.md +938 -0
- package/src/lineage/DESIGN_HANDLING_ANALYZER.md +355 -0
- package/src/lineage/DESIGN_INTRAPROCEDURAL.md +628 -0
- package/src/lineage/DESIGN_PATH_PROVENANCE.md +3451 -0
- package/src/lineage/DESIGN_QUEUE_DETAIL.md +120 -0
- package/src/lineage/DESIGN_REGISTRIES.md +880 -0
- package/src/lineage/DESIGN_STORE_DETAIL.md +143 -0
- package/src/lineage/DESIGN_TRANSIT_PROTECTION.md +245 -0
- package/src/lineage/classification.js +56 -0
- package/src/lineage/coverage.js +658 -0
- package/src/lineage/cross-repo-link.js +107 -0
- package/src/lineage/dataflow-graph.schema.json +184 -0
- package/src/lineage/decision-story.js +206 -0
- package/src/lineage/drift-policy.js +279 -0
- package/src/lineage/driver.js +135 -0
- package/src/lineage/engine.js +992 -0
- package/src/lineage/export-briefing.js +628 -0
- package/src/lineage/export-csv.js +62 -0
- package/src/lineage/export-json.js +238 -0
- package/src/lineage/export-privacy.js +258 -0
- package/src/lineage/federation-loader.js +111 -0
- package/src/lineage/field-identity.js +78 -0
- package/src/lineage/fixtures/build-flagship-fixture.mjs +272 -0
- package/src/lineage/fixtures/flagship-graph.json +1453 -0
- package/src/lineage/flow-grade.js +221 -0
- package/src/lineage/governance-edit.js +169 -0
- package/src/lineage/graph-builder.js +1114 -0
- package/src/lineage/graph-diff.js +431 -0
- package/src/lineage/graph-snapshot.js +180 -0
- package/src/lineage/handling-analyzer.js +168 -0
- package/src/lineage/ids.js +349 -0
- package/src/lineage/impact-assessment.js +76 -0
- package/src/lineage/impact-engine.js +268 -0
- package/src/lineage/index.js +281 -0
- package/src/lineage/language-coverage-tiers.js +58 -0
- package/src/lineage/obligation-mapping.js +126 -0
- package/src/lineage/obligation-predicates.js +235 -0
- package/src/lineage/observation-adapters.js +282 -0
- package/src/lineage/observation-correlation.js +622 -0
- package/src/lineage/observation-store.js +497 -0
- package/src/lineage/path-query.js +410 -0
- package/src/lineage/path-store.js +400 -0
- package/src/lineage/protection.js +53 -0
- package/src/lineage/recipient-profile.js +192 -0
- package/src/lineage/recipient-registry.js +394 -0
- package/src/lineage/redact-graph.js +224 -0
- package/src/lineage/remediation.js +417 -0
- package/src/lineage/resolve-destination.js +91 -0
- package/src/lineage/runtime-observation.js +464 -0
- package/src/lineage/scenario-diff.js +84 -0
- package/src/lineage/scenario-engine.js +251 -0
- package/src/lineage/scenario.js +101 -0
- package/src/lineage/schema.js +167 -0
- package/src/lineage/sink-registry.js +427 -0
- package/src/lineage/source-registry.js +357 -0
- package/src/lineage/source-seeding.js +212 -0
- package/src/lineage/summaries.js +590 -0
- package/src/lineage/transform-catalog.js +397 -0
- package/src/lineage/transit-protection.js +150 -0
- package/src/lineage/validate.js +285 -0
- package/src/lsp/server.js +49 -2
- package/src/mcp/CLAUDE.md +7 -1
- package/src/mcp/dataflow-tools.js +160 -0
- package/src/mcp/server.js +1 -1
- package/src/mcp/tools.js +22 -1
- package/src/pipeline/assurance-mode.js +64 -1
- package/src/pipeline/finding-schema.js +8 -1
- package/src/pipeline/scan-health.js +19 -1
- package/src/posture/CLAUDE.md +140 -0
- package/src/posture/accuracy-scorecard.js +60 -0
- package/src/posture/artifact-registry.js +76 -0
- package/src/posture/auditor-walkthrough.js +192 -13
- package/src/posture/compliance-frameworks/hipaa-security-rule.json +3 -2
- package/src/posture/compliance-policy.js +12 -2
- package/src/posture/cross-repo-memory.js +7 -2
- package/src/posture/fix-history.js +25 -2
- package/src/posture/fix-verify.js +9 -1
- package/src/posture/fleet.js +0 -0
- package/src/posture/git-history.js +13 -5
- package/src/posture/material-change.js +21 -2
- package/src/posture/mttr.js +75 -12
- package/src/posture/obligation-evidence-pack.js +202 -0
- package/src/posture/pre-incident-archaeology.js +39 -7
- package/src/posture/privacy-framework.js +14 -0
- package/src/posture/provenance/ai-authorship.js +68 -0
- package/src/posture/provenance/branch-entry.js +80 -0
- package/src/posture/provenance/cache.js +143 -0
- package/src/posture/provenance/confidence.js +36 -0
- package/src/posture/provenance/coordinator.js +786 -0
- package/src/posture/provenance/dag-walk.js +249 -0
- package/src/posture/provenance/evidence-attribution.js +59 -0
- package/src/posture/provenance/git-evidence.js +310 -0
- package/src/posture/provenance/lifecycle.js +208 -0
- package/src/posture/provenance/missing-control-resolver.js +137 -0
- package/src/posture/provenance/origin-resolver.js +342 -0
- package/src/posture/provenance/predicate-replay.js +133 -0
- package/src/posture/provenance/providers/config.js +39 -0
- package/src/posture/provenance/providers/github.js +62 -0
- package/src/posture/provenance/providers/gitlab.js +58 -0
- package/src/posture/provenance/repo-lineage.js +74 -0
- package/src/posture/provenance/sca-origin.js +139 -0
- package/src/posture/provenance/schema.js +255 -0
- package/src/posture/provenance/transitive-sca.js +147 -0
- package/src/posture/provenance/validate.js +30 -0
- package/src/posture/provenance-evidence-bundle.js +144 -0
- package/src/posture/remediation-ledger.js +337 -0
- package/src/posture/sbom-diff.js +15 -2
- package/src/posture/secret-history.js +10 -2
- package/src/posture/state-dir.js +38 -14
- package/src/posture/vuln-archaeology.js +8 -2
- package/src/pr-delta.js +25 -4
- package/src/report/index.js +197 -3
- package/src/runScan.js +34 -5
- package/src/sast/rate-limit.js +33 -3
- package/src/server/CLAUDE.md +47 -0
- package/src/server/graph-loader.js +141 -0
- package/src/server/http-server.js +325 -0
- package/src/server/routes.js +129 -0
- package/src/server/security.js +111 -0
- package/src/server/static-assets.js +139 -0
- package/src/util/git-hardening.js +128 -0
- package/dist/11.index.js +0 -353
- package/dist/259.index.js +0 -975
- package/dist/317.index.js +0 -300
- package/dist/609.index.js +0 -741
- package/dist/838.index.js +0 -152
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export const id = 6944;
|
|
2
|
+
export const ids = [6944];
|
|
3
|
+
export const modules = {
|
|
4
|
+
|
|
5
|
+
/***/ 6944:
|
|
6
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
7
|
+
|
|
8
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9
|
+
/* harmony export */ HO: () => (/* binding */ isValidHost),
|
|
10
|
+
/* harmony export */ SK: () => (/* binding */ constantTimeEqual),
|
|
11
|
+
/* harmony export */ Xv: () => (/* binding */ CSP_HEADER_VALUE),
|
|
12
|
+
/* harmony export */ generateSessionToken: () => (/* binding */ generateSessionToken)
|
|
13
|
+
/* harmony export */ });
|
|
14
|
+
/* harmony import */ var node_crypto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7598);
|
|
15
|
+
// security.js — Milestone 3, sub-project Server, increment 1.
|
|
16
|
+
//
|
|
17
|
+
// Security primitives for the `explore` loopback HTTP server: session-token
|
|
18
|
+
// generation/comparison and Host-header validation (the T2 DNS-rebinding
|
|
19
|
+
// defense — see docs/DATA_FLOW_EXPLORER_THREAT_MODEL.md). No node:http
|
|
20
|
+
// usage here — this module is pure and independently unit-testable.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/** 32 random bytes, hex-encoded (64 hex chars) — the per-session token. */
|
|
25
|
+
function generateSessionToken() {
|
|
26
|
+
return node_crypto__WEBPACK_IMPORTED_MODULE_0__.randomBytes(32).toString('hex');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Constant-time string comparison. Wraps crypto.timingSafeEqual, which
|
|
31
|
+
* THROWS on unequal-length buffers — guarded here the same way
|
|
32
|
+
* posture/integrity.js's verifyLastScan guards its own HMAC comparison
|
|
33
|
+
* (`stored.length !== expected.length`), which this function mirrors as
|
|
34
|
+
* its template. Never throws; returns false on any malformed input.
|
|
35
|
+
*/
|
|
36
|
+
function constantTimeEqual(a, b) {
|
|
37
|
+
if (typeof a !== 'string' || typeof b !== 'string') return false;
|
|
38
|
+
const bufA = Buffer.from(a, 'utf8');
|
|
39
|
+
const bufB = Buffer.from(b, 'utf8');
|
|
40
|
+
if (bufA.length !== bufB.length) return false;
|
|
41
|
+
try {
|
|
42
|
+
return node_crypto__WEBPACK_IMPORTED_MODULE_0__.timingSafeEqual(bufA, bufB);
|
|
43
|
+
} catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Loopback hostnames this server ever legitimately answers to. Anything
|
|
49
|
+
// else in a Host header is either a stray/misconfigured client or a
|
|
50
|
+
// DNS-rebinding attempt from a hostile page — reject it (T2).
|
|
51
|
+
const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Validates a request's `Host` header against the port the server is
|
|
55
|
+
* actually listening on. Accepts only `127.0.0.1`/`localhost`/`::1`
|
|
56
|
+
* (`::1` written either bare or bracketed, `[::1]`), each carrying the
|
|
57
|
+
* expected port explicitly — this is the ENTIRE T2 (DNS rebinding)
|
|
58
|
+
* defense: a hostile page that points a fetch() at 127.0.0.1:<port> still
|
|
59
|
+
* sends the ATTACKER'S origin's Host header value (its own hostname), not
|
|
60
|
+
* "127.0.0.1", so this check rejects it regardless of same-origin policy
|
|
61
|
+
* quirks in any particular browser.
|
|
62
|
+
*
|
|
63
|
+
* A bare host with no port suffix is accepted ONLY when expectedPort is
|
|
64
|
+
* the default HTTP port (80) — browsers omit :80 for a default-port
|
|
65
|
+
* http:// request. In practice this server always listens on a
|
|
66
|
+
* non-default port, so that branch is effectively unreachable but is kept
|
|
67
|
+
* for RFC-correctness rather than special-cased away.
|
|
68
|
+
*
|
|
69
|
+
* @param {string|undefined} hostHeader
|
|
70
|
+
* @param {number} expectedPort
|
|
71
|
+
* @returns {boolean}
|
|
72
|
+
*/
|
|
73
|
+
function isValidHost(hostHeader, expectedPort) {
|
|
74
|
+
if (typeof hostHeader !== 'string' || hostHeader.length === 0) return false;
|
|
75
|
+
if (typeof expectedPort !== 'number' || !Number.isInteger(expectedPort) || expectedPort <= 0) return false;
|
|
76
|
+
|
|
77
|
+
const host = hostHeader.trim();
|
|
78
|
+
if (host.length !== hostHeader.length) return false; // reject leading/trailing whitespace outright
|
|
79
|
+
if (/\s/.test(host)) return false; // no embedded whitespace/control chars in a well-formed Host header
|
|
80
|
+
|
|
81
|
+
let hostname;
|
|
82
|
+
let port = null;
|
|
83
|
+
|
|
84
|
+
if (host.startsWith('[')) {
|
|
85
|
+
// Bracketed IPv6 literal form: [::1] or [::1]:port
|
|
86
|
+
const closeIdx = host.indexOf(']');
|
|
87
|
+
if (closeIdx === -1) return false;
|
|
88
|
+
hostname = host.slice(1, closeIdx); // strip brackets
|
|
89
|
+
const rest = host.slice(closeIdx + 1);
|
|
90
|
+
if (rest.length) {
|
|
91
|
+
if (!rest.startsWith(':')) return false;
|
|
92
|
+
const portStr = rest.slice(1);
|
|
93
|
+
if (!/^\d+$/.test(portStr)) return false;
|
|
94
|
+
port = Number(portStr);
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
const parts = host.split(':');
|
|
98
|
+
if (parts.length === 1) {
|
|
99
|
+
hostname = parts[0];
|
|
100
|
+
} else if (parts.length === 2) {
|
|
101
|
+
hostname = parts[0];
|
|
102
|
+
if (!/^\d+$/.test(parts[1])) return false;
|
|
103
|
+
port = Number(parts[1]);
|
|
104
|
+
} else {
|
|
105
|
+
// More than one colon with no brackets: either a malformed header or
|
|
106
|
+
// a bare (unbracketed) IPv6 literal, which is not valid Host syntax
|
|
107
|
+
// (RFC 7230 §5.4 requires brackets for an IPv6 literal). Reject.
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
hostname = hostname.toLowerCase();
|
|
113
|
+
if (!LOOPBACK_HOSTS.has(hostname)) return false;
|
|
114
|
+
|
|
115
|
+
if (port === null) return expectedPort === 80;
|
|
116
|
+
return port === expectedPort;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// This server serves JSON only in this increment (no HTML, no inline
|
|
120
|
+
// script/style, no static assets) — `frontend/`'s own static assets are a
|
|
121
|
+
// later increment's (Wire's) job, not S1's. `default-src 'none'` is
|
|
122
|
+
// therefore the correct, maximally-restrictive policy: nothing this
|
|
123
|
+
// server ever returns should load or execute ANY sub-resource. Revisit
|
|
124
|
+
// only when a future increment starts serving HTML/JS itself.
|
|
125
|
+
const CSP_HEADER_VALUE = "default-src 'none'; frame-ancestors 'none'";
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
/***/ })
|
|
129
|
+
|
|
130
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const id =
|
|
2
|
-
export const ids = [
|
|
1
|
+
export const id = 7178;
|
|
2
|
+
export const ids = [7178];
|
|
3
3
|
export const modules = {
|
|
4
4
|
|
|
5
5
|
/***/ 7178:
|
|
@@ -13,7 +13,8 @@ export const modules = {
|
|
|
13
13
|
/* harmony import */ var node_child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1421);
|
|
14
14
|
/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3024);
|
|
15
15
|
/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6760);
|
|
16
|
-
/* harmony import */ var
|
|
16
|
+
/* harmony import */ var _util_git_hardening_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8844);
|
|
17
|
+
/* harmony import */ var _engine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9753);
|
|
17
18
|
// Time-travel + counterfactual scanning (v0.68).
|
|
18
19
|
//
|
|
19
20
|
// Two new modes that exploit the pure-input shape of runFullScan:
|
|
@@ -36,10 +37,14 @@ export const modules = {
|
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
|
|
40
|
+
|
|
39
41
|
const MAX_FILES_PER_SCAN = 5000;
|
|
40
42
|
|
|
43
|
+
// `root` is the scan target's repository, not this project's own trusted
|
|
44
|
+
// checkout — hardened per FR-PROV-024 / the second Finding Provenance PRD
|
|
45
|
+
// audit (same exposure class as provenance/git-evidence.js's `_run`).
|
|
41
46
|
function _git(root, args) {
|
|
42
|
-
const r = (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)('git', args, { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
47
|
+
const r = (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)('git', (0,_util_git_hardening_js__WEBPACK_IMPORTED_MODULE_3__/* .hardenGitArgs */ .Ax)(args), { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, env: (0,_util_git_hardening_js__WEBPACK_IMPORTED_MODULE_3__/* .hardenGitEnv */ .Si)() });
|
|
43
48
|
return { ok: r.status === 0, stdout: r.stdout || '', stderr: r.stderr || '' };
|
|
44
49
|
}
|
|
45
50
|
|
|
@@ -99,7 +104,10 @@ function _listFilesAtRef(root, ref) {
|
|
|
99
104
|
}
|
|
100
105
|
|
|
101
106
|
function _readFileAtRef(root, ref, file) {
|
|
102
|
-
|
|
107
|
+
// `--no-textconv`: this blob-cat form of `show` was verified NOT
|
|
108
|
+
// reachable via a hostile textconv driver in current git — kept for
|
|
109
|
+
// defense-in-depth/uniformity, same as pr-delta.js's equivalent.
|
|
110
|
+
const r = _git(root, ['show', '--no-textconv', `${ref}:${file}`]);
|
|
103
111
|
if (!r.ok) return null;
|
|
104
112
|
return r.stdout;
|
|
105
113
|
}
|
|
@@ -111,7 +119,13 @@ async function _scanAtRef(root, ref) {
|
|
|
111
119
|
const c = _readFileAtRef(root, ref, f);
|
|
112
120
|
if (c != null) fileContents[f] = c;
|
|
113
121
|
}
|
|
114
|
-
|
|
122
|
+
// `provenance:false` — this is a HISTORICAL ref, not "the state of this repo
|
|
123
|
+
// right now". Two things must not happen here: resolving git provenance for
|
|
124
|
+
// findings that already are a point in history (pure waste), and letting
|
|
125
|
+
// updateLifecycle see this partial, historical finding set as the current
|
|
126
|
+
// one — it marks every open stableId NOT in the set as `remediated`, so one
|
|
127
|
+
// per-ref scan would mass-remediate the whole project's real open findings.
|
|
128
|
+
const scan = await (0,_engine_js__WEBPACK_IMPORTED_MODULE_4__/* .runFullScan */ .wW)({ fileContents, scanRoot: root, provenance: false }, () => {});
|
|
115
129
|
return {
|
|
116
130
|
ref,
|
|
117
131
|
fileCount: Object.keys(fileContents).length,
|
|
@@ -193,8 +207,12 @@ async function runWhatIf(root, { overlays = [], remove = [] } = {}) {
|
|
|
193
207
|
}
|
|
194
208
|
}
|
|
195
209
|
// Baseline (without overlays) for delta computation.
|
|
196
|
-
|
|
197
|
-
|
|
210
|
+
// Both legs are hypothetical snapshots being differenced against each other,
|
|
211
|
+
// never the repo's current state — `provenance:false` for the same reason as
|
|
212
|
+
// _scanAtRef above (no provenance to resolve, and updateLifecycle must not
|
|
213
|
+
// treat either snapshot as "what is open right now").
|
|
214
|
+
const baseScan = await (0,_engine_js__WEBPACK_IMPORTED_MODULE_4__/* .runFullScan */ .wW)({ fileContents: _baselineFor(fileContents, overlays, remove, root), scanRoot: root, provenance: false }, () => {});
|
|
215
|
+
const whatIfScan = await (0,_engine_js__WEBPACK_IMPORTED_MODULE_4__/* .runFullScan */ .wW)({ fileContents, scanRoot: root, provenance: false }, () => {});
|
|
198
216
|
const baseIds = new Set((baseScan.findings || []).map(f => f.stableId || f.id));
|
|
199
217
|
const wIds = new Set((whatIfScan.findings || []).map(f => f.stableId || f.id));
|
|
200
218
|
const introduced = (whatIfScan.findings || []).filter(f => !baseIds.has(f.stableId || f.id)).map(_compact);
|