vaspera 2.5.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 (712) hide show
  1. package/CHANGELOG.md +184 -0
  2. package/LICENSE +21 -0
  3. package/README.md +809 -0
  4. package/dist/__tests__/integration/certification-flow.test.d.ts +5 -0
  5. package/dist/__tests__/integration/certification-flow.test.d.ts.map +1 -0
  6. package/dist/__tests__/integration/certification-flow.test.js +245 -0
  7. package/dist/__tests__/integration/certification-flow.test.js.map +1 -0
  8. package/dist/__tests__/integration/commands.test.d.ts +5 -0
  9. package/dist/__tests__/integration/commands.test.d.ts.map +1 -0
  10. package/dist/__tests__/integration/commands.test.js +93 -0
  11. package/dist/__tests__/integration/commands.test.js.map +1 -0
  12. package/dist/action/diff-mode.d.ts +34 -0
  13. package/dist/action/diff-mode.d.ts.map +1 -0
  14. package/dist/action/diff-mode.js +201 -0
  15. package/dist/action/diff-mode.js.map +1 -0
  16. package/dist/action/diff-mode.test.d.ts +5 -0
  17. package/dist/action/diff-mode.test.d.ts.map +1 -0
  18. package/dist/action/diff-mode.test.js +162 -0
  19. package/dist/action/diff-mode.test.js.map +1 -0
  20. package/dist/action/index.d.ts +10 -0
  21. package/dist/action/index.d.ts.map +1 -0
  22. package/dist/action/index.js +231 -0
  23. package/dist/action/index.js.map +1 -0
  24. package/dist/action/pr-comment.d.ts +30 -0
  25. package/dist/action/pr-comment.d.ts.map +1 -0
  26. package/dist/action/pr-comment.js +301 -0
  27. package/dist/action/pr-comment.js.map +1 -0
  28. package/dist/action/pr-comment.test.d.ts +5 -0
  29. package/dist/action/pr-comment.test.d.ts.map +1 -0
  30. package/dist/action/pr-comment.test.js +189 -0
  31. package/dist/action/pr-comment.test.js.map +1 -0
  32. package/dist/action/sarif-upload.d.ts +104 -0
  33. package/dist/action/sarif-upload.d.ts.map +1 -0
  34. package/dist/action/sarif-upload.js +188 -0
  35. package/dist/action/sarif-upload.js.map +1 -0
  36. package/dist/action/sarif-upload.test.d.ts +5 -0
  37. package/dist/action/sarif-upload.test.d.ts.map +1 -0
  38. package/dist/action/sarif-upload.test.js +206 -0
  39. package/dist/action/sarif-upload.test.js.map +1 -0
  40. package/dist/action/types.d.ts +104 -0
  41. package/dist/action/types.d.ts.map +1 -0
  42. package/dist/action/types.js +33 -0
  43. package/dist/action/types.js.map +1 -0
  44. package/dist/action/types.test.d.ts +5 -0
  45. package/dist/action/types.test.d.ts.map +1 -0
  46. package/dist/action/types.test.js +79 -0
  47. package/dist/action/types.test.js.map +1 -0
  48. package/dist/agents/agent-integrity.d.ts +111 -0
  49. package/dist/agents/agent-integrity.d.ts.map +1 -0
  50. package/dist/agents/agent-integrity.js +308 -0
  51. package/dist/agents/agent-integrity.js.map +1 -0
  52. package/dist/agents/agent-privacy.d.ts +68 -0
  53. package/dist/agents/agent-privacy.d.ts.map +1 -0
  54. package/dist/agents/agent-privacy.js +345 -0
  55. package/dist/agents/agent-privacy.js.map +1 -0
  56. package/dist/agents/exploit-chain.d.ts +64 -0
  57. package/dist/agents/exploit-chain.d.ts.map +1 -0
  58. package/dist/agents/exploit-chain.js +477 -0
  59. package/dist/agents/exploit-chain.js.map +1 -0
  60. package/dist/agents/exploit-chain.test.d.ts +5 -0
  61. package/dist/agents/exploit-chain.test.d.ts.map +1 -0
  62. package/dist/agents/exploit-chain.test.js +455 -0
  63. package/dist/agents/exploit-chain.test.js.map +1 -0
  64. package/dist/agents/index.d.ts +14 -0
  65. package/dist/agents/index.d.ts.map +1 -0
  66. package/dist/agents/index.js +19 -0
  67. package/dist/agents/index.js.map +1 -0
  68. package/dist/agents/logic-flaw-detector.d.ts +55 -0
  69. package/dist/agents/logic-flaw-detector.d.ts.map +1 -0
  70. package/dist/agents/logic-flaw-detector.js +454 -0
  71. package/dist/agents/logic-flaw-detector.js.map +1 -0
  72. package/dist/agents/zero-day-hunter.d.ts +69 -0
  73. package/dist/agents/zero-day-hunter.d.ts.map +1 -0
  74. package/dist/agents/zero-day-hunter.js +591 -0
  75. package/dist/agents/zero-day-hunter.js.map +1 -0
  76. package/dist/certification/artifacts.d.ts +21 -0
  77. package/dist/certification/artifacts.d.ts.map +1 -0
  78. package/dist/certification/artifacts.js +275 -0
  79. package/dist/certification/artifacts.js.map +1 -0
  80. package/dist/certification/autofix.d.ts +122 -0
  81. package/dist/certification/autofix.d.ts.map +1 -0
  82. package/dist/certification/autofix.js +476 -0
  83. package/dist/certification/autofix.js.map +1 -0
  84. package/dist/certification/badge.d.ts +56 -0
  85. package/dist/certification/badge.d.ts.map +1 -0
  86. package/dist/certification/badge.js +155 -0
  87. package/dist/certification/badge.js.map +1 -0
  88. package/dist/certification/cache.d.ts +121 -0
  89. package/dist/certification/cache.d.ts.map +1 -0
  90. package/dist/certification/cache.js +275 -0
  91. package/dist/certification/cache.js.map +1 -0
  92. package/dist/certification/cache.test.d.ts +5 -0
  93. package/dist/certification/cache.test.d.ts.map +1 -0
  94. package/dist/certification/cache.test.js +270 -0
  95. package/dist/certification/cache.test.js.map +1 -0
  96. package/dist/certification/consensus.d.ts +105 -0
  97. package/dist/certification/consensus.d.ts.map +1 -0
  98. package/dist/certification/consensus.js +353 -0
  99. package/dist/certification/consensus.js.map +1 -0
  100. package/dist/certification/consensus.test.d.ts +5 -0
  101. package/dist/certification/consensus.test.d.ts.map +1 -0
  102. package/dist/certification/consensus.test.js +342 -0
  103. package/dist/certification/consensus.test.js.map +1 -0
  104. package/dist/certification/index.d.ts +14 -0
  105. package/dist/certification/index.d.ts.map +1 -0
  106. package/dist/certification/index.js +14 -0
  107. package/dist/certification/index.js.map +1 -0
  108. package/dist/certification/rules.d.ts +89 -0
  109. package/dist/certification/rules.d.ts.map +1 -0
  110. package/dist/certification/rules.js +317 -0
  111. package/dist/certification/rules.js.map +1 -0
  112. package/dist/certification/sarif.d.ts +107 -0
  113. package/dist/certification/sarif.d.ts.map +1 -0
  114. package/dist/certification/sarif.js +191 -0
  115. package/dist/certification/sarif.js.map +1 -0
  116. package/dist/certification/store.d.ts +255 -0
  117. package/dist/certification/store.d.ts.map +1 -0
  118. package/dist/certification/store.js +835 -0
  119. package/dist/certification/store.js.map +1 -0
  120. package/dist/certification/store.test.d.ts +5 -0
  121. package/dist/certification/store.test.d.ts.map +1 -0
  122. package/dist/certification/store.test.js +468 -0
  123. package/dist/certification/store.test.js.map +1 -0
  124. package/dist/certification/summary.d.ts +72 -0
  125. package/dist/certification/summary.d.ts.map +1 -0
  126. package/dist/certification/summary.js +296 -0
  127. package/dist/certification/summary.js.map +1 -0
  128. package/dist/certification/types.d.ts +138 -0
  129. package/dist/certification/types.d.ts.map +1 -0
  130. package/dist/certification/types.js +34 -0
  131. package/dist/certification/types.js.map +1 -0
  132. package/dist/commands/audits/api-check.d.ts +3 -0
  133. package/dist/commands/audits/api-check.d.ts.map +1 -0
  134. package/dist/commands/audits/api-check.js +71 -0
  135. package/dist/commands/audits/api-check.js.map +1 -0
  136. package/dist/commands/audits/deadcode.d.ts +3 -0
  137. package/dist/commands/audits/deadcode.d.ts.map +1 -0
  138. package/dist/commands/audits/deadcode.js +63 -0
  139. package/dist/commands/audits/deadcode.js.map +1 -0
  140. package/dist/commands/audits/deps.d.ts +3 -0
  141. package/dist/commands/audits/deps.d.ts.map +1 -0
  142. package/dist/commands/audits/deps.js +56 -0
  143. package/dist/commands/audits/deps.js.map +1 -0
  144. package/dist/commands/audits/errors.d.ts +3 -0
  145. package/dist/commands/audits/errors.d.ts.map +1 -0
  146. package/dist/commands/audits/errors.js +65 -0
  147. package/dist/commands/audits/errors.js.map +1 -0
  148. package/dist/commands/audits/index.d.ts +3 -0
  149. package/dist/commands/audits/index.d.ts.map +1 -0
  150. package/dist/commands/audits/index.js +15 -0
  151. package/dist/commands/audits/index.js.map +1 -0
  152. package/dist/commands/audits/perf.d.ts +3 -0
  153. package/dist/commands/audits/perf.d.ts.map +1 -0
  154. package/dist/commands/audits/perf.js +85 -0
  155. package/dist/commands/audits/perf.js.map +1 -0
  156. package/dist/commands/audits/secrets.d.ts +3 -0
  157. package/dist/commands/audits/secrets.d.ts.map +1 -0
  158. package/dist/commands/audits/secrets.js +71 -0
  159. package/dist/commands/audits/secrets.js.map +1 -0
  160. package/dist/commands/certification/certify.d.ts +3 -0
  161. package/dist/commands/certification/certify.d.ts.map +1 -0
  162. package/dist/commands/certification/certify.js +108 -0
  163. package/dist/commands/certification/certify.js.map +1 -0
  164. package/dist/commands/certification/index.d.ts +3 -0
  165. package/dist/commands/certification/index.d.ts.map +1 -0
  166. package/dist/commands/certification/index.js +17 -0
  167. package/dist/commands/certification/index.js.map +1 -0
  168. package/dist/commands/certification/performance.d.ts +3 -0
  169. package/dist/commands/certification/performance.d.ts.map +1 -0
  170. package/dist/commands/certification/performance.js +89 -0
  171. package/dist/commands/certification/performance.js.map +1 -0
  172. package/dist/commands/certification/quality.d.ts +3 -0
  173. package/dist/commands/certification/quality.d.ts.map +1 -0
  174. package/dist/commands/certification/quality.js +92 -0
  175. package/dist/commands/certification/quality.js.map +1 -0
  176. package/dist/commands/certification/redteam.d.ts +3 -0
  177. package/dist/commands/certification/redteam.d.ts.map +1 -0
  178. package/dist/commands/certification/redteam.js +114 -0
  179. package/dist/commands/certification/redteam.js.map +1 -0
  180. package/dist/commands/certification/reliability.d.ts +3 -0
  181. package/dist/commands/certification/reliability.d.ts.map +1 -0
  182. package/dist/commands/certification/reliability.js +93 -0
  183. package/dist/commands/certification/reliability.js.map +1 -0
  184. package/dist/commands/certification/security.d.ts +3 -0
  185. package/dist/commands/certification/security.d.ts.map +1 -0
  186. package/dist/commands/certification/security.js +90 -0
  187. package/dist/commands/certification/security.js.map +1 -0
  188. package/dist/commands/certification/typesafety.d.ts +3 -0
  189. package/dist/commands/certification/typesafety.d.ts.map +1 -0
  190. package/dist/commands/certification/typesafety.js +87 -0
  191. package/dist/commands/certification/typesafety.js.map +1 -0
  192. package/dist/commands/core/add-tests.d.ts +3 -0
  193. package/dist/commands/core/add-tests.d.ts.map +1 -0
  194. package/dist/commands/core/add-tests.js +29 -0
  195. package/dist/commands/core/add-tests.js.map +1 -0
  196. package/dist/commands/core/audit.d.ts +3 -0
  197. package/dist/commands/core/audit.d.ts.map +1 -0
  198. package/dist/commands/core/audit.js +64 -0
  199. package/dist/commands/core/audit.js.map +1 -0
  200. package/dist/commands/core/fix-critical.d.ts +3 -0
  201. package/dist/commands/core/fix-critical.d.ts.map +1 -0
  202. package/dist/commands/core/fix-critical.js +22 -0
  203. package/dist/commands/core/fix-critical.js.map +1 -0
  204. package/dist/commands/core/fix-high.d.ts +3 -0
  205. package/dist/commands/core/fix-high.d.ts.map +1 -0
  206. package/dist/commands/core/fix-high.js +32 -0
  207. package/dist/commands/core/fix-high.js.map +1 -0
  208. package/dist/commands/core/fix-medium.d.ts +3 -0
  209. package/dist/commands/core/fix-medium.d.ts.map +1 -0
  210. package/dist/commands/core/fix-medium.js +29 -0
  211. package/dist/commands/core/fix-medium.js.map +1 -0
  212. package/dist/commands/core/fix-rls.d.ts +3 -0
  213. package/dist/commands/core/fix-rls.d.ts.map +1 -0
  214. package/dist/commands/core/fix-rls.js +17 -0
  215. package/dist/commands/core/fix-rls.js.map +1 -0
  216. package/dist/commands/core/harden.d.ts +3 -0
  217. package/dist/commands/core/harden.d.ts.map +1 -0
  218. package/dist/commands/core/harden.js +19 -0
  219. package/dist/commands/core/harden.js.map +1 -0
  220. package/dist/commands/core/index.d.ts +3 -0
  221. package/dist/commands/core/index.d.ts.map +1 -0
  222. package/dist/commands/core/index.js +21 -0
  223. package/dist/commands/core/index.js.map +1 -0
  224. package/dist/commands/core/preflight.d.ts +3 -0
  225. package/dist/commands/core/preflight.d.ts.map +1 -0
  226. package/dist/commands/core/preflight.js +50 -0
  227. package/dist/commands/core/preflight.js.map +1 -0
  228. package/dist/commands/core/verify.d.ts +3 -0
  229. package/dist/commands/core/verify.d.ts.map +1 -0
  230. package/dist/commands/core/verify.js +32 -0
  231. package/dist/commands/core/verify.js.map +1 -0
  232. package/dist/commands/index.d.ts +28 -0
  233. package/dist/commands/index.d.ts.map +1 -0
  234. package/dist/commands/index.js +37 -0
  235. package/dist/commands/index.js.map +1 -0
  236. package/dist/commands/types.d.ts +9 -0
  237. package/dist/commands/types.d.ts.map +1 -0
  238. package/dist/commands/types.js +5 -0
  239. package/dist/commands/types.js.map +1 -0
  240. package/dist/compliance/cis.d.ts +29 -0
  241. package/dist/compliance/cis.d.ts.map +1 -0
  242. package/dist/compliance/cis.js +316 -0
  243. package/dist/compliance/cis.js.map +1 -0
  244. package/dist/compliance/frameworks/eu-ai-act.d.ts +55 -0
  245. package/dist/compliance/frameworks/eu-ai-act.d.ts.map +1 -0
  246. package/dist/compliance/frameworks/eu-ai-act.js +621 -0
  247. package/dist/compliance/frameworks/eu-ai-act.js.map +1 -0
  248. package/dist/compliance/frameworks/index.d.ts +67 -0
  249. package/dist/compliance/frameworks/index.d.ts.map +1 -0
  250. package/dist/compliance/frameworks/index.js +97 -0
  251. package/dist/compliance/frameworks/index.js.map +1 -0
  252. package/dist/compliance/frameworks/iso-42001.d.ts +59 -0
  253. package/dist/compliance/frameworks/iso-42001.d.ts.map +1 -0
  254. package/dist/compliance/frameworks/iso-42001.js +719 -0
  255. package/dist/compliance/frameworks/iso-42001.js.map +1 -0
  256. package/dist/compliance/frameworks/mitre-atlas.d.ts +58 -0
  257. package/dist/compliance/frameworks/mitre-atlas.d.ts.map +1 -0
  258. package/dist/compliance/frameworks/mitre-atlas.js +686 -0
  259. package/dist/compliance/frameworks/mitre-atlas.js.map +1 -0
  260. package/dist/compliance/frameworks/nist-ai-rmf.d.ts +51 -0
  261. package/dist/compliance/frameworks/nist-ai-rmf.d.ts.map +1 -0
  262. package/dist/compliance/frameworks/nist-ai-rmf.js +677 -0
  263. package/dist/compliance/frameworks/nist-ai-rmf.js.map +1 -0
  264. package/dist/compliance/frameworks/owasp-llm.d.ts +58 -0
  265. package/dist/compliance/frameworks/owasp-llm.d.ts.map +1 -0
  266. package/dist/compliance/frameworks/owasp-llm.js +399 -0
  267. package/dist/compliance/frameworks/owasp-llm.js.map +1 -0
  268. package/dist/compliance/gdpr.d.ts +34 -0
  269. package/dist/compliance/gdpr.d.ts.map +1 -0
  270. package/dist/compliance/gdpr.js +319 -0
  271. package/dist/compliance/gdpr.js.map +1 -0
  272. package/dist/compliance/hipaa.d.ts +29 -0
  273. package/dist/compliance/hipaa.d.ts.map +1 -0
  274. package/dist/compliance/hipaa.js +205 -0
  275. package/dist/compliance/hipaa.js.map +1 -0
  276. package/dist/compliance/index.d.ts +18 -0
  277. package/dist/compliance/index.d.ts.map +1 -0
  278. package/dist/compliance/index.js +26 -0
  279. package/dist/compliance/index.js.map +1 -0
  280. package/dist/compliance/iso27001.d.ts +30 -0
  281. package/dist/compliance/iso27001.d.ts.map +1 -0
  282. package/dist/compliance/iso27001.js +332 -0
  283. package/dist/compliance/iso27001.js.map +1 -0
  284. package/dist/compliance/mapper.d.ts +42 -0
  285. package/dist/compliance/mapper.d.ts.map +1 -0
  286. package/dist/compliance/mapper.js +269 -0
  287. package/dist/compliance/mapper.js.map +1 -0
  288. package/dist/compliance/mapper.test.d.ts +5 -0
  289. package/dist/compliance/mapper.test.d.ts.map +1 -0
  290. package/dist/compliance/mapper.test.js +360 -0
  291. package/dist/compliance/mapper.test.js.map +1 -0
  292. package/dist/compliance/pci-dss.d.ts +29 -0
  293. package/dist/compliance/pci-dss.d.ts.map +1 -0
  294. package/dist/compliance/pci-dss.js +247 -0
  295. package/dist/compliance/pci-dss.js.map +1 -0
  296. package/dist/compliance/report.d.ts +25 -0
  297. package/dist/compliance/report.d.ts.map +1 -0
  298. package/dist/compliance/report.js +254 -0
  299. package/dist/compliance/report.js.map +1 -0
  300. package/dist/compliance/report.test.d.ts +5 -0
  301. package/dist/compliance/report.test.d.ts.map +1 -0
  302. package/dist/compliance/report.test.js +128 -0
  303. package/dist/compliance/report.test.js.map +1 -0
  304. package/dist/compliance/soc2.d.ts +30 -0
  305. package/dist/compliance/soc2.d.ts.map +1 -0
  306. package/dist/compliance/soc2.js +262 -0
  307. package/dist/compliance/soc2.js.map +1 -0
  308. package/dist/compliance/soc2.test.d.ts +5 -0
  309. package/dist/compliance/soc2.test.d.ts.map +1 -0
  310. package/dist/compliance/soc2.test.js +86 -0
  311. package/dist/compliance/soc2.test.js.map +1 -0
  312. package/dist/compliance/types.d.ts +125 -0
  313. package/dist/compliance/types.d.ts.map +1 -0
  314. package/dist/compliance/types.js +10 -0
  315. package/dist/compliance/types.js.map +1 -0
  316. package/dist/config/flags.d.ts +456 -0
  317. package/dist/config/flags.d.ts.map +1 -0
  318. package/dist/config/flags.js +464 -0
  319. package/dist/config/flags.js.map +1 -0
  320. package/dist/config/index.d.ts +10 -0
  321. package/dist/config/index.d.ts.map +1 -0
  322. package/dist/config/index.js +10 -0
  323. package/dist/config/index.js.map +1 -0
  324. package/dist/config/severity-overrides.d.ts +209 -0
  325. package/dist/config/severity-overrides.d.ts.map +1 -0
  326. package/dist/config/severity-overrides.js +380 -0
  327. package/dist/config/severity-overrides.js.map +1 -0
  328. package/dist/cost/index.d.ts +11 -0
  329. package/dist/cost/index.d.ts.map +1 -0
  330. package/dist/cost/index.js +12 -0
  331. package/dist/cost/index.js.map +1 -0
  332. package/dist/cost/pricing.d.ts +57 -0
  333. package/dist/cost/pricing.d.ts.map +1 -0
  334. package/dist/cost/pricing.js +196 -0
  335. package/dist/cost/pricing.js.map +1 -0
  336. package/dist/cost/pricing.test.d.ts +5 -0
  337. package/dist/cost/pricing.test.d.ts.map +1 -0
  338. package/dist/cost/pricing.test.js +195 -0
  339. package/dist/cost/pricing.test.js.map +1 -0
  340. package/dist/cost/tracker.d.ts +100 -0
  341. package/dist/cost/tracker.d.ts.map +1 -0
  342. package/dist/cost/tracker.js +366 -0
  343. package/dist/cost/tracker.js.map +1 -0
  344. package/dist/cost/tracker.test.d.ts +5 -0
  345. package/dist/cost/tracker.test.d.ts.map +1 -0
  346. package/dist/cost/tracker.test.js +360 -0
  347. package/dist/cost/tracker.test.js.map +1 -0
  348. package/dist/cost/types.d.ts +135 -0
  349. package/dist/cost/types.d.ts.map +1 -0
  350. package/dist/cost/types.js +9 -0
  351. package/dist/cost/types.js.map +1 -0
  352. package/dist/enterprise/auth/oidc.d.ts +231 -0
  353. package/dist/enterprise/auth/oidc.d.ts.map +1 -0
  354. package/dist/enterprise/auth/oidc.js +372 -0
  355. package/dist/enterprise/auth/oidc.js.map +1 -0
  356. package/dist/enterprise/auth/oidc.test.d.ts +5 -0
  357. package/dist/enterprise/auth/oidc.test.d.ts.map +1 -0
  358. package/dist/enterprise/auth/oidc.test.js +435 -0
  359. package/dist/enterprise/auth/oidc.test.js.map +1 -0
  360. package/dist/enterprise/index.d.ts +14 -0
  361. package/dist/enterprise/index.d.ts.map +1 -0
  362. package/dist/enterprise/index.js +19 -0
  363. package/dist/enterprise/index.js.map +1 -0
  364. package/dist/enterprise/integrations/chat.d.ts +205 -0
  365. package/dist/enterprise/integrations/chat.d.ts.map +1 -0
  366. package/dist/enterprise/integrations/chat.js +624 -0
  367. package/dist/enterprise/integrations/chat.js.map +1 -0
  368. package/dist/enterprise/integrations/chat.test.d.ts +5 -0
  369. package/dist/enterprise/integrations/chat.test.d.ts.map +1 -0
  370. package/dist/enterprise/integrations/chat.test.js +557 -0
  371. package/dist/enterprise/integrations/chat.test.js.map +1 -0
  372. package/dist/enterprise/integrations/ticketing.d.ts +257 -0
  373. package/dist/enterprise/integrations/ticketing.d.ts.map +1 -0
  374. package/dist/enterprise/integrations/ticketing.js +548 -0
  375. package/dist/enterprise/integrations/ticketing.js.map +1 -0
  376. package/dist/enterprise/integrations/ticketing.test.d.ts +5 -0
  377. package/dist/enterprise/integrations/ticketing.test.d.ts.map +1 -0
  378. package/dist/enterprise/integrations/ticketing.test.js +693 -0
  379. package/dist/enterprise/integrations/ticketing.test.js.map +1 -0
  380. package/dist/enterprise/policy/opa.d.ts +194 -0
  381. package/dist/enterprise/policy/opa.d.ts.map +1 -0
  382. package/dist/enterprise/policy/opa.js +385 -0
  383. package/dist/enterprise/policy/opa.js.map +1 -0
  384. package/dist/enterprise/policy/opa.test.d.ts +5 -0
  385. package/dist/enterprise/policy/opa.test.d.ts.map +1 -0
  386. package/dist/enterprise/policy/opa.test.js +702 -0
  387. package/dist/enterprise/policy/opa.test.js.map +1 -0
  388. package/dist/enterprise/signing/kms.d.ts +211 -0
  389. package/dist/enterprise/signing/kms.d.ts.map +1 -0
  390. package/dist/enterprise/signing/kms.js +480 -0
  391. package/dist/enterprise/signing/kms.js.map +1 -0
  392. package/dist/enterprise/signing/kms.test.d.ts +5 -0
  393. package/dist/enterprise/signing/kms.test.d.ts.map +1 -0
  394. package/dist/enterprise/signing/kms.test.js +511 -0
  395. package/dist/enterprise/signing/kms.test.js.map +1 -0
  396. package/dist/eval/fixtures.d.ts +58 -0
  397. package/dist/eval/fixtures.d.ts.map +1 -0
  398. package/dist/eval/fixtures.js +571 -0
  399. package/dist/eval/fixtures.js.map +1 -0
  400. package/dist/eval/fixtures.test.d.ts +5 -0
  401. package/dist/eval/fixtures.test.d.ts.map +1 -0
  402. package/dist/eval/fixtures.test.js +193 -0
  403. package/dist/eval/fixtures.test.js.map +1 -0
  404. package/dist/eval/harness.d.ts +30 -0
  405. package/dist/eval/harness.d.ts.map +1 -0
  406. package/dist/eval/harness.js +221 -0
  407. package/dist/eval/harness.js.map +1 -0
  408. package/dist/eval/harness.test.d.ts +5 -0
  409. package/dist/eval/harness.test.d.ts.map +1 -0
  410. package/dist/eval/harness.test.js +314 -0
  411. package/dist/eval/harness.test.js.map +1 -0
  412. package/dist/eval/index.d.ts +15 -0
  413. package/dist/eval/index.d.ts.map +1 -0
  414. package/dist/eval/index.js +18 -0
  415. package/dist/eval/index.js.map +1 -0
  416. package/dist/eval/metrics.d.ts +56 -0
  417. package/dist/eval/metrics.d.ts.map +1 -0
  418. package/dist/eval/metrics.js +298 -0
  419. package/dist/eval/metrics.js.map +1 -0
  420. package/dist/eval/metrics.test.d.ts +5 -0
  421. package/dist/eval/metrics.test.d.ts.map +1 -0
  422. package/dist/eval/metrics.test.js +426 -0
  423. package/dist/eval/metrics.test.js.map +1 -0
  424. package/dist/eval/report.d.ts +30 -0
  425. package/dist/eval/report.d.ts.map +1 -0
  426. package/dist/eval/report.js +333 -0
  427. package/dist/eval/report.js.map +1 -0
  428. package/dist/eval/report.test.d.ts +5 -0
  429. package/dist/eval/report.test.d.ts.map +1 -0
  430. package/dist/eval/report.test.js +275 -0
  431. package/dist/eval/report.test.js.map +1 -0
  432. package/dist/eval/types.d.ts +234 -0
  433. package/dist/eval/types.d.ts.map +1 -0
  434. package/dist/eval/types.js +27 -0
  435. package/dist/eval/types.js.map +1 -0
  436. package/dist/http-server.d.ts +3 -0
  437. package/dist/http-server.d.ts.map +1 -0
  438. package/dist/http-server.js +127 -0
  439. package/dist/http-server.js.map +1 -0
  440. package/dist/index.d.ts +33 -0
  441. package/dist/index.d.ts.map +1 -0
  442. package/dist/index.js +4120 -0
  443. package/dist/index.js.map +1 -0
  444. package/dist/logger.d.ts +46 -0
  445. package/dist/logger.d.ts.map +1 -0
  446. package/dist/logger.js +131 -0
  447. package/dist/logger.js.map +1 -0
  448. package/dist/multimodel/consensus.d.ts +49 -0
  449. package/dist/multimodel/consensus.d.ts.map +1 -0
  450. package/dist/multimodel/consensus.js +454 -0
  451. package/dist/multimodel/consensus.js.map +1 -0
  452. package/dist/multimodel/consensus.test.d.ts +5 -0
  453. package/dist/multimodel/consensus.test.d.ts.map +1 -0
  454. package/dist/multimodel/consensus.test.js +415 -0
  455. package/dist/multimodel/consensus.test.js.map +1 -0
  456. package/dist/multimodel/index.d.ts +13 -0
  457. package/dist/multimodel/index.d.ts.map +1 -0
  458. package/dist/multimodel/index.js +14 -0
  459. package/dist/multimodel/index.js.map +1 -0
  460. package/dist/multimodel/runner.d.ts +95 -0
  461. package/dist/multimodel/runner.d.ts.map +1 -0
  462. package/dist/multimodel/runner.js +312 -0
  463. package/dist/multimodel/runner.js.map +1 -0
  464. package/dist/multimodel/runner.test.d.ts +5 -0
  465. package/dist/multimodel/runner.test.d.ts.map +1 -0
  466. package/dist/multimodel/runner.test.js +224 -0
  467. package/dist/multimodel/runner.test.js.map +1 -0
  468. package/dist/multimodel/types.d.ts +202 -0
  469. package/dist/multimodel/types.d.ts.map +1 -0
  470. package/dist/multimodel/types.js +10 -0
  471. package/dist/multimodel/types.js.map +1 -0
  472. package/dist/observability/index.d.ts +9 -0
  473. package/dist/observability/index.d.ts.map +1 -0
  474. package/dist/observability/index.js +9 -0
  475. package/dist/observability/index.js.map +1 -0
  476. package/dist/observability/otel.d.ts +102 -0
  477. package/dist/observability/otel.d.ts.map +1 -0
  478. package/dist/observability/otel.js +284 -0
  479. package/dist/observability/otel.js.map +1 -0
  480. package/dist/plugins/index.d.ts +10 -0
  481. package/dist/plugins/index.d.ts.map +1 -0
  482. package/dist/plugins/index.js +10 -0
  483. package/dist/plugins/index.js.map +1 -0
  484. package/dist/plugins/loader.d.ts +78 -0
  485. package/dist/plugins/loader.d.ts.map +1 -0
  486. package/dist/plugins/loader.js +470 -0
  487. package/dist/plugins/loader.js.map +1 -0
  488. package/dist/plugins/types.d.ts +304 -0
  489. package/dist/plugins/types.d.ts.map +1 -0
  490. package/dist/plugins/types.js +100 -0
  491. package/dist/plugins/types.js.map +1 -0
  492. package/dist/sbom/cyclonedx.d.ts +30 -0
  493. package/dist/sbom/cyclonedx.d.ts.map +1 -0
  494. package/dist/sbom/cyclonedx.js +392 -0
  495. package/dist/sbom/cyclonedx.js.map +1 -0
  496. package/dist/sbom/cyclonedx.test.d.ts +5 -0
  497. package/dist/sbom/cyclonedx.test.d.ts.map +1 -0
  498. package/dist/sbom/cyclonedx.test.js +244 -0
  499. package/dist/sbom/cyclonedx.test.js.map +1 -0
  500. package/dist/sbom/index.d.ts +13 -0
  501. package/dist/sbom/index.d.ts.map +1 -0
  502. package/dist/sbom/index.js +15 -0
  503. package/dist/sbom/index.js.map +1 -0
  504. package/dist/sbom/provenance.d.ts +37 -0
  505. package/dist/sbom/provenance.d.ts.map +1 -0
  506. package/dist/sbom/provenance.js +268 -0
  507. package/dist/sbom/provenance.js.map +1 -0
  508. package/dist/sbom/provenance.test.d.ts +5 -0
  509. package/dist/sbom/provenance.test.d.ts.map +1 -0
  510. package/dist/sbom/provenance.test.js +189 -0
  511. package/dist/sbom/provenance.test.js.map +1 -0
  512. package/dist/sbom/signing.d.ts +87 -0
  513. package/dist/sbom/signing.d.ts.map +1 -0
  514. package/dist/sbom/signing.js +354 -0
  515. package/dist/sbom/signing.js.map +1 -0
  516. package/dist/sbom/signing.test.d.ts +5 -0
  517. package/dist/sbom/signing.test.d.ts.map +1 -0
  518. package/dist/sbom/signing.test.js +170 -0
  519. package/dist/sbom/signing.test.js.map +1 -0
  520. package/dist/sbom/types.d.ts +384 -0
  521. package/dist/sbom/types.d.ts.map +1 -0
  522. package/dist/sbom/types.js +17 -0
  523. package/dist/sbom/types.js.map +1 -0
  524. package/dist/scanners/agent/credential-scope-audit.d.ts +40 -0
  525. package/dist/scanners/agent/credential-scope-audit.d.ts.map +1 -0
  526. package/dist/scanners/agent/credential-scope-audit.js +404 -0
  527. package/dist/scanners/agent/credential-scope-audit.js.map +1 -0
  528. package/dist/scanners/agent/exfil-path-graph.d.ts +50 -0
  529. package/dist/scanners/agent/exfil-path-graph.d.ts.map +1 -0
  530. package/dist/scanners/agent/exfil-path-graph.js +764 -0
  531. package/dist/scanners/agent/exfil-path-graph.js.map +1 -0
  532. package/dist/scanners/agent/index.d.ts +43 -0
  533. package/dist/scanners/agent/index.d.ts.map +1 -0
  534. package/dist/scanners/agent/index.js +616 -0
  535. package/dist/scanners/agent/index.js.map +1 -0
  536. package/dist/scanners/agent/manifest-audit.d.ts +43 -0
  537. package/dist/scanners/agent/manifest-audit.d.ts.map +1 -0
  538. package/dist/scanners/agent/manifest-audit.js +403 -0
  539. package/dist/scanners/agent/manifest-audit.js.map +1 -0
  540. package/dist/scanners/agent/payloads/index.d.ts +44 -0
  541. package/dist/scanners/agent/payloads/index.d.ts.map +1 -0
  542. package/dist/scanners/agent/payloads/index.js +184 -0
  543. package/dist/scanners/agent/payloads/index.js.map +1 -0
  544. package/dist/scanners/agent/permission-minimiser.d.ts +48 -0
  545. package/dist/scanners/agent/permission-minimiser.d.ts.map +1 -0
  546. package/dist/scanners/agent/permission-minimiser.js +551 -0
  547. package/dist/scanners/agent/permission-minimiser.js.map +1 -0
  548. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts +39 -0
  549. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -0
  550. package/dist/scanners/agent/prompt-injection-fuzzer.js +720 -0
  551. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -0
  552. package/dist/scanners/agent/sandbox-audit.d.ts +44 -0
  553. package/dist/scanners/agent/sandbox-audit.d.ts.map +1 -0
  554. package/dist/scanners/agent/sandbox-audit.js +425 -0
  555. package/dist/scanners/agent/sandbox-audit.js.map +1 -0
  556. package/dist/scanners/agent/supply-chain-mcp.d.ts +53 -0
  557. package/dist/scanners/agent/supply-chain-mcp.d.ts.map +1 -0
  558. package/dist/scanners/agent/supply-chain-mcp.js +479 -0
  559. package/dist/scanners/agent/supply-chain-mcp.js.map +1 -0
  560. package/dist/scanners/agent/tool-description-drift.d.ts +62 -0
  561. package/dist/scanners/agent/tool-description-drift.d.ts.map +1 -0
  562. package/dist/scanners/agent/tool-description-drift.js +365 -0
  563. package/dist/scanners/agent/tool-description-drift.js.map +1 -0
  564. package/dist/scanners/agent/types.d.ts +840 -0
  565. package/dist/scanners/agent/types.d.ts.map +1 -0
  566. package/dist/scanners/agent/types.js +149 -0
  567. package/dist/scanners/agent/types.js.map +1 -0
  568. package/dist/scanners/bandit.d.ts +25 -0
  569. package/dist/scanners/bandit.d.ts.map +1 -0
  570. package/dist/scanners/bandit.js +129 -0
  571. package/dist/scanners/bandit.js.map +1 -0
  572. package/dist/scanners/binary-analysis.d.ts +41 -0
  573. package/dist/scanners/binary-analysis.d.ts.map +1 -0
  574. package/dist/scanners/binary-analysis.js +587 -0
  575. package/dist/scanners/binary-analysis.js.map +1 -0
  576. package/dist/scanners/binary-analysis.test.d.ts +5 -0
  577. package/dist/scanners/binary-analysis.test.d.ts.map +1 -0
  578. package/dist/scanners/binary-analysis.test.js +291 -0
  579. package/dist/scanners/binary-analysis.test.js.map +1 -0
  580. package/dist/scanners/brakeman.d.ts +30 -0
  581. package/dist/scanners/brakeman.d.ts.map +1 -0
  582. package/dist/scanners/brakeman.js +271 -0
  583. package/dist/scanners/brakeman.js.map +1 -0
  584. package/dist/scanners/dependencies.d.ts +22 -0
  585. package/dist/scanners/dependencies.d.ts.map +1 -0
  586. package/dist/scanners/dependencies.js +202 -0
  587. package/dist/scanners/dependencies.js.map +1 -0
  588. package/dist/scanners/dependencies.test.d.ts +5 -0
  589. package/dist/scanners/dependencies.test.d.ts.map +1 -0
  590. package/dist/scanners/dependencies.test.js +185 -0
  591. package/dist/scanners/dependencies.test.js.map +1 -0
  592. package/dist/scanners/eslint.d.ts +25 -0
  593. package/dist/scanners/eslint.d.ts.map +1 -0
  594. package/dist/scanners/eslint.js +220 -0
  595. package/dist/scanners/eslint.js.map +1 -0
  596. package/dist/scanners/gosec.d.ts +25 -0
  597. package/dist/scanners/gosec.d.ts.map +1 -0
  598. package/dist/scanners/gosec.js +128 -0
  599. package/dist/scanners/gosec.js.map +1 -0
  600. package/dist/scanners/index.d.ts +128 -0
  601. package/dist/scanners/index.d.ts.map +1 -0
  602. package/dist/scanners/index.js +811 -0
  603. package/dist/scanners/index.js.map +1 -0
  604. package/dist/scanners/index.test.d.ts +5 -0
  605. package/dist/scanners/index.test.d.ts.map +1 -0
  606. package/dist/scanners/index.test.js +424 -0
  607. package/dist/scanners/index.test.js.map +1 -0
  608. package/dist/scanners/memory-safety.d.ts +44 -0
  609. package/dist/scanners/memory-safety.d.ts.map +1 -0
  610. package/dist/scanners/memory-safety.js +571 -0
  611. package/dist/scanners/memory-safety.js.map +1 -0
  612. package/dist/scanners/memory-safety.test.d.ts +5 -0
  613. package/dist/scanners/memory-safety.test.d.ts.map +1 -0
  614. package/dist/scanners/memory-safety.test.js +321 -0
  615. package/dist/scanners/memory-safety.test.js.map +1 -0
  616. package/dist/scanners/race-condition.d.ts +25 -0
  617. package/dist/scanners/race-condition.d.ts.map +1 -0
  618. package/dist/scanners/race-condition.js +443 -0
  619. package/dist/scanners/race-condition.js.map +1 -0
  620. package/dist/scanners/race-condition.test.d.ts +5 -0
  621. package/dist/scanners/race-condition.test.d.ts.map +1 -0
  622. package/dist/scanners/race-condition.test.js +428 -0
  623. package/dist/scanners/race-condition.test.js.map +1 -0
  624. package/dist/scanners/secrets.d.ts +25 -0
  625. package/dist/scanners/secrets.d.ts.map +1 -0
  626. package/dist/scanners/secrets.js +367 -0
  627. package/dist/scanners/secrets.js.map +1 -0
  628. package/dist/scanners/secrets.test.d.ts +5 -0
  629. package/dist/scanners/secrets.test.d.ts.map +1 -0
  630. package/dist/scanners/secrets.test.js +160 -0
  631. package/dist/scanners/secrets.test.js.map +1 -0
  632. package/dist/scanners/semgrep.d.ts +33 -0
  633. package/dist/scanners/semgrep.d.ts.map +1 -0
  634. package/dist/scanners/semgrep.js +350 -0
  635. package/dist/scanners/semgrep.js.map +1 -0
  636. package/dist/scanners/semgrep.test.d.ts +8 -0
  637. package/dist/scanners/semgrep.test.d.ts.map +1 -0
  638. package/dist/scanners/semgrep.test.js +254 -0
  639. package/dist/scanners/semgrep.test.js.map +1 -0
  640. package/dist/scanners/trivy.d.ts +26 -0
  641. package/dist/scanners/trivy.d.ts.map +1 -0
  642. package/dist/scanners/trivy.js +187 -0
  643. package/dist/scanners/trivy.js.map +1 -0
  644. package/dist/scanners/types.d.ts +210 -0
  645. package/dist/scanners/types.d.ts.map +1 -0
  646. package/dist/scanners/types.js +106 -0
  647. package/dist/scanners/types.js.map +1 -0
  648. package/dist/scanners/types.test.d.ts +5 -0
  649. package/dist/scanners/types.test.d.ts.map +1 -0
  650. package/dist/scanners/types.test.js +103 -0
  651. package/dist/scanners/types.test.js.map +1 -0
  652. package/dist/scanners/typescript.d.ts +32 -0
  653. package/dist/scanners/typescript.d.ts.map +1 -0
  654. package/dist/scanners/typescript.js +300 -0
  655. package/dist/scanners/typescript.js.map +1 -0
  656. package/dist/scanners/typescript.test.d.ts +5 -0
  657. package/dist/scanners/typescript.test.d.ts.map +1 -0
  658. package/dist/scanners/typescript.test.js +296 -0
  659. package/dist/scanners/typescript.test.js.map +1 -0
  660. package/dist/transcripts/index.d.ts +13 -0
  661. package/dist/transcripts/index.d.ts.map +1 -0
  662. package/dist/transcripts/index.js +17 -0
  663. package/dist/transcripts/index.js.map +1 -0
  664. package/dist/transcripts/logger.d.ts +190 -0
  665. package/dist/transcripts/logger.d.ts.map +1 -0
  666. package/dist/transcripts/logger.js +385 -0
  667. package/dist/transcripts/logger.js.map +1 -0
  668. package/dist/transcripts/logger.test.d.ts +5 -0
  669. package/dist/transcripts/logger.test.d.ts.map +1 -0
  670. package/dist/transcripts/logger.test.js +227 -0
  671. package/dist/transcripts/logger.test.js.map +1 -0
  672. package/dist/transcripts/redaction.d.ts +125 -0
  673. package/dist/transcripts/redaction.d.ts.map +1 -0
  674. package/dist/transcripts/redaction.js +416 -0
  675. package/dist/transcripts/redaction.js.map +1 -0
  676. package/dist/transcripts/redaction.test.d.ts +5 -0
  677. package/dist/transcripts/redaction.test.d.ts.map +1 -0
  678. package/dist/transcripts/redaction.test.js +267 -0
  679. package/dist/transcripts/redaction.test.js.map +1 -0
  680. package/dist/transcripts/signing.d.ts +108 -0
  681. package/dist/transcripts/signing.d.ts.map +1 -0
  682. package/dist/transcripts/signing.js +173 -0
  683. package/dist/transcripts/signing.js.map +1 -0
  684. package/dist/transcripts/verifier.d.ts +133 -0
  685. package/dist/transcripts/verifier.d.ts.map +1 -0
  686. package/dist/transcripts/verifier.js +489 -0
  687. package/dist/transcripts/verifier.js.map +1 -0
  688. package/dist/transcripts/verifier.test.d.ts +5 -0
  689. package/dist/transcripts/verifier.test.d.ts.map +1 -0
  690. package/dist/transcripts/verifier.test.js +330 -0
  691. package/dist/transcripts/verifier.test.js.map +1 -0
  692. package/dist/util/concurrency.d.ts +221 -0
  693. package/dist/util/concurrency.d.ts.map +1 -0
  694. package/dist/util/concurrency.js +339 -0
  695. package/dist/util/concurrency.js.map +1 -0
  696. package/dist/util/index.d.ts +12 -0
  697. package/dist/util/index.d.ts.map +1 -0
  698. package/dist/util/index.js +12 -0
  699. package/dist/util/index.js.map +1 -0
  700. package/dist/util/json.d.ts +63 -0
  701. package/dist/util/json.d.ts.map +1 -0
  702. package/dist/util/json.js +134 -0
  703. package/dist/util/json.js.map +1 -0
  704. package/dist/util/paths.d.ts +56 -0
  705. package/dist/util/paths.d.ts.map +1 -0
  706. package/dist/util/paths.js +128 -0
  707. package/dist/util/paths.js.map +1 -0
  708. package/dist/util/retry.d.ts +185 -0
  709. package/dist/util/retry.d.ts.map +1 -0
  710. package/dist/util/retry.js +338 -0
  711. package/dist/util/retry.js.map +1 -0
  712. package/package.json +79 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Path Validation Utilities
