kirograph 0.17.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +105 -1822
  3. package/dist/architecture/layers/dart.d.ts +10 -0
  4. package/dist/architecture/layers/dart.d.ts.map +1 -0
  5. package/dist/architecture/layers/dart.js +112 -0
  6. package/dist/architecture/layers/dart.js.map +7 -0
  7. package/dist/architecture/layers/elixir.d.ts +6 -0
  8. package/dist/architecture/layers/elixir.d.ts.map +1 -0
  9. package/dist/architecture/layers/index.d.ts.map +1 -1
  10. package/dist/architecture/layers/index.js +3 -1
  11. package/dist/architecture/layers/index.js.map +2 -2
  12. package/dist/architecture/layers/ocaml.d.ts +6 -0
  13. package/dist/architecture/layers/ocaml.d.ts.map +1 -0
  14. package/dist/architecture/layers/scala.d.ts +6 -0
  15. package/dist/architecture/layers/scala.d.ts.map +1 -0
  16. package/dist/architecture/layers/solidity.d.ts +6 -0
  17. package/dist/architecture/layers/solidity.d.ts.map +1 -0
  18. package/dist/architecture/layers/vue.d.ts +6 -0
  19. package/dist/architecture/layers/vue.d.ts.map +1 -0
  20. package/dist/architecture/manifest/elm.d.ts +3 -0
  21. package/dist/architecture/manifest/elm.d.ts.map +1 -0
  22. package/dist/architecture/manifest/index.d.ts.map +1 -1
  23. package/dist/architecture/manifest/ocaml.d.ts +3 -0
  24. package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
  25. package/dist/architecture/manifest/scala.d.ts +3 -0
  26. package/dist/architecture/manifest/scala.d.ts.map +1 -0
  27. package/dist/bin/banner.d.ts.map +1 -1
  28. package/dist/bin/banner.js +74 -6
  29. package/dist/bin/banner.js.map +2 -2
  30. package/dist/bin/commands/affected.d.ts.map +1 -1
  31. package/dist/bin/commands/attack-surface.d.ts +3 -0
  32. package/dist/bin/commands/attack-surface.d.ts.map +1 -0
  33. package/dist/bin/commands/attack-surface.js +164 -0
  34. package/dist/bin/commands/attack-surface.js.map +7 -0
  35. package/dist/bin/commands/benchmark.d.ts +9 -0
  36. package/dist/bin/commands/benchmark.d.ts.map +1 -0
  37. package/dist/bin/commands/benchmark.js +206 -0
  38. package/dist/bin/commands/benchmark.js.map +7 -0
  39. package/dist/bin/commands/budget.d.ts +6 -0
  40. package/dist/bin/commands/budget.d.ts.map +1 -0
  41. package/dist/bin/commands/budget.js +70 -0
  42. package/dist/bin/commands/budget.js.map +7 -0
  43. package/dist/bin/commands/caveman.d.ts +7 -0
  44. package/dist/bin/commands/caveman.d.ts.map +1 -0
  45. package/dist/bin/commands/communities.d.ts +3 -0
  46. package/dist/bin/commands/communities.d.ts.map +1 -0
  47. package/dist/bin/commands/communities.js +77 -0
  48. package/dist/bin/commands/communities.js.map +7 -0
  49. package/dist/bin/commands/compression.d.ts +7 -0
  50. package/dist/bin/commands/compression.d.ts.map +1 -0
  51. package/dist/bin/commands/context.d.ts.map +1 -1
  52. package/dist/bin/commands/data.d.ts +3 -0
  53. package/dist/bin/commands/data.d.ts.map +1 -0
  54. package/dist/bin/commands/dead-code.d.ts +3 -0
  55. package/dist/bin/commands/dead-code.d.ts.map +1 -0
  56. package/dist/bin/commands/dep-confusion.d.ts +3 -0
  57. package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
  58. package/dist/bin/commands/dep-confusion.js +119 -0
  59. package/dist/bin/commands/dep-confusion.js.map +7 -0
  60. package/dist/bin/commands/docs.d.ts +3 -0
  61. package/dist/bin/commands/docs.d.ts.map +1 -0
  62. package/dist/bin/commands/exec.d.ts +11 -0
  63. package/dist/bin/commands/exec.d.ts.map +1 -0
  64. package/dist/bin/commands/export.d.ts +3 -0
  65. package/dist/bin/commands/export.d.ts.map +1 -0
  66. package/dist/bin/commands/export.js +304 -10
  67. package/dist/bin/commands/export.js.map +2 -2
  68. package/dist/bin/commands/flows.d.ts +3 -0
  69. package/dist/bin/commands/flows.d.ts.map +1 -0
  70. package/dist/bin/commands/flows.js +97 -0
  71. package/dist/bin/commands/flows.js.map +7 -0
  72. package/dist/bin/commands/gain.d.ts +6 -0
  73. package/dist/bin/commands/gain.d.ts.map +1 -0
  74. package/dist/bin/commands/help.d.ts +7 -0
  75. package/dist/bin/commands/help.d.ts.map +1 -1
  76. package/dist/bin/commands/help.js +399 -101
  77. package/dist/bin/commands/help.js.map +2 -2
  78. package/dist/bin/commands/hotspots.d.ts +3 -0
  79. package/dist/bin/commands/hotspots.d.ts.map +1 -0
  80. package/dist/bin/commands/hotspots.js +94 -1
  81. package/dist/bin/commands/hotspots.js.map +3 -3
  82. package/dist/bin/commands/install.d.ts.map +1 -1
  83. package/dist/bin/commands/install.js +90 -8
  84. package/dist/bin/commands/install.js.map +2 -2
  85. package/dist/bin/commands/licenses.d.ts +3 -0
  86. package/dist/bin/commands/licenses.d.ts.map +1 -0
  87. package/dist/bin/commands/licenses.js +201 -0
  88. package/dist/bin/commands/licenses.js.map +7 -0
  89. package/dist/bin/commands/memory.d.ts +16 -0
  90. package/dist/bin/commands/memory.d.ts.map +1 -0
  91. package/dist/bin/commands/memory.js +151 -4
  92. package/dist/bin/commands/memory.js.map +2 -2
  93. package/dist/bin/commands/path.d.ts +3 -0
  94. package/dist/bin/commands/path.d.ts.map +1 -0
  95. package/dist/bin/commands/pattern.d.ts +3 -0
  96. package/dist/bin/commands/pattern.d.ts.map +1 -0
  97. package/dist/bin/commands/pattern.js +592 -0
  98. package/dist/bin/commands/pattern.js.map +7 -0
  99. package/dist/bin/commands/query.d.ts.map +1 -1
  100. package/dist/bin/commands/reachability.d.ts +3 -0
  101. package/dist/bin/commands/reachability.d.ts.map +1 -0
  102. package/dist/bin/commands/reachability.js +160 -0
  103. package/dist/bin/commands/reachability.js.map +7 -0
  104. package/dist/bin/commands/read.d.ts +6 -0
  105. package/dist/bin/commands/read.d.ts.map +1 -0
  106. package/dist/bin/commands/read.js +100 -0
  107. package/dist/bin/commands/read.js.map +7 -0
  108. package/dist/bin/commands/refactor.d.ts +3 -0
  109. package/dist/bin/commands/refactor.d.ts.map +1 -0
  110. package/dist/bin/commands/refactor.js +116 -0
  111. package/dist/bin/commands/refactor.js.map +7 -0
  112. package/dist/bin/commands/remediation.d.ts +3 -0
  113. package/dist/bin/commands/remediation.d.ts.map +1 -0
  114. package/dist/bin/commands/remediation.js +133 -0
  115. package/dist/bin/commands/remediation.js.map +7 -0
  116. package/dist/bin/commands/sbom.d.ts +3 -0
  117. package/dist/bin/commands/sbom.d.ts.map +1 -0
  118. package/dist/bin/commands/sbom.js +76 -0
  119. package/dist/bin/commands/sbom.js.map +7 -0
  120. package/dist/bin/commands/security-ci-report.d.ts +9 -0
  121. package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
  122. package/dist/bin/commands/security-ci-report.js +267 -0
  123. package/dist/bin/commands/security-ci-report.js.map +7 -0
  124. package/dist/bin/commands/security-export.d.ts +2 -0
  125. package/dist/bin/commands/security-export.d.ts.map +1 -0
  126. package/dist/bin/commands/security-export.js +1349 -0
  127. package/dist/bin/commands/security-export.js.map +7 -0
  128. package/dist/bin/commands/security-flows.d.ts +3 -0
  129. package/dist/bin/commands/security-flows.d.ts.map +1 -0
  130. package/dist/bin/commands/security-flows.js +126 -0
  131. package/dist/bin/commands/security-flows.js.map +7 -0
  132. package/dist/bin/commands/security-secrets.d.ts +3 -0
  133. package/dist/bin/commands/security-secrets.d.ts.map +1 -0
  134. package/dist/bin/commands/security-secrets.js +170 -0
  135. package/dist/bin/commands/security-secrets.js.map +7 -0
  136. package/dist/bin/commands/security.d.ts +3 -0
  137. package/dist/bin/commands/security.d.ts.map +1 -0
  138. package/dist/bin/commands/security.js +208 -0
  139. package/dist/bin/commands/security.js.map +7 -0
  140. package/dist/bin/commands/snapshot.d.ts +3 -0
  141. package/dist/bin/commands/snapshot.d.ts.map +1 -0
  142. package/dist/bin/commands/staleness.d.ts +3 -0
  143. package/dist/bin/commands/staleness.d.ts.map +1 -0
  144. package/dist/bin/commands/staleness.js +144 -0
  145. package/dist/bin/commands/staleness.js.map +7 -0
  146. package/dist/bin/commands/status.d.ts.map +1 -1
  147. package/dist/bin/commands/status.js +129 -2
  148. package/dist/bin/commands/status.js.map +2 -2
  149. package/dist/bin/commands/supply-chain.d.ts +3 -0
  150. package/dist/bin/commands/supply-chain.d.ts.map +1 -0
  151. package/dist/bin/commands/supply-chain.js +138 -0
  152. package/dist/bin/commands/supply-chain.js.map +7 -0
  153. package/dist/bin/commands/surprising.d.ts +3 -0
  154. package/dist/bin/commands/surprising.d.ts.map +1 -0
  155. package/dist/bin/commands/sync.d.ts.map +1 -1
  156. package/dist/bin/commands/uninit.d.ts.map +1 -1
  157. package/dist/bin/commands/uninit.js +109 -60
  158. package/dist/bin/commands/uninit.js.map +2 -2
  159. package/dist/bin/commands/utils.d.ts +5 -0
  160. package/dist/bin/commands/utils.d.ts.map +1 -1
  161. package/dist/bin/commands/vex.d.ts +3 -0
  162. package/dist/bin/commands/vex.d.ts.map +1 -0
  163. package/dist/bin/commands/vex.js +76 -0
  164. package/dist/bin/commands/vex.js.map +7 -0
  165. package/dist/bin/commands/vuln-suppress.d.ts +3 -0
  166. package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
  167. package/dist/bin/commands/vuln-suppress.js +95 -0
  168. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  169. package/dist/bin/commands/vulns.d.ts +3 -0
  170. package/dist/bin/commands/vulns.d.ts.map +1 -0
  171. package/dist/bin/commands/vulns.js +382 -0
  172. package/dist/bin/commands/vulns.js.map +7 -0
  173. package/dist/bin/installer/archive.d.ts +47 -0
  174. package/dist/bin/installer/archive.d.ts.map +1 -0
  175. package/dist/bin/installer/auto-detect.d.ts +16 -0
  176. package/dist/bin/installer/auto-detect.d.ts.map +1 -0
  177. package/dist/bin/installer/auto-detect.js +125 -0
  178. package/dist/bin/installer/auto-detect.js.map +7 -0
  179. package/dist/bin/installer/caveman.d.ts +12 -0
  180. package/dist/bin/installer/caveman.d.ts.map +1 -0
  181. package/dist/bin/installer/cli-agent.d.ts +7 -2
  182. package/dist/bin/installer/cli-agent.d.ts.map +1 -1
  183. package/dist/bin/installer/cli-agent.js +32 -5
  184. package/dist/bin/installer/cli-agent.js.map +2 -2
  185. package/dist/bin/installer/common.d.ts +36 -0
  186. package/dist/bin/installer/common.d.ts.map +1 -0
  187. package/dist/bin/installer/common.js +48 -0
  188. package/dist/bin/installer/common.js.map +2 -2
  189. package/dist/bin/installer/config-prompt.d.ts +1 -1
  190. package/dist/bin/installer/config-prompt.d.ts.map +1 -1
  191. package/dist/bin/installer/config-prompt.js +85 -2
  192. package/dist/bin/installer/config-prompt.js.map +2 -2
  193. package/dist/bin/installer/dashboard.d.ts.map +1 -1
  194. package/dist/bin/installer/detect.d.ts +30 -0
  195. package/dist/bin/installer/detect.d.ts.map +1 -0
  196. package/dist/bin/installer/detect.js +309 -0
  197. package/dist/bin/installer/detect.js.map +7 -0
  198. package/dist/bin/installer/hooks.d.ts +4 -1
  199. package/dist/bin/installer/hooks.d.ts.map +1 -1
  200. package/dist/bin/installer/hooks.js +34 -0
  201. package/dist/bin/installer/hooks.js.map +2 -2
  202. package/dist/bin/installer/index.d.ts +5 -4
  203. package/dist/bin/installer/index.d.ts.map +1 -1
  204. package/dist/bin/installer/index.js +46 -8
  205. package/dist/bin/installer/index.js.map +2 -2
  206. package/dist/bin/installer/instructions.d.ts +14 -0
  207. package/dist/bin/installer/instructions.d.ts.map +1 -0
  208. package/dist/bin/installer/instructions.js +209 -3
  209. package/dist/bin/installer/instructions.js.map +2 -2
  210. package/dist/bin/installer/mcp.d.ts.map +1 -1
  211. package/dist/bin/installer/prompts.d.ts +17 -0
  212. package/dist/bin/installer/prompts.d.ts.map +1 -1
  213. package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
  214. package/dist/bin/installer/steering.d.ts +14 -2
  215. package/dist/bin/installer/steering.d.ts.map +1 -1
  216. package/dist/bin/installer/steering.js +488 -0
  217. package/dist/bin/installer/steering.js.map +2 -2
  218. package/dist/bin/installer/targets/aider.d.ts +6 -0
  219. package/dist/bin/installer/targets/aider.d.ts.map +1 -0
  220. package/dist/bin/installer/targets/aider.js +3 -3
  221. package/dist/bin/installer/targets/aider.js.map +2 -2
  222. package/dist/bin/installer/targets/amp.d.ts +6 -0
  223. package/dist/bin/installer/targets/amp.d.ts.map +1 -0
  224. package/dist/bin/installer/targets/amp.js +3 -3
  225. package/dist/bin/installer/targets/amp.js.map +2 -2
  226. package/dist/bin/installer/targets/antigravity.d.ts +13 -0
  227. package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
  228. package/dist/bin/installer/targets/antigravity.js +35 -6
  229. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  230. package/dist/bin/installer/targets/augment.d.ts +6 -0
  231. package/dist/bin/installer/targets/augment.d.ts.map +1 -0
  232. package/dist/bin/installer/targets/augment.js +3 -3
  233. package/dist/bin/installer/targets/augment.js.map +2 -2
  234. package/dist/bin/installer/targets/claude.d.ts +6 -0
  235. package/dist/bin/installer/targets/claude.d.ts.map +1 -0
  236. package/dist/bin/installer/targets/claude.js +49 -5
  237. package/dist/bin/installer/targets/claude.js.map +2 -2
  238. package/dist/bin/installer/targets/cline.d.ts +13 -0
  239. package/dist/bin/installer/targets/cline.d.ts.map +1 -0
  240. package/dist/bin/installer/targets/cline.js +32 -6
  241. package/dist/bin/installer/targets/cline.js.map +2 -2
  242. package/dist/bin/installer/targets/codex.d.ts +6 -0
  243. package/dist/bin/installer/targets/codex.d.ts.map +1 -0
  244. package/dist/bin/installer/targets/codex.js +64 -12
  245. package/dist/bin/installer/targets/codex.js.map +2 -2
  246. package/dist/bin/installer/targets/continue.d.ts +12 -0
  247. package/dist/bin/installer/targets/continue.d.ts.map +1 -0
  248. package/dist/bin/installer/targets/continue.js +2 -2
  249. package/dist/bin/installer/targets/continue.js.map +2 -2
  250. package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
  251. package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
  252. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  253. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  254. package/dist/bin/installer/targets/copilot.d.ts +6 -0
  255. package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
  256. package/dist/bin/installer/targets/copilot.js +31 -5
  257. package/dist/bin/installer/targets/copilot.js.map +2 -2
  258. package/dist/bin/installer/targets/cursor.d.ts +6 -0
  259. package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
  260. package/dist/bin/installer/targets/cursor.js +4 -4
  261. package/dist/bin/installer/targets/cursor.js.map +2 -2
  262. package/dist/bin/installer/targets/devin.d.ts +13 -0
  263. package/dist/bin/installer/targets/devin.d.ts.map +1 -0
  264. package/dist/bin/installer/targets/devin.js +2 -2
  265. package/dist/bin/installer/targets/devin.js.map +2 -2
  266. package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
  267. package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
  268. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  269. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  270. package/dist/bin/installer/targets/generic.d.ts +59 -0
  271. package/dist/bin/installer/targets/generic.d.ts.map +1 -0
  272. package/dist/bin/installer/targets/generic.js +2 -14
  273. package/dist/bin/installer/targets/generic.js.map +2 -2
  274. package/dist/bin/installer/targets/goose.d.ts +6 -0
  275. package/dist/bin/installer/targets/goose.d.ts.map +1 -0
  276. package/dist/bin/installer/targets/goose.js +3 -3
  277. package/dist/bin/installer/targets/goose.js.map +2 -2
  278. package/dist/bin/installer/targets/index.d.ts +11 -0
  279. package/dist/bin/installer/targets/index.d.ts.map +1 -0
  280. package/dist/bin/installer/targets/index.js +250 -0
  281. package/dist/bin/installer/targets/index.js.map +2 -2
  282. package/dist/bin/installer/targets/junie.d.ts +13 -0
  283. package/dist/bin/installer/targets/junie.d.ts.map +1 -0
  284. package/dist/bin/installer/targets/junie.js +2 -2
  285. package/dist/bin/installer/targets/junie.js.map +2 -2
  286. package/dist/bin/installer/targets/kilo.d.ts +12 -0
  287. package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
  288. package/dist/bin/installer/targets/kilo.js +2 -2
  289. package/dist/bin/installer/targets/kilo.js.map +2 -2
  290. package/dist/bin/installer/targets/kiro.d.ts +5 -0
  291. package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
  292. package/dist/bin/installer/targets/kiro.js +4 -4
  293. package/dist/bin/installer/targets/kiro.js.map +2 -2
  294. package/dist/bin/installer/targets/opencode.d.ts +13 -0
  295. package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
  296. package/dist/bin/installer/targets/opencode.js +2 -2
  297. package/dist/bin/installer/targets/opencode.js.map +2 -2
  298. package/dist/bin/installer/targets/openhands.d.ts +6 -0
  299. package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
  300. package/dist/bin/installer/targets/openhands.js +3 -3
  301. package/dist/bin/installer/targets/openhands.js.map +2 -2
  302. package/dist/bin/installer/targets/qoder.d.ts +12 -0
  303. package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
  304. package/dist/bin/installer/targets/qoder.js +91 -0
  305. package/dist/bin/installer/targets/qoder.js.map +7 -0
  306. package/dist/bin/installer/targets/qwen.d.ts +12 -0
  307. package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
  308. package/dist/bin/installer/targets/qwen.js +96 -0
  309. package/dist/bin/installer/targets/qwen.js.map +7 -0
  310. package/dist/bin/installer/targets/replit.d.ts +6 -0
  311. package/dist/bin/installer/targets/replit.d.ts.map +1 -0
  312. package/dist/bin/installer/targets/replit.js +3 -3
  313. package/dist/bin/installer/targets/replit.js.map +2 -2
  314. package/dist/bin/installer/targets/roo.d.ts +13 -0
  315. package/dist/bin/installer/targets/roo.d.ts.map +1 -0
  316. package/dist/bin/installer/targets/roo.js +2 -2
  317. package/dist/bin/installer/targets/roo.js.map +2 -2
  318. package/dist/bin/installer/targets/tabnine.d.ts +6 -0
  319. package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
  320. package/dist/bin/installer/targets/tabnine.js +3 -3
  321. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  322. package/dist/bin/installer/targets/trae.d.ts +6 -0
  323. package/dist/bin/installer/targets/trae.d.ts.map +1 -0
  324. package/dist/bin/installer/targets/trae.js +5 -5
  325. package/dist/bin/installer/targets/trae.js.map +2 -2
  326. package/dist/bin/installer/targets/warp.d.ts +12 -0
  327. package/dist/bin/installer/targets/warp.d.ts.map +1 -0
  328. package/dist/bin/installer/targets/warp.js +2 -2
  329. package/dist/bin/installer/targets/warp.js.map +2 -2
  330. package/dist/bin/installer/targets/windsurf.d.ts +13 -0
  331. package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
  332. package/dist/bin/installer/targets/windsurf.js +35 -6
  333. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  334. package/dist/bin/kirograph.js +74 -6
  335. package/dist/bin/kirograph.js.map +3 -3
  336. package/dist/bin/progress.d.ts +16 -1
  337. package/dist/bin/progress.d.ts.map +1 -1
  338. package/dist/compression/filters/aws.d.ts +9 -0
  339. package/dist/compression/filters/aws.d.ts.map +1 -0
  340. package/dist/compression/filters/docker.d.ts +6 -0
  341. package/dist/compression/filters/docker.d.ts.map +1 -0
  342. package/dist/compression/filters/files.d.ts +6 -0
  343. package/dist/compression/filters/files.d.ts.map +1 -0
  344. package/dist/compression/filters/generic.d.ts +7 -0
  345. package/dist/compression/filters/generic.d.ts.map +1 -0
  346. package/dist/compression/filters/git.d.ts +6 -0
  347. package/dist/compression/filters/git.d.ts.map +1 -0
  348. package/dist/compression/filters/github.d.ts +6 -0
  349. package/dist/compression/filters/github.d.ts.map +1 -0
  350. package/dist/compression/filters/lint.d.ts +6 -0
  351. package/dist/compression/filters/lint.d.ts.map +1 -0
  352. package/dist/compression/filters/misc.d.ts +6 -0
  353. package/dist/compression/filters/misc.d.ts.map +1 -0
  354. package/dist/compression/filters/package.d.ts +6 -0
  355. package/dist/compression/filters/package.d.ts.map +1 -0
  356. package/dist/compression/filters/test.d.ts +6 -0
  357. package/dist/compression/filters/test.d.ts.map +1 -0
  358. package/dist/compression/index.d.ts +29 -0
  359. package/dist/compression/index.d.ts.map +1 -0
  360. package/dist/compression/naive-cost.d.ts +26 -0
  361. package/dist/compression/naive-cost.d.ts.map +1 -0
  362. package/dist/compression/tracker.d.ts +155 -0
  363. package/dist/compression/tracker.d.ts.map +1 -0
  364. package/dist/compression/tracker.js +80 -0
  365. package/dist/compression/tracker.js.map +2 -2
  366. package/dist/compression/types.d.ts +49 -0
  367. package/dist/compression/types.d.ts.map +1 -0
  368. package/dist/config.d.ts +90 -0
  369. package/dist/config.d.ts.map +1 -1
  370. package/dist/config.js +144 -3
  371. package/dist/config.js.map +2 -2
  372. package/dist/core/lock-manager.d.ts +2 -0
  373. package/dist/core/lock-manager.d.ts.map +1 -1
  374. package/dist/core/pipeline.d.ts +4 -1
  375. package/dist/core/pipeline.d.ts.map +1 -1
  376. package/dist/core/pipeline.js +78 -2
  377. package/dist/core/pipeline.js.map +2 -2
  378. package/dist/core/snapshot.d.ts +58 -0
  379. package/dist/core/snapshot.d.ts.map +1 -0
  380. package/dist/data/filters.d.ts +23 -0
  381. package/dist/data/filters.d.ts.map +1 -0
  382. package/dist/data/indexer.d.ts +25 -0
  383. package/dist/data/indexer.d.ts.map +1 -0
  384. package/dist/data/linker.d.ts +37 -0
  385. package/dist/data/linker.d.ts.map +1 -0
  386. package/dist/data/lint.d.ts +27 -0
  387. package/dist/data/lint.d.ts.map +1 -0
  388. package/dist/data/parsers/csv.d.ts +11 -0
  389. package/dist/data/parsers/csv.d.ts.map +1 -0
  390. package/dist/data/parsers/excel.d.ts +10 -0
  391. package/dist/data/parsers/excel.d.ts.map +1 -0
  392. package/dist/data/parsers/index.d.ts +28 -0
  393. package/dist/data/parsers/index.d.ts.map +1 -0
  394. package/dist/data/parsers/json-array.d.ts +9 -0
  395. package/dist/data/parsers/json-array.d.ts.map +1 -0
  396. package/dist/data/parsers/jsonl.d.ts +9 -0
  397. package/dist/data/parsers/jsonl.d.ts.map +1 -0
  398. package/dist/data/parsers/parquet.d.ts +10 -0
  399. package/dist/data/parsers/parquet.d.ts.map +1 -0
  400. package/dist/data/profiler.d.ts +29 -0
  401. package/dist/data/profiler.d.ts.map +1 -0
  402. package/dist/data/queries.d.ts +95 -0
  403. package/dist/data/queries.d.ts.map +1 -0
  404. package/dist/data/types.d.ts +103 -0
  405. package/dist/data/types.d.ts.map +1 -0
  406. package/dist/db/database.d.ts +57 -0
  407. package/dist/db/database.d.ts.map +1 -1
  408. package/dist/db/database.js +75 -5
  409. package/dist/db/database.js.map +2 -2
  410. package/dist/db/memory-schema.sql +5 -1
  411. package/dist/db/patterns-schema.sql +23 -0
  412. package/dist/db/schema.sql +3 -1
  413. package/dist/db/security-schema.sql +72 -0
  414. package/dist/docs/formats/asciidoc.d.ts +9 -0
  415. package/dist/docs/formats/asciidoc.d.ts.map +1 -0
  416. package/dist/docs/formats/html.d.ts +10 -0
  417. package/dist/docs/formats/html.d.ts.map +1 -0
  418. package/dist/docs/formats/index.d.ts +31 -0
  419. package/dist/docs/formats/index.d.ts.map +1 -0
  420. package/dist/docs/formats/markdown.d.ts +11 -0
  421. package/dist/docs/formats/markdown.d.ts.map +1 -0
  422. package/dist/docs/formats/openapi.d.ts +17 -0
  423. package/dist/docs/formats/openapi.d.ts.map +1 -0
  424. package/dist/docs/formats/org.d.ts +9 -0
  425. package/dist/docs/formats/org.d.ts.map +1 -0
  426. package/dist/docs/formats/plaintext.d.ts +11 -0
  427. package/dist/docs/formats/plaintext.d.ts.map +1 -0
  428. package/dist/docs/formats/rdoc.d.ts +10 -0
  429. package/dist/docs/formats/rdoc.d.ts.map +1 -0
  430. package/dist/docs/formats/rst.d.ts +11 -0
  431. package/dist/docs/formats/rst.d.ts.map +1 -0
  432. package/dist/docs/indexer.d.ts +49 -0
  433. package/dist/docs/indexer.d.ts.map +1 -0
  434. package/dist/docs/linker.d.ts +30 -0
  435. package/dist/docs/linker.d.ts.map +1 -0
  436. package/dist/docs/lint.d.ts +27 -0
  437. package/dist/docs/lint.d.ts.map +1 -0
  438. package/dist/docs/queries.d.ts +78 -0
  439. package/dist/docs/queries.d.ts.map +1 -0
  440. package/dist/docs/section-id.d.ts +48 -0
  441. package/dist/docs/section-id.d.ts.map +1 -0
  442. package/dist/docs/summarizer.d.ts +13 -0
  443. package/dist/docs/summarizer.d.ts.map +1 -0
  444. package/dist/docs/types.d.ts +71 -0
  445. package/dist/docs/types.d.ts.map +1 -0
  446. package/dist/docs/vectors.d.ts +54 -0
  447. package/dist/docs/vectors.d.ts.map +1 -0
  448. package/dist/extraction/extractor.d.ts +1 -1
  449. package/dist/extraction/extractor.d.ts.map +1 -1
  450. package/dist/extraction/extractor.js +81 -0
  451. package/dist/extraction/extractor.js.map +2 -2
  452. package/dist/extraction/grammars.d.ts +6 -0
  453. package/dist/extraction/grammars.d.ts.map +1 -1
  454. package/dist/extraction/grammars.js +32 -8
  455. package/dist/extraction/grammars.js.map +2 -2
  456. package/dist/extraction/languages.d.ts.map +1 -1
  457. package/dist/extraction/languages.js +43 -1
  458. package/dist/extraction/languages.js.map +2 -2
  459. package/dist/extraction/notebook.d.ts +14 -0
  460. package/dist/extraction/notebook.d.ts.map +1 -0
  461. package/dist/extraction/notebook.js +300 -0
  462. package/dist/extraction/notebook.js.map +7 -0
  463. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  464. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  465. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  466. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  467. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  468. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  469. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  470. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  471. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  472. package/dist/frameworks/amplify.d.ts +9 -0
  473. package/dist/frameworks/amplify.d.ts.map +1 -0
  474. package/dist/frameworks/angular.d.ts +9 -0
  475. package/dist/frameworks/angular.d.ts.map +1 -0
  476. package/dist/frameworks/ansible.d.ts +8 -0
  477. package/dist/frameworks/ansible.d.ts.map +1 -0
  478. package/dist/frameworks/cloudformation.d.ts +9 -0
  479. package/dist/frameworks/cloudformation.d.ts.map +1 -0
  480. package/dist/frameworks/docker.d.ts +9 -0
  481. package/dist/frameworks/docker.d.ts.map +1 -0
  482. package/dist/frameworks/elixir.d.ts +6 -0
  483. package/dist/frameworks/elixir.d.ts.map +1 -0
  484. package/dist/frameworks/flutter.d.ts +12 -0
  485. package/dist/frameworks/flutter.d.ts.map +1 -0
  486. package/dist/frameworks/flutter.js +130 -0
  487. package/dist/frameworks/flutter.js.map +7 -0
  488. package/dist/frameworks/iac.d.ts +10 -0
  489. package/dist/frameworks/iac.d.ts.map +1 -0
  490. package/dist/frameworks/index.d.ts +14 -0
  491. package/dist/frameworks/index.d.ts.map +1 -1
  492. package/dist/frameworks/index.js +7 -1
  493. package/dist/frameworks/index.js.map +3 -3
  494. package/dist/frameworks/kubernetes.d.ts +9 -0
  495. package/dist/frameworks/kubernetes.d.ts.map +1 -0
  496. package/dist/frameworks/pulumi.d.ts +9 -0
  497. package/dist/frameworks/pulumi.d.ts.map +1 -0
  498. package/dist/frameworks/scala.d.ts +6 -0
  499. package/dist/frameworks/scala.d.ts.map +1 -0
  500. package/dist/frameworks/solidity.d.ts +6 -0
  501. package/dist/frameworks/solidity.d.ts.map +1 -0
  502. package/dist/frameworks/terraform.d.ts +14 -0
  503. package/dist/frameworks/terraform.d.ts.map +1 -0
  504. package/dist/frameworks/vue.d.ts +7 -0
  505. package/dist/frameworks/vue.d.ts.map +1 -0
  506. package/dist/graph/communities.d.ts +43 -0
  507. package/dist/graph/communities.d.ts.map +1 -0
  508. package/dist/graph/communities.js +317 -0
  509. package/dist/graph/communities.js.map +7 -0
  510. package/dist/graph/flows.d.ts +55 -0
  511. package/dist/graph/flows.d.ts.map +1 -0
  512. package/dist/graph/flows.js +138 -0
  513. package/dist/graph/flows.js.map +7 -0
  514. package/dist/graph/refactor.d.ts +43 -0
  515. package/dist/graph/refactor.d.ts.map +1 -0
  516. package/dist/graph/refactor.js +155 -0
  517. package/dist/graph/refactor.js.map +7 -0
  518. package/dist/index.d.ts +36 -4
  519. package/dist/index.d.ts.map +1 -1
  520. package/dist/index.js +1 -1
  521. package/dist/index.js.map +2 -2
  522. package/dist/mcp/cache.d.ts +69 -0
  523. package/dist/mcp/cache.d.ts.map +1 -0
  524. package/dist/mcp/cache.js +172 -0
  525. package/dist/mcp/cache.js.map +7 -0
  526. package/dist/mcp/read-modes.d.ts +31 -0
  527. package/dist/mcp/read-modes.d.ts.map +1 -0
  528. package/dist/mcp/read-modes.js +295 -0
  529. package/dist/mcp/read-modes.js.map +7 -0
  530. package/dist/mcp/server.d.ts +1 -0
  531. package/dist/mcp/server.d.ts.map +1 -1
  532. package/dist/mcp/server.js +17 -3
  533. package/dist/mcp/server.js.map +2 -2
  534. package/dist/mcp/tool-names.d.ts +2 -0
  535. package/dist/mcp/tool-names.d.ts.map +1 -0
  536. package/dist/mcp/tool-names.js +24 -1
  537. package/dist/mcp/tool-names.js.map +2 -2
  538. package/dist/mcp/tools.d.ts +12 -0
  539. package/dist/mcp/tools.d.ts.map +1 -1
  540. package/dist/mcp/tools.js +1560 -4
  541. package/dist/mcp/tools.js.map +3 -3
  542. package/dist/memory/compress.d.ts +19 -0
  543. package/dist/memory/compress.d.ts.map +1 -0
  544. package/dist/memory/database.d.ts +92 -0
  545. package/dist/memory/database.d.ts.map +1 -0
  546. package/dist/memory/database.js +70 -2
  547. package/dist/memory/database.js.map +2 -2
  548. package/dist/memory/index.d.ts +71 -0
  549. package/dist/memory/index.d.ts.map +1 -0
  550. package/dist/memory/index.js +12 -2
  551. package/dist/memory/index.js.map +2 -2
  552. package/dist/memory/symbols.d.ts +21 -0
  553. package/dist/memory/symbols.d.ts.map +1 -0
  554. package/dist/memory/types.d.ts +78 -0
  555. package/dist/memory/types.d.ts.map +1 -0
  556. package/dist/memory/types.js.map +1 -1
  557. package/dist/memory/vectors.d.ts +43 -0
  558. package/dist/memory/vectors.d.ts.map +1 -0
  559. package/dist/patterns/graph.d.ts +16 -0
  560. package/dist/patterns/graph.d.ts.map +1 -0
  561. package/dist/patterns/graph.js +45 -0
  562. package/dist/patterns/graph.js.map +7 -0
  563. package/dist/patterns/index.d.ts +4 -0
  564. package/dist/patterns/index.d.ts.map +1 -0
  565. package/dist/patterns/index.js +39 -0
  566. package/dist/patterns/index.js.map +7 -0
  567. package/dist/patterns/indexer.d.ts +15 -0
  568. package/dist/patterns/indexer.d.ts.map +1 -0
  569. package/dist/patterns/indexer.js +97 -0
  570. package/dist/patterns/indexer.js.map +7 -0
  571. package/dist/patterns/library/command-injection-go.yaml +11 -0
  572. package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
  573. package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
  574. package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
  575. package/dist/patterns/library/path-traversal-go.yaml +11 -0
  576. package/dist/patterns/library/path-traversal-py.yaml +12 -0
  577. package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
  578. package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
  579. package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
  580. package/dist/patterns/library/sql-injection-java.yaml +13 -0
  581. package/dist/patterns/library/sql-injection-py.yaml +12 -0
  582. package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
  583. package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
  584. package/dist/patterns/library/weak-crypto-py.yaml +13 -0
  585. package/dist/patterns/loader.d.ts +18 -0
  586. package/dist/patterns/loader.d.ts.map +1 -0
  587. package/dist/patterns/loader.js +277 -0
  588. package/dist/patterns/loader.js.map +7 -0
  589. package/dist/patterns/runner.d.ts +42 -0
  590. package/dist/patterns/runner.d.ts.map +1 -0
  591. package/dist/patterns/runner.js +277 -0
  592. package/dist/patterns/runner.js.map +7 -0
  593. package/dist/patterns/types.d.ts +27 -0
  594. package/dist/patterns/types.d.ts.map +1 -0
  595. package/dist/patterns/types.js +34 -0
  596. package/dist/patterns/types.js.map +7 -0
  597. package/dist/resolution/bridges/android-rn.d.ts +13 -0
  598. package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
  599. package/dist/resolution/bridges/android-rn.js +298 -0
  600. package/dist/resolution/bridges/android-rn.js.map +7 -0
  601. package/dist/resolution/bridges/expo-modules.d.ts +10 -0
  602. package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
  603. package/dist/resolution/bridges/expo-modules.js +155 -0
  604. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  605. package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
  606. package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
  607. package/dist/resolution/bridges/flutter-channel.js +385 -0
  608. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  609. package/dist/resolution/bridges/index.d.ts +40 -0
  610. package/dist/resolution/bridges/index.d.ts.map +1 -0
  611. package/dist/resolution/bridges/index.js +80 -0
  612. package/dist/resolution/bridges/index.js.map +7 -0
  613. package/dist/resolution/bridges/native-events.d.ts +10 -0
  614. package/dist/resolution/bridges/native-events.d.ts.map +1 -0
  615. package/dist/resolution/bridges/native-events.js +188 -0
  616. package/dist/resolution/bridges/native-events.js.map +7 -0
  617. package/dist/resolution/bridges/native-views.d.ts +13 -0
  618. package/dist/resolution/bridges/native-views.d.ts.map +1 -0
  619. package/dist/resolution/bridges/native-views.js +244 -0
  620. package/dist/resolution/bridges/native-views.js.map +7 -0
  621. package/dist/resolution/bridges/react-native.d.ts +9 -0
  622. package/dist/resolution/bridges/react-native.d.ts.map +1 -0
  623. package/dist/resolution/bridges/react-native.js +161 -0
  624. package/dist/resolution/bridges/react-native.js.map +7 -0
  625. package/dist/resolution/bridges/swift-objc.d.ts +14 -0
  626. package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
  627. package/dist/resolution/bridges/swift-objc.js +227 -0
  628. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  629. package/dist/resolution/bridges/turbomodules.d.ts +10 -0
  630. package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
  631. package/dist/resolution/bridges/turbomodules.js +216 -0
  632. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  633. package/dist/resolution/index.d.ts +28 -3
  634. package/dist/resolution/index.d.ts.map +1 -1
  635. package/dist/resolution/index.js +61 -2
  636. package/dist/resolution/index.js.map +2 -2
  637. package/dist/security/attack-surface.d.ts +46 -0
  638. package/dist/security/attack-surface.d.ts.map +1 -0
  639. package/dist/security/attack-surface.js +206 -0
  640. package/dist/security/attack-surface.js.map +7 -0
  641. package/dist/security/context-warnings.d.ts +40 -0
  642. package/dist/security/context-warnings.d.ts.map +1 -0
  643. package/dist/security/context-warnings.js +123 -0
  644. package/dist/security/context-warnings.js.map +7 -0
  645. package/dist/security/data-flows.d.ts +33 -0
  646. package/dist/security/data-flows.d.ts.map +1 -0
  647. package/dist/security/data-flows.js +286 -0
  648. package/dist/security/data-flows.js.map +7 -0
  649. package/dist/security/dep-confusion.d.ts +23 -0
  650. package/dist/security/dep-confusion.d.ts.map +1 -0
  651. package/dist/security/dep-confusion.js +255 -0
  652. package/dist/security/dep-confusion.js.map +7 -0
  653. package/dist/security/errors.d.ts +16 -0
  654. package/dist/security/errors.d.ts.map +1 -0
  655. package/dist/security/errors.js +51 -0
  656. package/dist/security/errors.js.map +7 -0
  657. package/dist/security/export/fix-suggestions.d.ts +21 -0
  658. package/dist/security/export/fix-suggestions.d.ts.map +1 -0
  659. package/dist/security/export/fix-suggestions.js +58 -0
  660. package/dist/security/export/fix-suggestions.js.map +7 -0
  661. package/dist/security/export/sbom.d.ts +33 -0
  662. package/dist/security/export/sbom.d.ts.map +1 -0
  663. package/dist/security/export/sbom.js +230 -0
  664. package/dist/security/export/sbom.js.map +7 -0
  665. package/dist/security/export/serialization.d.ts +62 -0
  666. package/dist/security/export/serialization.d.ts.map +1 -0
  667. package/dist/security/export/serialization.js +142 -0
  668. package/dist/security/export/serialization.js.map +7 -0
  669. package/dist/security/export/vex.d.ts +58 -0
  670. package/dist/security/export/vex.d.ts.map +1 -0
  671. package/dist/security/export/vex.js +220 -0
  672. package/dist/security/export/vex.js.map +7 -0
  673. package/dist/security/index.d.ts +21 -0
  674. package/dist/security/index.d.ts.map +1 -0
  675. package/dist/security/index.js +67 -0
  676. package/dist/security/index.js.map +7 -0
  677. package/dist/security/integrator.d.ts +63 -0
  678. package/dist/security/integrator.d.ts.map +1 -0
  679. package/dist/security/integrator.js +491 -0
  680. package/dist/security/integrator.js.map +7 -0
  681. package/dist/security/license.d.ts +33 -0
  682. package/dist/security/license.d.ts.map +1 -0
  683. package/dist/security/license.js +70 -0
  684. package/dist/security/license.js.map +7 -0
  685. package/dist/security/manifest/adapter.d.ts +92 -0
  686. package/dist/security/manifest/adapter.d.ts.map +1 -0
  687. package/dist/security/manifest/adapter.js +243 -0
  688. package/dist/security/manifest/adapter.js.map +7 -0
  689. package/dist/security/manifest/parser.d.ts +73 -0
  690. package/dist/security/manifest/parser.d.ts.map +1 -0
  691. package/dist/security/manifest/parser.js +376 -0
  692. package/dist/security/manifest/parser.js.map +7 -0
  693. package/dist/security/manifest/plugins/cargo.d.ts +11 -0
  694. package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
  695. package/dist/security/manifest/plugins/cargo.js +233 -0
  696. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  697. package/dist/security/manifest/plugins/composer.d.ts +11 -0
  698. package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
  699. package/dist/security/manifest/plugins/composer.js +152 -0
  700. package/dist/security/manifest/plugins/composer.js.map +7 -0
  701. package/dist/security/manifest/plugins/go.d.ts +12 -0
  702. package/dist/security/manifest/plugins/go.d.ts.map +1 -0
  703. package/dist/security/manifest/plugins/go.js +146 -0
  704. package/dist/security/manifest/plugins/go.js.map +7 -0
  705. package/dist/security/manifest/plugins/gradle.d.ts +12 -0
  706. package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
  707. package/dist/security/manifest/plugins/gradle.js +159 -0
  708. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  709. package/dist/security/manifest/plugins/hex.d.ts +11 -0
  710. package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
  711. package/dist/security/manifest/plugins/hex.js +159 -0
  712. package/dist/security/manifest/plugins/hex.js.map +7 -0
  713. package/dist/security/manifest/plugins/maven.d.ts +11 -0
  714. package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
  715. package/dist/security/manifest/plugins/maven.js +128 -0
  716. package/dist/security/manifest/plugins/maven.js.map +7 -0
  717. package/dist/security/manifest/plugins/npm.d.ts +11 -0
  718. package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
  719. package/dist/security/manifest/plugins/npm.js +284 -0
  720. package/dist/security/manifest/plugins/npm.js.map +7 -0
  721. package/dist/security/manifest/plugins/nuget.d.ts +12 -0
  722. package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
  723. package/dist/security/manifest/plugins/nuget.js +186 -0
  724. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  725. package/dist/security/manifest/plugins/pip.d.ts +11 -0
  726. package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
  727. package/dist/security/manifest/plugins/pip.js +123 -0
  728. package/dist/security/manifest/plugins/pip.js.map +7 -0
  729. package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
  730. package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
  731. package/dist/security/manifest/plugins/pubspec.js +212 -0
  732. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  733. package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
  734. package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
  735. package/dist/security/manifest/plugins/pyproject.js +261 -0
  736. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  737. package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
  738. package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
  739. package/dist/security/manifest/plugins/rubygems.js +185 -0
  740. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  741. package/dist/security/manifest/plugins/swift.d.ts +11 -0
  742. package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
  743. package/dist/security/manifest/plugins/swift.js +200 -0
  744. package/dist/security/manifest/plugins/swift.js.map +7 -0
  745. package/dist/security/owasp.d.ts +16 -0
  746. package/dist/security/owasp.d.ts.map +1 -0
  747. package/dist/security/owasp.js +104 -0
  748. package/dist/security/owasp.js.map +7 -0
  749. package/dist/security/pipeline.d.ts +37 -0
  750. package/dist/security/pipeline.d.ts.map +1 -0
  751. package/dist/security/pipeline.js +125 -0
  752. package/dist/security/pipeline.js.map +7 -0
  753. package/dist/security/reachability.d.ts +67 -0
  754. package/dist/security/reachability.d.ts.map +1 -0
  755. package/dist/security/reachability.js +276 -0
  756. package/dist/security/reachability.js.map +7 -0
  757. package/dist/security/remediation.d.ts +51 -0
  758. package/dist/security/remediation.d.ts.map +1 -0
  759. package/dist/security/remediation.js +126 -0
  760. package/dist/security/remediation.js.map +7 -0
  761. package/dist/security/secrets.d.ts +38 -0
  762. package/dist/security/secrets.d.ts.map +1 -0
  763. package/dist/security/secrets.js +176 -0
  764. package/dist/security/secrets.js.map +7 -0
  765. package/dist/security/staleness.d.ts +43 -0
  766. package/dist/security/staleness.d.ts.map +1 -0
  767. package/dist/security/staleness.js +231 -0
  768. package/dist/security/staleness.js.map +7 -0
  769. package/dist/security/supply-chain.d.ts +34 -0
  770. package/dist/security/supply-chain.d.ts.map +1 -0
  771. package/dist/security/supply-chain.js +301 -0
  772. package/dist/security/supply-chain.js.map +7 -0
  773. package/dist/security/suppressions.d.ts +18 -0
  774. package/dist/security/suppressions.d.ts.map +1 -0
  775. package/dist/security/suppressions.js +106 -0
  776. package/dist/security/suppressions.js.map +7 -0
  777. package/dist/security/types.d.ts +144 -0
  778. package/dist/security/types.d.ts.map +1 -0
  779. package/dist/security/types.js +17 -0
  780. package/dist/security/types.js.map +7 -0
  781. package/dist/security/vuln/client.d.ts +90 -0
  782. package/dist/security/vuln/client.d.ts.map +1 -0
  783. package/dist/security/vuln/client.js +355 -0
  784. package/dist/security/vuln/client.js.map +7 -0
  785. package/dist/security/vuln/epss-client.d.ts +26 -0
  786. package/dist/security/vuln/epss-client.d.ts.map +1 -0
  787. package/dist/security/vuln/epss-client.js +95 -0
  788. package/dist/security/vuln/epss-client.js.map +7 -0
  789. package/dist/security/vuln/index.d.ts +6 -0
  790. package/dist/security/vuln/index.d.ts.map +1 -0
  791. package/dist/security/vuln/index.js +29 -0
  792. package/dist/security/vuln/index.js.map +7 -0
  793. package/dist/security/vuln/osv-adapter.d.ts +58 -0
  794. package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
  795. package/dist/security/vuln/osv-adapter.js +321 -0
  796. package/dist/security/vuln/osv-adapter.js.map +7 -0
  797. package/dist/security/vuln/types.d.ts +29 -0
  798. package/dist/security/vuln/types.d.ts.map +1 -0
  799. package/dist/security/vuln/types.js +17 -0
  800. package/dist/security/vuln/types.js.map +7 -0
  801. package/dist/sync/index.d.ts +4 -2
  802. package/dist/sync/index.d.ts.map +1 -1
  803. package/dist/types.d.ts +10 -4
  804. package/dist/types.d.ts.map +1 -1
  805. package/dist/types.js.map +2 -2
  806. package/dist/vectors/index.d.ts +11 -3
  807. package/dist/vectors/index.d.ts.map +1 -1
  808. package/dist/vectors/qdrant-index.d.ts +10 -3
  809. package/dist/vectors/qdrant-index.d.ts.map +1 -1
  810. package/dist/vectors/typesense-index.d.ts.map +1 -1
  811. package/dist/watchmen/index.js +83 -0
  812. package/dist/watchmen/index.js.map +7 -0
  813. package/dist/watchmen/synthesize.js +475 -0
  814. package/dist/watchmen/synthesize.js.map +7 -0
  815. package/package.json +6 -2
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/security/types.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph-Sec Type Definitions\n *\n * Interfaces for the security analysis module including manifest parsing,\n * vulnerability detection, reachability analysis, and CycloneDX export.\n */\n\n// \u2500\u2500 Manifest Parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ParsedDependency {\n name: string;\n declaredConstraint: string;\n resolvedVersion?: string; // from lock file\n scope: 'production' | 'development' | 'optional';\n ecosystem: string;\n sourceManifest: string; // relative path to declaring manifest\n license?: string; // SPDX expression or license name, if available in the manifest\n}\n\nexport interface ManifestParseResult {\n dependenciesCreated: number;\n manifestsParsed: number;\n warnings: Array<{ file: string; line?: number; message: string }>;\n errors: Array<{ file: string; message: string }>;\n}\n\n// \u2500\u2500 Dependency Graph Integration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntegrationResult {\n importsEdgesCreated: number;\n referencesEdgesCreated: number;\n}\n\nexport interface TransitiveResult {\n dependsOnEdgesCreated: number;\n incompleteNodes: string[]; // nodes marked with transitive_status=incomplete\n}\n\nexport interface CleanupResult {\n nodesRemoved: number;\n edgesRemoved: number;\n}\n\n// \u2500\u2500 Vulnerability Database \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CVERecord {\n id: string; // e.g. \"CVE-2023-12345\"\n severity: number; // CVSS v3.1 base score\n affectedVersionRanges: VersionRange[];\n fixedVersion?: string;\n summary: string;\n}\n\nexport interface VersionRange {\n introduced?: string;\n fixed?: string;\n lastAffected?: string;\n}\n\nexport interface EnrichmentResult {\n vulnerabilitiesFound: number;\n dependenciesChecked: number;\n errors: Array<{ dependency: string; database: string; error: string }>;\n staleNodes: string[]; // nodes where vulnDataStale was set\n}\n\n// \u2500\u2500 Reachability Analysis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ReachabilityVerdict = 'affected' | 'not_affected' | 'under_investigation';\n\nexport interface ReachabilityPath {\n entryPoint: string; // node ID of the entry point\n path: string[]; // ordered list of node IDs from entry to dependency\n}\n\nexport interface ReachabilityResult {\n verdict: ReachabilityVerdict;\n paths: ReachabilityPath[];\n unresolvedSymbols: string[]; // up to 50, for under_investigation\n reachingEntryPointCount: number;\n}\n\nexport interface ImpactSummary {\n affectedLayers: string[]; // e.g. ['api', 'service']\n affectedEntryPoints: string[]; // node IDs of reaching entry points\n distinctPathCount: number; // capped at 100\n}\n\n// \u2500\u2500 Security Pipeline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface SecurityResult {\n manifestsDiscovered: number;\n dependenciesCreated: number;\n vulnerabilitiesFound: number;\n affectedCount: number;\n notAffectedCount: number;\n underInvestigationCount: number;\n duration: number;\n}\n\n// \u2500\u2500 CycloneDX SBOM Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface SBOMMetadata {\n toolName: string;\n toolVersion: string;\n timestamp: string; // ISO 8601 UTC\n projectName: string;\n}\n\nexport interface CycloneDXSBOM {\n bomFormat: 'CycloneDX';\n specVersion: '1.5';\n version: number;\n metadata: Record<string, unknown>;\n components: CycloneDXComponent[];\n dependencies: CycloneDXDependencyEntry[];\n}\n\nexport interface CycloneDXComponent {\n type: 'library';\n name: string;\n version: string;\n purl: string;\n scope?: 'required' | 'optional';\n properties?: Array<{ name: string; value: string }>;\n}\n\nexport interface CycloneDXDependencyEntry {\n ref: string;\n dependsOn?: string[];\n}\n\n// \u2500\u2500 CycloneDX VEX Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CycloneDXVEX {\n bomFormat: 'CycloneDX';\n specVersion: '1.5';\n version: number;\n metadata: Record<string, unknown>;\n vulnerabilities: CycloneDXVulnerability[];\n}\n\nexport interface CycloneDXVulnerability {\n id: string;\n source?: { name: string; url?: string };\n ratings?: Array<{ score: number; severity?: string; method?: string }>;\n analysis?: {\n state: 'affected' | 'not_affected' | 'under_investigation';\n justification?: string;\n detail?: string;\n };\n affects?: Array<{ ref: string }>;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * VulnerabilityDatabaseClient
3
+ *
4
+ * Orchestrates vulnerability enrichment by querying configured databases,
5
+ * merging and deduplicating results by CVE identifier, creating Vulnerability_Nodes
6
+ * linked to affected Dependency_Nodes, and handling unreachable databases gracefully.
7
+ *
8
+ * Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 3.7
9
+ */
10
+ import type { GraphDatabase } from '../../db/database';
11
+ import type { CVERecord, EnrichmentResult } from '../types';
12
+ import type { VulnDatabaseAdapter } from './types';
13
+ /**
14
+ * Compute a combined risk score (0.0–10.0) for a vulnerability.
15
+ *
16
+ * Formula:
17
+ * risk = reachability_factor × (0.4 × cvss_normalized + 0.6 × epss) × staleness_bonus
18
+ * scaled to 0–10: min(risk × 10, 10.0)
19
+ *
20
+ * @param cvss - CVSS base score (0.0–10.0), null treated as 5.0
21
+ * @param epss - EPSS exploitation probability (0.0–1.0), null treated as 0.0
22
+ * @param verdict - Reachability verdict or null/undefined
23
+ * @param staleness - Dependency staleness score (0.0–1.0), null treated as 0.0
24
+ */
25
+ export declare function computeRiskScore(cvss: number | null | undefined, epss: number | null | undefined, verdict: string | null | undefined, staleness: number | null | undefined): number;
26
+ export declare class VulnerabilityDatabaseClient {
27
+ private readonly adapters;
28
+ private readonly db;
29
+ private readonly timeoutMs;
30
+ constructor(adapters: VulnDatabaseAdapter[], db: GraphDatabase, timeoutMs?: number);
31
+ /**
32
+ * Enrich all Dependency_Nodes with vulnerability data.
33
+ *
34
+ * Uses batch queries (up to 1000 per HTTP request) when the adapter supports
35
+ * `queryBatch`. Falls back to sequential single queries per dependency if batch
36
+ * is unavailable or fails. Results are deduplicated by CVE ID across adapters.
37
+ */
38
+ enrichAll(): Promise<EnrichmentResult>;
39
+ /**
40
+ * Fetch EPSS scores for all stored vulnerabilities and update the database.
41
+ */
42
+ private enrichEpss;
43
+ /**
44
+ * Compute and persist combined risk scores for all stored vulnerabilities.
45
+ * Called after EPSS enrichment so epss_score values are up to date.
46
+ */
47
+ private computeRiskScores;
48
+ /**
49
+ * Batch enrichment path: groups deps into chunks of BATCH_CHUNK_SIZE and sends
50
+ * one HTTP request per chunk. Falls back to sequential on batch failure.
51
+ */
52
+ private enrichAllBatch;
53
+ /**
54
+ * Sequential enrichment path: queries one dependency at a time.
55
+ * Used when the adapter does not support queryBatch, or as a fallback.
56
+ */
57
+ private enrichAllSequential;
58
+ /**
59
+ * Enrich a single Dependency_Node with vulnerability data.
60
+ *
61
+ * @param dependencyNodeId - The node ID of the dependency to enrich
62
+ * @returns Array of CVE records found for this dependency
63
+ */
64
+ enrichOne(dependencyNodeId: string): Promise<CVERecord[]>;
65
+ /**
66
+ * Query a set of adapters for a single dependency.
67
+ * Handles timeouts and unreachable databases gracefully.
68
+ * Defaults to all configured adapters when adapterList is omitted.
69
+ */
70
+ private queryAdaptersForDependency;
71
+ /**
72
+ * Mark a dependency node as having stale vulnerability data.
73
+ * Retains cached data but sets the stale flag with timestamp.
74
+ */
75
+ private markDependencyStale;
76
+ /**
77
+ * Deduplicate CVE records by their ID.
78
+ * When the same CVE is reported by multiple databases, keep the first occurrence.
79
+ */
80
+ private deduplicateByCveId;
81
+ /**
82
+ * Create or update a Vulnerability_Node and link it to the affected dependency.
83
+ *
84
+ * - Creates a node in `nodes` table with kind='vulnerability', ID format `vuln:<cve_id>`
85
+ * - Inserts a row in `sec_vulnerabilities` with CVE metadata
86
+ * - Creates a `has_vulnerability` edge from the Dependency_Node to the Vulnerability_Node
87
+ */
88
+ private upsertVulnerabilityNode;
89
+ }
90
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/security/vuln/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,SAAS,CAAC;AAM/D;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,MAAM,CAoBR;AAaD,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGjC,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,EAAE,EAAE,aAAa,EACjB,SAAS,GAAE,MAAc;IAO3B;;;;;;OAMG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA4C5C;;OAEG;YACW,UAAU;IA+BxB;;;OAGG;YACW,iBAAiB;IAsB/B;;;OAGG;YACW,cAAc;IA4C5B;;;OAGG;YACW,mBAAmB;IAkBjC;;;;;OAKG;IACG,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAiD/D;;;;OAIG;YACW,0BAA0B;IA6CxC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;CAuDhC"}
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var client_exports = {};
20
+ __export(client_exports, {
21
+ VulnerabilityDatabaseClient: () => VulnerabilityDatabaseClient,
22
+ computeRiskScore: () => computeRiskScore
23
+ });
24
+ module.exports = __toCommonJS(client_exports);
25
+ var import_errors = require("../../errors");
26
+ var import_epss_client = require("./epss-client");
27
+ const BATCH_CHUNK_SIZE = 1e3;
28
+ function computeRiskScore(cvss, epss, verdict, staleness) {
29
+ const cvssNormalized = (cvss ?? 5) / 10;
30
+ const epssValue = epss ?? 0;
31
+ let reachabilityFactor;
32
+ if (verdict === "affected") {
33
+ reachabilityFactor = 1;
34
+ } else if (verdict === "under_investigation") {
35
+ reachabilityFactor = 0.5;
36
+ } else if (verdict === "not_affected") {
37
+ reachabilityFactor = 0.1;
38
+ } else {
39
+ reachabilityFactor = 0.3;
40
+ }
41
+ const stalenessBonus = 1 + (staleness ?? 0) * 0.2;
42
+ const raw = reachabilityFactor * (0.4 * cvssNormalized + 0.6 * epssValue) * stalenessBonus;
43
+ return Math.min(raw * 10, 10);
44
+ }
45
+ class VulnerabilityDatabaseClient {
46
+ constructor(adapters, db, timeoutMs = 3e4) {
47
+ this.adapters = adapters;
48
+ this.db = db;
49
+ this.timeoutMs = timeoutMs;
50
+ }
51
+ /**
52
+ * Enrich all Dependency_Nodes with vulnerability data.
53
+ *
54
+ * Uses batch queries (up to 1000 per HTTP request) when the adapter supports
55
+ * `queryBatch`. Falls back to sequential single queries per dependency if batch
56
+ * is unavailable or fails. Results are deduplicated by CVE ID across adapters.
57
+ */
58
+ async enrichAll() {
59
+ const rawDb = this.db.getRawDb();
60
+ const result = {
61
+ vulnerabilitiesFound: 0,
62
+ dependenciesChecked: 0,
63
+ errors: [],
64
+ staleNodes: []
65
+ };
66
+ const depRows = rawDb.all(
67
+ `SELECT node_id, ecosystem, package_name, resolved_version, declared_constraint
68
+ FROM sec_dependencies`
69
+ );
70
+ const queryableDeps = depRows.filter((d) => d.resolved_version || d.declared_constraint);
71
+ for (const adapter of this.adapters) {
72
+ if (adapter.queryBatch) {
73
+ await this.enrichAllBatch(adapter, queryableDeps, result);
74
+ } else {
75
+ await this.enrichAllSequential(adapter, queryableDeps, result);
76
+ }
77
+ }
78
+ const now = Date.now();
79
+ for (const dep of queryableDeps) {
80
+ rawDb.run(
81
+ `UPDATE sec_dependencies SET last_vuln_check = ? WHERE node_id = ?`,
82
+ [now, dep.node_id]
83
+ );
84
+ }
85
+ result.dependenciesChecked = queryableDeps.length;
86
+ await this.enrichEpss(rawDb);
87
+ await this.computeRiskScores(rawDb);
88
+ return result;
89
+ }
90
+ /**
91
+ * Fetch EPSS scores for all stored vulnerabilities and update the database.
92
+ */
93
+ async enrichEpss(rawDb) {
94
+ try {
95
+ const cveRows = rawDb.all(
96
+ `SELECT cve_id FROM sec_vulnerabilities`
97
+ );
98
+ if (cveRows.length === 0) {
99
+ return;
100
+ }
101
+ const cveIds = cveRows.map((r) => r.cve_id);
102
+ const epssClient = new import_epss_client.EpssClient();
103
+ const scores = await epssClient.fetchScores(cveIds);
104
+ if (scores.size === 0) {
105
+ return;
106
+ }
107
+ const fetchedAt = Date.now();
108
+ for (const [cveId, { score, percentile }] of scores) {
109
+ rawDb.run(
110
+ `UPDATE sec_vulnerabilities SET epss_score = ?, epss_percentile = ?, epss_fetched_at = ? WHERE cve_id = ?`,
111
+ [score, percentile, fetchedAt, cveId]
112
+ );
113
+ }
114
+ } catch (error) {
115
+ const msg = error instanceof Error ? error.message : String(error);
116
+ (0, import_errors.logWarn)(`[sec:epss] EPSS enrichment failed (non-critical): ${msg}`);
117
+ }
118
+ }
119
+ /**
120
+ * Compute and persist combined risk scores for all stored vulnerabilities.
121
+ * Called after EPSS enrichment so epss_score values are up to date.
122
+ */
123
+ async computeRiskScores(rawDb) {
124
+ const rows = rawDb.all(`
125
+ SELECT v.node_id, v.severity_score, v.epss_score,
126
+ r.verdict,
127
+ d.staleness_score
128
+ FROM sec_vulnerabilities v
129
+ LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'
130
+ LEFT JOIN sec_dependencies d ON d.node_id = e.source
131
+ LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id
132
+ `);
133
+ for (const row of rows) {
134
+ const score = computeRiskScore(row.severity_score, row.epss_score, row.verdict, row.staleness_score);
135
+ rawDb.run(`UPDATE sec_vulnerabilities SET risk_score = ? WHERE node_id = ?`, [score, row.node_id]);
136
+ }
137
+ }
138
+ /**
139
+ * Batch enrichment path: groups deps into chunks of BATCH_CHUNK_SIZE and sends
140
+ * one HTTP request per chunk. Falls back to sequential on batch failure.
141
+ */
142
+ async enrichAllBatch(adapter, deps, result) {
143
+ const rawDb = this.db.getRawDb();
144
+ for (let i = 0; i < deps.length; i += BATCH_CHUNK_SIZE) {
145
+ const chunk = deps.slice(i, i + BATCH_CHUNK_SIZE);
146
+ const queries = chunk.map((dep) => ({
147
+ ecosystem: dep.ecosystem,
148
+ packageName: dep.package_name,
149
+ version: dep.resolved_version || dep.declared_constraint
150
+ }));
151
+ let batchResults;
152
+ try {
153
+ const controller = new AbortController();
154
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
155
+ try {
156
+ batchResults = await adapter.queryBatch(queries, controller.signal);
157
+ } finally {
158
+ clearTimeout(timeout);
159
+ }
160
+ } catch (error) {
161
+ const msg = error instanceof Error ? error.message : String(error);
162
+ (0, import_errors.logWarn)(`[sec:vuln] ${adapter.name} batch query failed (${msg}), falling back to sequential for chunk of ${chunk.length}`);
163
+ await this.enrichAllSequential(adapter, chunk, result);
164
+ continue;
165
+ }
166
+ for (let j = 0; j < chunk.length; j++) {
167
+ const dep = chunk[j];
168
+ const cveRecords = batchResults[j] ?? [];
169
+ const uniqueCves = this.deduplicateByCveId(cveRecords);
170
+ for (const cve of uniqueCves) {
171
+ this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);
172
+ result.vulnerabilitiesFound++;
173
+ }
174
+ }
175
+ }
176
+ }
177
+ /**
178
+ * Sequential enrichment path: queries one dependency at a time.
179
+ * Used when the adapter does not support queryBatch, or as a fallback.
180
+ */
181
+ async enrichAllSequential(adapter, deps, result) {
182
+ const rawDb = this.db.getRawDb();
183
+ for (const dep of deps) {
184
+ const version = dep.resolved_version || dep.declared_constraint;
185
+ const cveRecords = await this.queryAdaptersForDependency(dep, version, result, [adapter]);
186
+ const uniqueCves = this.deduplicateByCveId(cveRecords);
187
+ for (const cve of uniqueCves) {
188
+ this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);
189
+ result.vulnerabilitiesFound++;
190
+ }
191
+ }
192
+ }
193
+ /**
194
+ * Enrich a single Dependency_Node with vulnerability data.
195
+ *
196
+ * @param dependencyNodeId - The node ID of the dependency to enrich
197
+ * @returns Array of CVE records found for this dependency
198
+ */
199
+ async enrichOne(dependencyNodeId) {
200
+ const rawDb = this.db.getRawDb();
201
+ const dep = rawDb.get(
202
+ `SELECT node_id, ecosystem, package_name, resolved_version, declared_constraint
203
+ FROM sec_dependencies WHERE node_id = ?`,
204
+ [dependencyNodeId]
205
+ );
206
+ if (!dep) {
207
+ return [];
208
+ }
209
+ const version = dep.resolved_version || dep.declared_constraint;
210
+ if (!version) {
211
+ return [];
212
+ }
213
+ const enrichResult = {
214
+ vulnerabilitiesFound: 0,
215
+ dependenciesChecked: 0,
216
+ errors: [],
217
+ staleNodes: []
218
+ };
219
+ const cveRecords = await this.queryAdaptersForDependency(
220
+ dep,
221
+ version,
222
+ enrichResult
223
+ );
224
+ const uniqueCves = this.deduplicateByCveId(cveRecords);
225
+ for (const cve of uniqueCves) {
226
+ this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);
227
+ }
228
+ const now = Date.now();
229
+ rawDb.run(
230
+ `UPDATE sec_dependencies SET last_vuln_check = ? WHERE node_id = ?`,
231
+ [now, dep.node_id]
232
+ );
233
+ return uniqueCves;
234
+ }
235
+ /**
236
+ * Query a set of adapters for a single dependency.
237
+ * Handles timeouts and unreachable databases gracefully.
238
+ * Defaults to all configured adapters when adapterList is omitted.
239
+ */
240
+ async queryAdaptersForDependency(dep, version, result, adapterList = this.adapters) {
241
+ const allRecords = [];
242
+ for (const adapter of adapterList) {
243
+ try {
244
+ const controller = new AbortController();
245
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
246
+ try {
247
+ const records = await adapter.query(
248
+ dep.ecosystem,
249
+ dep.package_name,
250
+ version,
251
+ controller.signal
252
+ );
253
+ allRecords.push(...records);
254
+ } finally {
255
+ clearTimeout(timeout);
256
+ }
257
+ } catch (error) {
258
+ const errorMessage = error instanceof Error ? error.message : String(error);
259
+ (0, import_errors.logError)(
260
+ `[sec:vuln] Failed to query ${adapter.name} for ${dep.package_name}@${version}: ${errorMessage}`
261
+ );
262
+ result.errors.push({
263
+ dependency: dep.package_name,
264
+ database: adapter.name,
265
+ error: errorMessage
266
+ });
267
+ this.markDependencyStale(dep.node_id, result);
268
+ }
269
+ }
270
+ return allRecords;
271
+ }
272
+ /**
273
+ * Mark a dependency node as having stale vulnerability data.
274
+ * Retains cached data but sets the stale flag with timestamp.
275
+ */
276
+ markDependencyStale(nodeId, result) {
277
+ const rawDb = this.db.getRawDb();
278
+ const now = Date.now();
279
+ rawDb.run(
280
+ `UPDATE sec_dependencies
281
+ SET vuln_data_stale = 1, vuln_data_stale_since = ?
282
+ WHERE node_id = ?`,
283
+ [now, nodeId]
284
+ );
285
+ if (!result.staleNodes.includes(nodeId)) {
286
+ result.staleNodes.push(nodeId);
287
+ }
288
+ (0, import_errors.logWarn)(
289
+ `[sec:vuln] Vulnerability data marked stale for dependency node ${nodeId}`
290
+ );
291
+ }
292
+ /**
293
+ * Deduplicate CVE records by their ID.
294
+ * When the same CVE is reported by multiple databases, keep the first occurrence.
295
+ */
296
+ deduplicateByCveId(records) {
297
+ const seen = /* @__PURE__ */ new Map();
298
+ for (const record of records) {
299
+ if (!seen.has(record.id)) {
300
+ seen.set(record.id, record);
301
+ }
302
+ }
303
+ return [...seen.values()];
304
+ }
305
+ /**
306
+ * Create or update a Vulnerability_Node and link it to the affected dependency.
307
+ *
308
+ * - Creates a node in `nodes` table with kind='vulnerability', ID format `vuln:<cve_id>`
309
+ * - Inserts a row in `sec_vulnerabilities` with CVE metadata
310
+ * - Creates a `has_vulnerability` edge from the Dependency_Node to the Vulnerability_Node
311
+ */
312
+ upsertVulnerabilityNode(rawDb, cve, dependencyNodeId) {
313
+ const vulnNodeId = `vuln:${cve.id}`;
314
+ const now = Date.now();
315
+ const summary = cve.summary.length > 500 ? cve.summary.slice(0, 500) : cve.summary;
316
+ const sourceDatabase = this.adapters.length > 0 ? this.adapters[0].name : "unknown";
317
+ rawDb.run(
318
+ `INSERT OR REPLACE INTO nodes
319
+ (id, kind, name, qualified_name, file_path, language,
320
+ start_line, end_line, start_column, end_column,
321
+ is_exported, is_async, is_static, is_abstract, updated_at)
322
+ VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,
323
+ [vulnNodeId, cve.id, cve.id, now]
324
+ );
325
+ const affectedRangesJson = JSON.stringify(cve.affectedVersionRanges);
326
+ rawDb.run(
327
+ `INSERT OR REPLACE INTO sec_vulnerabilities
328
+ (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)
329
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
330
+ [
331
+ vulnNodeId,
332
+ cve.id,
333
+ cve.severity,
334
+ affectedRangesJson,
335
+ cve.fixedVersion ?? null,
336
+ summary,
337
+ sourceDatabase
338
+ ]
339
+ );
340
+ const edge = {
341
+ source: dependencyNodeId,
342
+ target: vulnNodeId,
343
+ kind: "has_vulnerability",
344
+ confidence: "extracted",
345
+ confidenceScore: 1
346
+ };
347
+ this.db.insertEdge(edge);
348
+ }
349
+ }
350
+ // Annotate the CommonJS export names for ESM import in node:
351
+ 0 && (module.exports = {
352
+ VulnerabilityDatabaseClient,
353
+ computeRiskScore
354
+ });
355
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/security/vuln/client.ts"],
4
+ "sourcesContent": ["/**\n * VulnerabilityDatabaseClient\n *\n * Orchestrates vulnerability enrichment by querying configured databases,\n * merging and deduplicating results by CVE identifier, creating Vulnerability_Nodes\n * linked to affected Dependency_Nodes, and handling unreachable databases gracefully.\n *\n * Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 3.7\n */\n\nimport type { GraphDatabase } from '../../db/database';\nimport type { Edge } from '../../types';\nimport type { CVERecord, EnrichmentResult } from '../types';\nimport type { VulnDatabaseAdapter, BatchQuery } from './types';\nimport { logError, logWarn } from '../../errors';\nimport { EpssClient } from './epss-client';\n\nconst BATCH_CHUNK_SIZE = 1000;\n\n/**\n * Compute a combined risk score (0.0\u201310.0) for a vulnerability.\n *\n * Formula:\n * risk = reachability_factor \u00D7 (0.4 \u00D7 cvss_normalized + 0.6 \u00D7 epss) \u00D7 staleness_bonus\n * scaled to 0\u201310: min(risk \u00D7 10, 10.0)\n *\n * @param cvss - CVSS base score (0.0\u201310.0), null treated as 5.0\n * @param epss - EPSS exploitation probability (0.0\u20131.0), null treated as 0.0\n * @param verdict - Reachability verdict or null/undefined\n * @param staleness - Dependency staleness score (0.0\u20131.0), null treated as 0.0\n */\nexport function computeRiskScore(\n cvss: number | null | undefined,\n epss: number | null | undefined,\n verdict: string | null | undefined,\n staleness: number | null | undefined,\n): number {\n const cvssNormalized = (cvss ?? 5.0) / 10.0;\n const epssValue = epss ?? 0.0;\n\n let reachabilityFactor: number;\n if (verdict === 'affected') {\n reachabilityFactor = 1.0;\n } else if (verdict === 'under_investigation') {\n reachabilityFactor = 0.5;\n } else if (verdict === 'not_affected') {\n reachabilityFactor = 0.1;\n } else {\n // no verdict\n reachabilityFactor = 0.3;\n }\n\n const stalenessBonus = 1.0 + ((staleness ?? 0) * 0.2);\n\n const raw = reachabilityFactor * (0.4 * cvssNormalized + 0.6 * epssValue) * stalenessBonus;\n return Math.min(raw * 10, 10.0);\n}\n\n/**\n * Dependency row from sec_dependencies table.\n */\ninterface DependencyRow {\n node_id: string;\n ecosystem: string;\n package_name: string;\n resolved_version: string | null;\n declared_constraint: string;\n}\n\nexport class VulnerabilityDatabaseClient {\n private readonly adapters: VulnDatabaseAdapter[];\n private readonly db: GraphDatabase;\n private readonly timeoutMs: number;\n\n constructor(\n adapters: VulnDatabaseAdapter[],\n db: GraphDatabase,\n timeoutMs: number = 30000,\n ) {\n this.adapters = adapters;\n this.db = db;\n this.timeoutMs = timeoutMs;\n }\n\n /**\n * Enrich all Dependency_Nodes with vulnerability data.\n *\n * Uses batch queries (up to 1000 per HTTP request) when the adapter supports\n * `queryBatch`. Falls back to sequential single queries per dependency if batch\n * is unavailable or fails. Results are deduplicated by CVE ID across adapters.\n */\n async enrichAll(): Promise<EnrichmentResult> {\n const rawDb = this.db.getRawDb();\n const result: EnrichmentResult = {\n vulnerabilitiesFound: 0,\n dependenciesChecked: 0,\n errors: [],\n staleNodes: [],\n };\n\n const depRows: DependencyRow[] = rawDb.all(\n `SELECT node_id, ecosystem, package_name, resolved_version, declared_constraint\n FROM sec_dependencies`,\n );\n\n // Filter out deps with no usable version\n const queryableDeps = depRows.filter(d => d.resolved_version || d.declared_constraint);\n\n for (const adapter of this.adapters) {\n if (adapter.queryBatch) {\n await this.enrichAllBatch(adapter as typeof adapter & Required<Pick<typeof adapter, 'queryBatch'>>, queryableDeps, result);\n } else {\n await this.enrichAllSequential(adapter, queryableDeps, result);\n }\n }\n\n // Record lastVulnCheck for all queried deps (do once, after all adapters)\n const now = Date.now();\n for (const dep of queryableDeps) {\n rawDb.run(\n `UPDATE sec_dependencies SET last_vuln_check = ? WHERE node_id = ?`,\n [now, dep.node_id],\n );\n }\n result.dependenciesChecked = queryableDeps.length;\n\n // Enrich stored vulnerabilities with EPSS scores\n await this.enrichEpss(rawDb);\n\n // Compute combined risk scores after all enrichment is done\n await this.computeRiskScores(rawDb);\n\n return result;\n }\n\n /**\n * Fetch EPSS scores for all stored vulnerabilities and update the database.\n */\n private async enrichEpss(rawDb: any): Promise<void> {\n try {\n const cveRows: Array<{ cve_id: string }> = rawDb.all(\n `SELECT cve_id FROM sec_vulnerabilities`,\n );\n\n if (cveRows.length === 0) {\n return;\n }\n\n const cveIds = cveRows.map(r => r.cve_id);\n const epssClient = new EpssClient();\n const scores = await epssClient.fetchScores(cveIds);\n\n if (scores.size === 0) {\n return;\n }\n\n const fetchedAt = Date.now();\n for (const [cveId, { score, percentile }] of scores) {\n rawDb.run(\n `UPDATE sec_vulnerabilities SET epss_score = ?, epss_percentile = ?, epss_fetched_at = ? WHERE cve_id = ?`,\n [score, percentile, fetchedAt, cveId],\n );\n }\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logWarn(`[sec:epss] EPSS enrichment failed (non-critical): ${msg}`);\n }\n }\n\n /**\n * Compute and persist combined risk scores for all stored vulnerabilities.\n * Called after EPSS enrichment so epss_score values are up to date.\n */\n private async computeRiskScores(rawDb: any): Promise<void> {\n const rows: Array<{\n node_id: string;\n severity_score: number | null;\n epss_score: number | null;\n verdict: string | null;\n staleness_score: number | null;\n }> = rawDb.all(`\n SELECT v.node_id, v.severity_score, v.epss_score,\n r.verdict,\n d.staleness_score\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n `);\n for (const row of rows) {\n const score = computeRiskScore(row.severity_score, row.epss_score, row.verdict, row.staleness_score);\n rawDb.run(`UPDATE sec_vulnerabilities SET risk_score = ? WHERE node_id = ?`, [score, row.node_id]);\n }\n }\n\n /**\n * Batch enrichment path: groups deps into chunks of BATCH_CHUNK_SIZE and sends\n * one HTTP request per chunk. Falls back to sequential on batch failure.\n */\n private async enrichAllBatch(\n adapter: VulnDatabaseAdapter & Required<Pick<VulnDatabaseAdapter, 'queryBatch'>>,\n deps: DependencyRow[],\n result: EnrichmentResult,\n ): Promise<void> {\n const rawDb = this.db.getRawDb();\n\n for (let i = 0; i < deps.length; i += BATCH_CHUNK_SIZE) {\n const chunk = deps.slice(i, i + BATCH_CHUNK_SIZE);\n const queries: BatchQuery[] = chunk.map(dep => ({\n ecosystem: dep.ecosystem,\n packageName: dep.package_name,\n version: dep.resolved_version || dep.declared_constraint,\n }));\n\n let batchResults: Array<CVERecord[]>;\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n batchResults = await adapter.queryBatch(queries, controller.signal);\n } finally {\n clearTimeout(timeout);\n }\n } catch (error: unknown) {\n // Batch failed \u2014 fall back to sequential for this chunk\n const msg = error instanceof Error ? error.message : String(error);\n logWarn(`[sec:vuln] ${adapter.name} batch query failed (${msg}), falling back to sequential for chunk of ${chunk.length}`);\n await this.enrichAllSequential(adapter, chunk, result);\n continue;\n }\n\n for (let j = 0; j < chunk.length; j++) {\n const dep = chunk[j]!;\n const cveRecords = batchResults[j] ?? [];\n const uniqueCves = this.deduplicateByCveId(cveRecords);\n for (const cve of uniqueCves) {\n this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);\n result.vulnerabilitiesFound++;\n }\n }\n }\n }\n\n /**\n * Sequential enrichment path: queries one dependency at a time.\n * Used when the adapter does not support queryBatch, or as a fallback.\n */\n private async enrichAllSequential(\n adapter: VulnDatabaseAdapter,\n deps: DependencyRow[],\n result: EnrichmentResult,\n ): Promise<void> {\n const rawDb = this.db.getRawDb();\n\n for (const dep of deps) {\n const version = dep.resolved_version || dep.declared_constraint;\n const cveRecords = await this.queryAdaptersForDependency(dep, version, result, [adapter]);\n const uniqueCves = this.deduplicateByCveId(cveRecords);\n for (const cve of uniqueCves) {\n this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);\n result.vulnerabilitiesFound++;\n }\n }\n }\n\n /**\n * Enrich a single Dependency_Node with vulnerability data.\n *\n * @param dependencyNodeId - The node ID of the dependency to enrich\n * @returns Array of CVE records found for this dependency\n */\n async enrichOne(dependencyNodeId: string): Promise<CVERecord[]> {\n const rawDb = this.db.getRawDb();\n\n const dep: DependencyRow | undefined = rawDb.get(\n `SELECT node_id, ecosystem, package_name, resolved_version, declared_constraint\n FROM sec_dependencies WHERE node_id = ?`,\n [dependencyNodeId],\n );\n\n if (!dep) {\n return [];\n }\n\n const version = dep.resolved_version || dep.declared_constraint;\n if (!version) {\n return [];\n }\n\n const enrichResult: EnrichmentResult = {\n vulnerabilitiesFound: 0,\n dependenciesChecked: 0,\n errors: [],\n staleNodes: [],\n };\n\n const cveRecords = await this.queryAdaptersForDependency(\n dep,\n version,\n enrichResult,\n );\n\n // Deduplicate by CVE ID\n const uniqueCves = this.deduplicateByCveId(cveRecords);\n\n // Create Vulnerability_Nodes and edges\n for (const cve of uniqueCves) {\n this.upsertVulnerabilityNode(rawDb, cve, dep.node_id);\n }\n\n // Record lastVulnCheck timestamp\n const now = Date.now();\n rawDb.run(\n `UPDATE sec_dependencies SET last_vuln_check = ? WHERE node_id = ?`,\n [now, dep.node_id],\n );\n\n return uniqueCves;\n }\n\n /**\n * Query a set of adapters for a single dependency.\n * Handles timeouts and unreachable databases gracefully.\n * Defaults to all configured adapters when adapterList is omitted.\n */\n private async queryAdaptersForDependency(\n dep: DependencyRow,\n version: string,\n result: EnrichmentResult,\n adapterList: VulnDatabaseAdapter[] = this.adapters,\n ): Promise<CVERecord[]> {\n const allRecords: CVERecord[] = [];\n\n for (const adapter of adapterList) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const records = await adapter.query(\n dep.ecosystem,\n dep.package_name,\n version,\n controller.signal,\n );\n allRecords.push(...records);\n } finally {\n clearTimeout(timeout);\n }\n } catch (error: unknown) {\n // Handle unreachable database (Requirement 3.5)\n const errorMessage = error instanceof Error ? error.message : String(error);\n logError(\n `[sec:vuln] Failed to query ${adapter.name} for ${dep.package_name}@${version}: ${errorMessage}`,\n );\n\n result.errors.push({\n dependency: dep.package_name,\n database: adapter.name,\n error: errorMessage,\n });\n\n // Set vulnDataStale flag on the dependency node\n this.markDependencyStale(dep.node_id, result);\n }\n }\n\n return allRecords;\n }\n\n /**\n * Mark a dependency node as having stale vulnerability data.\n * Retains cached data but sets the stale flag with timestamp.\n */\n private markDependencyStale(nodeId: string, result: EnrichmentResult): void {\n const rawDb = this.db.getRawDb();\n const now = Date.now();\n\n rawDb.run(\n `UPDATE sec_dependencies\n SET vuln_data_stale = 1, vuln_data_stale_since = ?\n WHERE node_id = ?`,\n [now, nodeId],\n );\n\n if (!result.staleNodes.includes(nodeId)) {\n result.staleNodes.push(nodeId);\n }\n\n logWarn(\n `[sec:vuln] Vulnerability data marked stale for dependency node ${nodeId}`,\n );\n }\n\n /**\n * Deduplicate CVE records by their ID.\n * When the same CVE is reported by multiple databases, keep the first occurrence.\n */\n private deduplicateByCveId(records: CVERecord[]): CVERecord[] {\n const seen = new Map<string, CVERecord>();\n for (const record of records) {\n if (!seen.has(record.id)) {\n seen.set(record.id, record);\n }\n }\n return [...seen.values()];\n }\n\n /**\n * Create or update a Vulnerability_Node and link it to the affected dependency.\n *\n * - Creates a node in `nodes` table with kind='vulnerability', ID format `vuln:<cve_id>`\n * - Inserts a row in `sec_vulnerabilities` with CVE metadata\n * - Creates a `has_vulnerability` edge from the Dependency_Node to the Vulnerability_Node\n */\n private upsertVulnerabilityNode(\n rawDb: any,\n cve: CVERecord,\n dependencyNodeId: string,\n ): void {\n const vulnNodeId = `vuln:${cve.id}`;\n const now = Date.now();\n\n // Truncate summary to 500 characters (Requirement 3.3)\n const summary = cve.summary.length > 500\n ? cve.summary.slice(0, 500)\n : cve.summary;\n\n // Determine source database from the first adapter that returned this CVE\n // (in practice, the adapter name is not stored on CVERecord, so we use\n // the first configured adapter's name as the source)\n const sourceDatabase = this.adapters.length > 0 ? this.adapters[0].name : 'unknown';\n\n // Upsert into nodes table\n rawDb.run(\n `INSERT OR REPLACE INTO nodes\n (id, kind, name, qualified_name, file_path, language,\n start_line, end_line, start_column, end_column,\n is_exported, is_async, is_static, is_abstract, updated_at)\n VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,\n [vulnNodeId, cve.id, cve.id, now],\n );\n\n // Upsert into sec_vulnerabilities table\n const affectedRangesJson = JSON.stringify(cve.affectedVersionRanges);\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n vulnNodeId,\n cve.id,\n cve.severity,\n affectedRangesJson,\n cve.fixedVersion ?? null,\n summary,\n sourceDatabase,\n ],\n );\n\n // Create has_vulnerability edge from Dependency_Node to Vulnerability_Node\n const edge: Edge = {\n source: dependencyNodeId,\n target: vulnNodeId,\n kind: 'has_vulnerability',\n confidence: 'extracted',\n confidenceScore: 1.0,\n };\n this.db.insertEdge(edge);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * EPSS (Exploit Prediction Scoring System) Client
3
+ *
4
+ * Fetches exploit prediction scores from the FIRST.org EPSS API for CVE IDs.
5
+ * EPSS is non-critical: on error, an empty map is returned so the caller can
6
+ * continue without scores.
7
+ *
8
+ * API: https://api.first.org/data/v1/epss
9
+ */
10
+ export declare class EpssClient {
11
+ /**
12
+ * Fetch EPSS scores for a list of CVE IDs.
13
+ *
14
+ * CVEs are batched into chunks of 500 per request. Missing CVEs simply do
15
+ * not appear in the response and are omitted from the returned map.
16
+ *
17
+ * @param cveIds - List of CVE identifiers (e.g. ["CVE-2021-44228", ...])
18
+ * @returns Map from CVE ID to { score, percentile } (floats in [0, 1])
19
+ */
20
+ fetchScores(cveIds: string[]): Promise<Map<string, {
21
+ score: number;
22
+ percentile: number;
23
+ }>>;
24
+ private fetchChunk;
25
+ }
26
+ //# sourceMappingURL=epss-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epss-client.d.ts","sourceRoot":"","sources":["../../../src/security/vuln/epss-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,qBAAa,UAAU;IACrB;;;;;;;;OAQG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;YAwBlF,UAAU;CA2CzB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var epss_client_exports = {};
20
+ __export(epss_client_exports, {
21
+ EpssClient: () => EpssClient
22
+ });
23
+ module.exports = __toCommonJS(epss_client_exports);
24
+ var import_errors = require("../../errors");
25
+ const EPSS_API_URL = "https://api.first.org/data/v1/epss";
26
+ const CHUNK_SIZE = 500;
27
+ const TIMEOUT_MS = 3e4;
28
+ class EpssClient {
29
+ /**
30
+ * Fetch EPSS scores for a list of CVE IDs.
31
+ *
32
+ * CVEs are batched into chunks of 500 per request. Missing CVEs simply do
33
+ * not appear in the response and are omitted from the returned map.
34
+ *
35
+ * @param cveIds - List of CVE identifiers (e.g. ["CVE-2021-44228", ...])
36
+ * @returns Map from CVE ID to { score, percentile } (floats in [0, 1])
37
+ */
38
+ async fetchScores(cveIds) {
39
+ const result = /* @__PURE__ */ new Map();
40
+ if (cveIds.length === 0) {
41
+ return result;
42
+ }
43
+ for (let i = 0; i < cveIds.length; i += CHUNK_SIZE) {
44
+ const chunk = cveIds.slice(i, i + CHUNK_SIZE);
45
+ try {
46
+ const chunkResult = await this.fetchChunk(chunk);
47
+ for (const [cve, scores] of chunkResult) {
48
+ result.set(cve, scores);
49
+ }
50
+ } catch (error) {
51
+ const msg = error instanceof Error ? error.message : String(error);
52
+ (0, import_errors.logWarn)(`[sec:epss] Failed to fetch EPSS scores for chunk of ${chunk.length} CVEs: ${msg}`);
53
+ }
54
+ }
55
+ return result;
56
+ }
57
+ async fetchChunk(cveIds) {
58
+ const result = /* @__PURE__ */ new Map();
59
+ const controller = new AbortController();
60
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
61
+ try {
62
+ const cveParam = cveIds.join(",");
63
+ const url = `${EPSS_API_URL}?cve=${encodeURIComponent(cveParam)}`;
64
+ const response = await fetch(url, { signal: controller.signal });
65
+ if (!response.ok) {
66
+ (0, import_errors.logWarn)(`[sec:epss] EPSS API returned HTTP ${response.status}`);
67
+ return result;
68
+ }
69
+ const json = await response.json();
70
+ if (json.status !== "OK" || !Array.isArray(json.data)) {
71
+ (0, import_errors.logWarn)(`[sec:epss] Unexpected EPSS API response structure`);
72
+ return result;
73
+ }
74
+ for (const entry of json.data) {
75
+ const score = parseFloat(entry.epss);
76
+ const percentile = parseFloat(entry.percentile);
77
+ if (!isNaN(score) && !isNaN(percentile)) {
78
+ result.set(entry.cve, { score, percentile });
79
+ }
80
+ }
81
+ } catch (error) {
82
+ const msg = error instanceof Error ? error.message : String(error);
83
+ (0, import_errors.logError)(`[sec:epss] Error fetching EPSS chunk: ${msg}`);
84
+ throw error;
85
+ } finally {
86
+ clearTimeout(timeout);
87
+ }
88
+ return result;
89
+ }
90
+ }
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ EpssClient
94
+ });
95
+ //# sourceMappingURL=epss-client.js.map