@cdxgen/cdxgen 0.0.1 → 13.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/README.md +921 -87
  2. package/bin/audit.js +239 -0
  3. package/bin/cdxgen.js +2335 -0
  4. package/bin/convert.js +220 -0
  5. package/bin/evinse.js +353 -0
  6. package/bin/hbom.js +504 -0
  7. package/bin/repl.js +2224 -0
  8. package/bin/sign.js +195 -0
  9. package/bin/tracebom.js +303 -0
  10. package/bin/validate.js +268 -0
  11. package/bin/verify.js +189 -0
  12. package/data/README.md +307 -0
  13. package/data/bom-1.4.schema.json +1605 -0
  14. package/data/bom-1.5.schema.json +3660 -0
  15. package/data/bom-1.6.schema.json +5511 -0
  16. package/data/bom-1.7.schema.json +6700 -0
  17. package/data/cbomosdb-queries.json +68 -0
  18. package/data/component-tags.json +339 -0
  19. package/data/container-knowledge-index.json +125 -0
  20. package/data/cosdb-queries.json +17 -0
  21. package/data/crypto-oid.json +1998 -0
  22. package/data/cryptography-defs.json +3793 -0
  23. package/data/cryptography-defs.schema.json +576 -0
  24. package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
  25. package/data/frameworks-list.json +219 -0
  26. package/data/glibc-stdlib.json +117 -0
  27. package/data/gtfobins-index.json +6296 -0
  28. package/data/helpers/init.gradle +71 -0
  29. package/data/jsf-0.82.schema.json +211 -0
  30. package/data/known-licenses.json +82 -0
  31. package/data/lic-mapping.json +338 -0
  32. package/data/license-aliases.json +6624 -0
  33. package/data/license-db.json +39059 -0
  34. package/data/license-deprecations.json +302 -0
  35. package/data/lolbas-index.json +150 -0
  36. package/data/predictive-audit-allowlist.json +11 -0
  37. package/data/pypi-pkg-aliases.json +1199 -0
  38. package/data/python-stdlib.json +308 -0
  39. package/data/queries-darwin.json +193 -0
  40. package/data/queries-win.json +257 -0
  41. package/data/queries.json +268 -0
  42. package/data/ruby-known-modules.json +281 -0
  43. package/data/rules/ai-agent-governance.yaml +323 -0
  44. package/data/rules/ai-bom.yaml +268 -0
  45. package/data/rules/ai-oversight.yaml +186 -0
  46. package/data/rules/ai-provenance.yaml +92 -0
  47. package/data/rules/asar-archives.yaml +150 -0
  48. package/data/rules/cbom-security.yaml +165 -0
  49. package/data/rules/chrome-extensions.yaml +248 -0
  50. package/data/rules/ci-permissions.yaml +802 -0
  51. package/data/rules/container-risk.yaml +353 -0
  52. package/data/rules/dependency-sources.yaml +236 -0
  53. package/data/rules/golem-go.yaml +229 -0
  54. package/data/rules/hbom-compliance.yaml +325 -0
  55. package/data/rules/hbom-performance.yaml +307 -0
  56. package/data/rules/hbom-security.yaml +248 -0
  57. package/data/rules/host-topology.yaml +165 -0
  58. package/data/rules/mcp-servers.yaml +388 -0
  59. package/data/rules/obom-runtime.yaml +1776 -0
  60. package/data/rules/package-integrity.yaml +364 -0
  61. package/data/rules/rootfs-hardening.yaml +179 -0
  62. package/data/rules/vscode-extensions.yaml +237 -0
  63. package/data/spdx-export.schema.json +6794 -0
  64. package/data/spdx-license-list.json +7449 -0
  65. package/data/spdx-licenses.json +759 -0
  66. package/data/spdx.schema.json +819 -0
  67. package/data/templates/README.md +3 -0
  68. package/data/templates/asvs-4.0.3.cdx.json +2943 -0
  69. package/data/templates/asvs-5.0.cdx.json +3046 -0
  70. package/data/templates/bsimm-v13.cdx.json +1008 -0
  71. package/data/templates/masvs-2.0.0.cdx.json +225 -0
  72. package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
  73. package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
  74. package/data/templates/scvs-1.0.0.cdx.json +813 -0
  75. package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
  76. package/data/vendor-alias.json +41967 -0
  77. package/data/wrapdb-releases.json +4227 -0
  78. package/index.cjs +15 -0
  79. package/lib/audit/index.js +2800 -0
  80. package/lib/audit/progress.js +114 -0
  81. package/lib/audit/reporters.js +937 -0
  82. package/lib/audit/scoring.js +560 -0
  83. package/lib/audit/targets.js +798 -0
  84. package/lib/cli/bomAssembly.js +1882 -0
  85. package/lib/cli/cliOptions.js +543 -0
  86. package/lib/cli/index.js +2759 -0
  87. package/lib/cli/jsBom.js +2087 -0
  88. package/lib/cli/jvmBom.js +1858 -0
  89. package/lib/cli/managedBom.js +2083 -0
  90. package/lib/cli/nativeBom.js +2125 -0
  91. package/lib/core/activity.js +1087 -0
  92. package/lib/core/env.js +719 -0
  93. package/lib/core/fs.js +1058 -0
  94. package/lib/core/httpClient.js +730 -0
  95. package/lib/core/logger.js +280 -0
  96. package/lib/core/parallel.js +323 -0
  97. package/lib/core/paths.js +70 -0
  98. package/lib/core/projectConfig.js +122 -0
  99. package/lib/core/propertySanitizer.js +174 -0
  100. package/lib/core/spdx.js +5 -0
  101. package/lib/core/state.js +59 -0
  102. package/lib/core/text.js +207 -0
  103. package/lib/core/ui.js +920 -0
  104. package/lib/core/urls.js +84 -0
  105. package/lib/ecosystems/asarutils.js +1636 -0
  106. package/lib/ecosystems/bunutils.js +402 -0
  107. package/lib/ecosystems/caxa.js +77 -0
  108. package/lib/ecosystems/chromextutils.js +1174 -0
  109. package/lib/ecosystems/cmakeResolver.js +587 -0
  110. package/lib/ecosystems/cppEvidence.js +305 -0
  111. package/lib/ecosystems/denoutils.js +1094 -0
  112. package/lib/ecosystems/dotnetutils.js +132 -0
  113. package/lib/ecosystems/ecosystems.js +2772 -0
  114. package/lib/ecosystems/golem.js +1807 -0
  115. package/lib/ecosystems/gradleutils.js +1048 -0
  116. package/lib/ecosystems/jsEvidence.js +317 -0
  117. package/lib/ecosystems/npmutils.js +586 -0
  118. package/lib/ecosystems/parsers-bazel.js +875 -0
  119. package/lib/ecosystems/parsers-dotnet.js +1430 -0
  120. package/lib/ecosystems/parsers-gleam.js +302 -0
  121. package/lib/ecosystems/parsers-go.js +818 -0
  122. package/lib/ecosystems/parsers-js.js +4222 -0
  123. package/lib/ecosystems/parsers-jvm.js +948 -0
  124. package/lib/ecosystems/parsers-misc.js +3191 -0
  125. package/lib/ecosystems/parsers-python.js +2070 -0
  126. package/lib/ecosystems/parsers-rust.js +1294 -0
  127. package/lib/ecosystems/parsers-zig.js +861 -0
  128. package/lib/ecosystems/pep770.js +341 -0
  129. package/lib/ecosystems/pylockutils.js +427 -0
  130. package/lib/ecosystems/pythonutils.js +1281 -0
  131. package/lib/ecosystems/registryProvenance.js +1003 -0
  132. package/lib/ecosystems/remote/huggingface.js +1343 -0
  133. package/lib/ecosystems/rubyutils.js +1629 -0
  134. package/lib/ecosystems/rusi.js +820 -0
  135. package/lib/ecosystems/sbtutils.js +972 -0
  136. package/lib/ecosystems/tea.js +607 -0
  137. package/lib/ecosystems/utils.js +583 -0
  138. package/lib/ecosystems/zigResolver.js +410 -0
  139. package/lib/evinser/db.js +145 -0
  140. package/lib/evinser/evinser.js +2362 -0
  141. package/lib/evinser/scalasem.js +65 -0
  142. package/lib/evinser/swiftsem.js +767 -0
  143. package/lib/helpers/annotationFormatter.js +84 -0
  144. package/lib/helpers/bomSigner.js +312 -0
  145. package/lib/helpers/exportUtils.js +160 -0
  146. package/lib/helpers/remote/dependency-track.js +117 -0
  147. package/lib/helpers/versutils.js +202 -0
  148. package/lib/helpers/vsixutils.js +1069 -0
  149. package/lib/inventory/agentFormulationParser.js +322 -0
  150. package/lib/inventory/aiCollector.js +2140 -0
  151. package/lib/inventory/aiInventory.js +414 -0
  152. package/lib/inventory/aiModelVariants.js +121 -0
  153. package/lib/inventory/aiOversightCollector.js +661 -0
  154. package/lib/inventory/aiProvenanceCollector.js +822 -0
  155. package/lib/inventory/analyzer.js +6089 -0
  156. package/lib/inventory/analyzerScope.js +807 -0
  157. package/lib/inventory/astWorker.js +20 -0
  158. package/lib/inventory/atomUtils.js +1092 -0
  159. package/lib/inventory/auditCategories.js +192 -0
  160. package/lib/inventory/bomUtils.js +369 -0
  161. package/lib/inventory/cacheCommands.js +182 -0
  162. package/lib/inventory/cacheDir.js +104 -0
  163. package/lib/inventory/cbomutils.js +590 -0
  164. package/lib/inventory/cdxrs.js +434 -0
  165. package/lib/inventory/ciParsers/azurePipelines.js +295 -0
  166. package/lib/inventory/ciParsers/circleCi.js +286 -0
  167. package/lib/inventory/ciParsers/common.js +24 -0
  168. package/lib/inventory/ciParsers/githubActions.js +2434 -0
  169. package/lib/inventory/ciParsers/gitlabCi.js +213 -0
  170. package/lib/inventory/ciParsers/jenkins.js +180 -0
  171. package/lib/inventory/citations.js +234 -0
  172. package/lib/inventory/communityAiConfigParser.js +756 -0
  173. package/lib/inventory/containerRisk.js +204 -0
  174. package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
  175. package/lib/inventory/deps.js +807 -0
  176. package/lib/inventory/depsUtils.js +588 -0
  177. package/lib/inventory/display.js +2128 -0
  178. package/lib/inventory/dosai.js +601 -0
  179. package/lib/inventory/dosaiParsers.js +154 -0
  180. package/lib/inventory/dynamic.js +145 -0
  181. package/lib/inventory/envcontext.js +1793 -0
  182. package/lib/inventory/evidenceUtils.js +774 -0
  183. package/lib/inventory/fetchBatch.js +779 -0
  184. package/lib/inventory/fetchRate.js +255 -0
  185. package/lib/inventory/forgeEnricher.js +300 -0
  186. package/lib/inventory/formulationParsers.js +422 -0
  187. package/lib/inventory/gtfobins.js +339 -0
  188. package/lib/inventory/hbom.js +719 -0
  189. package/lib/inventory/hbomAnalysis.js +310 -0
  190. package/lib/inventory/hbomLoader.js +35 -0
  191. package/lib/inventory/hostTopology.js +835 -0
  192. package/lib/inventory/inventoryStats.js +100 -0
  193. package/lib/inventory/jsonLike.js +121 -0
  194. package/lib/inventory/licenseEnhancer.js +918 -0
  195. package/lib/inventory/lolbas.js +285 -0
  196. package/lib/inventory/mcp.js +253 -0
  197. package/lib/inventory/mcpConfigParser.js +683 -0
  198. package/lib/inventory/mcpDiscovery.js +112 -0
  199. package/lib/inventory/mcpPinning.js +209 -0
  200. package/lib/inventory/osPackageResolver.js +493 -0
  201. package/lib/inventory/osinfo.js +383 -0
  202. package/lib/inventory/osqueryTransform.js +274 -0
  203. package/lib/inventory/plugins.js +466 -0
  204. package/lib/inventory/protobom.js +231 -0
  205. package/lib/inventory/protobomLoader.js +43 -0
  206. package/lib/inventory/provenanceUtils.js +224 -0
  207. package/lib/inventory/purl.js +749 -0
  208. package/lib/inventory/rustFormulationParser.js +339 -0
  209. package/lib/inventory/sbomDocument.js +340 -0
  210. package/lib/inventory/source.js +1488 -0
  211. package/lib/inventory/spdx.js +361 -0
  212. package/lib/inventory/spdxExpression.js +512 -0
  213. package/lib/inventory/spdxUtils.js +107 -0
  214. package/lib/inventory/table.js +267 -0
  215. package/lib/inventory/traceRunner.js +439 -0
  216. package/lib/inventory/unicodeScan.js +147 -0
  217. package/lib/managers/binary.js +3459 -0
  218. package/lib/managers/containerutils.js +125 -0
  219. package/lib/managers/docker.js +2145 -0
  220. package/lib/managers/dockerConnection.js +162 -0
  221. package/lib/managers/oci.js +704 -0
  222. package/lib/managers/piptree.js +267 -0
  223. package/lib/parsers/cmakeCache.js +199 -0
  224. package/lib/parsers/gguf.js +492 -0
  225. package/lib/parsers/gitAiNotes.js +233 -0
  226. package/lib/parsers/gitmodules.js +239 -0
  227. package/lib/parsers/htmlExtract.js +610 -0
  228. package/lib/parsers/huggingfaceManifest.js +551 -0
  229. package/lib/parsers/huggingfaceUtils.js +506 -0
  230. package/lib/parsers/iri.js +618 -0
  231. package/lib/parsers/npmrc.js +99 -0
  232. package/lib/parsers/ollama.js +101 -0
  233. package/lib/parsers/xml.js +841 -0
  234. package/lib/server/openapi.yaml +433 -0
  235. package/lib/server/server.js +616 -0
  236. package/lib/stages/postgen/annotator.js +977 -0
  237. package/lib/stages/postgen/auditBom.js +468 -0
  238. package/lib/stages/postgen/postgen.js +1239 -0
  239. package/lib/stages/postgen/ruleEngine.js +731 -0
  240. package/lib/stages/postgen/sortBom.js +195 -0
  241. package/lib/stages/postgen/spdxConverter.js +796 -0
  242. package/lib/stages/postgen/specVersionCompat.js +703 -0
  243. package/lib/stages/pregen/envAudit.js +388 -0
  244. package/lib/stages/pregen/pregen.js +637 -0
  245. package/lib/third-party/README.md +9 -0
  246. package/lib/third-party/arborist/CHANGELOG.md +1109 -0
  247. package/lib/third-party/arborist/LICENSE.md +20 -0
  248. package/lib/third-party/arborist/README.md +315 -0
  249. package/lib/third-party/arborist/lib/arborist/index.js +258 -0
  250. package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
  251. package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
  252. package/lib/third-party/arborist/lib/bin-links.js +120 -0
  253. package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
  254. package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
  255. package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
  256. package/lib/third-party/arborist/lib/debug.js +50 -0
  257. package/lib/third-party/arborist/lib/dep-valid.js +190 -0
  258. package/lib/third-party/arborist/lib/edge.js +417 -0
  259. package/lib/third-party/arborist/lib/from-path.js +36 -0
  260. package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
  261. package/lib/third-party/arborist/lib/index.js +22 -0
  262. package/lib/third-party/arborist/lib/inventory.js +138 -0
  263. package/lib/third-party/arborist/lib/link.js +169 -0
  264. package/lib/third-party/arborist/lib/node.js +1673 -0
  265. package/lib/third-party/arborist/lib/npm-extension.js +45 -0
  266. package/lib/third-party/arborist/lib/override-resolves.js +11 -0
  267. package/lib/third-party/arborist/lib/override-set.js +319 -0
  268. package/lib/third-party/arborist/lib/package-extensions.js +289 -0
  269. package/lib/third-party/arborist/lib/printable.js +210 -0
  270. package/lib/third-party/arborist/lib/proc-log.js +30 -0
  271. package/lib/third-party/arborist/lib/realpath.js +100 -0
  272. package/lib/third-party/arborist/lib/relpath.js +4 -0
  273. package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
  274. package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
  275. package/lib/third-party/arborist/lib/tree-check.js +165 -0
  276. package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
  277. package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
  278. package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
  279. package/lib/validator/bomValidator.js +985 -0
  280. package/lib/validator/complianceEngine.js +241 -0
  281. package/lib/validator/complianceRules.js +1680 -0
  282. package/lib/validator/generated/runtime.mjs +17 -0
  283. package/lib/validator/generated/validate-1.6.mjs +21258 -0
  284. package/lib/validator/generated/validate-1.7.mjs +24803 -0
  285. package/lib/validator/generated/validate-2.0.mjs +22931 -0
  286. package/lib/validator/index.js +246 -0
  287. package/lib/validator/reporters/annotations.js +142 -0
  288. package/lib/validator/reporters/console.js +160 -0
  289. package/lib/validator/reporters/index.js +41 -0
  290. package/lib/validator/reporters/json.js +37 -0
  291. package/lib/validator/reporters/sarif.js +184 -0
  292. package/package.json +209 -26
  293. package/types/bin/audit.d.ts +3 -0
  294. package/types/bin/audit.d.ts.map +1 -0
  295. package/types/bin/cdxgen.d.ts +3 -0
  296. package/types/bin/cdxgen.d.ts.map +1 -0
  297. package/types/bin/convert.d.ts +3 -0
  298. package/types/bin/convert.d.ts.map +1 -0
  299. package/types/bin/evinse.d.ts +3 -0
  300. package/types/bin/evinse.d.ts.map +1 -0
  301. package/types/bin/hbom.d.ts +3 -0
  302. package/types/bin/hbom.d.ts.map +1 -0
  303. package/types/bin/repl.d.ts +3 -0
  304. package/types/bin/repl.d.ts.map +1 -0
  305. package/types/bin/sign.d.ts +3 -0
  306. package/types/bin/sign.d.ts.map +1 -0
  307. package/types/bin/tracebom.d.ts +3 -0
  308. package/types/bin/tracebom.d.ts.map +1 -0
  309. package/types/bin/validate.d.ts +14 -0
  310. package/types/bin/validate.d.ts.map +1 -0
  311. package/types/bin/verify.d.ts +3 -0
  312. package/types/bin/verify.d.ts.map +1 -0
  313. package/types/lib/audit/index.d.ts +153 -0
  314. package/types/lib/audit/index.d.ts.map +1 -0
  315. package/types/lib/audit/progress.d.ts +31 -0
  316. package/types/lib/audit/progress.d.ts.map +1 -0
  317. package/types/lib/audit/reporters.d.ts +62 -0
  318. package/types/lib/audit/reporters.d.ts.map +1 -0
  319. package/types/lib/audit/scoring.d.ts +36 -0
  320. package/types/lib/audit/scoring.d.ts.map +1 -0
  321. package/types/lib/audit/targets.d.ts +77 -0
  322. package/types/lib/audit/targets.d.ts.map +1 -0
  323. package/types/lib/cli/bomAssembly.d.ts +329 -0
  324. package/types/lib/cli/bomAssembly.d.ts.map +1 -0
  325. package/types/lib/cli/cliOptions.d.ts +156 -0
  326. package/types/lib/cli/cliOptions.d.ts.map +1 -0
  327. package/types/lib/cli/index.d.ts +107 -0
  328. package/types/lib/cli/index.d.ts.map +1 -0
  329. package/types/lib/cli/jsBom.d.ts +94 -0
  330. package/types/lib/cli/jsBom.d.ts.map +1 -0
  331. package/types/lib/cli/jvmBom.d.ts +54 -0
  332. package/types/lib/cli/jvmBom.d.ts.map +1 -0
  333. package/types/lib/cli/managedBom.d.ts +105 -0
  334. package/types/lib/cli/managedBom.d.ts.map +1 -0
  335. package/types/lib/cli/nativeBom.d.ts +143 -0
  336. package/types/lib/cli/nativeBom.d.ts.map +1 -0
  337. package/types/lib/core/activity.d.ts +178 -0
  338. package/types/lib/core/activity.d.ts.map +1 -0
  339. package/types/lib/core/env.d.ts +192 -0
  340. package/types/lib/core/env.d.ts.map +1 -0
  341. package/types/lib/core/fs.d.ts +158 -0
  342. package/types/lib/core/fs.d.ts.map +1 -0
  343. package/types/lib/core/httpClient.d.ts +149 -0
  344. package/types/lib/core/httpClient.d.ts.map +1 -0
  345. package/types/lib/core/logger.d.ts +50 -0
  346. package/types/lib/core/logger.d.ts.map +1 -0
  347. package/types/lib/core/parallel.d.ts +95 -0
  348. package/types/lib/core/parallel.d.ts.map +1 -0
  349. package/types/lib/core/paths.d.ts +36 -0
  350. package/types/lib/core/paths.d.ts.map +1 -0
  351. package/types/lib/core/projectConfig.d.ts +23 -0
  352. package/types/lib/core/projectConfig.d.ts.map +1 -0
  353. package/types/lib/core/propertySanitizer.d.ts +23 -0
  354. package/types/lib/core/propertySanitizer.d.ts.map +1 -0
  355. package/types/lib/core/spdx.d.ts +5 -0
  356. package/types/lib/core/spdx.d.ts.map +1 -0
  357. package/types/lib/core/state.d.ts +20 -0
  358. package/types/lib/core/state.d.ts.map +1 -0
  359. package/types/lib/core/text.d.ts +78 -0
  360. package/types/lib/core/text.d.ts.map +1 -0
  361. package/types/lib/core/ui.d.ts +87 -0
  362. package/types/lib/core/ui.d.ts.map +1 -0
  363. package/types/lib/core/urls.d.ts +43 -0
  364. package/types/lib/core/urls.d.ts.map +1 -0
  365. package/types/lib/ecosystems/asarutils.d.ts +71 -0
  366. package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
  367. package/types/lib/ecosystems/bunutils.d.ts +38 -0
  368. package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
  369. package/types/lib/ecosystems/caxa.d.ts +8 -0
  370. package/types/lib/ecosystems/caxa.d.ts.map +1 -0
  371. package/types/lib/ecosystems/chromextutils.d.ts +97 -0
  372. package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
  373. package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
  374. package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
  375. package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
  376. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
  377. package/types/lib/ecosystems/denoutils.d.ts +76 -0
  378. package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
  379. package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
  380. package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
  381. package/types/lib/ecosystems/ecosystems.d.ts +279 -0
  382. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
  383. package/types/lib/ecosystems/golem.d.ts +60 -0
  384. package/types/lib/ecosystems/golem.d.ts.map +1 -0
  385. package/types/lib/ecosystems/gradleutils.d.ts +139 -0
  386. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
  387. package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
  388. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
  389. package/types/lib/ecosystems/npmutils.d.ts +183 -0
  390. package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
  391. package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
  392. package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
  393. package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
  394. package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
  395. package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
  396. package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
  397. package/types/lib/ecosystems/parsers-go.d.ts +92 -0
  398. package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
  399. package/types/lib/ecosystems/parsers-js.d.ts +242 -0
  400. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
  401. package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
  402. package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
  403. package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
  404. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
  405. package/types/lib/ecosystems/parsers-python.d.ts +145 -0
  406. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
  407. package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
  408. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
  409. package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
  410. package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
  411. package/types/lib/ecosystems/pep770.d.ts +38 -0
  412. package/types/lib/ecosystems/pep770.d.ts.map +1 -0
  413. package/types/lib/ecosystems/pylockutils.d.ts +68 -0
  414. package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
  415. package/types/lib/ecosystems/pythonutils.d.ts +70 -0
  416. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
  417. package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
  418. package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
  419. package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
  420. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
  421. package/types/lib/ecosystems/rubyutils.d.ts +182 -0
  422. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
  423. package/types/lib/ecosystems/rusi.d.ts +40 -0
  424. package/types/lib/ecosystems/rusi.d.ts.map +1 -0
  425. package/types/lib/ecosystems/sbtutils.d.ts +179 -0
  426. package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
  427. package/types/lib/ecosystems/tea.d.ts +180 -0
  428. package/types/lib/ecosystems/tea.d.ts.map +1 -0
  429. package/types/lib/ecosystems/utils.d.ts +41 -0
  430. package/types/lib/ecosystems/utils.d.ts.map +1 -0
  431. package/types/lib/ecosystems/zigResolver.d.ts +70 -0
  432. package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
  433. package/types/lib/evinser/db.d.ts +17 -0
  434. package/types/lib/evinser/db.d.ts.map +1 -0
  435. package/types/lib/evinser/evinser.d.ts +354 -0
  436. package/types/lib/evinser/evinser.d.ts.map +1 -0
  437. package/types/lib/evinser/scalasem.d.ts +15 -0
  438. package/types/lib/evinser/scalasem.d.ts.map +1 -0
  439. package/types/lib/evinser/swiftsem.d.ts +103 -0
  440. package/types/lib/evinser/swiftsem.d.ts.map +1 -0
  441. package/types/lib/helpers/annotationFormatter.d.ts +23 -0
  442. package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
  443. package/types/lib/helpers/bomSigner.d.ts +28 -0
  444. package/types/lib/helpers/bomSigner.d.ts.map +1 -0
  445. package/types/lib/helpers/exportUtils.d.ts +52 -0
  446. package/types/lib/helpers/exportUtils.d.ts.map +1 -0
  447. package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
  448. package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
  449. package/types/lib/helpers/versutils.d.ts +8 -0
  450. package/types/lib/helpers/versutils.d.ts.map +1 -0
  451. package/types/lib/helpers/vsixutils.d.ts +130 -0
  452. package/types/lib/helpers/vsixutils.d.ts.map +1 -0
  453. package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
  454. package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
  455. package/types/lib/inventory/aiCollector.d.ts +61 -0
  456. package/types/lib/inventory/aiCollector.d.ts.map +1 -0
  457. package/types/lib/inventory/aiInventory.d.ts +103 -0
  458. package/types/lib/inventory/aiInventory.d.ts.map +1 -0
  459. package/types/lib/inventory/aiModelVariants.d.ts +31 -0
  460. package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
  461. package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
  462. package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
  463. package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
  464. package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
  465. package/types/lib/inventory/analyzer.d.ts +157 -0
  466. package/types/lib/inventory/analyzer.d.ts.map +1 -0
  467. package/types/lib/inventory/analyzerScope.d.ts +106 -0
  468. package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
  469. package/types/lib/inventory/astWorker.d.ts +9 -0
  470. package/types/lib/inventory/astWorker.d.ts.map +1 -0
  471. package/types/lib/inventory/atomUtils.d.ts +159 -0
  472. package/types/lib/inventory/atomUtils.d.ts.map +1 -0
  473. package/types/lib/inventory/auditCategories.d.ts +80 -0
  474. package/types/lib/inventory/auditCategories.d.ts.map +1 -0
  475. package/types/lib/inventory/bomUtils.d.ts +145 -0
  476. package/types/lib/inventory/bomUtils.d.ts.map +1 -0
  477. package/types/lib/inventory/cacheCommands.d.ts +28 -0
  478. package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
  479. package/types/lib/inventory/cacheDir.d.ts +55 -0
  480. package/types/lib/inventory/cacheDir.d.ts.map +1 -0
  481. package/types/lib/inventory/cbomutils.d.ts +37 -0
  482. package/types/lib/inventory/cbomutils.d.ts.map +1 -0
  483. package/types/lib/inventory/cdxrs.d.ts +90 -0
  484. package/types/lib/inventory/cdxrs.d.ts.map +1 -0
  485. package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
  486. package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
  487. package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
  488. package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
  489. package/types/lib/inventory/ciParsers/common.d.ts +11 -0
  490. package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
  491. package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
  492. package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
  493. package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
  494. package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
  495. package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
  496. package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
  497. package/types/lib/inventory/citations.d.ts +90 -0
  498. package/types/lib/inventory/citations.d.ts.map +1 -0
  499. package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
  500. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
  501. package/types/lib/inventory/containerRisk.d.ts +20 -0
  502. package/types/lib/inventory/containerRisk.d.ts.map +1 -0
  503. package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
  504. package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
  505. package/types/lib/inventory/deps.d.ts +140 -0
  506. package/types/lib/inventory/deps.d.ts.map +1 -0
  507. package/types/lib/inventory/depsUtils.d.ts +74 -0
  508. package/types/lib/inventory/depsUtils.d.ts.map +1 -0
  509. package/types/lib/inventory/display.d.ts +227 -0
  510. package/types/lib/inventory/display.d.ts.map +1 -0
  511. package/types/lib/inventory/dosai.d.ts +130 -0
  512. package/types/lib/inventory/dosai.d.ts.map +1 -0
  513. package/types/lib/inventory/dosaiParsers.d.ts +59 -0
  514. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
  515. package/types/lib/inventory/dynamic.d.ts +25 -0
  516. package/types/lib/inventory/dynamic.d.ts.map +1 -0
  517. package/types/lib/inventory/envcontext.d.ts +377 -0
  518. package/types/lib/inventory/envcontext.d.ts.map +1 -0
  519. package/types/lib/inventory/evidenceUtils.d.ts +74 -0
  520. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
  521. package/types/lib/inventory/fetchBatch.d.ts +127 -0
  522. package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
  523. package/types/lib/inventory/fetchRate.d.ts +118 -0
  524. package/types/lib/inventory/fetchRate.d.ts.map +1 -0
  525. package/types/lib/inventory/forgeEnricher.d.ts +31 -0
  526. package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
  527. package/types/lib/inventory/formulationParsers.d.ts +50 -0
  528. package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
  529. package/types/lib/inventory/gtfobins.d.ts +27 -0
  530. package/types/lib/inventory/gtfobins.d.ts.map +1 -0
  531. package/types/lib/inventory/hbom.d.ts +58 -0
  532. package/types/lib/inventory/hbom.d.ts.map +1 -0
  533. package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
  534. package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
  535. package/types/lib/inventory/hbomLoader.d.ts +7 -0
  536. package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
  537. package/types/lib/inventory/hostTopology.d.ts +47 -0
  538. package/types/lib/inventory/hostTopology.d.ts.map +1 -0
  539. package/types/lib/inventory/inventoryStats.d.ts +42 -0
  540. package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
  541. package/types/lib/inventory/jsonLike.d.ts +23 -0
  542. package/types/lib/inventory/jsonLike.d.ts.map +1 -0
  543. package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
  544. package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
  545. package/types/lib/inventory/lolbas.d.ts +16 -0
  546. package/types/lib/inventory/lolbas.d.ts.map +1 -0
  547. package/types/lib/inventory/mcp.d.ts +29 -0
  548. package/types/lib/inventory/mcp.d.ts.map +1 -0
  549. package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
  550. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
  551. package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
  552. package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
  553. package/types/lib/inventory/mcpPinning.d.ts +11 -0
  554. package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
  555. package/types/lib/inventory/osPackageResolver.d.ts +49 -0
  556. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
  557. package/types/lib/inventory/osinfo.d.ts +201 -0
  558. package/types/lib/inventory/osinfo.d.ts.map +1 -0
  559. package/types/lib/inventory/osqueryTransform.d.ts +84 -0
  560. package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
  561. package/types/lib/inventory/plugins.d.ts +58 -0
  562. package/types/lib/inventory/plugins.d.ts.map +1 -0
  563. package/types/lib/inventory/protobom.d.ts +71 -0
  564. package/types/lib/inventory/protobom.d.ts.map +1 -0
  565. package/types/lib/inventory/protobomLoader.d.ts +17 -0
  566. package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
  567. package/types/lib/inventory/provenanceUtils.d.ts +98 -0
  568. package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
  569. package/types/lib/inventory/purl.d.ts +313 -0
  570. package/types/lib/inventory/purl.d.ts.map +1 -0
  571. package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
  572. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
  573. package/types/lib/inventory/sbomDocument.d.ts +59 -0
  574. package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
  575. package/types/lib/inventory/source.d.ts +163 -0
  576. package/types/lib/inventory/source.d.ts.map +1 -0
  577. package/types/lib/inventory/spdx.d.ts +66 -0
  578. package/types/lib/inventory/spdx.d.ts.map +1 -0
  579. package/types/lib/inventory/spdxExpression.d.ts +58 -0
  580. package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
  581. package/types/lib/inventory/spdxUtils.d.ts +12 -0
  582. package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
  583. package/types/lib/inventory/table.d.ts +22 -0
  584. package/types/lib/inventory/table.d.ts.map +1 -0
  585. package/types/lib/inventory/traceRunner.d.ts +80 -0
  586. package/types/lib/inventory/traceRunner.d.ts.map +1 -0
  587. package/types/lib/inventory/unicodeScan.d.ts +46 -0
  588. package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
  589. package/types/lib/managers/binary.d.ts +147 -0
  590. package/types/lib/managers/binary.d.ts.map +1 -0
  591. package/types/lib/managers/containerutils.d.ts +30 -0
  592. package/types/lib/managers/containerutils.d.ts.map +1 -0
  593. package/types/lib/managers/docker.d.ts +157 -0
  594. package/types/lib/managers/docker.d.ts.map +1 -0
  595. package/types/lib/managers/dockerConnection.d.ts +42 -0
  596. package/types/lib/managers/dockerConnection.d.ts.map +1 -0
  597. package/types/lib/managers/oci.d.ts +21 -0
  598. package/types/lib/managers/oci.d.ts.map +1 -0
  599. package/types/lib/managers/piptree.d.ts +13 -0
  600. package/types/lib/managers/piptree.d.ts.map +1 -0
  601. package/types/lib/parsers/cmakeCache.d.ts +70 -0
  602. package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
  603. package/types/lib/parsers/gguf.d.ts +39 -0
  604. package/types/lib/parsers/gguf.d.ts.map +1 -0
  605. package/types/lib/parsers/gitAiNotes.d.ts +15 -0
  606. package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
  607. package/types/lib/parsers/gitmodules.d.ts +88 -0
  608. package/types/lib/parsers/gitmodules.d.ts.map +1 -0
  609. package/types/lib/parsers/htmlExtract.d.ts +34 -0
  610. package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
  611. package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
  612. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
  613. package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
  614. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
  615. package/types/lib/parsers/iri.d.ts +68 -0
  616. package/types/lib/parsers/iri.d.ts.map +1 -0
  617. package/types/lib/parsers/npmrc.d.ts +33 -0
  618. package/types/lib/parsers/npmrc.d.ts.map +1 -0
  619. package/types/lib/parsers/ollama.d.ts +22 -0
  620. package/types/lib/parsers/ollama.d.ts.map +1 -0
  621. package/types/lib/parsers/xml.d.ts +47 -0
  622. package/types/lib/parsers/xml.d.ts.map +1 -0
  623. package/types/lib/server/server.d.ts +51 -0
  624. package/types/lib/server/server.d.ts.map +1 -0
  625. package/types/lib/stages/postgen/annotator.d.ts +36 -0
  626. package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
  627. package/types/lib/stages/postgen/auditBom.d.ts +92 -0
  628. package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
  629. package/types/lib/stages/postgen/postgen.d.ts +59 -0
  630. package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
  631. package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
  632. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
  633. package/types/lib/stages/postgen/sortBom.d.ts +34 -0
  634. package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
  635. package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
  636. package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
  637. package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
  638. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
  639. package/types/lib/stages/pregen/envAudit.d.ts +14 -0
  640. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
  641. package/types/lib/stages/pregen/pregen.d.ts +59 -0
  642. package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
  643. package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
  644. package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
  645. package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
  646. package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
  647. package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
  648. package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
  649. package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
  650. package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
  651. package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
  652. package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
  653. package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
  654. package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
  655. package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
  656. package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
  657. package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
  658. package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
  659. package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
  660. package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
  661. package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
  662. package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
  663. package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
  664. package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
  665. package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
  666. package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
  667. package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
  668. package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
  669. package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
  670. package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
  671. package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
  672. package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
  673. package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
  674. package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
  675. package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
  676. package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
  677. package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
  678. package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
  679. package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
  680. package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
  681. package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
  682. package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
  683. package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
  684. package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
  685. package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
  686. package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
  687. package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
  688. package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
  689. package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
  690. package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
  691. package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
  692. package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
  693. package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
  694. package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
  695. package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
  696. package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
  697. package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
  698. package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
  699. package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
  700. package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
  701. package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
  702. package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
  703. package/types/lib/validator/bomValidator.d.ts +40 -0
  704. package/types/lib/validator/bomValidator.d.ts.map +1 -0
  705. package/types/lib/validator/complianceEngine.d.ts +72 -0
  706. package/types/lib/validator/complianceEngine.d.ts.map +1 -0
  707. package/types/lib/validator/complianceRules.d.ts +61 -0
  708. package/types/lib/validator/complianceRules.d.ts.map +1 -0
  709. package/types/lib/validator/index.d.ts +101 -0
  710. package/types/lib/validator/index.d.ts.map +1 -0
  711. package/types/lib/validator/reporters/annotations.d.ts +37 -0
  712. package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
  713. package/types/lib/validator/reporters/console.d.ts +34 -0
  714. package/types/lib/validator/reporters/console.d.ts.map +1 -0
  715. package/types/lib/validator/reporters/index.d.ts +30 -0
  716. package/types/lib/validator/reporters/index.d.ts.map +1 -0
  717. package/types/lib/validator/reporters/json.d.ts +11 -0
  718. package/types/lib/validator/reporters/json.d.ts.map +1 -0
  719. package/types/lib/validator/reporters/sarif.d.ts +22 -0
  720. package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
  721. package/mod.d.ts +0 -7
  722. package/mod.js +0 -22