3
+ *
4
+ * Security-focused path validation to prevent path traversal attacks
5
+ * and ensure paths are within allowed boundaries.
6
+ *
7
+ * @module util/paths
8
+ */
9
+ import { stat, lstat, realpath } from "fs/promises";
10
+ import path from "path";
11
+ /**
12
+ * Error thrown when path validation fails
13
+ */
14
+ export class PathValidationError extends Error {
15
+ path;
16
+ reason;
17
+ constructor(message, path, reason) {
18
+ super(message);
19
+ this.path = path;
20
+ this.reason = reason;
21
+ this.name = "PathValidationError";
22
+ }
23
+ }
24
+ /**
25
+ * Validate a project path for security
26
+ *
27
+ * Checks:
28
+ * 1. Path is absolute after resolution
29
+ * 2. Path exists on the filesystem
30
+ * 3. Path is a directory (optional)
31
+ * 4. Symlinks are resolved and checked (optional)
32
+ * 5. Path doesn't escape base directory (optional)
33
+ *
34
+ * @param projectPath - The path to validate
35
+ * @param options - Validation options
36
+ * @returns The validated, resolved absolute path
37
+ * @throws PathValidationError if validation fails
38
+ */
39
+ export async function validateProjectPath(projectPath, options = {}) {
40
+ const { requireDirectory = true, allowSymlinks = false, basePath } = options;
41
+ // Resolve to absolute path
42
+ const resolvedPath = path.resolve(projectPath);
43
+ // Check for path traversal attempts
44
+ if (projectPath.includes("..") && !path.isAbsolute(projectPath)) {
45
+ // Verify the resolved path doesn't escape intended boundaries
46
+ const normalizedInput = path.normalize(projectPath);
47
+ if (normalizedInput.startsWith("..")) {
48
+ throw new PathValidationError(`Path traversal detected: ${projectPath}`, projectPath, "path_traversal");
49
+ }
50
+ }
51
+ try {
52
+ // Check if path exists (using lstat to detect symlinks)
53
+ const lstats = await lstat(resolvedPath);
54
+ // Handle symlinks
55
+ if (lstats.isSymbolicLink()) {
56
+ if (!allowSymlinks) {
57
+ // Resolve the symlink and verify it doesn't escape
58
+ const realPath = await realpath(resolvedPath);
59
+ // If basePath is specified, ensure symlink target is within it
60
+ if (basePath) {
61
+ const resolvedBase = path.resolve(basePath);
62
+ if (!realPath.startsWith(resolvedBase)) {
63
+ throw new PathValidationError(`Symlink escapes base directory: ${projectPath} -> ${realPath}`, projectPath, "symlink_escape");
64
+ }
65
+ }
66
+ // Use the real path
67
+ const realStats = await stat(realPath);
68
+ if (requireDirectory && !realStats.isDirectory()) {
69
+ throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
70
+ }
71
+ return realPath;
72
+ }
73
+ }
74
+ // Check if it's a directory (if required)
75
+ if (requireDirectory && !lstats.isDirectory()) {
76
+ throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
77
+ }
78
+ // If basePath is specified, ensure the path is within it
79
+ if (basePath) {
80
+ const resolvedBase = path.resolve(basePath);
81
+ if (!resolvedPath.startsWith(resolvedBase)) {
82
+ throw new PathValidationError(`Path is outside base directory: ${projectPath}`, projectPath, "path_traversal");
83
+ }
84
+ }
85
+ return resolvedPath;
86
+ }
87
+ catch (error) {
88
+ if (error instanceof PathValidationError) {
89
+ throw error;
90
+ }
91
+ // Handle ENOENT (file not found)
92
+ if (error.code === "ENOENT") {
93
+ throw new PathValidationError(`Path does not exist: ${projectPath}`, projectPath, "not_found");
94
+ }
95
+ // Re-throw other errors
96
+ throw new PathValidationError(`Invalid path: ${projectPath} - ${error.message}`, projectPath, "invalid_path");
97
+ }
98
+ }
99
+ /**
100
+ * Validate a file path (not requiring directory)
101
+ */
102
+ export async function validateFilePath(filePath, options = {}) {
103
+ return validateProjectPath(filePath, { ...options, requireDirectory: false });
104
+ }
105
+ /**
106
+ * Check if a path is safe (doesn't throw, returns boolean)
107
+ */
108
+ export async function isPathSafe(projectPath, options = {}) {
109
+ try {
110
+ await validateProjectPath(projectPath, options);
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ /**
118
+ * Sanitize a path for use in error messages (remove sensitive info)
119
+ */
120
+ export function sanitizePathForLogging(inputPath) {
121
+ // Remove home directory prefix if present
122
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
123
+ if (homeDir && inputPath.startsWith(homeDir)) {
124
+ return "~" + inputPath.slice(homeDir.length);
125
+ }
126
+ return inputPath;
127
+ }
128
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Retry and Circuit Breaker Utilities
3
+ *
4
+ * Provides retry logic with exponential backoff and circuit breaker pattern
5
+ * for handling transient failures in scanner and LLM operations.
6
+ *
7
+ * @module util/retry
8
+ */
9
+ /**
10
+ * Error classification for retry decisions
11
+ */
12
+ export type ErrorType = "transient" | "permanent" | "unknown";
13
+ /**
14
+ * Circuit breaker state
15
+ */
16
+ export type CircuitState = "closed" | "open" | "half-open";
17
+ /**
18
+ * Options for retry behavior
19
+ */
20
+ export interface RetryOptions {
21
+ /** Maximum number of retry attempts (default: 3) */
22
+ maxAttempts?: number;
23
+ /** Initial delay in ms before first retry (default: 1000) */
24
+ initialDelayMs?: number;
25
+ /** Maximum delay in ms between retries (default: 30000) */
26
+ maxDelayMs?: number;
27
+ /** Multiplier for exponential backoff (default: 2) */
28
+ backoffMultiplier?: number;
29
+ /** Add jitter to delays to prevent thundering herd (default: true) */
30
+ jitter?: boolean;
31
+ /** Timeout for each attempt in ms (optional) */
32
+ attemptTimeoutMs?: number;
33
+ /** Custom error classifier (default: classifyError) */
34
+ classifyError?: (error: Error) => ErrorType;
35
+ /** Callback for retry attempts */
36
+ onRetry?: (attempt: number, error: Error, delayMs: number) => void;
37
+ }
38
+ /**
39
+ * Circuit breaker options
40
+ */
41
+ export interface CircuitBreakerOptions {
42
+ /** Number of failures before opening circuit (default: 5) */
43
+ failureThreshold?: number;
44
+ /** Time in ms before attempting to close circuit (default: 30000) */
45
+ resetTimeoutMs?: number;
46
+ /** Number of successes in half-open state to close circuit (default: 2) */
47
+ successThreshold?: number;
48
+ /** Callback when circuit state changes */
49
+ onStateChange?: (from: CircuitState, to: CircuitState) => void;
50
+ }
51
+ /**
52
+ * Classify an error as transient or permanent
53
+ *
54
+ * Transient errors (should retry):
55
+ * - Timeout errors (ETIMEDOUT, ESOCKETTIMEDOUT)
56
+ * - Rate limiting (429)
57
+ * - Server errors (5xx)
58
+ * - Network errors (ECONNRESET, ECONNREFUSED, ENOTFOUND)
59
+ *
60
+ * Permanent errors (should not retry):
61
+ * - File not found (ENOENT)
62
+ * - Permission denied (EACCES, EPERM)
63
+ * - Invalid input (4xx except 429)
64
+ * - Authentication errors (401, 403)
65
+ */
66
+ export declare function classifyError(error: Error): ErrorType;
67
+ /**
68
+ * Retry error thrown when all attempts fail
69
+ */
70
+ export declare class RetryError extends Error {
71
+ readonly attempts: number;
72
+ readonly lastError: Error;
73
+ readonly errors: Error[];
74
+ constructor(message: string, attempts: number, lastError: Error, errors: Error[]);
75
+ }
76
+ /**
77
+ * Circuit breaker error thrown when circuit is open
78
+ */
79
+ export declare class CircuitOpenError extends Error {
80
+ readonly circuitName: string;
81
+ readonly openedAt: Date;
82
+ readonly resetAt: Date;
83
+ constructor(circuitName: string, openedAt: Date, resetAt: Date);
84
+ }
85
+ /**
86
+ * Execute a function with retry logic
87
+ *
88
+ * @param fn - The async function to execute
89
+ * @param options - Retry options
90
+ * @returns The result of the function
91
+ * @throws RetryError if all attempts fail
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * const result = await withRetry(
96
+ * () => fetchData(),
97
+ * { maxAttempts: 3, onRetry: (attempt, err) => console.log(`Retry ${attempt}: ${err.message}`) }
98
+ * );
99
+ * ```
100
+ */
101
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
102
+ /**
103
+ * Circuit breaker implementation
104
+ *
105
+ * States:
106
+ * - CLOSED: Normal operation, requests pass through
107
+ * - OPEN: Circuit tripped, requests fail fast
108
+ * - HALF-OPEN: Testing if service recovered
109
+ */
110
+ export declare class CircuitBreaker {
111
+ private state;
112
+ private failures;
113
+ private successes;
114
+ private lastFailureTime;
115
+ private readonly name;
116
+ private readonly failureThreshold;
117
+ private readonly resetTimeoutMs;
118
+ private readonly successThreshold;
119
+ private readonly onStateChange?;
120
+ constructor(name: string, options?: CircuitBreakerOptions);
121
+ /**
122
+ * Get the current circuit state
123
+ */
124
+ getState(): CircuitState;
125
+ /**
126
+ * Check if the circuit allows requests
127
+ */
128
+ canExecute(): boolean;
129
+ /**
130
+ * Execute a function through the circuit breaker
131
+ *
132
+ * @param fn - The async function to execute
133
+ * @returns The result of the function
134
+ * @throws CircuitOpenError if circuit is open
135
+ */
136
+ execute<T>(fn: () => Promise<T>): Promise<T>;
137
+ /**
138
+ * Record a successful execution
139
+ */
140
+ private onSuccess;
141
+ /**
142
+ * Record a failed execution
143
+ */
144
+ private onFailure;
145
+ /**
146
+ * Transition to a new state
147
+ */
148
+ private transition;
149
+ /**
150
+ * Reset the circuit breaker
151
+ */
152
+ private reset;
153
+ /**
154
+ * Force the circuit to a specific state (for testing)
155
+ */
156
+ forceState(state: CircuitState): void;
157
+ /**
158
+ * Get circuit breaker stats
159
+ */
160
+ getStats(): {
161
+ name: string;
162
+ state: CircuitState;
163
+ failures: number;
164
+ successes: number;
165
+ lastFailureTime: Date | null;
166
+ };
167
+ }
168
+ /**
169
+ * Execute a function with both retry and circuit breaker
170
+ *
171
+ * @param circuitBreaker - The circuit breaker instance
172
+ * @param fn - The async function to execute
173
+ * @param retryOptions - Retry options
174
+ * @returns The result of the function
175
+ */
176
+ export declare function withRetryAndCircuitBreaker<T>(circuitBreaker: CircuitBreaker, fn: () => Promise<T>, retryOptions?: RetryOptions): Promise<T>;
177
+ /**
178
+ * Create a retry wrapper for a function
179
+ *
180
+ * @param fn - The async function to wrap
181
+ * @param options - Retry options
182
+ * @returns A wrapped function that retries on failure
183
+ */
184
+ export declare function createRetryWrapper<TArgs extends unknown[], TResult>(fn: (...args: TArgs) => Promise<TResult>, options?: RetryOptions): (...args: TArgs) => Promise<TResult>;
185
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Retry and Circuit Breaker Utilities
3
+ *
4
+ * Provides retry logic with exponential backoff and circuit breaker pattern
5
+ * for handling transient failures in scanner and LLM operations.
6
+ *
7
+ * @module util/retry
8
+ */
9
+ /**
10
+ * Classify an error as transient or permanent
11
+ *
12
+ * Transient errors (should retry):
13
+ * - Timeout errors (ETIMEDOUT, ESOCKETTIMEDOUT)
14
+ * - Rate limiting (429)
15
+ * - Server errors (5xx)
16
+ * - Network errors (ECONNRESET, ECONNREFUSED, ENOTFOUND)
17
+ *
18
+ * Permanent errors (should not retry):
19
+ * - File not found (ENOENT)
20
+ * - Permission denied (EACCES, EPERM)
21
+ * - Invalid input (4xx except 429)
22
+ * - Authentication errors (401, 403)
23
+ */
24
+ export function classifyError(error) {
25
+ const message = error.message.toLowerCase();
26
+ const code = error.code;
27
+ // Check for transient errors
28
+ if (code === "ETIMEDOUT" ||
29
+ code === "ESOCKETTIMEDOUT" ||
30
+ code === "ECONNRESET" ||
31
+ code === "ECONNREFUSED" ||
32
+ code === "ENOTFOUND" ||
33
+ code === "ENETUNREACH" ||
34
+ code === "EAI_AGAIN") {
35
+ return "transient";
36
+ }
37
+ // Check for permanent errors
38
+ if (code === "ENOENT" || code === "EACCES" || code === "EPERM" || code === "EEXIST") {
39
+ return "permanent";
40
+ }
41
+ // Check message for HTTP status codes
42
+ if (message.includes("429") || message.includes("rate limit")) {
43
+ return "transient";
44
+ }
45
+ if (message.includes("500") ||
46
+ message.includes("502") ||
47
+ message.includes("503") ||
48
+ message.includes("504") ||
49
+ message.includes("internal server error") ||
50
+ message.includes("bad gateway") ||
51
+ message.includes("service unavailable") ||
52
+ message.includes("gateway timeout")) {
53
+ return "transient";
54
+ }
55
+ if (message.includes("401") ||
56
+ message.includes("403") ||
57
+ message.includes("404") ||
58
+ message.includes("unauthorized") ||
59
+ message.includes("forbidden") ||
60
+ message.includes("not found")) {
61
+ return "permanent";
62
+ }
63
+ // Check for timeout in message
64
+ if (message.includes("timeout") || message.includes("timed out")) {
65
+ return "transient";
66
+ }
67
+ return "unknown";
68
+ }
69
+ /**
70
+ * Calculate delay with exponential backoff and optional jitter
71
+ */
72
+ function calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter) {
73
+ // Exponential backoff: initialDelay * multiplier^(attempt-1)
74
+ let delay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);
75
+ // Cap at max delay
76
+ delay = Math.min(delay, maxDelayMs);
77
+ // Add jitter (±25%)
78
+ if (jitter) {
79
+ const jitterRange = delay * 0.25;
80
+ delay = delay + (Math.random() * 2 - 1) * jitterRange;
81
+ }
82
+ return Math.round(delay);
83
+ }
84
+ /**
85
+ * Sleep for a given number of milliseconds
86
+ */
87
+ function sleep(ms) {
88
+ return new Promise((resolve) => setTimeout(resolve, ms));
89
+ }
90
+ /**
91
+ * Retry error thrown when all attempts fail
92
+ */
93
+ export class RetryError extends Error {
94
+ attempts;
95
+ lastError;
96
+ errors;
97
+ constructor(message, attempts, lastError, errors) {
98
+ super(message);
99
+ this.attempts = attempts;
100
+ this.lastError = lastError;
101
+ this.errors = errors;
102
+ this.name = "RetryError";
103
+ }
104
+ }
105
+ /**
106
+ * Circuit breaker error thrown when circuit is open
107
+ */
108
+ export class CircuitOpenError extends Error {
109
+ circuitName;
110
+ openedAt;
111
+ resetAt;
112
+ constructor(circuitName, openedAt, resetAt) {
113
+ super(`Circuit '${circuitName}' is open. Will reset at ${resetAt.toISOString()}`);
114
+ this.circuitName = circuitName;
115
+ this.openedAt = openedAt;
116
+ this.resetAt = resetAt;
117
+ this.name = "CircuitOpenError";
118
+ }
119
+ }
120
+ /**
121
+ * Execute a function with retry logic
122
+ *
123
+ * @param fn - The async function to execute
124
+ * @param options - Retry options
125
+ * @returns The result of the function
126
+ * @throws RetryError if all attempts fail
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const result = await withRetry(
131
+ * () => fetchData(),
132
+ * { maxAttempts: 3, onRetry: (attempt, err) => console.log(`Retry ${attempt}: ${err.message}`) }
133
+ * );
134
+ * ```
135
+ */
136
+ export async function withRetry(fn, options = {}) {
137
+ const { maxAttempts = 3, initialDelayMs = 1000, maxDelayMs = 30000, backoffMultiplier = 2, jitter = true, attemptTimeoutMs, classifyError: classifier = classifyError, onRetry, } = options;
138
+ const errors = [];
139
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
140
+ try {
141
+ // Wrap with timeout if specified
142
+ if (attemptTimeoutMs) {
143
+ return await Promise.race([
144
+ fn(),
145
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Attempt ${attempt} timed out after ${attemptTimeoutMs}ms`)), attemptTimeoutMs)),
146
+ ]);
147
+ }
148
+ return await fn();
149
+ }
150
+ catch (error) {
151
+ const err = error;
152
+ errors.push(err);
153
+ // Check if this is the last attempt
154
+ if (attempt >= maxAttempts) {
155
+ throw new RetryError(`All ${maxAttempts} attempts failed. Last error: ${err.message}`, attempt, err, errors);
156
+ }
157
+ // Classify the error
158
+ const errorType = classifier(err);
159
+ // Don't retry permanent errors
160
+ if (errorType === "permanent") {
161
+ throw new RetryError(`Permanent error after ${attempt} attempt(s): ${err.message}`, attempt, err, errors);
162
+ }
163
+ // Calculate delay for next attempt
164
+ const delayMs = calculateDelay(attempt, initialDelayMs, maxDelayMs, backoffMultiplier, jitter);
165
+ // Notify about retry
166
+ if (onRetry) {
167
+ onRetry(attempt, err, delayMs);
168
+ }
169
+ // Wait before retrying
170
+ await sleep(delayMs);
171
+ }
172
+ }
173
+ // This should never be reached, but TypeScript needs it
174
+ throw new Error("Unexpected retry loop exit");
175
+ }
176
+ /**
177
+ * Circuit breaker implementation
178
+ *
179
+ * States:
180
+ * - CLOSED: Normal operation, requests pass through
181
+ * - OPEN: Circuit tripped, requests fail fast
182
+ * - HALF-OPEN: Testing if service recovered
183
+ */
184
+ export class CircuitBreaker {
185
+ state = "closed";
186
+ failures = 0;
187
+ successes = 0;
188
+ lastFailureTime = null;
189
+ name;
190
+ failureThreshold;
191
+ resetTimeoutMs;
192
+ successThreshold;
193
+ onStateChange;
194
+ constructor(name, options = {}) {
195
+ this.name = name;
196
+ this.failureThreshold = options.failureThreshold ?? 5;
197
+ this.resetTimeoutMs = options.resetTimeoutMs ?? 30000;
198
+ this.successThreshold = options.successThreshold ?? 2;
199
+ this.onStateChange = options.onStateChange;
200
+ }
201
+ /**
202
+ * Get the current circuit state
203
+ */
204
+ getState() {
205
+ // Check if we should transition from open to half-open
206
+ if (this.state === "open" && this.lastFailureTime) {
207
+ const elapsed = Date.now() - this.lastFailureTime.getTime();
208
+ if (elapsed >= this.resetTimeoutMs) {
209
+ this.transition("half-open");
210
+ }
211
+ }
212
+ return this.state;
213
+ }
214
+ /**
215
+ * Check if the circuit allows requests
216
+ */
217
+ canExecute() {
218
+ const state = this.getState();
219
+ return state === "closed" || state === "half-open";
220
+ }
221
+ /**
222
+ * Execute a function through the circuit breaker
223
+ *
224
+ * @param fn - The async function to execute
225
+ * @returns The result of the function
226
+ * @throws CircuitOpenError if circuit is open
227
+ */
228
+ async execute(fn) {
229
+ const state = this.getState();
230
+ if (state === "open") {
231
+ const resetAt = new Date(this.lastFailureTime.getTime() + this.resetTimeoutMs);
232
+ throw new CircuitOpenError(this.name, this.lastFailureTime, resetAt);
233
+ }
234
+ try {
235
+ const result = await fn();
236
+ this.onSuccess();
237
+ return result;
238
+ }
239
+ catch (error) {
240
+ this.onFailure();
241
+ throw error;
242
+ }
243
+ }
244
+ /**
245
+ * Record a successful execution
246
+ */
247
+ onSuccess() {
248
+ if (this.state === "half-open") {
249
+ this.successes++;
250
+ if (this.successes >= this.successThreshold) {
251
+ this.transition("closed");
252
+ this.reset();
253
+ }
254
+ }
255
+ else {
256
+ // Reset failure count on success in closed state
257
+ this.failures = 0;
258
+ }
259
+ }
260
+ /**
261
+ * Record a failed execution
262
+ */
263
+ onFailure() {
264
+ this.failures++;
265
+ this.lastFailureTime = new Date();
266
+ if (this.state === "half-open") {
267
+ // Any failure in half-open goes back to open
268
+ this.transition("open");
269
+ this.successes = 0;
270
+ }
271
+ else if (this.state === "closed" && this.failures >= this.failureThreshold) {
272
+ this.transition("open");
273
+ }
274
+ }
275
+ /**
276
+ * Transition to a new state
277
+ */
278
+ transition(newState) {
279
+ if (this.state !== newState) {
280
+ const oldState = this.state;
281
+ this.state = newState;
282
+ if (this.onStateChange) {
283
+ this.onStateChange(oldState, newState);
284
+ }
285
+ }
286
+ }
287
+ /**
288
+ * Reset the circuit breaker
289
+ */
290
+ reset() {
291
+ this.failures = 0;
292
+ this.successes = 0;
293
+ this.lastFailureTime = null;
294
+ }
295
+ /**
296
+ * Force the circuit to a specific state (for testing)
297
+ */
298
+ forceState(state) {
299
+ this.transition(state);
300
+ if (state === "closed") {
301
+ this.reset();
302
+ }
303
+ }
304
+ /**
305
+ * Get circuit breaker stats
306
+ */
307
+ getStats() {
308
+ return {
309
+ name: this.name,
310
+ state: this.getState(),
311
+ failures: this.failures,
312
+ successes: this.successes,
313
+ lastFailureTime: this.lastFailureTime,
314
+ };
315
+ }
316
+ }
317
+ /**
318
+ * Execute a function with both retry and circuit breaker
319
+ *
320
+ * @param circuitBreaker - The circuit breaker instance
321
+ * @param fn - The async function to execute
322
+ * @param retryOptions - Retry options
323
+ * @returns The result of the function
324
+ */
325
+ export async function withRetryAndCircuitBreaker(circuitBreaker, fn, retryOptions = {}) {
326
+ return circuitBreaker.execute(() => withRetry(fn, retryOptions));
327
+ }
328
+ /**
329
+ * Create a retry wrapper for a function
330
+ *
331
+ * @param fn - The async function to wrap
332
+ * @param options - Retry options
333
+ * @returns A wrapped function that retries on failure
334
+ */
335
+ export function createRetryWrapper(fn, options = {}) {
336
+ return (...args) => withRetry(() => fn(...args), options);
337
+ }
338
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"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"}