@4da/mcp-server 6.2.4 → 6.2.5

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 (119) hide show
  1. package/CHANGELOG.md +484 -0
  2. package/README.md +22 -6
  3. package/dist/db.d.ts +38 -0
  4. package/dist/db.js +78 -23
  5. package/dist/doctor.js +6 -3
  6. package/dist/embeddings.d.ts +1 -1
  7. package/dist/embeddings.js +16 -14
  8. package/dist/index.js +73 -103
  9. package/dist/live/advisory-groups.d.ts +68 -0
  10. package/dist/live/advisory-groups.js +131 -0
  11. package/dist/live/cache.js +11 -3
  12. package/dist/live/cargo-platform.d.ts +6 -0
  13. package/dist/live/cargo-platform.js +8 -2
  14. package/dist/live/changelog.js +38 -6
  15. package/dist/live/dependency-set.d.ts +9 -1
  16. package/dist/live/dependency-set.js +10 -2
  17. package/dist/live/fix-paths.d.ts +258 -9
  18. package/dist/live/fix-paths.js +790 -45
  19. package/dist/live/github-releases.js +3 -0
  20. package/dist/live/held-dependencies.d.ts +93 -0
  21. package/dist/live/held-dependencies.js +212 -0
  22. package/dist/live/held-targets.d.ts +30 -0
  23. package/dist/live/held-targets.js +107 -0
  24. package/dist/live/http-utils.js +13 -3
  25. package/dist/live/index.d.ts +7 -4
  26. package/dist/live/index.js +24 -19
  27. package/dist/live/install-state.js +6 -2
  28. package/dist/live/js-lockfile-readers.d.ts +8 -1
  29. package/dist/live/js-lockfile-readers.js +43 -6
  30. package/dist/live/lockfile-parents.d.ts +15 -0
  31. package/dist/live/lockfile-parents.js +85 -10
  32. package/dist/live/lockfile-parsers-pygo.d.ts +47 -2
  33. package/dist/live/lockfile-parsers-pygo.js +230 -12
  34. package/dist/live/lockfile-parsers-rbphp.d.ts +38 -0
  35. package/dist/live/lockfile-parsers-rbphp.js +123 -0
  36. package/dist/live/lockfile-parsers.d.ts +6 -0
  37. package/dist/live/lockfile-parsers.js +116 -4
  38. package/dist/live/lockfile-types.d.ts +28 -1
  39. package/dist/live/maintenance.d.ts +20 -4
  40. package/dist/live/maintenance.js +31 -2
  41. package/dist/live/malware.d.ts +20 -0
  42. package/dist/live/malware.js +31 -0
  43. package/dist/live/npm-packument.d.ts +4 -1
  44. package/dist/live/npm-packument.js +5 -2
  45. package/dist/live/offered-release.d.ts +53 -0
  46. package/dist/live/offered-release.js +117 -0
  47. package/dist/live/osv-ranges.d.ts +111 -0
  48. package/dist/live/osv-ranges.js +173 -14
  49. package/dist/live/osv-scanner.d.ts +87 -5
  50. package/dist/live/osv-scanner.js +310 -59
  51. package/dist/live/pinned-advisories.d.ts +2 -2
  52. package/dist/live/pinned-advisories.js +3 -3
  53. package/dist/live/pypi-advice.d.ts +36 -0
  54. package/dist/live/pypi-advice.js +158 -0
  55. package/dist/live/rate-limiter.d.ts +7 -0
  56. package/dist/live/rate-limiter.js +22 -1
  57. package/dist/live/release-metadata.d.ts +5 -0
  58. package/dist/live/resolution.d.ts +3 -0
  59. package/dist/live/resolution.js +6 -3
  60. package/dist/live/scan-coverage.d.ts +26 -0
  61. package/dist/live/scan-coverage.js +70 -0
  62. package/dist/live/semver-utils.d.ts +8 -0
  63. package/dist/live/semver-utils.js +26 -3
  64. package/dist/live/severity-scope.d.ts +26 -1
  65. package/dist/live/severity-scope.js +32 -0
  66. package/dist/live/shell-safe.d.ts +19 -0
  67. package/dist/live/shell-safe.js +36 -0
  68. package/dist/live/types.d.ts +134 -8
  69. package/dist/live/version-compare.d.ts +49 -0
  70. package/dist/live/version-compare.js +131 -0
  71. package/dist/live/withdrawn-releases.d.ts +50 -0
  72. package/dist/live/withdrawn-releases.js +125 -0
  73. package/dist/project-manifests.d.ts +7 -0
  74. package/dist/project-manifests.js +45 -5
  75. package/dist/project-scanner.js +6 -4
  76. package/dist/project-tree.d.ts +56 -0
  77. package/dist/project-tree.js +174 -5
  78. package/dist/schema-registry.d.ts +47 -4
  79. package/dist/schema-registry.js +76 -9
  80. package/dist/server-instructions.js +4 -2
  81. package/dist/setup.d.ts +8 -0
  82. package/dist/setup.js +21 -2
  83. package/dist/tool-dispatch.js +3 -3
  84. package/dist/tools/agent-memory.d.ts +5 -0
  85. package/dist/tools/agent-memory.js +9 -0
  86. package/dist/tools/briefing-task-scope.js +5 -2
  87. package/dist/tools/decision-memory.js +2 -0
  88. package/dist/tools/dependency-check-held.d.ts +44 -0
  89. package/dist/tools/dependency-check-held.js +98 -0
  90. package/dist/tools/dependency-check-signals.d.ts +19 -2
  91. package/dist/tools/dependency-check-signals.js +84 -13
  92. package/dist/tools/dependency-check-versions.d.ts +37 -4
  93. package/dist/tools/dependency-check-versions.js +48 -13
  94. package/dist/tools/dependency-check.d.ts +11 -1
  95. package/dist/tools/dependency-check.js +81 -29
  96. package/dist/tools/dependency-health.js +209 -45
  97. package/dist/tools/get-context.d.ts +3 -0
  98. package/dist/tools/get-context.js +4 -0
  99. package/dist/tools/project-scope.d.ts +8 -0
  100. package/dist/tools/project-scope.js +21 -0
  101. package/dist/tools/upgrade-impact-features.d.ts +37 -0
  102. package/dist/tools/upgrade-impact-features.js +176 -0
  103. package/dist/tools/upgrade-impact-literals.js +26 -4
  104. package/dist/tools/upgrade-impact-report.d.ts +5 -1
  105. package/dist/tools/upgrade-impact-report.js +26 -5
  106. package/dist/tools/upgrade-impact.js +10 -3
  107. package/dist/tools/upgrade-planner-fixpaths.d.ts +162 -5
  108. package/dist/tools/upgrade-planner-fixpaths.js +0 -0
  109. package/dist/tools/upgrade-planner.d.ts +59 -4
  110. package/dist/tools/upgrade-planner.js +237 -61
  111. package/dist/tools/vulnerability-scan-concise.d.ts +47 -2
  112. package/dist/tools/vulnerability-scan-concise.js +37 -3
  113. package/dist/tools/vulnerability-scan-format.d.ts +126 -24
  114. package/dist/tools/vulnerability-scan-format.js +193 -26
  115. package/dist/tools/vulnerability-scan.d.ts +224 -63
  116. package/dist/tools/vulnerability-scan.js +50 -15
  117. package/dist/tools/what-should-i-know.d.ts +6 -1
  118. package/dist/tools/what-should-i-know.js +72 -15
  119. package/package.json +2 -2