@@ -0,0 +1,977 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { thoughtLog } from "../../core/logger.js";
5
+ import { dirNameStr } from "../../core/paths.js";
6
+ import { detectAiModelVariants } from "../../inventory/aiModelVariants.js";
7
+ import {
8
+ formatHbomHardwareClassSummary,
9
+ getHbomSummary,
10
+ isHbomLikeBom,
11
+ } from "../../inventory/hbomAnalysis.js";
12
+ import {
13
+ getContainerFileInventoryStats,
14
+ getPropertyValue,
15
+ } from "../../inventory/inventoryStats.js";
16
+ import { getTrustedPublishingComponentCounts } from "../../inventory/provenanceUtils.js";
17
+
18
+ // Tags per BOM type.
19
+ const componentTags = JSON.parse(
20
+ readFileSync(join(dirNameStr, "data", "component-tags.json"), "utf-8"),
21
+ );
22
+
23
+ function humanifyTimestamp(timestamp) {
24
+ const dateObj = new Date(Date.parse(timestamp));
25
+ return dateObj.toLocaleDateString("en-US", {
26
+ year: "numeric",
27
+ month: "long",
28
+ day: "numeric",
29
+ weekday: "long",
30
+ timeZone: "UTC",
31
+ });
32
+ }
33
+
34
+ function toArticle(s) {
35
+ return /^[aeiou]/i.test(s) ? "an" : "a";
36
+ }
37
+
38
+ function joinArray(arr) {
39
+ if (!Array.isArray(arr)) {
40
+ return arr;
41
+ }
42
+ if (arr.length <= 1) {
43
+ return arr.join(", ");
44
+ }
45
+ const last = arr.pop();
46
+ return `${arr.join(", ")}${arr.length > 1 ? "," : ""} and ${last}`;
47
+ }
48
+
49
+ function cleanNames(s) {
50
+ return s?.replace(/[+]/g, " ");
51
+ }
52
+
53
+ function cleanTypes(s) {
54
+ return s?.replace(/[+_-]/g, " ");
55
+ }
56
+
57
+ const uniqueValues = (values) => [...new Set((values || []).filter(Boolean))];
58
+
59
+ const isAiComponent = (component) =>
60
+ component?.type === "machine-learning-model" ||
61
+ component?.type === "data" ||
62
+ getPropertyValue(component, "cdx:ai:kind") ||
63
+ component?.modelCard ||
64
+ component?.pedigree ||
65
+ component?.data?.length;
66
+
67
+ const isAiDatasetComponent = (component) =>
68
+ component?.type === "data" ||
69
+ getPropertyValue(component, "cdx:ai:kind") === "dataset" ||
70
+ (component?.data || []).some((entry) => entry?.type === "dataset");
71
+
72
+ const datasetIdentity = (component) =>
73
+ component?.group ? `${component.group}/${component.name}` : component?.name;
74
+
75
+ const referencedDatasetName = (dataset, bomJson) => {
76
+ if (dataset?.name) {
77
+ return dataset.name;
78
+ }
79
+ const resolved = (bomJson?.components || []).find(
80
+ (candidate) => candidate?.["bom-ref"] === dataset?.ref,
81
+ );
82
+ if (!resolved) {
83
+ return dataset?.ref;
84
+ }
85
+ return datasetIdentity(resolved);
86
+ };
87
+
88
+ function formatShortList(values, max = 4) {
89
+ const unique = uniqueValues(values);
90
+ if (!unique.length) {
91
+ return "";
92
+ }
93
+ return `${unique.slice(0, max).join(", ")}${
94
+ unique.length > max ? ` and ${unique.length - max} more` : ""
95
+ }`;
96
+ }
97
+
98
+ function getAiNarrativeSummary(bomJson) {
99
+ const aiComponents = (bomJson?.components || []).filter((component) =>
100
+ isAiComponent(component),
101
+ );
102
+ const aiServices = (bomJson?.services || []).filter(
103
+ (service) =>
104
+ getPropertyValue(service, "cdx:ai:kind") || service?.provider?.name,
105
+ );
106
+ if (!aiComponents.length && !aiServices.length) {
107
+ return "";
108
+ }
109
+ const models = aiComponents.filter(
110
+ (component) =>
111
+ component?.type === "machine-learning-model" ||
112
+ getPropertyValue(component, "cdx:ai:kind") === "model",
113
+ );
114
+ const standaloneDatasets = (bomJson?.components || [])
115
+ .filter((component) => isAiDatasetComponent(component))
116
+ .map((component) => datasetIdentity(component));
117
+ const datasets = uniqueValues(
118
+ standaloneDatasets.concat(
119
+ models.flatMap(
120
+ (component) =>
121
+ component?.modelCard?.modelParameters?.datasets?.map((dataset) =>
122
+ referencedDatasetName(dataset, bomJson),
123
+ ) || [],
124
+ ),
125
+ ),
126
+ );
127
+ const datasetSizedCount = (bomJson?.components || []).filter(
128
+ (component) =>
129
+ isAiDatasetComponent(component) &&
130
+ component?.data?.some((entry) => entry?.description),
131
+ ).length;
132
+ const tasks = uniqueValues(
133
+ models.map(
134
+ (component) =>
135
+ component?.modelCard?.modelParameters?.task ||
136
+ getPropertyValue(component, "cdx:ai:modality"),
137
+ ),
138
+ );
139
+ const pedigreeModels = models.filter(
140
+ (component) =>
141
+ component?.pedigree?.ancestors?.length ||
142
+ component?.pedigree?.variants?.length ||
143
+ component?.pedigree?.notes,
144
+ );
145
+ const variants = uniqueValues(
146
+ models.flatMap((component) =>
147
+ detectAiModelVariants({
148
+ description: component?.description,
149
+ metadata: [component?.modelCard?.modelParameters?.task],
150
+ modelName: [component?.group, component?.name]
151
+ .filter(Boolean)
152
+ .join("/"),
153
+ notes: [component?.pedigree?.notes],
154
+ quantization: getPropertyValue(component, "cdx:ai:quantization"),
155
+ tags: component?.tags,
156
+ }),
157
+ ),
158
+ );
159
+ const usageProviders = uniqueValues(
160
+ aiServices.map(
161
+ (service) => service?.provider?.name || service?.group || service?.name,
162
+ ),
163
+ );
164
+ const sentences = [];
165
+ sentences.push(
166
+ `It inventories ${models.length} AI model(s), ${aiServices.length} AI service(s), and ${datasets.length} dataset(s).`,
167
+ );
168
+ if (tasks.length) {
169
+ sentences.push(`Documented model tasks include ${formatShortList(tasks)}.`);
170
+ }
171
+ if (datasets.length) {
172
+ sentences.push(
173
+ `Recorded training or evaluation datasets include ${formatShortList(datasets)}.`,
174
+ );
175
+ }
176
+ if (pedigreeModels.length) {
177
+ sentences.push(
178
+ `Pedigree information is captured for ${pedigreeModels.length} model(s), which helps reviewers trace upstream bases and downstream variants.`,
179
+ );
180
+ }
181
+ if (variants.length) {
182
+ sentences.push(
183
+ `Detected model variants include ${formatShortList(variants)}, so modified artifacts remain visible in the BOM.`,
184
+ );
185
+ }
186
+ if (usageProviders.length) {
187
+ sentences.push(
188
+ `Usage references span ${usageProviders.length} provider or runtime endpoint(s), including ${formatShortList(usageProviders)}.`,
189
+ );
190
+ }
191
+ if (datasetSizedCount) {
192
+ sentences.push(
193
+ `Dataset sizing metadata is captured for ${datasetSizedCount} dataset(s).`,
194
+ );
195
+ }
196
+ return sentences.join(" ");
197
+ }
198
+
199
+ /**
200
+ * Count GitHub workflow components and extract security-relevant stats
201
+ *
202
+ * @param {Array} components BOM components array
203
+ *
204
+ * @returns {Object} Statistics about GitHub workflow components
205
+ */
206
+ function getGitHubWorkflowStats(components) {
207
+ const stats = {
208
+ totalActions: 0,
209
+ officialActions: 0,
210
+ verifiedActions: 0,
211
+ shaPinned: 0,
212
+ tagPinned: 0,
213
+ branchPinned: 0,
214
+ unknownPinned: 0,
215
+ workflowCount: 0,
216
+ jobCount: 0,
217
+ hasWritePermissions: 0,
218
+ hasIdTokenWrite: 0,
219
+ continueOnError: 0,
220
+ workflows: new Set(),
221
+ jobs: new Set(),
222
+ runners: new Set(),
223
+ environments: new Set(),
224
+ };
225
+
226
+ if (!components || !Array.isArray(components)) {
227
+ return stats;
228
+ }
229
+
230
+ for (const comp of components) {
231
+ if (comp?.scope === "excluded") {
232
+ continue;
233
+ }
234
+ if (comp?.purl?.startsWith("pkg:github/")) {
235
+ stats.totalActions++;
236
+ const props = comp.properties || [];
237
+ const propMap = {};
238
+ for (const prop of props) {
239
+ propMap[prop.name] = prop.value;
240
+ }
241
+ if (propMap["cdx:github:workflow:name"]) {
242
+ stats.workflows.add(propMap["cdx:github:workflow:name"]);
243
+ }
244
+ if (propMap["cdx:github:job:name"]) {
245
+ stats.jobs.add(propMap["cdx:github:job:name"]);
246
+ }
247
+ if (propMap["cdx:actions:isOfficial"] === "true") {
248
+ stats.officialActions++;
249
+ }
250
+ if (propMap["cdx:actions:isVerified"] === "true") {
251
+ stats.verifiedActions++;
252
+ }
253
+ const pinningType = propMap["cdx:github:action:versionPinningType"];
254
+ if (pinningType === "sha") {
255
+ stats.shaPinned++;
256
+ } else if (pinningType === "tag") {
257
+ stats.tagPinned++;
258
+ } else if (pinningType === "branch") {
259
+ stats.branchPinned++;
260
+ } else {
261
+ stats.unknownPinned++;
262
+ }
263
+ if (propMap["cdx:github:workflow:hasWritePermissions"] === "true") {
264
+ stats.hasWritePermissions++;
265
+ }
266
+ if (propMap["cdx:github:workflow:hasIdTokenWrite"] === "true") {
267
+ stats.hasIdTokenWrite++;
268
+ }
269
+ if (propMap["cdx:github:step:continueOnError"] === "true") {
270
+ stats.continueOnError++;
271
+ }
272
+ if (propMap["cdx:github:job:runner"]) {
273
+ String(propMap["cdx:github:job:runner"])
274
+ .split(",")
275
+ .filter((r) => r.includes("$"))
276
+ .forEach((r) => {
277
+ stats.runners.add(r.trim());
278
+ });
279
+ }
280
+ if (propMap["cdx:github:job:environment"]) {
281
+ stats.environments.add(propMap["cdx:github:job:environment"]);
282
+ }
283
+ }
284
+ }
285
+ stats.workflowCount = stats.workflows.size;
286
+ stats.jobCount = stats.jobs.size;
287
+ stats.workflows = Array.from(stats.workflows);
288
+ stats.jobs = Array.from(stats.jobs);
289
+ stats.runners = Array.from(stats.runners);
290
+ stats.environments = Array.from(stats.environments);
291
+ return stats;
292
+ }
293
+
294
+ /**
295
+ * Generate security assessment text based on GitHub workflow properties
296
+ *
297
+ * @param {Object} stats GitHub workflow statistics
298
+ *
299
+ * @returns {String} Security assessment text
300
+ */
301
+ function generateSecurityAssessment(stats) {
302
+ let text = "";
303
+ const securityIssues = [];
304
+ const securityStrengths = [];
305
+ if (stats.branchPinned > 0) {
306
+ securityIssues.push(
307
+ `${stats.branchPinned} action(s) use branch references instead of pinned versions, which may introduce supply chain risks`,
308
+ );
309
+ }
310
+ if (stats.unknownPinned > 0) {
311
+ securityIssues.push(
312
+ `${stats.unknownPinned} action(s) have unknown version pinning types`,
313
+ );
314
+ }
315
+ if (stats.shaPinned > 0) {
316
+ securityStrengths.push(
317
+ `${stats.shaPinned} action(s) are pinned to specific commit SHAs for maximum security`,
318
+ );
319
+ }
320
+ if (stats.tagPinned > 0) {
321
+ securityStrengths.push(
322
+ `${stats.tagPinned} action(s) are pinned to version tags`,
323
+ );
324
+ }
325
+ if (stats.hasWritePermissions > 0) {
326
+ securityIssues.push(
327
+ `${stats.hasWritePermissions} workflow(s) have write permissions to repository resources`,
328
+ );
329
+ }
330
+ if (stats.hasIdTokenWrite > 0) {
331
+ securityIssues.push(
332
+ `${stats.hasIdTokenWrite} workflow(s) have id-token write access, enabling OIDC authentication`,
333
+ );
334
+ }
335
+ if (stats.officialActions > 0) {
336
+ securityStrengths.push(
337
+ `${stats.officialActions} action(s) are official GitHub Actions from github.com org`,
338
+ );
339
+ }
340
+ if (stats.verifiedActions > 0) {
341
+ securityStrengths.push(
342
+ `${stats.verifiedActions} action(s) are from verified creators`,
343
+ );
344
+ }
345
+ if (stats.continueOnError > 0) {
346
+ securityIssues.push(
347
+ `${stats.continueOnError} step(s) continue on error, which may mask failures`,
348
+ );
349
+ }
350
+ if (securityStrengths.length > 0) {
351
+ text = `${text} Security strengths: ${joinArray(securityStrengths)}.`;
352
+ }
353
+ if (securityIssues.length > 0) {
354
+ text = `${text} Security considerations: ${joinArray(securityIssues)}.`;
355
+ }
356
+ const totalActions = stats.totalActions || 1;
357
+ const securePinned = stats.shaPinned + stats.tagPinned;
358
+ const pinningScore = (securePinned / totalActions) * 100;
359
+ if (pinningScore >= 80) {
360
+ text = `${text} Overall, the workflow demonstrates good version pinning practices.`;
361
+ } else if (pinningScore >= 50) {
362
+ text = `${text} Overall, the workflow has moderate version pinning practices with room for improvement.`;
363
+ } else {
364
+ text = `${text} Overall, the workflow would benefit from improved version pinning practices.`;
365
+ }
366
+ return text;
367
+ }
368
+
369
+ /**
370
+ * Method to determine the type of the BOM.
371
+ *
372
+ * @param {Object} bomJson BOM JSON Object
373
+ *
374
+ * @returns {String} Type of the bom such as sbom, cbom, obom, ml-bom etc
375
+ */
376
+ export function findBomType(bomJson) {
377
+ let description = "Software Bill-of-Materials (SBOM)";
378
+ let bomType = "SBOM";
379
+ const metadata = bomJson.metadata;
380
+ const lifecycles = metadata?.lifecycles || [];
381
+ const cryptoAssetsCount = bomJson?.components?.filter(
382
+ (c) => c.type === "cryptographic-asset",
383
+ ).length;
384
+ const dataCount = bomJson?.components?.filter(
385
+ (c) =>
386
+ c?.data?.length > 0 ||
387
+ (c.modelCard && Object.keys(c?.modelCard).length > 0),
388
+ ).length;
389
+ const aiComponentCount = (bomJson?.components || []).filter((component) =>
390
+ isAiComponent(component),
391
+ ).length;
392
+ const aiDatasetCount = (bomJson?.components || []).filter((component) =>
393
+ isAiDatasetComponent(component),
394
+ ).length;
395
+ const githubActionCount = bomJson?.components?.filter((c) =>
396
+ c?.purl?.startsWith("pkg:github/"),
397
+ ).length;
398
+ const hasWorkflowProperties = bomJson?.components?.some((c) =>
399
+ c?.properties?.some(
400
+ (p) =>
401
+ p.name?.startsWith("cdx:github:") || p.name?.startsWith("cdx:actions:"),
402
+ ),
403
+ );
404
+ // Is this a GitHub Workflow BOM?
405
+ if (githubActionCount > 0 && hasWorkflowProperties) {
406
+ bomType = "SBOM";
407
+ description = "Software Bill-of-Materials (SBOM) including GitHub Actions";
408
+ }
409
+ // Is this an HBOM?
410
+ else if (isHbomLikeBom(bomJson)) {
411
+ bomType = "HBOM";
412
+ description = "Hardware Bill-of-Materials (HBOM)";
413
+ }
414
+ // Is this an OBOM?
415
+ else if (lifecycles.filter((l) => l.phase === "operations").length > 0) {
416
+ bomType = "OBOM";
417
+ description = "Operations Bill-of-Materials (OBOM)";
418
+ } else if (cryptoAssetsCount > 0) {
419
+ bomType = "CBOM";
420
+ description = "Cryptography Bill-of-Materials (CBOM)";
421
+ } else if (aiComponentCount > 0 && aiDatasetCount > 0) {
422
+ bomType = "AI-BOM";
423
+ description = "AI Bill-of-Materials (AI-BOM)";
424
+ } else if (dataCount > 0) {
425
+ bomType = "ML-BOM";
426
+ description = "Machine-Learning Bill-of-Materials (ML-BOM)";
427
+ } else if (bomJson?.services?.length > 0) {
428
+ bomType = "SaaSBOM";
429
+ description = "Software-as-a-Service BOM (SaaSBOM)";
430
+ } else if (bomJson.declarations?.attestations?.length > 0) {
431
+ bomType = "CDXA";
432
+ description = "CycloneDX Attestations (CDXA)";
433
+ }
434
+ return {
435
+ bomType,
436
+ bomTypeDescription: description,
437
+ };
438
+ }
439
+
440
+ /**
441
+ * Create the textual representation of the metadata section.
442
+ *
443
+ * @param {Object} bomJson BOM JSON Object
444
+ *
445
+ * @returns {String | undefined} Textual representation of the metadata
446
+ */
447
+ export function textualMetadata(bomJson) {
448
+ if (!bomJson?.metadata) {
449
+ return undefined;
450
+ }
451
+ let text = "";
452
+ const { bomType, bomTypeDescription } = findBomType(bomJson);
453
+ const metadata = bomJson.metadata;
454
+ const lifecycles = metadata?.lifecycles || [];
455
+ const tlpClassification =
456
+ metadata.distributionConstraints?.tlp || metadata.distribution;
457
+ const cryptoAssetsCount = bomJson?.components?.filter(
458
+ (c) => c.type === "cryptographic-asset",
459
+ ).length;
460
+ const vsixCount = bomJson?.components?.filter((c) =>
461
+ c?.purl?.startsWith("pkg:vscode-extension"),
462
+ ).length;
463
+ const swidCount = bomJson?.components?.filter((c) =>
464
+ c?.purl?.startsWith("pkg:swid"),
465
+ ).length;
466
+ const { unpackagedExecutableCount, unpackagedSharedLibraryCount } =
467
+ getContainerFileInventoryStats(bomJson?.components);
468
+ const githubStats = getGitHubWorkflowStats(bomJson?.components);
469
+ const hbomSummary = bomType === "HBOM" ? getHbomSummary(bomJson) : undefined;
470
+ const trustedPublishingCounts = getTrustedPublishingComponentCounts(
471
+ bomJson?.components,
472
+ );
473
+ const isGitHubBom = bomType === "SBOM";
474
+ if (metadata?.timestamp) {
475
+ text = `This ${bomTypeDescription} document was created on ${humanifyTimestamp(metadata.timestamp)}`;
476
+ }
477
+ if (metadata?.tools) {
478
+ const tools = metadata.tools.components;
479
+ // Only components would be supported. If you need support for services, send a PR!
480
+ if (tools && Array.isArray(tools)) {
481
+ if (tools.length === 1) {
482
+ text = `${text} with ${tools[0].name}.`;
483
+ } else {
484
+ text = `${text}. The xBOM tools used are: ${joinArray(tools.map((t) => t.name))}.`;
485
+ }
486
+ }
487
+ }
488
+ if (tlpClassification) {
489
+ text = `${text} The Traffic Light Protocol (TLP) classification for this document is '${tlpClassification}'.`;
490
+ }
491
+ if (lifecycles && Array.isArray(lifecycles)) {
492
+ if (lifecycles.length === 1) {
493
+ const thePhase = lifecycles[0].phase;
494
+ if (thePhase === "pre-build") {
495
+ text = `${text} The data was captured during the ${thePhase} lifecycle phase without building the application.`;
496
+ } else {
497
+ text = `${text} The data was captured during the ${thePhase} lifecycle phase.`;
498
+ }
499
+ } else {
500
+ text = `${text} The lifecycles phases represented are: ${joinArray(lifecycles.map((l) => l.phase))}.`;
501
+ }
502
+ }
503
+ if (metadata?.component) {
504
+ const parentVersion = metadata.component.version;
505
+ const cleanTypeName = cleanTypes(metadata.component.type);
506
+ if (
507
+ parentVersion &&
508
+ !["", "unspecified", "latest", "master", "main"].includes(parentVersion)
509
+ ) {
510
+ let versionType = "version";
511
+ if (parentVersion.includes(" ") || parentVersion.includes("(")) {
512
+ versionType = "the build name";
513
+ } else if (
514
+ parentVersion.toLowerCase().includes("dev") ||
515
+ parentVersion.toLowerCase().includes("snapshot")
516
+ ) {
517
+ versionType = "the dev version";
518
+ } else if (
519
+ parentVersion.toLowerCase().includes("release") ||
520
+ parentVersion.toLowerCase().includes("final")
521
+ ) {
522
+ versionType = "the release version";
523
+ }
524
+ text = `${text} The document describes ${toArticle(metadata.component.type)} ${cleanTypeName} named '${cleanNames(metadata.component.name)}' with ${versionType} '${parentVersion}'.`;
525
+ } else {
526
+ text = `${text} The document describes ${toArticle(metadata.component.type)} ${cleanTypeName} named '${cleanNames(metadata.component.name)}'.`;
527
+ }
528
+ if (cryptoAssetsCount) {
529
+ text = `${text} There are ${cryptoAssetsCount} cryptographic assets listed under components in this ${bomType}.`;
530
+ }
531
+ if (
532
+ metadata?.component.components &&
533
+ Array.isArray(metadata.component?.components)
534
+ ) {
535
+ text = `${text} The ${cleanTypeName} also has ${metadata.component.components.length} child modules/components.`;
536
+ }
537
+ }
538
+ const aiNarrativeSummary = getAiNarrativeSummary(bomJson);
539
+ if (aiNarrativeSummary) {
540
+ text = `${text} ${aiNarrativeSummary}`;
541
+ }
542
+ if (isGitHubBom && githubStats.totalActions > 0) {
543
+ text = `${text} This ${bomType} contains ${githubStats.totalActions} GitHub Action references across ${githubStats.workflowCount} workflow(s) and ${githubStats.jobCount} job(s).`;
544
+ if (githubStats.workflows.length > 0) {
545
+ if (githubStats.workflows.length <= 3) {
546
+ text = `${text} The workflows are: ${joinArray(githubStats.workflows)}.`;
547
+ } else {
548
+ text = `${text} There are ${githubStats.workflows.length} workflows including ${joinArray(githubStats.workflows.slice(0, 3))}${githubStats.workflows.length > 3 ? " and others" : ""}.`;
549
+ }
550
+ }
551
+ if (githubStats.environments.length > 0) {
552
+ text = `${text} Jobs are deployed to ${joinArray(githubStats.environments)} environment(s).`;
553
+ }
554
+ const pinningText = [];
555
+ if (githubStats.shaPinned > 0) {
556
+ pinningText.push(`${githubStats.shaPinned} SHA-pinned`);
557
+ }
558
+ if (githubStats.tagPinned > 0) {
559
+ pinningText.push(`${githubStats.tagPinned} tag-pinned`);
560
+ }
561
+ if (githubStats.branchPinned > 0) {
562
+ pinningText.push(`${githubStats.branchPinned} branch-referenced`);
563
+ }
564
+ if (githubStats.unknownPinned > 0) {
565
+ pinningText.push(`${githubStats.unknownPinned} with unknown pinning`);
566
+ }
567
+ if (pinningText.length > 0) {
568
+ text = `${text} Version pinning breakdown: ${pinningText.join(", ")}.`;
569
+ }
570
+ if (githubStats.officialActions > 0 || githubStats.verifiedActions > 0) {
571
+ const trustText = [];
572
+ if (githubStats.officialActions > 0) {
573
+ trustText.push(`${githubStats.officialActions} official`);
574
+ }
575
+ if (githubStats.verifiedActions > 0) {
576
+ trustText.push(`${githubStats.verifiedActions} verified`);
577
+ }
578
+ text = `${text} ${joinArray(trustText)} action(s) are from trusted sources.`;
579
+ }
580
+ const securityText = generateSecurityAssessment(githubStats);
581
+ if (securityText) {
582
+ text = `${text}${securityText}`;
583
+ }
584
+ }
585
+ let metadataProperties = metadata.properties || [];
586
+ if (
587
+ metadata?.component?.properties &&
588
+ Array.isArray(metadata.component.properties)
589
+ ) {
590
+ metadataProperties = metadataProperties.concat(
591
+ metadata.component.properties,
592
+ );
593
+ }
594
+ let bomPkgTypes = [];
595
+ let bomPkgNamespaces = [];
596
+ let componentSrcFiles = [];
597
+ let imageRepoTag;
598
+ let imageArch;
599
+ let imageOs;
600
+ let imageComponentTypes;
601
+ let osBuildVersion;
602
+ const bundledSdks = [];
603
+ let appLanguage;
604
+ for (const aprop of metadataProperties) {
605
+ switch (aprop.name) {
606
+ case "cdx:bom:componentTypes":
607
+ bomPkgTypes = aprop?.value.split("\\n");
608
+ break;
609
+ case "cdx:bom:componentNamespaces":
610
+ bomPkgNamespaces = aprop?.value.split("\\n");
611
+ break;
612
+ case "cdx:bom:componentSrcFiles":
613
+ componentSrcFiles = aprop?.value.split("\\n");
614
+ break;
615
+ case "oci:image:RepoTag":
616
+ imageRepoTag = aprop.value;
617
+ break;
618
+ case "arch":
619
+ case "oci:image:Architecture":
620
+ imageArch = aprop.value;
621
+ break;
622
+ case "oci:image:Os":
623
+ imageOs = aprop.value;
624
+ break;
625
+ case "oci:image:componentTypes":
626
+ imageComponentTypes = aprop.value.split("\\n");
627
+ break;
628
+ case "build_version":
629
+ osBuildVersion = aprop.value;
630
+ break;
631
+ case "oci:image:bundles:AndroidSdk":
632
+ case "oci:image:bundles:Sdkman":
633
+ case "oci:image:bundles:Nvm":
634
+ case "oci:image:bundles:Rbenv":
635
+ case "oci:image:bundles:DotnetSdk":
636
+ bundledSdks.push(
637
+ aprop.name.split(":").pop().replace(/Sdk$/, "").toLowerCase(),
638
+ );
639
+ break;
640
+ case "oci:image:appLanguage":
641
+ appLanguage = aprop.value;
642
+ break;
643
+ default:
644
+ break;
645
+ }
646
+ }
647
+ if (bomJson?.components?.length) {
648
+ if (!isGitHubBom) {
649
+ text = `${text} There are ${bomJson.components.length} components.`;
650
+ }
651
+ if (trustedPublishingCounts.total > 0) {
652
+ text = `${text} Trusted publishing metadata is present for ${trustedPublishingCounts.npm} npm component(s) and ${trustedPublishingCounts.pypi} PyPI component(s).`;
653
+ }
654
+ } else {
655
+ text = `${text} BOM file is empty without components.`;
656
+ thoughtLog(
657
+ "It looks like I didn't find any components, so the BOM is empty.",
658
+ );
659
+ if (bomJson?.dependencies?.length) {
660
+ thoughtLog(
661
+ `There are ${bomJson.dependencies.length} dependencies and no components; this is confusing 😵‍💫.`,
662
+ );
663
+ } else if (
664
+ metadata?.component?.components &&
665
+ Array.isArray(metadata.component?.components) &&
666
+ metadata?.component.components.length > 1
667
+ ) {
668
+ thoughtLog(
669
+ `I did find ${metadata.component.components.length} child modules, so I'm confident things will work with some troubleshooting.`,
670
+ );
671
+ }
672
+ }
673
+ if (appLanguage) {
674
+ text = `${text} This container image is for a ${appLanguage} application.`;
675
+ }
676
+ if (imageOs && imageArch && imageRepoTag) {
677
+ text = `${text} The ${imageOs} image uses the ${imageArch} architecture and has the registry tag ${imageRepoTag}.`;
678
+ }
679
+ if (imageArch && osBuildVersion) {
680
+ text = `${text} The OS uses the ${imageArch} architecture and has the build version '${osBuildVersion}'.`;
681
+ }
682
+ if (imageComponentTypes && imageComponentTypes.length > 0) {
683
+ text = `${text} The OS components are of types ${joinArray(imageComponentTypes)}.`;
684
+ }
685
+ if (bundledSdks.length) {
686
+ text = `${text} Furthermore, the container image bundles the following SDKs: ${bundledSdks.join(", ")}.`;
687
+ }
688
+ if (unpackagedExecutableCount || unpackagedSharedLibraryCount) {
689
+ text = `${text} The container or rootfs inventory includes ${unpackagedExecutableCount} executable file component(s) and ${unpackagedSharedLibraryCount} shared library component(s) that were not traced to OS package ownership.`;
690
+ }
691
+ if (bomPkgTypes.length && bomPkgNamespaces.length) {
692
+ if (bomPkgTypes.length === 1) {
693
+ if (bomPkgNamespaces.length === 1) {
694
+ text = `${text} The package type in this ${bomType} is ${joinArray(bomPkgTypes)} with a single purl namespace '${bomPkgNamespaces.join(", ")}' described under components.`;
695
+ } else {
696
+ text = `${text} The package type in this ${bomType} is ${joinArray(bomPkgTypes)} with ${bomPkgNamespaces.length} purl namespaces described under components.`;
697
+ }
698
+ if (componentSrcFiles.length) {
699
+ if (componentSrcFiles.length <= 2) {
700
+ text = `${text} The components were identified from the source files: ${componentSrcFiles.join(", ")}.`;
701
+ } else {
702
+ text = `${text} The components were identified from ${componentSrcFiles.length} source files.`;
703
+ }
704
+ }
705
+ } else {
706
+ text = `${text} ${bomPkgTypes.length} package type(s) and ${bomPkgNamespaces.length} purl namespaces are described in the document under components.`;
707
+ }
708
+ }
709
+ if (bomType === "OBOM") {
710
+ if (vsixCount > 0) {
711
+ text = `${text} The system appears to be set up for remote development, with ${vsixCount} Visual Studio Code extensions installed.`;
712
+ }
713
+ if (swidCount > 0) {
714
+ text = `${text} In addition, there are ${swidCount} applications installed on the system.`;
715
+ }
716
+ }
717
+ if (bomType === "HBOM" && hbomSummary) {
718
+ if (hbomSummary.hardwareClassCount > 0) {
719
+ text = `${text} The hardware inventory spans ${hbomSummary.hardwareClassCount} hardware classes.`;
720
+ const hardwareClassSummary = formatHbomHardwareClassSummary(
721
+ hbomSummary.hardwareClassCounts,
722
+ );
723
+ if (hardwareClassSummary) {
724
+ text = `${text} The most represented hardware classes are ${hardwareClassSummary}.`;
725
+ }
726
+ }
727
+ if (hbomSummary.collectorProfile) {
728
+ text = `${text} Collector profile '${hbomSummary.collectorProfile}' recorded ${hbomSummary.evidenceCommandCount} command evidence entr${hbomSummary.evidenceCommandCount === 1 ? "y" : "ies"}`;
729
+ if (hbomSummary.evidenceFileCount > 0) {
730
+ text = `${text} and ${hbomSummary.evidenceFileCount} observed file entr${hbomSummary.evidenceFileCount === 1 ? "y" : "ies"}`;
731
+ }
732
+ text = `${text}.`;
733
+ }
734
+ if (hbomSummary.identifierPolicy) {
735
+ text = `${text} Identifier policy is '${hbomSummary.identifierPolicy}'.`;
736
+ }
737
+ }
738
+ if (bomType === "SaaSBOM") {
739
+ text = `${text} ${bomJson.services.length} are described in this ${bomType} under services.`;
740
+ }
741
+ if (bomType === "CDXA") {
742
+ text = `${text} ${bomJson.declarations.attestations.length} attestations are found under declarations.`;
743
+ }
744
+ if (bomJson?.formulation?.length > 0) {
745
+ text = `${text} Further, there is a formulation section with components, workflows and steps for reproducibility.`;
746
+ }
747
+ const instrumentedCount = bomJson?.components?.filter((c) =>
748
+ c.evidence?.identity?.some((id) =>
749
+ id.methods?.some((m) => m.technique === "instrumentation"),
750
+ ),
751
+ ).length;
752
+ if (instrumentedCount > 0) {
753
+ text = `${text} This SBOM contains ${instrumentedCount} dynamically instrumented library components discovered during process execution tracing. These libraries were loaded at runtime and mapped back to system packages.`;
754
+ }
755
+ // Summarize AI code-authorship provenance and human-oversight signals when the
756
+ // cdx:ai:codegen:* / cdx:ai:oversight:* properties are present at the BOM root
757
+ // (emitted by `-t ai-provenance` and cdx-audit).
758
+ const aiProvenanceText = summarizeAiProvenance(bomJson);
759
+ if (aiProvenanceText) {
760
+ text = `${text} ${aiProvenanceText}`;
761
+ }
762
+ thoughtLog(`Let me summarize this xBOM:\n${text}`);
763
+ return text;
764
+ }
765
+
766
+ /**
767
+ * Build a human-readable summary of AI authorship provenance and human-oversight
768
+ * rigor from the BOM's root `properties`. Returns an empty string when no
769
+ * cdx:ai:codegen provenance was detected.
770
+ *
771
+ * @param {Object} bomJson CycloneDX BOM
772
+ * @returns {string} Summary sentence(s), or "" when no AI provenance is present
773
+ */
774
+ export function summarizeAiProvenance(bomJson) {
775
+ const props = bomJson?.properties;
776
+ if (!Array.isArray(props) || !props.length) {
777
+ return "";
778
+ }
779
+ const get = (name) => props.find((p) => p?.name === name)?.value;
780
+ if (get("cdx:ai:codegen:detected") !== "true") {
781
+ return "";
782
+ }
783
+ let text =
784
+ "AI/LLM/agent involvement was detected in this project's development";
785
+ const tools = get("cdx:ai:codegen:tools");
786
+ if (tools) {
787
+ text = `${text} (${tools})`;
788
+ }
789
+ const band = get("cdx:ai:codegen:confidence:band");
790
+ const confidence = get("cdx:ai:codegen:confidence");
791
+ if (confidence) {
792
+ text = `${text} with ${band ? `${band} ` : ""}confidence ${confidence}`;
793
+ }
794
+ text = `${text}.`;
795
+
796
+ // Human-oversight rigor, when the oversight layer produced a score.
797
+ const oversightScore = get("cdx:ai:oversight:score");
798
+ const oversightBand = get("cdx:ai:oversight:band");
799
+ if (oversightScore && oversightBand) {
800
+ text = `${text} The human-oversight (process-rigor) score is ${oversightScore} (${oversightBand}).`;
801
+ const details = [];
802
+ const vdr = get("cdx:ai:oversight:verificationDebtRatio");
803
+ if (vdr && vdr !== "unavailable") {
804
+ details.push(`verification-debt ratio ${vdr}`);
805
+ }
806
+ const reviewCoverage = get("cdx:ai:oversight:reviewCoverage");
807
+ if (reviewCoverage && reviewCoverage !== "unavailable") {
808
+ details.push(`review coverage ${reviewCoverage}`);
809
+ }
810
+ const ciWeakening = get("cdx:ai:oversight:ciWeakeningEvents");
811
+ if (ciWeakening && ciWeakening !== "0") {
812
+ details.push(`${ciWeakening} CI-weakening event(s)`);
813
+ }
814
+ const aiLineRatio = get("cdx:ai:oversight:aiLineRatio");
815
+ if (aiLineRatio) {
816
+ details.push(`AI line ratio ${aiLineRatio}`);
817
+ }
818
+ const aiModels = get("cdx:ai:codegen:models");
819
+ if (aiModels) {
820
+ details.push(`AI models: ${aiModels}`);
821
+ }
822
+ const aiAgents = get("cdx:ai:codegen:agents");
823
+ if (aiAgents) {
824
+ details.push(`AI agents: ${aiAgents}`);
825
+ }
826
+ if (details.length) {
827
+ text = `${text} Signals: ${joinArray(details)}.`;
828
+ }
829
+ const dataSources = get("cdx:ai:oversight:dataSources");
830
+ if (dataSources) {
831
+ text = `${text} Oversight data sources: ${dataSources}.`;
832
+ }
833
+ }
834
+ return text;
835
+ }
836
+
837
+ /**
838
+ * Extract interesting tags from the component attribute
839
+ *
840
+ * @param {Object} component CycloneDX component
841
+ * @param {String} bomType BOM type
842
+ * @param {String} parentComponentType Parent component type
843
+ *
844
+ * @returns {Array | undefined} Array of string tags
845
+ */
846
+ export function extractTags(
847
+ component,
848
+ bomType = "all",
849
+ parentComponentType = "application",
850
+ ) {
851
+ if (
852
+ !component ||
853
+ (!component.description && !component.properties && !component.name)
854
+ ) {
855
+ return undefined;
856
+ }
857
+ bomType = bomType?.toLowerCase();
858
+ const tags = new Set();
859
+ if (
860
+ component.type &&
861
+ !["library", "application", "file"].includes(component.type)
862
+ ) {
863
+ tags.add(component.type);
864
+ }
865
+ (component?.tags || []).forEach((tag) => {
866
+ if (tag.length) {
867
+ tags.add(tag);
868
+ }
869
+ });
870
+ const desc = component?.description?.toLowerCase();
871
+ const compProps = component.properties || [];
872
+ // Collect both the BOM specific tags and all tags
873
+ let compNameTags = (componentTags.name[bomType] || []).concat(
874
+ componentTags.name.all || [],
875
+ );
876
+ // For SBOMs with a container component as parent, utilize the tags
877
+ // from OBOM
878
+ if (bomType === "sbom" && parentComponentType === "container") {
879
+ compNameTags = compNameTags.concat(componentTags.name.obom || []);
880
+ }
881
+ const compDescTags = (componentTags.description[bomType] || []).concat(
882
+ componentTags.description.all || [],
883
+ );
884
+ const compPropsTags = (componentTags.properties[bomType] || []).concat(
885
+ componentTags.properties.all || [],
886
+ );
887
+ if (component?.name) {
888
+ // {"devel": ["/-(dev|devel|headers)$/"]}
889
+ for (const anameTagObject of compNameTags) {
890
+ for (const compCategoryTag of Object.keys(anameTagObject)) {
891
+ for (const catRegexStr of anameTagObject[compCategoryTag]) {
892
+ // Regex-based search on the name
893
+ if (new RegExp(catRegexStr, "ig").test(component.name)) {
894
+ tags.add(compCategoryTag);
895
+ }
896
+ }
897
+ }
898
+ }
899
+ }
900
+ // Identify tags from description
901
+ if (desc) {
902
+ for (const adescTag of compDescTags) {
903
+ if (desc.includes(` ${adescTag} `) || desc.includes(` ${adescTag}.`)) {
904
+ tags.add(adescTag);
905
+ }
906
+ const stemmedTag = adescTag.replace(/(ion|ed|er|en|ing)$/, "");
907
+ const stemmedDesc = adescTag.replace(/(ion|ed|er|en|ing) $/, " ");
908
+ if (
909
+ stemmedDesc.includes(` ${stemmedTag} `) ||
910
+ stemmedDesc.includes(` ${stemmedTag}.`)
911
+ ) {
912
+ tags.add(adescTag);
913
+ }
914
+ }
915
+ }
916
+ // Identify tags from properties as a fallback
917
+ if (!tags.size) {
918
+ for (const adescTag of compPropsTags) {
919
+ for (const aprop of compProps) {
920
+ if (
921
+ aprop.name !== "internal:SrcFile" &&
922
+ aprop?.value?.toLowerCase().includes(adescTag)
923
+ ) {
924
+ tags.add(adescTag);
925
+ }
926
+ }
927
+ }
928
+ }
929
+ // GitHub workflow specific tags from properties
930
+ if (bomType === "sbom" || bomType === "all") {
931
+ for (const aprop of compProps) {
932
+ // Security-related tags
933
+ if (
934
+ aprop.name === "cdx:github:action:isShaPinned" &&
935
+ aprop.value === "true"
936
+ ) {
937
+ tags.add("sha-pinned");
938
+ tags.add("secure-versioning");
939
+ }
940
+ if (
941
+ aprop.name === "cdx:github:action:versionPinningType" &&
942
+ aprop.value !== "sha"
943
+ ) {
944
+ tags.add(`pinning-${aprop.value}`);
945
+ }
946
+ if (aprop.name === "cdx:actions:isOfficial" && aprop.value === "true") {
947
+ tags.add("official-action");
948
+ tags.add("trusted-source");
949
+ }
950
+ if (aprop.name === "cdx:actions:isVerified" && aprop.value === "true") {
951
+ tags.add("verified-action");
952
+ tags.add("trusted-source");
953
+ }
954
+ if (
955
+ aprop.name === "cdx:github:workflow:hasWritePermissions" &&
956
+ aprop.value === "true"
957
+ ) {
958
+ tags.add("write-permissions");
959
+ tags.add("elevated-access");
960
+ }
961
+ if (
962
+ aprop.name === "cdx:github:workflow:hasIdTokenWrite" &&
963
+ aprop.value === "true"
964
+ ) {
965
+ tags.add("id-token-write");
966
+ tags.add("oidc-enabled");
967
+ }
968
+ if (
969
+ aprop.name === "cdx:github:step:continueOnError" &&
970
+ aprop.value === "true"
971
+ ) {
972
+ tags.add("continue-on-error");
973
+ }
974
+ }
975
+ }
976
+ return Array.from(tags).sort();
977
+ }