@clear-capabilities/agentic-security-scanner 0.80.0 → 0.84.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.
- package/dist/178.index.js +1 -1
- package/dist/384.index.js +1 -1
- package/dist/637.index.js +1 -1
- package/dist/838.index.js +1 -1
- package/dist/839.index.js +170 -0
- package/dist/985.index.js +51 -1
- package/dist/agentic-security.mjs +83 -83
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/package.json +3 -3
- package/src/.agentic-security/findings.json +21283 -8189
- package/src/.agentic-security/last-scan.json +21283 -8189
- package/src/.agentic-security/last-scan.json.sig +1 -1
- package/src/.agentic-security/scan-history.json +512 -128
- package/src/.agentic-security/streak.json +3 -3
- package/src/engine.js +41 -0
- package/src/mcp/.agentic-security/findings.json +4 -4
- package/src/mcp/.agentic-security/last-scan.json +4 -4
- package/src/mcp/.agentic-security/last-scan.json.sig +1 -1
- package/src/mcp/.agentic-security/scan-history.json +188 -0
- package/src/mcp/.agentic-security/streak.json +5 -5
- package/src/mcp/tools.js +51 -1
- package/src/posture/.agentic-security/findings.json +17234 -4057
- package/src/posture/.agentic-security/last-scan.json +17234 -4057
- package/src/posture/.agentic-security/last-scan.json.sig +1 -1
- package/src/posture/.agentic-security/scan-history.json +1942 -200
- package/src/posture/.agentic-security/streak.json +3 -3
- package/src/posture/auditor-walkthrough.js +252 -0
- package/src/posture/claude-authorship.js +197 -0
- package/src/posture/compliance-frameworks/.agentic-security/findings.json +80 -0
- package/src/posture/compliance-frameworks/.agentic-security/last-scan.json +80 -0
- package/src/posture/compliance-frameworks/.agentic-security/last-scan.json.sig +1 -0
- package/src/posture/compliance-frameworks/.agentic-security/scan-history.json +90 -0
- package/src/posture/compliance-frameworks/.agentic-security/streak.json +22 -0
- package/src/posture/compliance-frameworks/ccpa.json +32 -0
- package/src/posture/compliance-frameworks/eu-ai-act.json +51 -0
- package/src/posture/compliance-frameworks/gdpr.json +45 -0
- package/src/posture/compliance-frameworks/hipaa-security-rule.json +56 -0
- package/src/posture/compliance-frameworks/nist-ai-600-1.json +51 -0
- package/src/posture/compliance-frameworks/nist-csf-2.json +73 -0
- package/src/posture/compliance-frameworks/owasp-asvs-5.json +79 -0
- package/src/posture/compliance-frameworks/owasp-llm-top-10.json +69 -0
- package/src/posture/cross-repo-memory.js +180 -0
- package/src/posture/dep-add-guard.js +197 -0
- package/src/posture/findings-memory.js +152 -0
- package/src/posture/fix-style-mirror.js +118 -0
- package/src/posture/git-history.js +141 -0
- package/src/posture/intent-context.js +175 -0
- package/src/posture/model-rescan.js +76 -0
- package/src/posture/pattern-propagation.js +39 -0
- package/src/posture/pr-augment.js +234 -0
- package/src/posture/risk-dollars.js +158 -0
- package/src/posture/threat-model-grounding.js +169 -0
- package/src/posture/time-to-fix.js +129 -0
- package/src/posture/triage-memory.js +151 -0
- package/src/posture/triage.js +15 -1
- package/src/posture/watch-mode.js +171 -0
- package/src/posture/workflow-installer.js +231 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"firstScanDate": "2026-05-28T17:41:23.688Z",
|
|
3
|
-
"lastScanDate": "2026-05-
|
|
4
|
-
"totalScans":
|
|
3
|
+
"lastScanDate": "2026-05-29T22:33:27.822Z",
|
|
4
|
+
"totalScans": 58,
|
|
5
5
|
"daysCleanCritical": 0,
|
|
6
6
|
"lastCleanDate": null,
|
|
7
7
|
"lastCriticalDate": "2026-05-29",
|
|
8
8
|
"hasEverHadCritical": true,
|
|
9
9
|
"bestDaysCleanCritical": 0,
|
|
10
10
|
"totalFindingsAtFirstScan": 432,
|
|
11
|
-
"totalFindingsAtLastScan":
|
|
11
|
+
"totalFindingsAtLastScan": 584,
|
|
12
12
|
"totalFixesInferred": 0,
|
|
13
13
|
"lastGrade": "C",
|
|
14
14
|
"bestGrade": "C",
|
package/src/engine.js
CHANGED
|
@@ -159,6 +159,13 @@ import { buildMigrationPlan as buildPqcPlan, persistMigrationPlan as persistPqcP
|
|
|
159
159
|
import { analyzeLicenseGraph, loadLicenseGraphPolicy } from './posture/license-graph.js';
|
|
160
160
|
import { generateAttributions, persistAttributions } from './posture/license-attributions.js';
|
|
161
161
|
import { annotateAttackTaxonomy, summarizeTaxonomy } from './posture/attack-taxonomy.js';
|
|
162
|
+
import { suppressByPastDecisions } from './posture/triage-memory.js';
|
|
163
|
+
import { suppressByIntent } from './posture/intent-context.js';
|
|
164
|
+
import { annotateGitHistory } from './posture/git-history.js';
|
|
165
|
+
import { applyThreatModel } from './posture/threat-model-grounding.js';
|
|
166
|
+
import { annotateCrossRepoSignals } from './posture/pattern-propagation.js';
|
|
167
|
+
import { annotateRiskDollars } from './posture/risk-dollars.js';
|
|
168
|
+
import { annotateTimeToFix } from './posture/time-to-fix.js';
|
|
162
169
|
import { annotateTypeNarrowing } from './posture/type-narrowing.js';
|
|
163
170
|
import { annotateWhyFired } from './posture/why-fired.js';
|
|
164
171
|
import { scanSpecificationDrift } from './posture/specification-mining.js';
|
|
@@ -7736,6 +7743,40 @@ async function runFullScan({fileContents={}, depFileContents={}, scanRoot=null},
|
|
|
7736
7743
|
if (process.env.AGENTIC_SECURITY_NO_ATTACK_TAX !== '1') {
|
|
7737
7744
|
_runAnnotator("annotateAttackTaxonomy", () => { annotateAttackTaxonomy(finalFindings); });
|
|
7738
7745
|
}
|
|
7746
|
+
// Triage memory — demote findings whose (family, dir) bucket was
|
|
7747
|
+
// previously marked wont-fix or false-positive in this project.
|
|
7748
|
+
if (process.env.AGENTIC_SECURITY_NO_TRIAGE_MEMORY !== '1') {
|
|
7749
|
+
_runAnnotator("suppressByPastDecisions", () => { suppressByPastDecisions(scanRoot, finalFindings); });
|
|
7750
|
+
}
|
|
7751
|
+
// Intent-aware FP suppression — demote findings on files marked as
|
|
7752
|
+
// intentionally vulnerable (sandbox/CTF/tutorial/example/etc.).
|
|
7753
|
+
if (process.env.AGENTIC_SECURITY_NO_INTENT_CTX !== '1') {
|
|
7754
|
+
_runAnnotator("suppressByIntent", () => { suppressByIntent(scanRoot, finalFindings); });
|
|
7755
|
+
}
|
|
7756
|
+
// Git history — stamp each finding with introducedBy / introducedIn /
|
|
7757
|
+
// originatingPrompt by running `git blame` on the finding's line.
|
|
7758
|
+
if (process.env.AGENTIC_SECURITY_NO_GIT_HISTORY !== '1') {
|
|
7759
|
+
_runAnnotator("annotateGitHistory", () => { annotateGitHistory(scanRoot, finalFindings); });
|
|
7760
|
+
}
|
|
7761
|
+
// Threat-model grounding — bump severity on crown-jewels, demote
|
|
7762
|
+
// out-of-scope, tag compliance regimes, stamp attacker profile.
|
|
7763
|
+
if (process.env.AGENTIC_SECURITY_NO_THREAT_MODEL_GROUNDING !== '1') {
|
|
7764
|
+
_runAnnotator("applyThreatModel", () => { applyThreatModel(scanRoot, finalFindings); });
|
|
7765
|
+
}
|
|
7766
|
+
// Cross-repo pattern propagation — surface sibling-repo fixes and
|
|
7767
|
+
// triage decisions for the same family from this developer's history.
|
|
7768
|
+
if (process.env.AGENTIC_SECURITY_NO_CROSS_REPO !== '1') {
|
|
7769
|
+
_runAnnotator("annotateCrossRepoSignals", () => { annotateCrossRepoSignals(scanRoot, finalFindings); });
|
|
7770
|
+
}
|
|
7771
|
+
// Risk-in-dollars — combine EPSS + crown-jewel + reachability into an
|
|
7772
|
+
// expected-value-of-exploitation USD figure per finding.
|
|
7773
|
+
if (process.env.AGENTIC_SECURITY_NO_RISK_DOLLARS !== '1') {
|
|
7774
|
+
_runAnnotator("annotateRiskDollars", () => { annotateRiskDollars(scanRoot, finalFindings); });
|
|
7775
|
+
}
|
|
7776
|
+
// Time-to-fix — estimate engineering hours per finding.
|
|
7777
|
+
if (process.env.AGENTIC_SECURITY_NO_TIME_TO_FIX !== '1') {
|
|
7778
|
+
_runAnnotator("annotateTimeToFix", () => { annotateTimeToFix(scanRoot, finalFindings); });
|
|
7779
|
+
}
|
|
7739
7780
|
}
|
|
7740
7781
|
// v3 next-gen: crown-jewel mapping (FR-PROD-5) — score each file/finding by
|
|
7741
7782
|
// business impact. Must run before persona prioritization (which uses it).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"scanId": "
|
|
3
|
-
"startedAt": "2026-05-
|
|
4
|
-
"durationMs":
|
|
2
|
+
"scanId": "47925823-e41f-4a38-acec-1c5dfb77f44d",
|
|
3
|
+
"startedAt": "2026-05-29T20:35:23.218Z",
|
|
4
|
+
"durationMs": 217,
|
|
5
5
|
"scanned": {
|
|
6
6
|
"files": 6,
|
|
7
7
|
"lines": 0
|
|
@@ -8417,7 +8417,7 @@
|
|
|
8417
8417
|
"_v3": {
|
|
8418
8418
|
"counterfactual": {
|
|
8419
8419
|
"spofControls": [],
|
|
8420
|
-
"controlsDetected":
|
|
8420
|
+
"controlsDetected": 75
|
|
8421
8421
|
},
|
|
8422
8422
|
"threatModel": {
|
|
8423
8423
|
"summary": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"scanId": "
|
|
3
|
-
"startedAt": "2026-05-
|
|
4
|
-
"durationMs":
|
|
2
|
+
"scanId": "47925823-e41f-4a38-acec-1c5dfb77f44d",
|
|
3
|
+
"startedAt": "2026-05-29T20:35:23.218Z",
|
|
4
|
+
"durationMs": 217,
|
|
5
5
|
"scanned": {
|
|
6
6
|
"files": 6,
|
|
7
7
|
"lines": 0
|
|
@@ -8417,7 +8417,7 @@
|
|
|
8417
8417
|
"_v3": {
|
|
8418
8418
|
"counterfactual": {
|
|
8419
8419
|
"spofControls": [],
|
|
8420
|
-
"controlsDetected":
|
|
8420
|
+
"controlsDetected": 75
|
|
8421
8421
|
},
|
|
8422
8422
|
"threatModel": {
|
|
8423
8423
|
"summary": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
7bb61d3bece7b47b3d112df139e09a5a95a0c51828999fa1734804ee3f7b6efc
|
|
@@ -139,5 +139,193 @@
|
|
|
139
139
|
"toctou-fs:tools.js:753",
|
|
140
140
|
"toctou-fs:tools.js:835"
|
|
141
141
|
]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"timestamp": "2026-05-29T20:12:38.328Z",
|
|
145
|
+
"label": "scan",
|
|
146
|
+
"total": 35,
|
|
147
|
+
"critical": 0,
|
|
148
|
+
"high": 0,
|
|
149
|
+
"medium": 35,
|
|
150
|
+
"low": 0,
|
|
151
|
+
"kev": 0,
|
|
152
|
+
"ids": [
|
|
153
|
+
"struct:audit.js:102:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
154
|
+
"struct:audit.js:113:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
155
|
+
"struct:audit.js:127:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
156
|
+
"struct:audit.js:128:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
157
|
+
"struct:audit.js:52:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
158
|
+
"struct:audit.js:54:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
159
|
+
"struct:audit.js:88:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
160
|
+
"struct:server.js:32:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
161
|
+
"struct:server.js:49:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
162
|
+
"struct:tools.js:159:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
163
|
+
"struct:tools.js:163:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
164
|
+
"struct:tools.js:167:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
165
|
+
"struct:tools.js:196:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
166
|
+
"struct:tools.js:211:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
167
|
+
"struct:tools.js:226:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
168
|
+
"struct:tools.js:227:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
169
|
+
"struct:tools.js:281:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
170
|
+
"struct:tools.js:320:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
171
|
+
"struct:tools.js:328:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
172
|
+
"struct:tools.js:535:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
173
|
+
"struct:tools.js:671:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
174
|
+
"struct:tools.js:746:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
175
|
+
"struct:tools.js:748:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
176
|
+
"struct:tools.js:753:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
177
|
+
"struct:tools.js:756:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
178
|
+
"struct:tools.js:835:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
179
|
+
"struct:tools.js:844:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
180
|
+
"struct:tools.js:873:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
181
|
+
"struct:tools.js:875:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
182
|
+
"toctou-fs:audit.js:127",
|
|
183
|
+
"toctou-fs:audit.js:52",
|
|
184
|
+
"toctou-fs:tools.js:196",
|
|
185
|
+
"toctou-fs:tools.js:320",
|
|
186
|
+
"toctou-fs:tools.js:753",
|
|
187
|
+
"toctou-fs:tools.js:835"
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"timestamp": "2026-05-29T20:12:45.655Z",
|
|
192
|
+
"label": "scan",
|
|
193
|
+
"total": 35,
|
|
194
|
+
"critical": 0,
|
|
195
|
+
"high": 0,
|
|
196
|
+
"medium": 35,
|
|
197
|
+
"low": 0,
|
|
198
|
+
"kev": 0,
|
|
199
|
+
"ids": [
|
|
200
|
+
"struct:audit.js:102:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
201
|
+
"struct:audit.js:113:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
202
|
+
"struct:audit.js:127:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
203
|
+
"struct:audit.js:128:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
204
|
+
"struct:audit.js:52:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
205
|
+
"struct:audit.js:54:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
206
|
+
"struct:audit.js:88:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
207
|
+
"struct:server.js:32:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
208
|
+
"struct:server.js:49:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
209
|
+
"struct:tools.js:159:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
210
|
+
"struct:tools.js:163:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
211
|
+
"struct:tools.js:167:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
212
|
+
"struct:tools.js:196:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
213
|
+
"struct:tools.js:211:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
214
|
+
"struct:tools.js:226:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
215
|
+
"struct:tools.js:227:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
216
|
+
"struct:tools.js:281:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
217
|
+
"struct:tools.js:320:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
218
|
+
"struct:tools.js:328:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
219
|
+
"struct:tools.js:535:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
220
|
+
"struct:tools.js:671:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
221
|
+
"struct:tools.js:746:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
222
|
+
"struct:tools.js:748:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
223
|
+
"struct:tools.js:753:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
224
|
+
"struct:tools.js:756:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
225
|
+
"struct:tools.js:835:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
226
|
+
"struct:tools.js:844:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
227
|
+
"struct:tools.js:873:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
228
|
+
"struct:tools.js:875:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
229
|
+
"toctou-fs:audit.js:127",
|
|
230
|
+
"toctou-fs:audit.js:52",
|
|
231
|
+
"toctou-fs:tools.js:196",
|
|
232
|
+
"toctou-fs:tools.js:320",
|
|
233
|
+
"toctou-fs:tools.js:753",
|
|
234
|
+
"toctou-fs:tools.js:835"
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"timestamp": "2026-05-29T20:35:14.131Z",
|
|
239
|
+
"label": "scan",
|
|
240
|
+
"total": 35,
|
|
241
|
+
"critical": 0,
|
|
242
|
+
"high": 0,
|
|
243
|
+
"medium": 35,
|
|
244
|
+
"low": 0,
|
|
245
|
+
"kev": 0,
|
|
246
|
+
"ids": [
|
|
247
|
+
"struct:audit.js:102:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
248
|
+
"struct:audit.js:113:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
249
|
+
"struct:audit.js:127:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
250
|
+
"struct:audit.js:128:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
251
|
+
"struct:audit.js:52:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
252
|
+
"struct:audit.js:54:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
253
|
+
"struct:audit.js:88:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
254
|
+
"struct:server.js:32:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
255
|
+
"struct:server.js:49:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
256
|
+
"struct:tools.js:159:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
257
|
+
"struct:tools.js:163:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
258
|
+
"struct:tools.js:167:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
259
|
+
"struct:tools.js:196:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
260
|
+
"struct:tools.js:211:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
261
|
+
"struct:tools.js:226:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
262
|
+
"struct:tools.js:227:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
263
|
+
"struct:tools.js:281:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
264
|
+
"struct:tools.js:320:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
265
|
+
"struct:tools.js:328:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
266
|
+
"struct:tools.js:535:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
267
|
+
"struct:tools.js:671:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
268
|
+
"struct:tools.js:746:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
269
|
+
"struct:tools.js:748:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
270
|
+
"struct:tools.js:753:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
271
|
+
"struct:tools.js:756:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
272
|
+
"struct:tools.js:835:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
273
|
+
"struct:tools.js:844:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
274
|
+
"struct:tools.js:873:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
275
|
+
"struct:tools.js:875:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
276
|
+
"toctou-fs:audit.js:127",
|
|
277
|
+
"toctou-fs:audit.js:52",
|
|
278
|
+
"toctou-fs:tools.js:196",
|
|
279
|
+
"toctou-fs:tools.js:320",
|
|
280
|
+
"toctou-fs:tools.js:753",
|
|
281
|
+
"toctou-fs:tools.js:835"
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"timestamp": "2026-05-29T20:35:23.436Z",
|
|
286
|
+
"label": "scan",
|
|
287
|
+
"total": 35,
|
|
288
|
+
"critical": 0,
|
|
289
|
+
"high": 0,
|
|
290
|
+
"medium": 35,
|
|
291
|
+
"low": 0,
|
|
292
|
+
"kev": 0,
|
|
293
|
+
"ids": [
|
|
294
|
+
"struct:audit.js:102:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
295
|
+
"struct:audit.js:113:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
296
|
+
"struct:audit.js:127:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
297
|
+
"struct:audit.js:128:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
298
|
+
"struct:audit.js:52:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
299
|
+
"struct:audit.js:54:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
300
|
+
"struct:audit.js:88:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
301
|
+
"struct:server.js:32:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
302
|
+
"struct:server.js:49:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
303
|
+
"struct:tools.js:159:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
304
|
+
"struct:tools.js:163:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
305
|
+
"struct:tools.js:167:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
306
|
+
"struct:tools.js:196:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
307
|
+
"struct:tools.js:211:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
308
|
+
"struct:tools.js:226:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
309
|
+
"struct:tools.js:227:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
310
|
+
"struct:tools.js:281:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
311
|
+
"struct:tools.js:320:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
312
|
+
"struct:tools.js:328:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
313
|
+
"struct:tools.js:535:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
314
|
+
"struct:tools.js:671:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
315
|
+
"struct:tools.js:746:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
316
|
+
"struct:tools.js:748:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
317
|
+
"struct:tools.js:753:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
318
|
+
"struct:tools.js:756:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
319
|
+
"struct:tools.js:835:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
320
|
+
"struct:tools.js:844:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
321
|
+
"struct:tools.js:873:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
322
|
+
"struct:tools.js:875:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
323
|
+
"toctou-fs:audit.js:127",
|
|
324
|
+
"toctou-fs:audit.js:52",
|
|
325
|
+
"toctou-fs:tools.js:196",
|
|
326
|
+
"toctou-fs:tools.js:320",
|
|
327
|
+
"toctou-fs:tools.js:753",
|
|
328
|
+
"toctou-fs:tools.js:835"
|
|
329
|
+
]
|
|
142
330
|
}
|
|
143
331
|
]
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"firstScanDate": "2026-05-28T17:48:43.176Z",
|
|
3
|
-
"lastScanDate": "2026-05-
|
|
4
|
-
"totalScans":
|
|
5
|
-
"daysCleanCritical":
|
|
6
|
-
"lastCleanDate": "2026-05-
|
|
3
|
+
"lastScanDate": "2026-05-29T20:35:23.458Z",
|
|
4
|
+
"totalScans": 7,
|
|
5
|
+
"daysCleanCritical": 2,
|
|
6
|
+
"lastCleanDate": "2026-05-29",
|
|
7
7
|
"lastCriticalDate": null,
|
|
8
8
|
"hasEverHadCritical": false,
|
|
9
|
-
"bestDaysCleanCritical":
|
|
9
|
+
"bestDaysCleanCritical": 2,
|
|
10
10
|
"totalFindingsAtFirstScan": 40,
|
|
11
11
|
"totalFindingsAtLastScan": 40,
|
|
12
12
|
"totalFixesInferred": 0,
|
package/src/mcp/tools.js
CHANGED
|
@@ -946,6 +946,56 @@ export const read_agents_memory = {
|
|
|
946
946
|
},
|
|
947
947
|
};
|
|
948
948
|
|
|
949
|
+
// ─── query_triage_memory ───────────────────────────────────────────────────
|
|
950
|
+
// Natural-language Q&A over past triage decisions (wont-fix / false-positive
|
|
951
|
+
// markings + reasons). Backed by .agentic-security/triage-memory.jsonl, which
|
|
952
|
+
// is auto-populated by triage.transition(). Returns at most 10 most-relevant
|
|
953
|
+
// past decisions.
|
|
954
|
+
|
|
955
|
+
export const query_triage_memory = {
|
|
956
|
+
name: 'query_triage_memory',
|
|
957
|
+
description: 'Search past triage decisions (wont-fix / false-positive) by natural-language query. Returns up to 10 most-relevant past decisions with their reasons. Use when you see a new finding and want to know "did we already decide on something like this?" — answers in seconds without re-reading the full AGENTS.md narrative.',
|
|
958
|
+
inputSchema: {
|
|
959
|
+
type: 'object',
|
|
960
|
+
additionalProperties: false,
|
|
961
|
+
properties: {
|
|
962
|
+
query: { type: 'string', description: 'Free-text terms to match against past reasons / vuln text / file paths / family names.' },
|
|
963
|
+
},
|
|
964
|
+
},
|
|
965
|
+
async handler({ query }, ctx) {
|
|
966
|
+
const { queryMemory } = await import('../posture/triage-memory.js');
|
|
967
|
+
const results = queryMemory(ctx.sessionRoot, query || '');
|
|
968
|
+
return {
|
|
969
|
+
_meta: META,
|
|
970
|
+
count: results.length,
|
|
971
|
+
results,
|
|
972
|
+
};
|
|
973
|
+
},
|
|
974
|
+
};
|
|
975
|
+
|
|
976
|
+
// ─── query_findings_memory ─────────────────────────────────────────────────
|
|
977
|
+
// Natural-language Q&A across the scanner's accumulated institutional
|
|
978
|
+
// memory: current findings + past triage decisions + scan history +
|
|
979
|
+
// AGENTS.md narrative. Use to answer "have we seen something like this
|
|
980
|
+
// before?" without reading multiple files.
|
|
981
|
+
|
|
982
|
+
export const query_findings_memory = {
|
|
983
|
+
name: 'query_findings_memory',
|
|
984
|
+
description: 'Search the scanner accumulated memory (current scan findings + past wont-fix/false-positive decisions + scan history + AGENTS.md narrative) by natural-language terms. Returns top-10 results scored by term-match count and ranked finding > triage > history > AGENTS.md.',
|
|
985
|
+
inputSchema: {
|
|
986
|
+
type: 'object',
|
|
987
|
+
additionalProperties: false,
|
|
988
|
+
properties: {
|
|
989
|
+
query: { type: 'string', description: 'Natural-language search terms (2+ chars each).' },
|
|
990
|
+
},
|
|
991
|
+
required: ['query'],
|
|
992
|
+
},
|
|
993
|
+
async handler({ query }, ctx) {
|
|
994
|
+
const { queryFindingsMemory } = await import('../posture/findings-memory.js');
|
|
995
|
+
return { _meta: META, ...queryFindingsMemory(ctx.sessionRoot, query || '') };
|
|
996
|
+
},
|
|
997
|
+
};
|
|
998
|
+
|
|
949
999
|
// ─── lookup_cve ────────────────────────────────────────────────────────────
|
|
950
1000
|
// LangChain harness-anatomy #8: bridge the knowledge-cutoff gap by exposing
|
|
951
1001
|
// the local OSV / KEV / EPSS cache as a structured tool. Read-only — never
|
|
@@ -1041,4 +1091,4 @@ export const apply_sca_upgrade = {
|
|
|
1041
1091
|
},
|
|
1042
1092
|
};
|
|
1043
1093
|
|
|
1044
|
-
export const ALL_TOOLS = [scan_diff, query_taint, explain_finding, apply_fix, verify_fix, synthesize_fix, find_rule_module, append_scratchpad, read_scratchpad, append_agents_memory, read_agents_memory, lookup_cve, synthesize_sca_upgrade, apply_sca_upgrade];
|
|
1094
|
+
export const ALL_TOOLS = [scan_diff, query_taint, explain_finding, apply_fix, verify_fix, synthesize_fix, find_rule_module, append_scratchpad, read_scratchpad, append_agents_memory, read_agents_memory, lookup_cve, synthesize_sca_upgrade, apply_sca_upgrade, query_triage_memory, query_findings_memory];
|