@@ -18,6 +18,17 @@ import { SEVERITY_RANK } from "../live/severity-scope.js";
18
18
  const MAX_PACKAGES = 40;
19
19
  const MAX_RECOMMENDATIONS = 25;
20
20
  const IDS_PER_ROW = 3;
21
+ /** The withdrawn releases behind a row's fix: the checked target's, else its advisories' own line fixes. */
22
+ function withheldOf(checked, vulns) {
23
+ if (checked?.withheld && checked.withheld.length > 0)
24
+ return { withheld: checked.withheld, ...(checked.withheld_note ? { withheld_note: checked.withheld_note } : {}) };
25
+ if (checked)
26
+ return {};
27
+ const rows = vulns;
28
+ const withheld = [...new Set(rows.flatMap((v) => v.withheld ?? []))];
29
+ const notes = [...new Set(rows.map((v) => v.withheld_note).filter((n) => Boolean(n)))];
30
+ return withheld.length > 0 ? { withheld, ...(notes.length > 0 ? { withheld_note: notes.join("; ") } : {}) } : {};
31
+ }
21
32
  /** One row per package version: worst graded severity, the fix that clears every fixable advisory. */
22
33
  export function groupByPackage(rows, targets = {}) {
23
34
  const groups = new Map();
@@ -31,17 +42,23 @@ export function groupByPackage(rows, targets = {}) {
31
42
  const fixes = vulns.map((v) => v.fixed_version).filter((f) => Boolean(f));
32
43
  const unfixed = vulns.length - fixes.length;
33
44
  const checked = targets[`${worst.package}@${worst.current_version}`];
34
- const fixed = checked?.checked === "all_advisories" ? checked.target : fixes.length > 0 ? maxVersion(fixes, worst.ecosystem) : null;
45
+ // fix_targets also carries the installed-advisories-only target, corrected by the registry
46
+ // when the highest fix is deprecated or yanked (audit H5); without an entry, the highest fix.
47
+ const fixed = checked ? checked.target : fixes.length > 0 ? maxVersion(fixes, worst.ecosystem) : null;
35
48
  // Unknown (null) only when no advisory row knows; any direct row makes it direct.
36
49
  const direct = vulns.some((v) => v.is_direct === true) ? true : vulns.some((v) => v.is_direct === null) ? null : false;
37
50
  out.push({
38
51
  package: worst.package,
39
52
  current_version: worst.current_version,
40
53
  severity: worst.severity,
54
+ ...(worst.severity_from ? { severity_from: worst.severity_from } : {}),
55
+ // Any malicious-package record on this copy: the row says so (audit 6.2.5 D-3).
56
+ ...(vulns.some((v) => v.malware === true) ? { malware: true } : {}),
41
57
  advisories: vulns.length,
42
58
  ids: vulns.slice(0, IDS_PER_ROW).map((v) => v.vuln_id),
43
59
  fixed_version: fixed,
44
60
  fix_checked: checked?.checked ?? "installed_advisories_only",
61
+ ...withheldOf(checked, vulns),
45
62
  ...(unfixed > 0 ? { unfixed_advisories: unfixed } : {}),
46
63
  is_direct: direct,
47
64
  ...(vulns.every((v) => v.is_dev) ? { is_dev: true } : {}),
@@ -65,24 +82,40 @@ export function conciseScanResult(full) {
65
82
  const omittedPackages = packages.length - listed.length;
66
83
  const omittedRecommendations = full.recommendations.length - recommendations.length;
67
84
  return {
85
+ // Leads the answer when any dependency went unchecked ("NOT CHECKED: ...").
86
+ ...(full.summary ? { summary: full.summary } : {}),
68
87
  scan_time: full.scan_time,
69
88
  project_root: full.project_root,
70
89
  host_platform: full.host_platform,
71
90
  ecosystems_scanned: full.ecosystems_scanned,
72
91
  total_dependencies_scanned: full.total_dependencies_scanned,
92
+ ...(full.dev_scope ? { dev_scope: full.dev_scope } : {}),
73
93
  total_vulnerable_packages: full.total_vulnerable_packages,
74
94
  ...(full.coverage
75
95
  ? {
76
96
  coverage: {
77
97
  complete: false,
78
98
  note: full.coverage.note,
99
+ ...(full.coverage.unchecked_dependencies !== undefined
100
+ ? {
101
+ unchecked_dependencies: full.coverage.unchecked_dependencies,
102
+ checked_dependencies: full.coverage.checked_dependencies,
103
+ osv_status: full.coverage.osv_status,
104
+ }
105
+ : {}),
79
106
  lockfiles_not_scanned: full.coverage.lockfiles_not_scanned,
80
- ...("unresolved_manifests" in full.coverage ? { unresolved_manifests: full.coverage.unresolved_manifests } : {}),
107
+ ...(full.coverage.unreadable_lockfiles ? { unreadable_lockfiles: full.coverage.unreadable_lockfiles } : {}),
108
+ ...(full.coverage.partial_lockfiles ? { partial_lockfiles: full.coverage.partial_lockfiles } : {}),
109
+ ...(full.coverage.refused_includes ? { refused_includes: full.coverage.refused_includes } : {}),
110
+ ...(full.coverage.not_covered ? { not_covered: full.coverage.not_covered, not_covered_count: full.coverage.not_covered_count } : {}),
111
+ ...(full.coverage.not_scanned ? { not_scanned: full.coverage.not_scanned } : {}),
112
+ ...(full.coverage.unresolved_manifests ? { unresolved_manifests: full.coverage.unresolved_manifests } : {}),
81
113
  },
82
114
  }
83
115
  : {}),
84
- // Every listed advisory, before grouping and trimming.
116
+ // Every listed advisory, before grouping and trimming. Null when the scan is incomplete.
85
117
  by_severity: full.by_severity,
118
+ ...(full.found_in_checked_dependencies ? { found_in_checked_dependencies: full.found_in_checked_dependencies } : {}),
86
119
  vulnerable_packages: listed,
87
120
  ...(omittedPackages > 0
88
121
  ? { vulnerable_packages_note: `Showing the ${listed.length} most severe of ${packages.length} vulnerable package versions; pass severity_filter (e.g. "high") or response_format: "detailed" for the rest.` }
@@ -104,6 +137,7 @@ export function conciseScanResult(full) {
104
137
  lockfiles_read: full._meta.resolution.lockfiles.length,
105
138
  resolved_at: full._meta.resolution.resolved_at,
106
139
  privacy: full._meta.privacy,
140
+ ...(full._meta.alias_severity ? { alias_severity: full._meta.alias_severity } : {}),
107
141
  },
108
142
  };
109
143
  }
@@ -3,15 +3,18 @@
3
3
  * recommendations, install drift, the shared severity grade, and resolution
4
4
  * provenance. Split out of vulnerability-scan.ts, which keeps execution.
5
5
  */
6
- import type { InstallDriftRecord, ResolutionProvenance, VulnerabilityScanResult } from "../live/types.js";
6
+ import type { AliasSeverityReport, InstallDriftRecord, ResolutionProvenance, VulnerabilityCoverage, VulnerabilityScanResult } from "../live/types.js";
7
7
  import { type TreeDiscovery } from "../project-tree.js";
8
- import type { CleanTarget } from "../live/osv-ranges.js";
8
+ import type { LockfileProblem } from "../live/lockfile-types.js";
9
+ import { type FixTargetResult } from "../live/fix-paths.js";
9
10
  /** What the formatter needs beyond the scan itself. */
10
11
  export interface ScanContext {
11
12
  resolution: ResolutionProvenance | null;
12
13
  reResolvedThisCall: boolean;
13
14
  drift: InstallDriftRecord[];
14
15
  includeDev: boolean;
16
+ /** Installed copies that are dev-only (every path a dev one): left out without include_dev. */
17
+ devOnlyCopies?: number;
15
18
  /** What the project-tree walk left out; null when the set did not come from a walk. */
16
19
  discovery?: TreeDiscovery | null;
17
20
  /** Manifests with no lockfile, whose ranged dependencies were not scanned. */
@@ -20,11 +23,13 @@ export interface ScanContext {
20
23
  manifest: string;
21
24
  ranges: number;
22
25
  }>;
26
+ /** Lockfiles present that could not be read (conflict markers, invalid JSON, ...). */
27
+ problems?: LockfileProblem[];
23
28
  /**
24
29
  * Upgrade targets checked against every advisory of the package, keyed by
25
30
  * fixTargetKey(); absent when the check could not run (offline, budget).
26
31
  */
27
- verifiedTargets?: Map<string, CleanTarget>;
32
+ verifiedTargets?: Map<string, FixTargetResult>;
28
33
  }
29
34
  /** The key a verified target is stored under: one installed copy of a package. */
30
35
  export declare function fixTargetKey(ecosystem: string, name: string, version: string): string;
@@ -34,7 +39,7 @@ export declare function fixTargetKey(ecosystem: string, name: string, version: s
34
39
  * lockfile (declared ranges are not installs, so they are not sent to OSV).
35
40
  */
36
41
  export declare function scanCoverage(ctx: ScanContext, relative: (dir: string) => string, detailed: boolean): {
37
- complete: boolean;
42
+ complete: false;
38
43
  note: string;
39
44
  lockfiles_not_scanned: number;
40
45
  skipped_lockfiles?: {
@@ -42,12 +47,84 @@ export declare function scanCoverage(ctx: ScanContext, relative: (dir: string) =
42
47
  reason: "depth" | "project_limit";
43
48
  }[] | undefined;
44
49
  walk_truncated?: boolean | undefined;
50
+ unreadable_lockfiles?: {
51
+ path: string;
52
+ error: string;
53
+ }[] | undefined;
54
+ partial_lockfiles?: {
55
+ path: string;
56
+ skipped_entries: number;
57
+ reason: string;
58
+ }[] | undefined;
59
+ refused_includes?: {
60
+ path: string;
61
+ reason: string;
62
+ }[] | undefined;
63
+ not_covered?: {
64
+ path: string;
65
+ ecosystem: string;
66
+ }[] | undefined;
67
+ not_covered_count?: number | undefined;
68
+ not_scanned?: {
69
+ test_fixture_lockfiles: number;
70
+ dirs: string[];
71
+ } | undefined;
45
72
  unresolved_manifests?: {
46
73
  manifest: string;
47
74
  declared_ranges: number;
48
75
  fix: string;
49
76
  }[] | undefined;
50
77
  } | null;
78
+ /** The `coverage` block: everything the scan did not cover, the unchecked count first. */
79
+ export interface MergedCoverage {
80
+ complete: false;
81
+ note: string;
82
+ lockfiles_not_scanned: number;
83
+ skipped_lockfiles?: Array<{
84
+ path: string;
85
+ reason: string;
86
+ }>;
87
+ walk_truncated?: boolean;
88
+ unresolved_manifests?: Array<{
89
+ manifest: string;
90
+ declared_ranges: number;
91
+ fix: string;
92
+ }>;
93
+ /** Lockfiles that could not be read at all. */
94
+ unreadable_lockfiles?: Array<{
95
+ path: string;
96
+ error: string;
97
+ }>;
98
+ /** Lockfiles read except for `skipped_entries` entries (a line past the length cap). */
99
+ partial_lockfiles?: Array<{
100
+ path: string;
101
+ skipped_entries: number;
102
+ reason: string;
103
+ }>;
104
+ /** Requirements includes not read because they point outside the project. */
105
+ refused_includes?: Array<{
106
+ path: string;
107
+ reason: string;
108
+ }>;
109
+ not_covered?: Array<{
110
+ path: string;
111
+ ecosystem: string;
112
+ }>;
113
+ not_covered_count?: number;
114
+ not_scanned?: {
115
+ test_fixture_lockfiles: number;
116
+ dirs: string[];
117
+ };
118
+ unchecked_dependencies?: number;
119
+ checked_dependencies?: number;
120
+ osv_status?: string;
121
+ }
122
+ /**
123
+ * One `coverage` block for everything the scan did not cover: lockfiles past
124
+ * the walk's bounds, manifests with no lockfile, and dependencies OSV.dev gave
125
+ * no answer for. The unchecked count leads the note.
126
+ */
127
+ export declare function mergeCoverage(walk: ReturnType<typeof scanCoverage>, osv: VulnerabilityCoverage | null): MergedCoverage | null;
51
128
  /**
52
129
  * Collapse advisories that are the same finding under different identifiers.
53
130
  *
@@ -55,7 +132,11 @@ export declare function scanCoverage(ctx: ScanContext, relative: (dir: string) =
55
132
  * other in `aliases`. Reported separately they double the count and read as two
56
133
  * problems: `quinn-proto` showed as "2 high" for a single memory-exhaustion
57
134
  * bug. Keeps the entry with the most usable detail (a CVSS score, then a fix
58
- * version) and folds the rest into its alias list.
135
+ * version) and folds the rest into its alias list. The kept entry carries the
136
+ * group's MOST severe grade, naming the record it came from (`severityFrom`),
137
+ * as every other tool does (advisory-groups.ts gradeAliasGroups): keeping the
138
+ * richest record's own grade showed CVE-2026-4277 as low here and critical in
139
+ * dependency_check (final release audit of 6.2.5).
59
140
  */
60
141
  export declare function collapseAliases(vulns: VulnerabilityScanResult["vulnerabilities"]): import("../live/types.js").VulnerabilityEntry[];
61
142
  /**
@@ -71,32 +152,25 @@ export declare function platformFilterNote(vulns: VulnerabilityScanResult["vulne
71
152
  /** Shortest readable label for a manifest directory, relative to the scan root. */
72
153
  export declare function relativeDir(dir: string, root: string): string;
73
154
  export declare function formatScanResult(result: VulnerabilityScanResult, severityFilter: string | undefined, ctx: ScanContext): {
155
+ summary?: string | undefined;
74
156
  scan_time: string;
75
157
  project: string;
76
- coverage?: {
77
- complete: boolean;
78
- note: string;
79
- lockfiles_not_scanned: number;
80
- skipped_lockfiles?: {
81
- path: string;
82
- reason: "depth" | "project_limit";
83
- }[] | undefined;
84
- walk_truncated?: boolean | undefined;
85
- unresolved_manifests?: {
86
- manifest: string;
87
- declared_ranges: number;
88
- fix: string;
89
- }[] | undefined;
90
- } | undefined;
158
+ coverage?: MergedCoverage | undefined;
91
159
  project_root: string;
92
160
  workspaces_with_findings: string[];
93
161
  host_platform: string;
94
162
  ecosystems_scanned: string[];
95
163
  total_dependencies_scanned: number;
96
- total_vulnerable_packages: number;
164
+ dev_scope?: string | undefined;
165
+ total_vulnerable_packages: number | null;
97
166
  platform_inactive_packages: number;
98
- by_severity: import("../live/severity-scope.js").SeverityCounts;
99
- advisory_by_severity: import("../live/severity-scope.js").SeverityCounts;
167
+ by_severity: import("../live/severity-scope.js").SeverityCounts | null;
168
+ advisory_by_severity: import("../live/severity-scope.js").SeverityCounts | null;
169
+ found_in_checked_dependencies?: {
170
+ note: string;
171
+ vulnerable_packages: number;
172
+ by_severity: import("../live/severity-scope.js").SeverityCounts;
173
+ } | undefined;
100
174
  vulnerabilities: {
101
175
  package: string;
102
176
  current_version: string;
@@ -112,10 +186,14 @@ export declare function formatScanResult(result: VulnerabilityScanResult, severi
112
186
  aliases: string[];
113
187
  severity: "critical" | "high" | "low" | "medium" | "unknown";
114
188
  advisory_severity: "critical" | "high" | "low" | "medium" | "unknown";
189
+ malware?: boolean | undefined;
190
+ severity_from?: string | undefined;
115
191
  severity_note?: string | undefined;
116
192
  cvss_score: number | null;
117
193
  summary: string;
118
194
  fixed_version: string | null;
195
+ withheld?: string[] | undefined;
196
+ withheld_note?: string | null | undefined;
119
197
  published: string;
120
198
  references: string[];
121
199
  }[];
@@ -134,10 +212,14 @@ export declare function formatScanResult(result: VulnerabilityScanResult, severi
134
212
  aliases: string[];
135
213
  severity: "critical" | "high" | "low" | "medium" | "unknown";
136
214
  advisory_severity: "critical" | "high" | "low" | "medium" | "unknown";
215
+ malware?: boolean | undefined;
216
+ severity_from?: string | undefined;
137
217
  severity_note?: string | undefined;
138
218
  cvss_score: number | null;
139
219
  summary: string;
140
220
  fixed_version: string | null;
221
+ withheld?: string[] | undefined;
222
+ withheld_note?: string | null | undefined;
141
223
  published: string;
142
224
  references: string[];
143
225
  }[];
@@ -156,10 +238,14 @@ export declare function formatScanResult(result: VulnerabilityScanResult, severi
156
238
  aliases: string[];
157
239
  severity: "critical" | "high" | "low" | "medium" | "unknown";
158
240
  advisory_severity: "critical" | "high" | "low" | "medium" | "unknown";
241
+ malware?: boolean | undefined;
242
+ severity_from?: string | undefined;
159
243
  severity_note?: string | undefined;
160
244
  cvss_score: number | null;
161
245
  summary: string;
162
246
  fixed_version: string | null;
247
+ withheld?: string[] | undefined;
248
+ withheld_note?: string | null | undefined;
163
249
  published: string;
164
250
  references: string[];
165
251
  }[];
@@ -169,14 +255,23 @@ export declare function formatScanResult(result: VulnerabilityScanResult, severi
169
255
  target: string | null;
170
256
  checked: "all_advisories" | "installed_advisories_only";
171
257
  note?: string;
258
+ withheld?: string[];
259
+ withheld_note?: string;
172
260
  }>;
173
- clean_dependencies: number;
261
+ clean_dependencies: number | null;
174
262
  scan_duration_ms: number;
175
263
  _meta: {
176
264
  source: string;
177
265
  cached: boolean;
178
266
  osv_cached: boolean;
179
267
  offline: boolean;
268
+ stale_osv_answers?: number | undefined;
269
+ alias_severity?: {
270
+ rated_from_alias: number;
271
+ unresolved: string[];
272
+ ungraded: string[];
273
+ note?: string | undefined;
274
+ } | undefined;
180
275
  privacy: string;
181
276
  relevance: string;
182
277
  severity_rule: string;
@@ -192,3 +287,10 @@ export declare function formatScanResult(result: VulnerabilityScanResult, severi
192
287
  };
193
288
  };
194
289
  };
290
+ /** `_meta.alias_severity`: how many records were graded from a GHSA alias, and which stay unknown, with why. */
291
+ export declare function aliasSeverityMeta(report: AliasSeverityReport): {
292
+ rated_from_alias: number;
293
+ unresolved: string[];
294
+ ungraded: string[];
295
+ note?: string | undefined;
296
+ };