shield360 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +330 -3
  2. package/dist/__tests__/build-info.test.js +8 -1
  3. package/dist/__tests__/build-info.test.js.map +1 -1
  4. package/dist/__tests__/code-location.test.js +1 -1
  5. package/dist/__tests__/destination.test.js +15 -0
  6. package/dist/__tests__/destination.test.js.map +1 -1
  7. package/dist/__tests__/masking.test.d.ts +1 -0
  8. package/dist/__tests__/masking.test.js +66 -0
  9. package/dist/__tests__/masking.test.js.map +1 -0
  10. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/register.e2e.test.js +279 -0
  12. package/dist/__tests__/register.e2e.test.js.map +1 -0
  13. package/dist/__tests__/register.test.js +60 -0
  14. package/dist/__tests__/register.test.js.map +1 -1
  15. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  16. package/dist/agents/__tests__/agents.test.js +529 -0
  17. package/dist/agents/__tests__/agents.test.js.map +1 -0
  18. package/dist/agents/index.d.ts +15 -0
  19. package/dist/agents/index.js +25 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/passport.d.ts +92 -0
  22. package/dist/agents/passport.js +301 -0
  23. package/dist/agents/passport.js.map +1 -0
  24. package/dist/agents/policy.d.ts +24 -0
  25. package/dist/agents/policy.js +93 -0
  26. package/dist/agents/policy.js.map +1 -0
  27. package/dist/agents/replay.d.ts +20 -0
  28. package/dist/agents/replay.js +47 -0
  29. package/dist/agents/replay.js.map +1 -0
  30. package/dist/agents/report.d.ts +30 -0
  31. package/dist/agents/report.js +93 -0
  32. package/dist/agents/report.js.map +1 -0
  33. package/dist/agents/types.d.ts +148 -0
  34. package/dist/agents/types.js +37 -0
  35. package/dist/agents/types.js.map +1 -0
  36. package/dist/agents/verifier.d.ts +33 -0
  37. package/dist/agents/verifier.js +276 -0
  38. package/dist/agents/verifier.js.map +1 -0
  39. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  40. package/dist/ai-security/__tests__/bench.test.js +50 -0
  41. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  42. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/checks.test.js +248 -0
  44. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/config.test.js +164 -0
  47. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/detection.test.js +114 -0
  50. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  52. package/dist/ai-security/__tests__/fixtures.js +30 -0
  53. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  54. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  55. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  56. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  57. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/stream.test.js +85 -0
  59. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  60. package/dist/ai-security/config.d.ts +94 -0
  61. package/dist/ai-security/config.js +241 -0
  62. package/dist/ai-security/config.js.map +1 -0
  63. package/dist/ai-security/context.d.ts +45 -0
  64. package/dist/ai-security/context.js +108 -0
  65. package/dist/ai-security/context.js.map +1 -0
  66. package/dist/ai-security/custom-kinds.d.ts +23 -0
  67. package/dist/ai-security/custom-kinds.js +97 -0
  68. package/dist/ai-security/custom-kinds.js.map +1 -0
  69. package/dist/ai-security/events.d.ts +77 -0
  70. package/dist/ai-security/events.js +153 -0
  71. package/dist/ai-security/events.js.map +1 -0
  72. package/dist/ai-security/hooks.d.ts +48 -0
  73. package/dist/ai-security/hooks.js +461 -0
  74. package/dist/ai-security/hooks.js.map +1 -0
  75. package/dist/ai-security/index.d.ts +209 -0
  76. package/dist/ai-security/index.js +587 -0
  77. package/dist/ai-security/index.js.map +1 -0
  78. package/dist/ai-security/injection-rules.json +1024 -0
  79. package/dist/ai-security/injection.d.ts +46 -0
  80. package/dist/ai-security/injection.js +635 -0
  81. package/dist/ai-security/injection.js.map +1 -0
  82. package/dist/ai-security/jailbreak.d.ts +38 -0
  83. package/dist/ai-security/jailbreak.js +73 -0
  84. package/dist/ai-security/jailbreak.js.map +1 -0
  85. package/dist/ai-security/limits.d.ts +84 -0
  86. package/dist/ai-security/limits.js +195 -0
  87. package/dist/ai-security/limits.js.map +1 -0
  88. package/dist/ai-security/mcp.d.ts +82 -0
  89. package/dist/ai-security/mcp.js +150 -0
  90. package/dist/ai-security/mcp.js.map +1 -0
  91. package/dist/ai-security/output.d.ts +107 -0
  92. package/dist/ai-security/output.js +390 -0
  93. package/dist/ai-security/output.js.map +1 -0
  94. package/dist/ai-security/policy.d.ts +125 -0
  95. package/dist/ai-security/policy.js +196 -0
  96. package/dist/ai-security/policy.js.map +1 -0
  97. package/dist/ai-security/rag.d.ts +70 -0
  98. package/dist/ai-security/rag.js +174 -0
  99. package/dist/ai-security/rag.js.map +1 -0
  100. package/dist/ai-security/tool-rules.json +203 -0
  101. package/dist/ai-security/tools.d.ts +46 -0
  102. package/dist/ai-security/tools.js +62 -0
  103. package/dist/ai-security/tools.js.map +1 -0
  104. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  105. package/dist/budgets/__tests__/budgets.test.js +134 -0
  106. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  107. package/dist/budgets/auto.d.ts +25 -0
  108. package/dist/budgets/auto.js +63 -0
  109. package/dist/budgets/auto.js.map +1 -0
  110. package/dist/budgets/index.d.ts +110 -0
  111. package/dist/budgets/index.js +239 -0
  112. package/dist/budgets/index.js.map +1 -0
  113. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  114. package/dist/customer/__tests__/customer.test.js +155 -0
  115. package/dist/customer/__tests__/customer.test.js.map +1 -0
  116. package/dist/customer/index.d.ts +48 -0
  117. package/dist/customer/index.js +132 -0
  118. package/dist/customer/index.js.map +1 -0
  119. package/dist/destination.d.ts +14 -0
  120. package/dist/destination.js +16 -0
  121. package/dist/destination.js.map +1 -1
  122. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  123. package/dist/feedback/__tests__/feedback.test.js +80 -0
  124. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  125. package/dist/feedback/index.d.ts +48 -0
  126. package/dist/feedback/index.js +97 -0
  127. package/dist/feedback/index.js.map +1 -0
  128. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  129. package/dist/flags/__tests__/flags.test.js +301 -0
  130. package/dist/flags/__tests__/flags.test.js.map +1 -0
  131. package/dist/flags/client.d.ts +131 -0
  132. package/dist/flags/client.js +301 -0
  133. package/dist/flags/client.js.map +1 -0
  134. package/dist/flags/engine.d.ts +200 -0
  135. package/dist/flags/engine.js +677 -0
  136. package/dist/flags/engine.js.map +1 -0
  137. package/dist/flags/index.d.ts +4 -0
  138. package/dist/flags/index.js +16 -0
  139. package/dist/flags/index.js.map +1 -0
  140. package/dist/guard/__tests__/findings.test.js +1 -1
  141. package/dist/guard/__tests__/report.test.js +67 -0
  142. package/dist/guard/__tests__/report.test.js.map +1 -1
  143. package/dist/guard/heartbeat.d.ts +34 -0
  144. package/dist/guard/heartbeat.js +83 -0
  145. package/dist/guard/heartbeat.js.map +1 -0
  146. package/dist/guard/integration.d.ts +9 -0
  147. package/dist/guard/integration.js +4 -2
  148. package/dist/guard/integration.js.map +1 -1
  149. package/dist/guard/report.d.ts +24 -1
  150. package/dist/guard/report.js +67 -18
  151. package/dist/guard/report.js.map +1 -1
  152. package/dist/index.d.ts +88 -0
  153. package/dist/index.js +203 -2
  154. package/dist/index.js.map +1 -1
  155. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  156. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  157. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  158. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  159. package/dist/instrumentation/openai/wrapper.js +6 -0
  160. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  161. package/dist/masking.d.ts +42 -0
  162. package/dist/masking.js +197 -0
  163. package/dist/masking.js.map +1 -0
  164. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  165. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  166. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  167. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  168. package/dist/otel/__tests__/app-logs.test.js +269 -0
  169. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  170. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  171. package/dist/otel/__tests__/log-auto.test.js +125 -0
  172. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  173. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  174. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  175. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  176. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  177. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  178. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  179. package/dist/otel/app-logs.d.ts +80 -0
  180. package/dist/otel/app-logs.js +195 -0
  181. package/dist/otel/app-logs.js.map +1 -0
  182. package/dist/otel/build-info.d.ts +2 -1
  183. package/dist/otel/build-info.js +3 -2
  184. package/dist/otel/build-info.js.map +1 -1
  185. package/dist/otel/events.d.ts +1 -0
  186. package/dist/otel/events.js +22 -13
  187. package/dist/otel/events.js.map +1 -1
  188. package/dist/otel/log-auto.d.ts +44 -0
  189. package/dist/otel/log-auto.js +200 -0
  190. package/dist/otel/log-auto.js.map +1 -0
  191. package/dist/otel/log-bridges.d.ts +54 -0
  192. package/dist/otel/log-bridges.js +307 -0
  193. package/dist/otel/log-bridges.js.map +1 -0
  194. package/dist/otel/metrics.js +1 -1
  195. package/dist/otel/metrics.js.map +1 -1
  196. package/dist/otel/system-metrics.d.ts +39 -0
  197. package/dist/otel/system-metrics.js +166 -0
  198. package/dist/otel/system-metrics.js.map +1 -0
  199. package/dist/otel/tracing.js +6 -2
  200. package/dist/otel/tracing.js.map +1 -1
  201. package/dist/protect/__tests__/protect.test.js +4 -0
  202. package/dist/protect/__tests__/protect.test.js.map +1 -1
  203. package/dist/protect/index.js +9 -4
  204. package/dist/protect/index.js.map +1 -1
  205. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  206. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  207. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  208. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  209. package/dist/rasp/__tests__/baseline.test.js +86 -0
  210. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  211. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  212. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  213. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  214. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  215. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  216. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  217. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  218. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  219. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  220. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  221. package/dist/rasp/__tests__/config-client.test.js +283 -0
  222. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  223. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  224. package/dist/rasp/__tests__/corpus.js +111 -0
  225. package/dist/rasp/__tests__/corpus.js.map +1 -0
  226. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  227. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  228. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  229. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  231. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  232. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/deception.test.js +567 -0
  234. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  235. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/detect.test.js +276 -0
  237. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  238. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  240. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  241. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  243. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  246. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  247. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  248. package/dist/rasp/__tests__/hook-kit.js +139 -0
  249. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  250. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  252. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  253. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/iast.test.js +361 -0
  255. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  256. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  258. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  259. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/middleware.test.js +302 -0
  261. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  262. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  264. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  265. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/reporter.test.js +114 -0
  267. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  268. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/route.test.js +46 -0
  270. package/dist/rasp/__tests__/route.test.js.map +1 -0
  271. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  272. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  273. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  274. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  276. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  277. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  279. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  280. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/targets.test.js +82 -0
  282. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  283. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  285. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  286. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/upload.test.js +81 -0
  288. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  289. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  291. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  292. package/dist/rasp/auto-http.d.ts +6 -0
  293. package/dist/rasp/auto-http.js +194 -0
  294. package/dist/rasp/auto-http.js.map +1 -0
  295. package/dist/rasp/baseline.d.ts +35 -0
  296. package/dist/rasp/baseline.js +91 -0
  297. package/dist/rasp/baseline.js.map +1 -0
  298. package/dist/rasp/capture.d.ts +76 -0
  299. package/dist/rasp/capture.js +304 -0
  300. package/dist/rasp/capture.js.map +1 -0
  301. package/dist/rasp/config-client.d.ts +122 -0
  302. package/dist/rasp/config-client.js +337 -0
  303. package/dist/rasp/config-client.js.map +1 -0
  304. package/dist/rasp/context.d.ts +65 -0
  305. package/dist/rasp/context.js +68 -0
  306. package/dist/rasp/context.js.map +1 -0
  307. package/dist/rasp/custom-rules.d.ts +68 -0
  308. package/dist/rasp/custom-rules.js +222 -0
  309. package/dist/rasp/custom-rules.js.map +1 -0
  310. package/dist/rasp/data/default-rules.json +199 -0
  311. package/dist/rasp/data/default-sinks.json +4 -0
  312. package/dist/rasp/data/dnslog-domains.json +11 -0
  313. package/dist/rasp/deception.d.ts +70 -0
  314. package/dist/rasp/deception.js +220 -0
  315. package/dist/rasp/deception.js.map +1 -0
  316. package/dist/rasp/detect.d.ts +68 -0
  317. package/dist/rasp/detect.js +671 -0
  318. package/dist/rasp/detect.js.map +1 -0
  319. package/dist/rasp/engine.d.ts +107 -0
  320. package/dist/rasp/engine.js +330 -0
  321. package/dist/rasp/engine.js.map +1 -0
  322. package/dist/rasp/hooks/code.d.ts +20 -0
  323. package/dist/rasp/hooks/code.js +334 -0
  324. package/dist/rasp/hooks/code.js.map +1 -0
  325. package/dist/rasp/hooks/db.d.ts +48 -0
  326. package/dist/rasp/hooks/db.js +322 -0
  327. package/dist/rasp/hooks/db.js.map +1 -0
  328. package/dist/rasp/hooks/esm.d.ts +7 -0
  329. package/dist/rasp/hooks/esm.js +18 -0
  330. package/dist/rasp/hooks/esm.js.map +1 -0
  331. package/dist/rasp/hooks/fs.d.ts +3 -0
  332. package/dist/rasp/hooks/fs.js +206 -0
  333. package/dist/rasp/hooks/fs.js.map +1 -0
  334. package/dist/rasp/hooks/http.d.ts +4 -0
  335. package/dist/rasp/hooks/http.js +213 -0
  336. package/dist/rasp/hooks/http.js.map +1 -0
  337. package/dist/rasp/hooks/include.d.ts +9 -0
  338. package/dist/rasp/hooks/include.js +79 -0
  339. package/dist/rasp/hooks/include.js.map +1 -0
  340. package/dist/rasp/hooks/marks.d.ts +2 -0
  341. package/dist/rasp/hooks/marks.js +16 -0
  342. package/dist/rasp/hooks/marks.js.map +1 -0
  343. package/dist/rasp/hooks/process.d.ts +22 -0
  344. package/dist/rasp/hooks/process.js +191 -0
  345. package/dist/rasp/hooks/process.js.map +1 -0
  346. package/dist/rasp/hooks/sinks.d.ts +54 -0
  347. package/dist/rasp/hooks/sinks.js +329 -0
  348. package/dist/rasp/hooks/sinks.js.map +1 -0
  349. package/dist/rasp/hooks/template.d.ts +21 -0
  350. package/dist/rasp/hooks/template.js +152 -0
  351. package/dist/rasp/hooks/template.js.map +1 -0
  352. package/dist/rasp/iast-rules.d.ts +82 -0
  353. package/dist/rasp/iast-rules.js +240 -0
  354. package/dist/rasp/iast-rules.js.map +1 -0
  355. package/dist/rasp/iast-scope.d.ts +29 -0
  356. package/dist/rasp/iast-scope.js +54 -0
  357. package/dist/rasp/iast-scope.js.map +1 -0
  358. package/dist/rasp/iast.d.ts +81 -0
  359. package/dist/rasp/iast.js +272 -0
  360. package/dist/rasp/iast.js.map +1 -0
  361. package/dist/rasp/index.d.ts +52 -0
  362. package/dist/rasp/index.js +280 -0
  363. package/dist/rasp/index.js.map +1 -0
  364. package/dist/rasp/lexers.d.ts +32 -0
  365. package/dist/rasp/lexers.js +444 -0
  366. package/dist/rasp/lexers.js.map +1 -0
  367. package/dist/rasp/middleware.d.ts +155 -0
  368. package/dist/rasp/middleware.js +568 -0
  369. package/dist/rasp/middleware.js.map +1 -0
  370. package/dist/rasp/model-output.d.ts +14 -0
  371. package/dist/rasp/model-output.js +107 -0
  372. package/dist/rasp/model-output.js.map +1 -0
  373. package/dist/rasp/normalize.d.ts +23 -0
  374. package/dist/rasp/normalize.js +140 -0
  375. package/dist/rasp/normalize.js.map +1 -0
  376. package/dist/rasp/reporter.d.ts +60 -0
  377. package/dist/rasp/reporter.js +230 -0
  378. package/dist/rasp/reporter.js.map +1 -0
  379. package/dist/rasp/rule-expr.d.ts +236 -0
  380. package/dist/rasp/rule-expr.js +1253 -0
  381. package/dist/rasp/rule-expr.js.map +1 -0
  382. package/dist/rasp/template.d.ts +53 -0
  383. package/dist/rasp/template.js +336 -0
  384. package/dist/rasp/template.js.map +1 -0
  385. package/dist/rasp/types.d.ts +110 -0
  386. package/dist/rasp/types.js +51 -0
  387. package/dist/rasp/types.js.map +1 -0
  388. package/dist/rasp/vpatch.d.ts +55 -0
  389. package/dist/rasp/vpatch.js +120 -0
  390. package/dist/rasp/vpatch.js.map +1 -0
  391. package/dist/register.js +52 -11
  392. package/dist/register.js.map +1 -1
  393. package/dist/semantic-convention.d.ts +2 -0
  394. package/dist/semantic-convention.js +5 -0
  395. package/dist/semantic-convention.js.map +1 -1
  396. package/dist/types.d.ts +77 -1
  397. package/dist/zero-code.d.ts +8 -0
  398. package/dist/zero-code.js +38 -0
  399. package/dist/zero-code.js.map +1 -0
  400. package/package.json +18 -2
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setModelOutputRecording = setModelOutputRecording;
4
+ exports.modelOutputRecording = modelOutputRecording;
5
+ exports.recordModelOutput = recordModelOutput;
6
+ exports.recordToolArguments = recordToolArguments;
7
+ exports.recordModelResponse = recordModelResponse;
8
+ /**
9
+ * The hook point the SDK's LLM instrumentation calls with what a model
10
+ * returned (README "Sources of untrusted input", `source: "model_output"`).
11
+ * No patching happens here: the instrumentation already sees the response
12
+ * and hands the text over. A no-op unless RASP is on with `modelOutput`.
13
+ *
14
+ * Inside a request the fragments join the request's inputs. Outside one,
15
+ * the SDK starts a context for the rest of the current async continuation;
16
+ * a worker that acts on a model's answer gets reliable scoping by wrapping
17
+ * the job in `runInRaspScope(fn)`.
18
+ */
19
+ const context_1 = require("./context");
20
+ const normalize_1 = require("./normalize");
21
+ let enabled = false;
22
+ /** Set by the engine: whether model output is recorded at all. */
23
+ function setModelOutputRecording(on) {
24
+ enabled = on;
25
+ }
26
+ function modelOutputRecording() {
27
+ return enabled;
28
+ }
29
+ function scope() {
30
+ let ctx = context_1.storage.getStore();
31
+ if (!ctx) {
32
+ ctx = (0, context_1.newContext)();
33
+ context_1.storage.enterWith(ctx);
34
+ }
35
+ return ctx;
36
+ }
37
+ /** Registers completion text a model returned as untrusted input. Never throws. */
38
+ function recordModelOutput(text, key = 'model.completion') {
39
+ if (!enabled)
40
+ return;
41
+ try {
42
+ if (typeof text !== 'string' || !text)
43
+ return;
44
+ (0, normalize_1.addModelOutput)(scope().inputs, text, key);
45
+ }
46
+ catch {
47
+ // fail open
48
+ }
49
+ }
50
+ /** Registers tool-call arguments (a JSON string or an object) as untrusted input. Never throws. */
51
+ function recordToolArguments(args, toolName) {
52
+ if (!enabled)
53
+ return;
54
+ try {
55
+ if (args == null || args === '')
56
+ return;
57
+ const name = typeof toolName === 'string' ? toolName.replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 64) : '';
58
+ (0, normalize_1.addToolArguments)(scope().inputs, args, name ? `model.tool.${name}` : 'model.tool');
59
+ }
60
+ catch {
61
+ // fail open
62
+ }
63
+ }
64
+ /**
65
+ * Records a provider response the instrumentation already holds: OpenAI chat
66
+ * completions (`choices[].message`), OpenAI Responses (`output[]`), Anthropic
67
+ * messages (`content[]`). Text becomes completion fragments; tool-call
68
+ * arguments become `model.tool.<name>` inputs. Never throws.
69
+ */
70
+ function recordModelResponse(result) {
71
+ if (!enabled || !result || typeof result !== 'object')
72
+ return;
73
+ try {
74
+ const r = result;
75
+ if (Array.isArray(r.choices)) {
76
+ for (const c of r.choices.slice(0, 8)) {
77
+ const m = c?.message;
78
+ if (typeof m?.content === 'string')
79
+ recordModelOutput(m.content);
80
+ for (const t of Array.isArray(m?.tool_calls) ? m.tool_calls.slice(0, 32) : [])
81
+ recordToolArguments(t?.function?.arguments, t?.function?.name);
82
+ }
83
+ }
84
+ if (Array.isArray(r.output)) {
85
+ for (const item of r.output.slice(0, 64)) {
86
+ if (item?.type === 'function_call')
87
+ recordToolArguments(item.arguments, item.name);
88
+ for (const part of Array.isArray(item?.content) ? item.content : []) {
89
+ if (typeof part?.text === 'string')
90
+ recordModelOutput(part.text);
91
+ }
92
+ }
93
+ }
94
+ if (Array.isArray(r.content)) {
95
+ for (const block of r.content.slice(0, 64)) {
96
+ if (block?.type === 'text' && typeof block.text === 'string')
97
+ recordModelOutput(block.text);
98
+ else if (block?.type === 'tool_use')
99
+ recordToolArguments(block.input, block.name);
100
+ }
101
+ }
102
+ }
103
+ catch {
104
+ // fail open
105
+ }
106
+ }
107
+ //# sourceMappingURL=model-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-output.js","sourceRoot":"","sources":["../../src/rasp/model-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Input normalisation: percent-decoded forms, JSON flattening and model-output
3
+ * fragments (README "Sources of untrusted input" and "Implementation notes").
4
+ */
5
+ import type { RaspInput } from './types';
6
+ export declare const MAX_INPUTS = 256;
7
+ export declare const MAX_VALUE = 4096;
8
+ export declare const MAX_FRAGMENTS = 32;
9
+ export declare const MAX_RAW_BODY: number;
10
+ /** Lenient percent decoding: %XX to bytes, other % kept, UTF-8 with U+FFFD. */
11
+ export declare function percentDecode(s: string): string;
12
+ /** Adds an input, its decoded and double-decoded forms; caps count and length. */
13
+ export declare function addInput(list: RaspInput[], value: unknown, key: string, source?: RaspInput['source']): void;
14
+ /** Flattens string leaves of a parsed body (`body.a.b`, arrays by index). */
15
+ export declare function flatten(list: RaspInput[], value: unknown, key: string, depth?: number): void;
16
+ /** Splits model text into fragments: fenced code blocks, then lines. */
17
+ export declare function modelFragments(text: string): string[];
18
+ /** Adds model text as model_output fragments. */
19
+ export declare function addModelOutput(list: RaspInput[], text: string, key?: string): void;
20
+ /** Adds tool-call argument string leaves as model_output (`model.tool.<path>`). */
21
+ export declare function addToolArguments(list: RaspInput[], args: unknown, path?: string): void;
22
+ /** Parses a Cookie header into name/value pairs. */
23
+ export declare function parseCookies(header: string | undefined): [string, string][];
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_RAW_BODY = exports.MAX_FRAGMENTS = exports.MAX_VALUE = exports.MAX_INPUTS = void 0;
4
+ exports.percentDecode = percentDecode;
5
+ exports.addInput = addInput;
6
+ exports.flatten = flatten;
7
+ exports.modelFragments = modelFragments;
8
+ exports.addModelOutput = addModelOutput;
9
+ exports.addToolArguments = addToolArguments;
10
+ exports.parseCookies = parseCookies;
11
+ exports.MAX_INPUTS = 256;
12
+ exports.MAX_VALUE = 4096;
13
+ exports.MAX_FRAGMENTS = 32;
14
+ exports.MAX_RAW_BODY = 8 * 1024;
15
+ const HEX = /^[0-9a-fA-F]{2}$/;
16
+ /** Lenient percent decoding: %XX to bytes, other % kept, UTF-8 with U+FFFD. */
17
+ function percentDecode(s) {
18
+ if (!s.includes('%'))
19
+ return s;
20
+ const bytes = [];
21
+ const enc = Buffer.from(s, 'utf8');
22
+ for (let i = 0; i < enc.length; i++) {
23
+ if (enc[i] === 0x25 && i + 2 < enc.length) {
24
+ const h = String.fromCharCode(enc[i + 1], enc[i + 2]);
25
+ if (HEX.test(h)) {
26
+ bytes.push(parseInt(h, 16));
27
+ i += 2;
28
+ continue;
29
+ }
30
+ }
31
+ bytes.push(enc[i]);
32
+ }
33
+ return Buffer.from(bytes).toString('utf8');
34
+ }
35
+ /** Adds an input, its decoded and double-decoded forms; caps count and length. */
36
+ function addInput(list, value, key, source = 'request') {
37
+ if (typeof value !== 'string' || value === '' || list.length >= exports.MAX_INPUTS)
38
+ return;
39
+ const v = value.length > exports.MAX_VALUE ? value.slice(0, exports.MAX_VALUE) : value;
40
+ list.push({ value: v, key, source });
41
+ if (source !== 'request' || !v.includes('%'))
42
+ return;
43
+ const once = percentDecode(v);
44
+ if (once !== v && list.length < exports.MAX_INPUTS) {
45
+ list.push({ value: once, key, source });
46
+ const twice = percentDecode(once);
47
+ if (twice !== once && list.length < exports.MAX_INPUTS)
48
+ list.push({ value: twice, key, source });
49
+ }
50
+ }
51
+ /** Flattens string leaves of a parsed body (`body.a.b`, arrays by index). */
52
+ function flatten(list, value, key, depth = 0) {
53
+ if (list.length >= exports.MAX_INPUTS || depth > 16 || value == null)
54
+ return;
55
+ if (typeof value === 'string')
56
+ return addInput(list, value, key);
57
+ if (typeof value === 'number' || typeof value === 'boolean')
58
+ return;
59
+ if (Array.isArray(value)) {
60
+ value.forEach((v, i) => flatten(list, v, `${key}.${i}`, depth + 1));
61
+ return;
62
+ }
63
+ if (typeof value === 'object') {
64
+ if (Buffer.isBuffer(value))
65
+ return;
66
+ for (const [k, v] of Object.entries(value))
67
+ flatten(list, v, `${key}.${k}`, depth + 1);
68
+ }
69
+ }
70
+ /** Splits model text into fragments: fenced code blocks, then lines. */
71
+ function modelFragments(text) {
72
+ const out = [];
73
+ const seen = new Set();
74
+ const push = (f) => {
75
+ const t = f.trim();
76
+ if (!t || seen.has(t) || out.length >= exports.MAX_FRAGMENTS)
77
+ return;
78
+ seen.add(t);
79
+ out.push(t.length > exports.MAX_VALUE ? t.slice(0, exports.MAX_VALUE) : t);
80
+ };
81
+ const lines = text.split('\n');
82
+ let block = null;
83
+ for (const line of lines) {
84
+ if (line.trim().startsWith('```')) {
85
+ if (block) {
86
+ push(block.join('\n'));
87
+ block = null;
88
+ }
89
+ else
90
+ block = [];
91
+ continue;
92
+ }
93
+ if (block)
94
+ block.push(line);
95
+ }
96
+ if (block)
97
+ push(block.join('\n'));
98
+ for (const line of lines)
99
+ if (!line.trim().startsWith('```'))
100
+ push(line);
101
+ return out;
102
+ }
103
+ /** Adds model text as model_output fragments. */
104
+ function addModelOutput(list, text, key = 'model.completion') {
105
+ for (const f of modelFragments(text)) {
106
+ if (list.length >= exports.MAX_INPUTS)
107
+ return;
108
+ list.push({ value: f, key, source: 'model_output' });
109
+ }
110
+ }
111
+ /** Adds tool-call argument string leaves as model_output (`model.tool.<path>`). */
112
+ function addToolArguments(list, args, path = 'model.tool') {
113
+ if (typeof args === 'string') {
114
+ try {
115
+ args = JSON.parse(args);
116
+ }
117
+ catch {
118
+ return addModelOutput(list, args, path);
119
+ }
120
+ }
121
+ const tmp = [];
122
+ flatten(tmp, args, path);
123
+ for (const i of tmp)
124
+ if (list.length < exports.MAX_INPUTS)
125
+ list.push({ value: i.value, key: i.key, source: 'model_output' });
126
+ }
127
+ /** Parses a Cookie header into name/value pairs. */
128
+ function parseCookies(header) {
129
+ if (!header)
130
+ return [];
131
+ const out = [];
132
+ for (const part of header.split(';')) {
133
+ const i = part.indexOf('=');
134
+ if (i <= 0)
135
+ continue;
136
+ out.push([part.slice(0, i).trim(), part.slice(i + 1).trim()]);
137
+ }
138
+ return out;
139
+ }
140
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/rasp/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export declare const RASP_EVENT = "shield360.rasp.event";
2
+ export declare const RASP_COMPONENT = "shield360.rasp.component";
3
+ export declare const PER_MINUTE = 100;
4
+ export declare const FOLD_MS = 10000;
5
+ export declare const MAX_COMPONENTS = 500;
6
+ export type RaspEvent = {
7
+ name: string;
8
+ time: string;
9
+ attrs: Record<string, string>;
10
+ };
11
+ export type ReporterOptions = {
12
+ url: string;
13
+ apiKey: string;
14
+ applicationName: string;
15
+ environment?: string;
16
+ sdkVersion?: string;
17
+ fetchImpl?: typeof fetch;
18
+ now?: () => number;
19
+ retryDelayMs?: number;
20
+ };
21
+ export declare class RaspReporter {
22
+ private readonly o;
23
+ private queue;
24
+ private folds;
25
+ private windowStart;
26
+ private sentInWindow;
27
+ private timer?;
28
+ private readonly endpoint;
29
+ readonly resource: Record<string, string>;
30
+ private readonly now;
31
+ private sending;
32
+ constructor(o: ReporterOptions);
33
+ start(): void;
34
+ /**
35
+ * Queues an event, folding repeats of the same key. Returns whether it was queued now.
36
+ * An empty `foldKey` never folds: the event is queued or refused and nothing is kept,
37
+ * for callers that count repeats themselves (passive IAST).
38
+ */
39
+ add(event: RaspEvent, foldKey: string): boolean;
40
+ private enqueue;
41
+ private closeFolds;
42
+ /** Queued events (tests). */
43
+ pending(): RaspEvent[];
44
+ /** Sends what is queued; `force` also closes every open fold. Never rejects. */
45
+ flush(force?: boolean): Promise<void>;
46
+ /** Queues the components report: names and versions only, at most 500. */
47
+ reportComponents(components: Component[]): void;
48
+ stop(): Promise<void>;
49
+ }
50
+ export type Component = {
51
+ ecosystem: string;
52
+ name: string;
53
+ version: string;
54
+ };
55
+ /**
56
+ * The runtime, the app's declared dependencies (resolved from
57
+ * `<cwd>/node_modules`), and every npm package loaded through `require` so
58
+ * far. Names and versions only; at most 500.
59
+ */
60
+ export declare function collectComponents(cache?: Record<string, unknown>, cwd?: string): Component[];
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RaspReporter = exports.MAX_COMPONENTS = exports.FOLD_MS = exports.PER_MINUTE = exports.RASP_COMPONENT = exports.RASP_EVENT = void 0;
37
+ exports.collectComponents = collectComponents;
38
+ /**
39
+ * RASP event reporter (README "Events"). Batches `shield360.rasp.event` and
40
+ * `shield360.rasp.component` records to `POST /api/guard/events` through the
41
+ * guard reporter's transport (guard/report.ts `postGuardEvents`), off the
42
+ * call path. At most 100 events a minute per process; repeats of the same
43
+ * (attack, rule, sink, route, decision) within 10 s fold into one more
44
+ * event carrying `shield360.rasp.count`. Events name locations, never values.
45
+ */
46
+ const fs = __importStar(require("fs"));
47
+ const os_1 = require("os");
48
+ const path_1 = require("path");
49
+ const report_1 = require("../guard/report");
50
+ exports.RASP_EVENT = 'shield360.rasp.event';
51
+ exports.RASP_COMPONENT = 'shield360.rasp.component';
52
+ exports.PER_MINUTE = 100;
53
+ exports.FOLD_MS = 10000;
54
+ const FLUSH_MS = 2000;
55
+ const MAX_QUEUED = 1000;
56
+ exports.MAX_COMPONENTS = 500;
57
+ const BATCH = 100;
58
+ // Captured at load, before any later file-system hook.
59
+ const readFile = fs.readFileSync.bind(fs);
60
+ class RaspReporter {
61
+ constructor(o) {
62
+ this.o = o;
63
+ this.queue = [];
64
+ this.folds = new Map();
65
+ this.windowStart = -Infinity;
66
+ this.sentInWindow = 0;
67
+ this.sending = Promise.resolve();
68
+ this.endpoint = `${o.url.replace(/\/+$/, '')}/api/guard/events`;
69
+ this.now = o.now ?? Date.now;
70
+ this.resource = { 'service.name': o.applicationName };
71
+ const host = safeHost();
72
+ if (host)
73
+ this.resource['host.name'] = host;
74
+ if (o.environment)
75
+ this.resource['deployment.environment'] = o.environment;
76
+ if (o.sdkVersion)
77
+ this.resource['service.version'] = o.sdkVersion;
78
+ }
79
+ start() {
80
+ if (this.timer)
81
+ return;
82
+ this.timer = setInterval(() => void this.flush(), FLUSH_MS);
83
+ this.timer.unref?.();
84
+ }
85
+ /**
86
+ * Queues an event, folding repeats of the same key. Returns whether it was queued now.
87
+ * An empty `foldKey` never folds: the event is queued or refused and nothing is kept,
88
+ * for callers that count repeats themselves (passive IAST).
89
+ */
90
+ add(event, foldKey) {
91
+ const now = this.now();
92
+ this.closeFolds(now);
93
+ if (!foldKey)
94
+ return this.enqueue(event, now);
95
+ const f = this.folds.get(foldKey);
96
+ if (f && now < f.until) {
97
+ f.extra++;
98
+ return false;
99
+ }
100
+ this.folds.set(foldKey, { event, extra: 0, until: now + exports.FOLD_MS });
101
+ return this.enqueue(event, now);
102
+ }
103
+ enqueue(event, now) {
104
+ if (now - this.windowStart >= 60000) {
105
+ this.windowStart = now;
106
+ this.sentInWindow = 0;
107
+ }
108
+ if (this.sentInWindow >= exports.PER_MINUTE || this.queue.length >= MAX_QUEUED)
109
+ return false;
110
+ this.sentInWindow++;
111
+ this.queue.push(event);
112
+ return true;
113
+ }
114
+ closeFolds(now) {
115
+ for (const [k, f] of this.folds) {
116
+ if (now < f.until)
117
+ continue;
118
+ this.folds.delete(k);
119
+ if (f.extra > 0) {
120
+ const time = new Date(Number.isFinite(now) ? now : this.now()).toISOString();
121
+ this.enqueue({ ...f.event, time, attrs: { ...f.event.attrs, 'shield360.rasp.count': String(f.extra) } }, Number.isFinite(now) ? now : this.now());
122
+ }
123
+ }
124
+ }
125
+ /** Queued events (tests). */
126
+ pending() {
127
+ return [...this.queue];
128
+ }
129
+ /** Sends what is queued; `force` also closes every open fold. Never rejects. */
130
+ flush(force = false) {
131
+ this.sending = this.sending
132
+ .then(async () => {
133
+ this.closeFolds(force ? Infinity : this.now());
134
+ while (this.queue.length) {
135
+ await (0, report_1.postGuardEvents)(this.endpoint, this.o.apiKey, { resource: this.resource, events: this.queue.splice(0, BATCH) }, { label: 'runtime protection event', fetchImpl: this.o.fetchImpl, retryDelayMs: this.o.retryDelayMs });
136
+ }
137
+ })
138
+ .catch(() => undefined);
139
+ return this.sending;
140
+ }
141
+ /** Queues the components report: names and versions only, at most 500. */
142
+ reportComponents(components) {
143
+ const time = new Date(this.now()).toISOString();
144
+ for (const c of components.slice(0, exports.MAX_COMPONENTS)) {
145
+ if (this.queue.length >= MAX_QUEUED)
146
+ break;
147
+ this.queue.push({
148
+ name: exports.RASP_COMPONENT,
149
+ time,
150
+ attrs: {
151
+ 'shield360.rasp.app': this.o.applicationName,
152
+ 'shield360.rasp.component.ecosystem': c.ecosystem,
153
+ 'shield360.rasp.component.name': c.name,
154
+ 'shield360.rasp.component.version': c.version,
155
+ },
156
+ });
157
+ }
158
+ }
159
+ stop() {
160
+ if (this.timer)
161
+ clearInterval(this.timer);
162
+ this.timer = undefined;
163
+ return this.flush(true);
164
+ }
165
+ }
166
+ exports.RaspReporter = RaspReporter;
167
+ function safeHost() {
168
+ try {
169
+ return (0, os_1.hostname)();
170
+ }
171
+ catch {
172
+ return '';
173
+ }
174
+ }
175
+ const PACKAGE = /^[A-Za-z0-9@_][A-Za-z0-9@/._+~-]{0,213}$/;
176
+ const VERSION = /^v?[0-9A-Za-z][0-9A-Za-z.+_~-]{0,63}$/;
177
+ function readPackage(dir) {
178
+ try {
179
+ return JSON.parse(readFile((0, path_1.join)(dir, 'package.json'), 'utf8'));
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ /**
186
+ * The runtime, the app's declared dependencies (resolved from
187
+ * `<cwd>/node_modules`), and every npm package loaded through `require` so
188
+ * far. Names and versions only; at most 500.
189
+ */
190
+ function collectComponents(cache = require.cache, cwd = process.cwd()) {
191
+ const out = [{ ecosystem: 'runtime', name: 'node', version: process.versions.node }];
192
+ const seen = new Set();
193
+ const push = (name, version) => {
194
+ if (typeof name !== 'string' || typeof version !== 'string' || !PACKAGE.test(name) || !VERSION.test(version))
195
+ return;
196
+ const id = `${name}@${version}`;
197
+ if (seen.has(id) || out.length >= exports.MAX_COMPONENTS)
198
+ return;
199
+ seen.add(id);
200
+ out.push({ ecosystem: 'npm', name, version });
201
+ };
202
+ const app = readPackage(cwd);
203
+ for (const name of Object.keys({ ...(app?.dependencies || {}), ...(app?.optionalDependencies || {}) })) {
204
+ const pkg = readPackage((0, path_1.join)(cwd, 'node_modules', ...name.split('/')));
205
+ if (pkg)
206
+ push(pkg.name, pkg.version);
207
+ }
208
+ const roots = new Set();
209
+ const marker = `${path_1.sep}node_modules${path_1.sep}`;
210
+ for (const file of Object.keys(cache)) {
211
+ if (out.length >= exports.MAX_COMPONENTS)
212
+ break;
213
+ const at = file.lastIndexOf(marker);
214
+ if (at < 0)
215
+ continue;
216
+ const rest = file.slice(at + marker.length).split(path_1.sep);
217
+ if (!rest[0])
218
+ continue;
219
+ const name = rest[0].startsWith('@') && rest[1] ? `${rest[0]}/${rest[1]}` : rest[0];
220
+ const root = (0, path_1.join)(file.slice(0, at + marker.length), ...name.split('/'));
221
+ if (roots.has(root))
222
+ continue;
223
+ roots.add(root);
224
+ const pkg = readPackage(root);
225
+ if (pkg)
226
+ push(pkg.name, pkg.version);
227
+ }
228
+ return out;
229
+ }
230
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/rasp/reporter.ts"],"names":[],"mappings":"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"}