@cdot65/prisma-airs-cli 2.12.0 → 3.0.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 (392) hide show
  1. package/README.md +27 -169
  2. package/dist/chunk-JXHYQFEK.js +1752 -0
  3. package/dist/cli/index.js +6511 -4
  4. package/dist/dlp-5XKWITZX.js +710 -0
  5. package/dist/index.d.ts +1396 -26
  6. package/dist/index.js +40 -37
  7. package/package.json +22 -25
  8. package/dist/airs/dlp/data-filtering-profiles.d.ts +0 -10
  9. package/dist/airs/dlp/data-filtering-profiles.d.ts.map +0 -1
  10. package/dist/airs/dlp/data-filtering-profiles.js +0 -17
  11. package/dist/airs/dlp/data-filtering-profiles.js.map +0 -1
  12. package/dist/airs/dlp/data-patterns.d.ts +0 -13
  13. package/dist/airs/dlp/data-patterns.d.ts.map +0 -1
  14. package/dist/airs/dlp/data-patterns.js +0 -26
  15. package/dist/airs/dlp/data-patterns.js.map +0 -1
  16. package/dist/airs/dlp/data-profiles.d.ts +0 -12
  17. package/dist/airs/dlp/data-profiles.d.ts.map +0 -1
  18. package/dist/airs/dlp/data-profiles.js +0 -23
  19. package/dist/airs/dlp/data-profiles.js.map +0 -1
  20. package/dist/airs/dlp/dictionaries.d.ts +0 -13
  21. package/dist/airs/dlp/dictionaries.d.ts.map +0 -1
  22. package/dist/airs/dlp/dictionaries.js +0 -34
  23. package/dist/airs/dlp/dictionaries.js.map +0 -1
  24. package/dist/airs/dlp/index.d.ts +0 -6
  25. package/dist/airs/dlp/index.d.ts.map +0 -1
  26. package/dist/airs/dlp/index.js +0 -6
  27. package/dist/airs/dlp/index.js.map +0 -1
  28. package/dist/airs/dlp/types.d.ts +0 -36
  29. package/dist/airs/dlp/types.d.ts.map +0 -1
  30. package/dist/airs/dlp/types.js +0 -2
  31. package/dist/airs/dlp/types.js.map +0 -1
  32. package/dist/airs/management.d.ts +0 -69
  33. package/dist/airs/management.d.ts.map +0 -1
  34. package/dist/airs/management.js +0 -370
  35. package/dist/airs/management.js.map +0 -1
  36. package/dist/airs/modelsecurity.d.ts +0 -74
  37. package/dist/airs/modelsecurity.d.ts.map +0 -1
  38. package/dist/airs/modelsecurity.js +0 -337
  39. package/dist/airs/modelsecurity.js.map +0 -1
  40. package/dist/airs/promptsets.d.ts +0 -50
  41. package/dist/airs/promptsets.d.ts.map +0 -1
  42. package/dist/airs/promptsets.js +0 -120
  43. package/dist/airs/promptsets.js.map +0 -1
  44. package/dist/airs/redteam.d.ts +0 -75
  45. package/dist/airs/redteam.d.ts.map +0 -1
  46. package/dist/airs/redteam.js +0 -418
  47. package/dist/airs/redteam.js.map +0 -1
  48. package/dist/airs/runtime.d.ts +0 -27
  49. package/dist/airs/runtime.d.ts.map +0 -1
  50. package/dist/airs/runtime.js +0 -158
  51. package/dist/airs/runtime.js.map +0 -1
  52. package/dist/airs/scanner.d.ts +0 -36
  53. package/dist/airs/scanner.d.ts.map +0 -1
  54. package/dist/airs/scanner.js +0 -101
  55. package/dist/airs/scanner.js.map +0 -1
  56. package/dist/airs/types.d.ts +0 -838
  57. package/dist/airs/types.d.ts.map +0 -1
  58. package/dist/airs/types.js +0 -6
  59. package/dist/airs/types.js.map +0 -1
  60. package/dist/audit/evaluator.d.ts +0 -17
  61. package/dist/audit/evaluator.d.ts.map +0 -1
  62. package/dist/audit/evaluator.js +0 -82
  63. package/dist/audit/evaluator.js.map +0 -1
  64. package/dist/audit/report.d.ts +0 -38
  65. package/dist/audit/report.d.ts.map +0 -1
  66. package/dist/audit/report.js +0 -141
  67. package/dist/audit/report.js.map +0 -1
  68. package/dist/audit/runner.d.ts +0 -18
  69. package/dist/audit/runner.d.ts.map +0 -1
  70. package/dist/audit/runner.js +0 -60
  71. package/dist/audit/runner.js.map +0 -1
  72. package/dist/audit/types.d.ts +0 -53
  73. package/dist/audit/types.d.ts.map +0 -1
  74. package/dist/audit/types.js +0 -5
  75. package/dist/audit/types.js.map +0 -1
  76. package/dist/backup/index.d.ts +0 -3
  77. package/dist/backup/index.d.ts.map +0 -1
  78. package/dist/backup/index.js +0 -3
  79. package/dist/backup/index.js.map +0 -1
  80. package/dist/backup/io.d.ts +0 -15
  81. package/dist/backup/io.d.ts.map +0 -1
  82. package/dist/backup/io.js +0 -67
  83. package/dist/backup/io.js.map +0 -1
  84. package/dist/backup/types.d.ts +0 -25
  85. package/dist/backup/types.d.ts.map +0 -1
  86. package/dist/backup/types.js +0 -2
  87. package/dist/backup/types.js.map +0 -1
  88. package/dist/cli/builders/profile-builder.d.ts +0 -45
  89. package/dist/cli/builders/profile-builder.d.ts.map +0 -1
  90. package/dist/cli/builders/profile-builder.js +0 -308
  91. package/dist/cli/builders/profile-builder.js.map +0 -1
  92. package/dist/cli/bulk-scan-state.d.ts +0 -15
  93. package/dist/cli/bulk-scan-state.d.ts.map +0 -1
  94. package/dist/cli/bulk-scan-state.js +0 -20
  95. package/dist/cli/bulk-scan-state.js.map +0 -1
  96. package/dist/cli/commands/audit.d.ts +0 -4
  97. package/dist/cli/commands/audit.d.ts.map +0 -1
  98. package/dist/cli/commands/audit.js +0 -113
  99. package/dist/cli/commands/audit.js.map +0 -1
  100. package/dist/cli/commands/backup.d.ts +0 -10
  101. package/dist/cli/commands/backup.d.ts.map +0 -1
  102. package/dist/cli/commands/backup.js +0 -102
  103. package/dist/cli/commands/backup.js.map +0 -1
  104. package/dist/cli/commands/dlp/build-body.d.ts +0 -28
  105. package/dist/cli/commands/dlp/build-body.d.ts.map +0 -1
  106. package/dist/cli/commands/dlp/build-body.js +0 -174
  107. package/dist/cli/commands/dlp/build-body.js.map +0 -1
  108. package/dist/cli/commands/dlp/dictionaries.d.ts +0 -3
  109. package/dist/cli/commands/dlp/dictionaries.d.ts.map +0 -1
  110. package/dist/cli/commands/dlp/dictionaries.js +0 -167
  111. package/dist/cli/commands/dlp/dictionaries.js.map +0 -1
  112. package/dist/cli/commands/dlp/filtering-profiles.d.ts +0 -3
  113. package/dist/cli/commands/dlp/filtering-profiles.d.ts.map +0 -1
  114. package/dist/cli/commands/dlp/filtering-profiles.js +0 -82
  115. package/dist/cli/commands/dlp/filtering-profiles.js.map +0 -1
  116. package/dist/cli/commands/dlp/generate.d.ts +0 -3
  117. package/dist/cli/commands/dlp/generate.d.ts.map +0 -1
  118. package/dist/cli/commands/dlp/generate.js +0 -51
  119. package/dist/cli/commands/dlp/generate.js.map +0 -1
  120. package/dist/cli/commands/dlp/index.d.ts +0 -3
  121. package/dist/cli/commands/dlp/index.d.ts.map +0 -1
  122. package/dist/cli/commands/dlp/index.js +0 -16
  123. package/dist/cli/commands/dlp/index.js.map +0 -1
  124. package/dist/cli/commands/dlp/patch.d.ts +0 -15
  125. package/dist/cli/commands/dlp/patch.d.ts.map +0 -1
  126. package/dist/cli/commands/dlp/patch.js +0 -70
  127. package/dist/cli/commands/dlp/patch.js.map +0 -1
  128. package/dist/cli/commands/dlp/patterns.d.ts +0 -3
  129. package/dist/cli/commands/dlp/patterns.d.ts.map +0 -1
  130. package/dist/cli/commands/dlp/patterns.js +0 -127
  131. package/dist/cli/commands/dlp/patterns.js.map +0 -1
  132. package/dist/cli/commands/dlp/profiles.d.ts +0 -3
  133. package/dist/cli/commands/dlp/profiles.d.ts.map +0 -1
  134. package/dist/cli/commands/dlp/profiles.js +0 -126
  135. package/dist/cli/commands/dlp/profiles.js.map +0 -1
  136. package/dist/cli/commands/modelsecurity.d.ts +0 -4
  137. package/dist/cli/commands/modelsecurity.d.ts.map +0 -1
  138. package/dist/cli/commands/modelsecurity.js +0 -605
  139. package/dist/cli/commands/modelsecurity.js.map +0 -1
  140. package/dist/cli/commands/profiles-cleanup.d.ts +0 -26
  141. package/dist/cli/commands/profiles-cleanup.d.ts.map +0 -1
  142. package/dist/cli/commands/profiles-cleanup.js +0 -113
  143. package/dist/cli/commands/profiles-cleanup.js.map +0 -1
  144. package/dist/cli/commands/redteam.d.ts +0 -12
  145. package/dist/cli/commands/redteam.d.ts.map +0 -1
  146. package/dist/cli/commands/redteam.js +0 -1075
  147. package/dist/cli/commands/redteam.js.map +0 -1
  148. package/dist/cli/commands/restore.d.ts +0 -11
  149. package/dist/cli/commands/restore.d.ts.map +0 -1
  150. package/dist/cli/commands/restore.js +0 -109
  151. package/dist/cli/commands/restore.js.map +0 -1
  152. package/dist/cli/commands/runtime.d.ts +0 -6
  153. package/dist/cli/commands/runtime.d.ts.map +0 -1
  154. package/dist/cli/commands/runtime.js +0 -869
  155. package/dist/cli/commands/runtime.js.map +0 -1
  156. package/dist/cli/commands/topics-apply.d.ts +0 -16
  157. package/dist/cli/commands/topics-apply.d.ts.map +0 -1
  158. package/dist/cli/commands/topics-apply.js +0 -69
  159. package/dist/cli/commands/topics-apply.js.map +0 -1
  160. package/dist/cli/commands/topics-create.d.ts +0 -16
  161. package/dist/cli/commands/topics-create.d.ts.map +0 -1
  162. package/dist/cli/commands/topics-create.js +0 -71
  163. package/dist/cli/commands/topics-create.js.map +0 -1
  164. package/dist/cli/commands/topics-eval.d.ts +0 -7
  165. package/dist/cli/commands/topics-eval.d.ts.map +0 -1
  166. package/dist/cli/commands/topics-eval.js +0 -65
  167. package/dist/cli/commands/topics-eval.js.map +0 -1
  168. package/dist/cli/commands/topics-revert.d.ts +0 -9
  169. package/dist/cli/commands/topics-revert.d.ts.map +0 -1
  170. package/dist/cli/commands/topics-revert.js +0 -52
  171. package/dist/cli/commands/topics-revert.js.map +0 -1
  172. package/dist/cli/commands/topics-sample.d.ts +0 -4
  173. package/dist/cli/commands/topics-sample.d.ts.map +0 -1
  174. package/dist/cli/commands/topics-sample.js +0 -27
  175. package/dist/cli/commands/topics-sample.js.map +0 -1
  176. package/dist/cli/debug-logger.d.ts +0 -11
  177. package/dist/cli/debug-logger.d.ts.map +0 -1
  178. package/dist/cli/debug-logger.js +0 -137
  179. package/dist/cli/debug-logger.js.map +0 -1
  180. package/dist/cli/index.d.ts +0 -3
  181. package/dist/cli/index.d.ts.map +0 -1
  182. package/dist/cli/index.js.map +0 -1
  183. package/dist/cli/parse-input.d.ts +0 -9
  184. package/dist/cli/parse-input.d.ts.map +0 -1
  185. package/dist/cli/parse-input.js +0 -109
  186. package/dist/cli/parse-input.js.map +0 -1
  187. package/dist/cli/program.d.ts +0 -3
  188. package/dist/cli/program.d.ts.map +0 -1
  189. package/dist/cli/program.js +0 -32
  190. package/dist/cli/program.js.map +0 -1
  191. package/dist/cli/renderer/audit.d.ts +0 -11
  192. package/dist/cli/renderer/audit.d.ts.map +0 -1
  193. package/dist/cli/renderer/audit.js +0 -58
  194. package/dist/cli/renderer/audit.js.map +0 -1
  195. package/dist/cli/renderer/backup.d.ts +0 -8
  196. package/dist/cli/renderer/backup.d.ts.map +0 -1
  197. package/dist/cli/renderer/backup.js +0 -50
  198. package/dist/cli/renderer/backup.js.map +0 -1
  199. package/dist/cli/renderer/common.d.ts +0 -14
  200. package/dist/cli/renderer/common.d.ts.map +0 -1
  201. package/dist/cli/renderer/common.js +0 -50
  202. package/dist/cli/renderer/common.js.map +0 -1
  203. package/dist/cli/renderer/dlp.d.ts +0 -34
  204. package/dist/cli/renderer/dlp.d.ts.map +0 -1
  205. package/dist/cli/renderer/dlp.js +0 -348
  206. package/dist/cli/renderer/dlp.js.map +0 -1
  207. package/dist/cli/renderer/eval.d.ts +0 -30
  208. package/dist/cli/renderer/eval.d.ts.map +0 -1
  209. package/dist/cli/renderer/eval.js +0 -61
  210. package/dist/cli/renderer/eval.js.map +0 -1
  211. package/dist/cli/renderer/index.d.ts +0 -9
  212. package/dist/cli/renderer/index.d.ts.map +0 -1
  213. package/dist/cli/renderer/index.js +0 -9
  214. package/dist/cli/renderer/index.js.map +0 -1
  215. package/dist/cli/renderer/modelsecurity.d.ts +0 -35
  216. package/dist/cli/renderer/modelsecurity.d.ts.map +0 -1
  217. package/dist/cli/renderer/modelsecurity.js +0 -339
  218. package/dist/cli/renderer/modelsecurity.js.map +0 -1
  219. package/dist/cli/renderer/redteam.d.ts +0 -224
  220. package/dist/cli/renderer/redteam.d.ts.map +0 -1
  221. package/dist/cli/renderer/redteam.js +0 -500
  222. package/dist/cli/renderer/redteam.js.map +0 -1
  223. package/dist/cli/renderer/runtime.d.ts +0 -135
  224. package/dist/cli/renderer/runtime.d.ts.map +0 -1
  225. package/dist/cli/renderer/runtime.js +0 -426
  226. package/dist/cli/renderer/runtime.js.map +0 -1
  227. package/dist/config/loader.d.ts +0 -3
  228. package/dist/config/loader.d.ts.map +0 -1
  229. package/dist/config/loader.js +0 -59
  230. package/dist/config/loader.js.map +0 -1
  231. package/dist/config/schema.d.ts +0 -63
  232. package/dist/config/schema.d.ts.map +0 -1
  233. package/dist/config/schema.js +0 -38
  234. package/dist/config/schema.js.map +0 -1
  235. package/dist/core/constraints.d.ts +0 -19
  236. package/dist/core/constraints.d.ts.map +0 -1
  237. package/dist/core/constraints.js +0 -82
  238. package/dist/core/constraints.js.map +0 -1
  239. package/dist/core/metrics.d.ts +0 -13
  240. package/dist/core/metrics.d.ts.map +0 -1
  241. package/dist/core/metrics.js +0 -73
  242. package/dist/core/metrics.js.map +0 -1
  243. package/dist/core/prompt-loader.d.ts +0 -14
  244. package/dist/core/prompt-loader.d.ts.map +0 -1
  245. package/dist/core/prompt-loader.js +0 -122
  246. package/dist/core/prompt-loader.js.map +0 -1
  247. package/dist/core/types.d.ts +0 -96
  248. package/dist/core/types.d.ts.map +0 -1
  249. package/dist/core/types.js +0 -5
  250. package/dist/core/types.js.map +0 -1
  251. package/dist/dlp/embed/docx.d.ts +0 -3
  252. package/dist/dlp/embed/docx.d.ts.map +0 -1
  253. package/dist/dlp/embed/docx.js +0 -63
  254. package/dist/dlp/embed/docx.js.map +0 -1
  255. package/dist/dlp/embed/index.d.ts +0 -6
  256. package/dist/dlp/embed/index.d.ts.map +0 -1
  257. package/dist/dlp/embed/index.js +0 -20
  258. package/dist/dlp/embed/index.js.map +0 -1
  259. package/dist/dlp/embed/jpeg.d.ts +0 -5
  260. package/dist/dlp/embed/jpeg.d.ts.map +0 -1
  261. package/dist/dlp/embed/jpeg.js +0 -67
  262. package/dist/dlp/embed/jpeg.js.map +0 -1
  263. package/dist/dlp/embed/overlay.d.ts +0 -7
  264. package/dist/dlp/embed/overlay.d.ts.map +0 -1
  265. package/dist/dlp/embed/overlay.js +0 -21
  266. package/dist/dlp/embed/overlay.js.map +0 -1
  267. package/dist/dlp/embed/pdf.d.ts +0 -7
  268. package/dist/dlp/embed/pdf.d.ts.map +0 -1
  269. package/dist/dlp/embed/pdf.js +0 -124
  270. package/dist/dlp/embed/pdf.js.map +0 -1
  271. package/dist/dlp/embed/png-chunks.d.ts +0 -12
  272. package/dist/dlp/embed/png-chunks.d.ts.map +0 -1
  273. package/dist/dlp/embed/png-chunks.js +0 -85
  274. package/dist/dlp/embed/png-chunks.js.map +0 -1
  275. package/dist/dlp/embed/png.d.ts +0 -5
  276. package/dist/dlp/embed/png.d.ts.map +0 -1
  277. package/dist/dlp/embed/png.js +0 -75
  278. package/dist/dlp/embed/png.js.map +0 -1
  279. package/dist/dlp/embed/svg.d.ts +0 -3
  280. package/dist/dlp/embed/svg.d.ts.map +0 -1
  281. package/dist/dlp/embed/svg.js +0 -43
  282. package/dist/dlp/embed/svg.js.map +0 -1
  283. package/dist/dlp/embed/zip.d.ts +0 -3
  284. package/dist/dlp/embed/zip.d.ts.map +0 -1
  285. package/dist/dlp/embed/zip.js +0 -25
  286. package/dist/dlp/embed/zip.js.map +0 -1
  287. package/dist/dlp/generate/docx.d.ts +0 -3
  288. package/dist/dlp/generate/docx.d.ts.map +0 -1
  289. package/dist/dlp/generate/docx.js +0 -24
  290. package/dist/dlp/generate/docx.js.map +0 -1
  291. package/dist/dlp/generate/index.d.ts +0 -5
  292. package/dist/dlp/generate/index.d.ts.map +0 -1
  293. package/dist/dlp/generate/index.js +0 -21
  294. package/dist/dlp/generate/index.js.map +0 -1
  295. package/dist/dlp/generate/jpeg.d.ts +0 -3
  296. package/dist/dlp/generate/jpeg.d.ts.map +0 -1
  297. package/dist/dlp/generate/jpeg.js +0 -8
  298. package/dist/dlp/generate/jpeg.js.map +0 -1
  299. package/dist/dlp/generate/pdf.d.ts +0 -3
  300. package/dist/dlp/generate/pdf.d.ts.map +0 -1
  301. package/dist/dlp/generate/pdf.js +0 -19
  302. package/dist/dlp/generate/pdf.js.map +0 -1
  303. package/dist/dlp/generate/png.d.ts +0 -3
  304. package/dist/dlp/generate/png.d.ts.map +0 -1
  305. package/dist/dlp/generate/png.js +0 -8
  306. package/dist/dlp/generate/png.js.map +0 -1
  307. package/dist/dlp/generate/raster.d.ts +0 -9
  308. package/dist/dlp/generate/raster.d.ts.map +0 -1
  309. package/dist/dlp/generate/raster.js +0 -20
  310. package/dist/dlp/generate/raster.js.map +0 -1
  311. package/dist/dlp/generate/svg.d.ts +0 -3
  312. package/dist/dlp/generate/svg.d.ts.map +0 -1
  313. package/dist/dlp/generate/svg.js +0 -17
  314. package/dist/dlp/generate/svg.js.map +0 -1
  315. package/dist/dlp/index.d.ts +0 -15
  316. package/dist/dlp/index.d.ts.map +0 -1
  317. package/dist/dlp/index.js +0 -54
  318. package/dist/dlp/index.js.map +0 -1
  319. package/dist/dlp/lorem.d.ts +0 -3
  320. package/dist/dlp/lorem.d.ts.map +0 -1
  321. package/dist/dlp/lorem.js +0 -65
  322. package/dist/dlp/lorem.js.map +0 -1
  323. package/dist/dlp/manifest.d.ts +0 -11
  324. package/dist/dlp/manifest.d.ts.map +0 -1
  325. package/dist/dlp/manifest.js +0 -14
  326. package/dist/dlp/manifest.js.map +0 -1
  327. package/dist/dlp/payload.d.ts +0 -6
  328. package/dist/dlp/payload.d.ts.map +0 -1
  329. package/dist/dlp/payload.js +0 -62
  330. package/dist/dlp/payload.js.map +0 -1
  331. package/dist/dlp/rng.d.ts +0 -9
  332. package/dist/dlp/rng.d.ts.map +0 -1
  333. package/dist/dlp/rng.js +0 -28
  334. package/dist/dlp/rng.js.map +0 -1
  335. package/dist/dlp/types.d.ts +0 -26
  336. package/dist/dlp/types.d.ts.map +0 -1
  337. package/dist/dlp/types.js +0 -2
  338. package/dist/dlp/types.js.map +0 -1
  339. package/dist/index.d.ts.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/llm/prompts/analyze-results.d.ts +0 -3
  342. package/dist/llm/prompts/analyze-results.d.ts.map +0 -1
  343. package/dist/llm/prompts/analyze-results.js +0 -52
  344. package/dist/llm/prompts/analyze-results.js.map +0 -1
  345. package/dist/llm/prompts/generate-companion.d.ts +0 -3
  346. package/dist/llm/prompts/generate-companion.d.ts.map +0 -1
  347. package/dist/llm/prompts/generate-companion.js +0 -42
  348. package/dist/llm/prompts/generate-companion.js.map +0 -1
  349. package/dist/llm/prompts/generate-tests.d.ts +0 -3
  350. package/dist/llm/prompts/generate-tests.d.ts.map +0 -1
  351. package/dist/llm/prompts/generate-tests.js +0 -46
  352. package/dist/llm/prompts/generate-tests.js.map +0 -1
  353. package/dist/llm/prompts/generate-topic.d.ts +0 -4
  354. package/dist/llm/prompts/generate-topic.d.ts.map +0 -1
  355. package/dist/llm/prompts/generate-topic.js +0 -41
  356. package/dist/llm/prompts/generate-topic.js.map +0 -1
  357. package/dist/llm/prompts/improve-topic.d.ts +0 -3
  358. package/dist/llm/prompts/improve-topic.d.ts.map +0 -1
  359. package/dist/llm/prompts/improve-topic.js +0 -77
  360. package/dist/llm/prompts/improve-topic.js.map +0 -1
  361. package/dist/llm/prompts/simplify-topic.d.ts +0 -3
  362. package/dist/llm/prompts/simplify-topic.d.ts.map +0 -1
  363. package/dist/llm/prompts/simplify-topic.js +0 -50
  364. package/dist/llm/prompts/simplify-topic.js.map +0 -1
  365. package/dist/llm/provider.d.ts +0 -21
  366. package/dist/llm/provider.d.ts.map +0 -1
  367. package/dist/llm/provider.js +0 -76
  368. package/dist/llm/provider.js.map +0 -1
  369. package/dist/llm/schemas.d.ts +0 -97
  370. package/dist/llm/schemas.d.ts.map +0 -1
  371. package/dist/llm/schemas.js +0 -24
  372. package/dist/llm/schemas.js.map +0 -1
  373. package/dist/llm/service.d.ts +0 -34
  374. package/dist/llm/service.d.ts.map +0 -1
  375. package/dist/llm/service.js +0 -268
  376. package/dist/llm/service.js.map +0 -1
  377. package/dist/llm/types.d.ts +0 -18
  378. package/dist/llm/types.d.ts.map +0 -1
  379. package/dist/llm/types.js +0 -2
  380. package/dist/llm/types.js.map +0 -1
  381. package/dist/report/html.d.ts +0 -6
  382. package/dist/report/html.d.ts.map +0 -1
  383. package/dist/report/html.js +0 -200
  384. package/dist/report/html.js.map +0 -1
  385. package/dist/report/json.d.ts +0 -11
  386. package/dist/report/json.d.ts.map +0 -1
  387. package/dist/report/json.js +0 -74
  388. package/dist/report/json.js.map +0 -1
  389. package/dist/report/types.d.ts +0 -58
  390. package/dist/report/types.d.ts.map +0 -1
  391. package/dist/report/types.js +0 -5
  392. package/dist/report/types.js.map +0 -1
@@ -1,869 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import { readFile, writeFile } from 'node:fs/promises';
3
- import chalk from 'chalk';
4
- import { SdkManagementService } from '../../airs/management.js';
5
- import { SdkRuntimeService } from '../../airs/runtime.js';
6
- import { loadConfig } from '../../config/loader.js';
7
- import { buildProfileOverrides, buildProfileRequest, mergeProfilePolicy, } from '../builders/profile-builder.js';
8
- import { loadBulkScanState, saveBulkScanState } from '../bulk-scan-state.js';
9
- import { parseInputFile } from '../parse-input.js';
10
- import { OUTPUT_FORMATS, renderApiKeyDetail, renderApiKeyList, renderCustomerAppConsumption, renderCustomerAppDetail, renderCustomerAppList, renderDeploymentProfileList, renderError, renderProfileDetail, renderProfileList, renderRuntimeConfigHeader, renderScanLogList, renderTopicDetail, renderTopicList, } from '../renderer/index.js';
11
- import { registerAuditCommand } from './audit.js';
12
- import { registerDlpCommands } from './dlp/index.js';
13
- import { registerCleanupCommand } from './profiles-cleanup.js';
14
- import { registerApplyCommand } from './topics-apply.js';
15
- import { registerCreateCommand } from './topics-create.js';
16
- import { registerEvalCommand } from './topics-eval.js';
17
- import { registerRevertCommand } from './topics-revert.js';
18
- import { registerSampleCommand } from './topics-sample.js';
19
- function renderScanResult(result) {
20
- const actionColor = result.action === 'block' ? chalk.red : chalk.green;
21
- console.log(chalk.bold('\n Scan Result'));
22
- console.log(chalk.dim(' ─────────────────────────'));
23
- console.log(` Action: ${actionColor(result.action.toUpperCase())}`);
24
- console.log(` Category: ${result.category}`);
25
- console.log(` Triggered: ${result.triggered ? chalk.red('yes') : chalk.green('no')}`);
26
- console.log(` Scan ID: ${chalk.dim(result.scanId)}`);
27
- console.log(` Report ID: ${chalk.dim(result.reportId)}`);
28
- const flags = Object.entries(result.detections).filter(([, v]) => v);
29
- if (flags.length > 0) {
30
- console.log(chalk.bold('\n Detections:'));
31
- for (const [key] of flags) {
32
- console.log(` ${chalk.yellow('●')} ${key}`);
33
- }
34
- }
35
- console.log();
36
- }
37
- /** Create a management service from config. */
38
- export async function createMgmtService() {
39
- const config = await loadConfig();
40
- return new SdkManagementService({
41
- clientId: config.mgmtClientId,
42
- clientSecret: config.mgmtClientSecret,
43
- tsgId: config.mgmtTsgId,
44
- tokenEndpoint: config.mgmtTokenEndpoint,
45
- });
46
- }
47
- export function registerRuntimeCommand(program) {
48
- const runtime = program
49
- .command('runtime')
50
- .description('Runtime prompt scanning against AIRS profiles');
51
- // -----------------------------------------------------------------------
52
- // runtime api-keys — API key management subcommands
53
- // -----------------------------------------------------------------------
54
- const apiKeys = runtime.command('api-keys').description('Manage AIRS API keys');
55
- apiKeys
56
- .command('list')
57
- .description('List API keys')
58
- .option('--limit <n>', 'Max results', '100')
59
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
60
- .action(async (opts) => {
61
- try {
62
- const fmt = opts.output;
63
- if (fmt === 'pretty')
64
- renderRuntimeConfigHeader();
65
- const service = await createMgmtService();
66
- const result = await service.listApiKeys({
67
- limit: Number.parseInt(opts.limit, 10),
68
- });
69
- renderApiKeyList(result.apiKeys, fmt);
70
- }
71
- catch (err) {
72
- renderError(err instanceof Error ? err.message : String(err));
73
- process.exit(1);
74
- }
75
- });
76
- apiKeys
77
- .command('create')
78
- .description('Create a new API key')
79
- .requiredOption('--config <path>', 'JSON file with API key configuration')
80
- .action(async (opts) => {
81
- try {
82
- renderRuntimeConfigHeader();
83
- const service = await createMgmtService();
84
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
85
- const key = await service.createApiKey(config);
86
- console.log(` API key created: ${key.id}\n`);
87
- renderApiKeyDetail(key);
88
- }
89
- catch (err) {
90
- renderError(err instanceof Error ? err.message : String(err));
91
- process.exit(1);
92
- }
93
- });
94
- apiKeys
95
- .command('regenerate <apiKeyId>')
96
- .description('Regenerate an API key')
97
- .requiredOption('--interval <n>', 'Rotation time interval')
98
- .requiredOption('--unit <unit>', 'Rotation time unit (hours, days, months)')
99
- .option('--updated-by <email>', 'Email of user performing regeneration')
100
- .action(async (apiKeyId, opts) => {
101
- try {
102
- renderRuntimeConfigHeader();
103
- const service = await createMgmtService();
104
- const request = {
105
- rotation_time_interval: Number.parseInt(opts.interval, 10),
106
- rotation_time_unit: opts.unit,
107
- };
108
- if (opts.updatedBy)
109
- request.updated_by = opts.updatedBy;
110
- const key = await service.regenerateApiKey(apiKeyId, request);
111
- console.log(` API key regenerated: ${key.id}\n`);
112
- renderApiKeyDetail(key);
113
- }
114
- catch (err) {
115
- renderError(err instanceof Error ? err.message : String(err));
116
- process.exit(1);
117
- }
118
- });
119
- apiKeys
120
- .command('delete <apiKeyName>')
121
- .description('Delete an API key')
122
- .requiredOption('--updated-by <email>', 'Email of user performing deletion')
123
- .action(async (apiKeyName, opts) => {
124
- try {
125
- renderRuntimeConfigHeader();
126
- const service = await createMgmtService();
127
- const result = await service.deleteApiKey(apiKeyName, opts.updatedBy);
128
- console.log(` ${result.message}\n`);
129
- }
130
- catch (err) {
131
- renderError(err instanceof Error ? err.message : String(err));
132
- process.exit(1);
133
- }
134
- });
135
- // -----------------------------------------------------------------------
136
- // runtime bulk-scan — async bulk scanning
137
- // -----------------------------------------------------------------------
138
- runtime
139
- .command('bulk-scan')
140
- .description('Scan multiple prompts via the async AIRS API')
141
- .requiredOption('--profile <name>', 'Security profile name')
142
- .requiredOption('--input <file>', 'Input file — .csv (extracts prompt column) or .txt (one per line)')
143
- .option('--output <file>', 'Output CSV file path')
144
- .option('--session-id <id>', 'Session ID for grouping scans in AIRS dashboard')
145
- .action(async (opts) => {
146
- try {
147
- const config = await loadConfig({});
148
- if (!config.airsApiKey) {
149
- renderError('PANW_AI_SEC_API_KEY is required');
150
- process.exit(1);
151
- }
152
- const raw = await readFile(opts.input, 'utf-8');
153
- const prompts = parseInputFile(raw, opts.input);
154
- if (prompts.length === 0) {
155
- renderError('No prompts found in input file');
156
- process.exit(1);
157
- }
158
- const sessionId = opts.sessionId ?? `prisma-airs-cli-bulk-${Date.now().toString(36)}`;
159
- const service = new SdkRuntimeService(config.airsApiKey);
160
- console.log(chalk.bold.cyan('\n Prisma AIRS Bulk Scan'));
161
- console.log(chalk.dim(` Profile: ${opts.profile}`));
162
- console.log(chalk.dim(` Session: ${sessionId}`));
163
- console.log(chalk.dim(` Prompts: ${prompts.length}`));
164
- console.log(chalk.dim(` Batches: ${Math.ceil(prompts.length / 5)}\n`));
165
- console.log(chalk.dim(' Submitting async scans...'));
166
- const scanIds = await service.submitBulkScan(opts.profile, prompts, sessionId);
167
- const stateDir = config.dataDir.replace(/\/runs$/, '/bulk-scans');
168
- const statePath = await saveBulkScanState({ scanIds, profile: opts.profile, promptCount: prompts.length, sessionId }, stateDir);
169
- console.log(chalk.dim(` Scan IDs saved: ${statePath}`));
170
- console.log(chalk.dim(` Submitted ${scanIds.length} batch(es), polling for results...`));
171
- const results = await service.pollResults(scanIds, undefined, {
172
- onRetry: (attempt, delayMs) => {
173
- console.log(chalk.yellow(` ⚠ Rate limited — retry ${attempt} in ${(delayMs / 1000).toFixed(0)}s...`));
174
- },
175
- });
176
- // Attach prompts to results
177
- for (let i = 0; i < results.length && i < prompts.length; i++) {
178
- results[i].prompt = prompts[i];
179
- }
180
- const outputPath = opts.output ?? `${opts.profile.replace(/\s+/g, '-')}-bulk-scan.csv`;
181
- const csv = SdkRuntimeService.formatResultsCsv(results);
182
- await writeFile(outputPath, csv, 'utf-8');
183
- const blocked = results.filter((r) => r.action === 'block').length;
184
- const allowed = results.filter((r) => r.action === 'allow').length;
185
- console.log(chalk.bold('\n Bulk Scan Complete'));
186
- console.log(chalk.dim(' ─────────────────────────'));
187
- console.log(` Total: ${results.length}`);
188
- console.log(` Blocked: ${chalk.red(String(blocked))}`);
189
- console.log(` Allowed: ${chalk.green(String(allowed))}`);
190
- console.log(` Output: ${chalk.cyan(outputPath)}\n`);
191
- }
192
- catch (err) {
193
- renderError(err instanceof Error ? err.message : String(err));
194
- process.exit(1);
195
- }
196
- });
197
- // -----------------------------------------------------------------------
198
- // runtime customer-apps — customer app management subcommands
199
- // -----------------------------------------------------------------------
200
- const customerApps = runtime.command('customer-apps').description('Manage AIRS customer apps');
201
- customerApps
202
- .command('list')
203
- .description('List customer apps')
204
- .option('--limit <n>', 'Max results', '100')
205
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
206
- .action(async (opts) => {
207
- try {
208
- const fmt = opts.output;
209
- if (fmt === 'pretty')
210
- renderRuntimeConfigHeader();
211
- const service = await createMgmtService();
212
- const result = await service.listCustomerApps({
213
- limit: Number.parseInt(opts.limit, 10),
214
- });
215
- renderCustomerAppList(result.apps, fmt);
216
- }
217
- catch (err) {
218
- renderError(err instanceof Error ? err.message : String(err));
219
- process.exit(1);
220
- }
221
- });
222
- customerApps
223
- .command('get <appName>')
224
- .description('Get customer app details')
225
- .action(async (appName) => {
226
- try {
227
- renderRuntimeConfigHeader();
228
- const service = await createMgmtService();
229
- const app = await service.getCustomerApp(appName);
230
- renderCustomerAppDetail(app);
231
- }
232
- catch (err) {
233
- renderError(err instanceof Error ? err.message : String(err));
234
- process.exit(1);
235
- }
236
- });
237
- customerApps
238
- .command('update <appId>')
239
- .description('Update a customer app')
240
- .requiredOption('--config <path>', 'JSON file with app updates')
241
- .action(async (appId, opts) => {
242
- try {
243
- renderRuntimeConfigHeader();
244
- const service = await createMgmtService();
245
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
246
- const app = await service.updateCustomerApp(appId, config);
247
- console.log(` Customer app updated: ${app.name}\n`);
248
- renderCustomerAppDetail(app);
249
- }
250
- catch (err) {
251
- renderError(err instanceof Error ? err.message : String(err));
252
- process.exit(1);
253
- }
254
- });
255
- customerApps
256
- .command('delete <appName>')
257
- .description('Delete a customer app')
258
- .requiredOption('--updated-by <email>', 'Email of user performing deletion')
259
- .action(async (appName, opts) => {
260
- try {
261
- renderRuntimeConfigHeader();
262
- const service = await createMgmtService();
263
- const app = await service.deleteCustomerApp(appName, opts.updatedBy);
264
- console.log(` Customer app "${app.name}" deleted.\n`);
265
- }
266
- catch (err) {
267
- renderError(err instanceof Error ? err.message : String(err));
268
- process.exit(1);
269
- }
270
- });
271
- customerApps
272
- .command('consumption [appName]')
273
- .description('Show per-app token consumption + violation breakdown (SCM dashboard). Omit appName to scan all apps.')
274
- .option('--time-interval <n>', 'Window in days: 7, 30, or 60', '30')
275
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
276
- .action(async (appName, opts) => {
277
- try {
278
- const fmt = opts.output;
279
- const interval = Number.parseInt(opts.timeInterval, 10);
280
- if (interval !== 7 && interval !== 30 && interval !== 60) {
281
- renderError('--time-interval must be 7, 30, or 60 (the API rejects other values)');
282
- process.exit(1);
283
- }
284
- if (fmt === 'pretty')
285
- renderRuntimeConfigHeader();
286
- const service = await createMgmtService();
287
- // Single app mode: explicit name was given.
288
- if (appName) {
289
- const data = await service.getCustomerAppConsumption(appName, {
290
- timeInterval: interval,
291
- });
292
- renderCustomerAppConsumption(data, fmt);
293
- return;
294
- }
295
- // All-apps mode: loop the list and emit one record per app.
296
- const list = await service.listCustomerApps({ limit: 100 });
297
- if (list.apps.length === 0) {
298
- console.log(' No customer apps found.');
299
- return;
300
- }
301
- for (const app of list.apps) {
302
- try {
303
- const data = await service.getCustomerAppConsumption(app.name, {
304
- timeInterval: interval,
305
- });
306
- renderCustomerAppConsumption(data, fmt);
307
- }
308
- catch (err) {
309
- renderError(`[${app.name}] ${err instanceof Error ? err.message : String(err)}`);
310
- }
311
- }
312
- }
313
- catch (err) {
314
- renderError(err instanceof Error ? err.message : String(err));
315
- process.exit(1);
316
- }
317
- });
318
- // -----------------------------------------------------------------------
319
- // runtime deployment-profiles — read-only listing
320
- // -----------------------------------------------------------------------
321
- const deploymentProfiles = runtime
322
- .command('deployment-profiles')
323
- .description('List AIRS deployment profiles');
324
- deploymentProfiles
325
- .command('list')
326
- .description('List deployment profiles')
327
- .option('--unactivated', 'Include unactivated profiles')
328
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
329
- .action(async (opts) => {
330
- try {
331
- const fmt = opts.output;
332
- if (fmt === 'pretty')
333
- renderRuntimeConfigHeader();
334
- const service = await createMgmtService();
335
- const profiles = await service.listDeploymentProfiles({
336
- unactivated: opts.unactivated,
337
- });
338
- renderDeploymentProfileList(profiles, fmt);
339
- }
340
- catch (err) {
341
- renderError(err instanceof Error ? err.message : String(err));
342
- process.exit(1);
343
- }
344
- });
345
- // -----------------------------------------------------------------------
346
- // runtime profiles — security profile CRUD subcommands
347
- // -----------------------------------------------------------------------
348
- const profiles = runtime.command('profiles').description('Manage AIRS security profiles');
349
- profiles
350
- .command('list')
351
- .description('List security profiles')
352
- .option('--limit <n>', 'Max results', '100')
353
- .option('--offset <n>', 'Starting offset', '0')
354
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
355
- .action(async (opts) => {
356
- try {
357
- const fmt = opts.output;
358
- if (!OUTPUT_FORMATS.includes(fmt)) {
359
- renderError(`Invalid output format "${fmt}". Valid: ${OUTPUT_FORMATS.join(', ')}`);
360
- process.exit(1);
361
- }
362
- if (fmt === 'pretty')
363
- renderRuntimeConfigHeader();
364
- const service = await createMgmtService();
365
- const result = await service.listProfiles({
366
- limit: Number.parseInt(opts.limit, 10),
367
- offset: Number.parseInt(opts.offset, 10),
368
- });
369
- renderProfileList(result.profiles, fmt);
370
- if (fmt === 'pretty' && result.nextOffset != null) {
371
- console.log(chalk.dim(` Next offset: ${result.nextOffset}\n`));
372
- }
373
- }
374
- catch (err) {
375
- renderError(err instanceof Error ? err.message : String(err));
376
- process.exit(1);
377
- }
378
- });
379
- profiles
380
- .command('get <nameOrId>')
381
- .description('Get a security profile by name or UUID')
382
- .option('--output <format>', 'Output format: pretty, json, yaml', 'pretty')
383
- .action(async (nameOrId, opts) => {
384
- try {
385
- const fmt = opts.output;
386
- if (fmt !== 'pretty' && fmt !== 'json' && fmt !== 'yaml') {
387
- renderError(`Invalid output format "${fmt}". Valid: pretty, json, yaml`);
388
- process.exit(1);
389
- }
390
- if (fmt === 'pretty')
391
- renderRuntimeConfigHeader();
392
- const service = await createMgmtService();
393
- const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId);
394
- const profile = isUuid
395
- ? await service.getProfile(nameOrId)
396
- : await service.getProfileByName(nameOrId);
397
- if (fmt === 'json') {
398
- console.log(JSON.stringify(profile, null, 2));
399
- }
400
- else if (fmt === 'yaml') {
401
- const lines = [`profileId: ${profile.profileId}`, `profileName: ${profile.profileName}`];
402
- if (profile.revision != null)
403
- lines.push(`revision: ${profile.revision}`);
404
- if (profile.active != null)
405
- lines.push(`active: ${profile.active}`);
406
- if (profile.createdBy)
407
- lines.push(`createdBy: ${profile.createdBy}`);
408
- if (profile.updatedBy)
409
- lines.push(`updatedBy: ${profile.updatedBy}`);
410
- if (profile.lastModifiedTs)
411
- lines.push(`lastModifiedTs: ${profile.lastModifiedTs}`);
412
- if (profile.policy)
413
- lines.push(`policy: ${JSON.stringify(profile.policy, null, 2)}`);
414
- console.log(lines.join('\n'));
415
- }
416
- else {
417
- renderProfileDetail(profile);
418
- }
419
- }
420
- catch (err) {
421
- renderError(err instanceof Error ? err.message : String(err));
422
- process.exit(1);
423
- }
424
- });
425
- profiles
426
- .command('create')
427
- .description('Create a new security profile')
428
- .requiredOption('--name <name>', 'Profile name')
429
- .option('--no-active', 'Create profile as inactive')
430
- .option('--prompt-injection <action>', 'Prompt injection action (block/allow/alert)')
431
- .option('--toxic-content <action>', 'Toxic content action (e.g. "high:block, moderate:block")')
432
- .option('--contextual-grounding <action>', 'Contextual grounding action (block/allow/alert)')
433
- .option('--malicious-code <action>', 'Malicious code protection action (block/allow/alert)')
434
- .option('--url-action <action>', 'URL detected action (block/allow/alert)')
435
- .option('--allow-url-categories <list>', 'Comma-separated URL categories to allow')
436
- .option('--block-url-categories <list>', 'Comma-separated URL categories to block')
437
- .option('--alert-url-categories <list>', 'Comma-separated URL categories to alert')
438
- .option('--agent-security <action>', 'Agent security action (block/allow/alert)')
439
- .option('--dlp-action <action>', 'Data leak detection action (block/allow/alert)')
440
- .option('--dlp-profiles <list>', 'Comma-separated DLP profile names')
441
- .option('--mask-data-inline', 'Mask detected data inline')
442
- .option('--db-security-create <action>', 'Database create action (block/allow/alert)')
443
- .option('--db-security-read <action>', 'Database read action (block/allow/alert)')
444
- .option('--db-security-update <action>', 'Database update action (block/allow/alert)')
445
- .option('--db-security-delete <action>', 'Database delete action (block/allow/alert)')
446
- .option('--inline-timeout-action <action>', 'Inline timeout action (block/allow)')
447
- .option('--max-inline-latency <n>', 'Max inline latency in seconds', Number.parseFloat)
448
- .option('--mask-data-in-storage', 'Mask data in storage')
449
- .option('--config <path>', 'JSON file with profile configuration (legacy)')
450
- .action(async (opts) => {
451
- const service = await createMgmtService();
452
- try {
453
- renderRuntimeConfigHeader();
454
- let profile;
455
- if (opts.config) {
456
- // Legacy JSON file path
457
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
458
- profile = await service.createProfile(config);
459
- }
460
- else {
461
- const request = buildProfileRequest({
462
- name: opts.name,
463
- active: opts.active,
464
- promptInjection: opts.promptInjection,
465
- toxicContent: opts.toxicContent,
466
- contextualGrounding: opts.contextualGrounding,
467
- maliciousCode: opts.maliciousCode,
468
- urlAction: opts.urlAction,
469
- allowUrlCategories: opts.allowUrlCategories,
470
- blockUrlCategories: opts.blockUrlCategories,
471
- alertUrlCategories: opts.alertUrlCategories,
472
- agentSecurity: opts.agentSecurity,
473
- dlpAction: opts.dlpAction,
474
- dlpProfiles: opts.dlpProfiles,
475
- maskDataInline: opts.maskDataInline,
476
- dbSecurityCreate: opts.dbSecurityCreate,
477
- dbSecurityRead: opts.dbSecurityRead,
478
- dbSecurityUpdate: opts.dbSecurityUpdate,
479
- dbSecurityDelete: opts.dbSecurityDelete,
480
- inlineTimeoutAction: opts.inlineTimeoutAction,
481
- maxInlineLatency: opts.maxInlineLatency,
482
- maskDataInStorage: opts.maskDataInStorage,
483
- });
484
- profile = await service.createProfile(request);
485
- }
486
- console.log(` Profile created: ${profile.profileId}\n`);
487
- renderProfileDetail(profile);
488
- }
489
- catch (err) {
490
- const msg = err instanceof Error ? err.message : String(err);
491
- if (msg.includes('409')) {
492
- // AIRS may create the profile but also return 409 — check if it exists
493
- try {
494
- const created = await service.getProfileByName(opts.name);
495
- console.log(` Profile created: ${created.profileId}\n`);
496
- renderProfileDetail(created);
497
- return;
498
- }
499
- catch {
500
- // Profile truly already existed before our call
501
- renderError(`Profile "${opts.name}" already exists. Use 'profiles update' to modify it.`);
502
- }
503
- }
504
- else {
505
- renderError(msg);
506
- }
507
- process.exit(1);
508
- }
509
- });
510
- profiles
511
- .command('update <nameOrId>')
512
- .description('Update a security profile by name or UUID')
513
- .option('--name <name>', 'Update profile name')
514
- .option('--no-active', 'Set profile as inactive')
515
- .option('--active', 'Set profile as active')
516
- .option('--prompt-injection <action>', 'Prompt injection action (block/allow/alert)')
517
- .option('--toxic-content <action>', 'Toxic content action (e.g. "high:block, moderate:block")')
518
- .option('--contextual-grounding <action>', 'Contextual grounding action (block/allow/alert)')
519
- .option('--malicious-code <action>', 'Malicious code protection action (block/allow/alert)')
520
- .option('--url-action <action>', 'URL detected action (block/allow/alert)')
521
- .option('--allow-url-categories <list>', 'Comma-separated URL categories to allow')
522
- .option('--block-url-categories <list>', 'Comma-separated URL categories to block')
523
- .option('--alert-url-categories <list>', 'Comma-separated URL categories to alert')
524
- .option('--agent-security <action>', 'Agent security action (block/allow/alert)')
525
- .option('--dlp-action <action>', 'Data leak detection action (block/allow/alert)')
526
- .option('--dlp-profiles <list>', 'Comma-separated DLP profile names')
527
- .option('--mask-data-inline', 'Mask detected data inline')
528
- .option('--db-security-create <action>', 'Database create action (block/allow/alert)')
529
- .option('--db-security-read <action>', 'Database read action (block/allow/alert)')
530
- .option('--db-security-update <action>', 'Database update action (block/allow/alert)')
531
- .option('--db-security-delete <action>', 'Database delete action (block/allow/alert)')
532
- .option('--inline-timeout-action <action>', 'Inline timeout action (block/allow)')
533
- .option('--max-inline-latency <n>', 'Max inline latency in seconds', Number.parseFloat)
534
- .option('--mask-data-in-storage', 'Mask data in storage')
535
- .option('--config <path>', 'JSON file with profile updates (legacy)')
536
- .action(async (nameOrId, opts) => {
537
- try {
538
- renderRuntimeConfigHeader();
539
- const service = await createMgmtService();
540
- const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId);
541
- const resolved = isUuid
542
- ? await service.getProfile(nameOrId)
543
- : await service.getProfileByName(nameOrId);
544
- const profileId = resolved.profileId;
545
- let profile;
546
- if (opts.config) {
547
- // Legacy JSON file path
548
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
549
- profile = await service.updateProfile(profileId, config);
550
- }
551
- else {
552
- // Read-modify-write: fetch current profile, merge flags, PUT full payload
553
- const current = resolved;
554
- const overrides = buildProfileOverrides({
555
- promptInjection: opts.promptInjection,
556
- toxicContent: opts.toxicContent,
557
- contextualGrounding: opts.contextualGrounding,
558
- maliciousCode: opts.maliciousCode,
559
- urlAction: opts.urlAction,
560
- allowUrlCategories: opts.allowUrlCategories,
561
- blockUrlCategories: opts.blockUrlCategories,
562
- alertUrlCategories: opts.alertUrlCategories,
563
- agentSecurity: opts.agentSecurity,
564
- dlpAction: opts.dlpAction,
565
- dlpProfiles: opts.dlpProfiles,
566
- maskDataInline: opts.maskDataInline,
567
- dbSecurityCreate: opts.dbSecurityCreate,
568
- dbSecurityRead: opts.dbSecurityRead,
569
- dbSecurityUpdate: opts.dbSecurityUpdate,
570
- dbSecurityDelete: opts.dbSecurityDelete,
571
- inlineTimeoutAction: opts.inlineTimeoutAction,
572
- maxInlineLatency: opts.maxInlineLatency,
573
- maskDataInStorage: opts.maskDataInStorage,
574
- });
575
- const mergedPolicy = mergeProfilePolicy(current.policy, overrides);
576
- profile = await service.updateProfile(profileId, {
577
- profile_name: opts.name ?? current.profileName,
578
- active: opts.active ?? current.active ?? true,
579
- policy: mergedPolicy,
580
- });
581
- }
582
- console.log(` Profile updated: ${profile.profileId}\n`);
583
- renderProfileDetail(profile);
584
- }
585
- catch (err) {
586
- renderError(err instanceof Error ? err.message : String(err));
587
- process.exit(1);
588
- }
589
- });
590
- profiles
591
- .command('delete <nameOrId>')
592
- .description('Delete a security profile by name or UUID')
593
- .option('--force', 'Force delete (removes from referencing policies)')
594
- .option('--updated-by <email>', 'Email of user performing force deletion')
595
- .action(async (nameOrId, opts) => {
596
- try {
597
- renderRuntimeConfigHeader();
598
- const service = await createMgmtService();
599
- const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId);
600
- let profileId = nameOrId;
601
- let profileName = nameOrId;
602
- if (isUuid) {
603
- const profile = await service.getProfile(nameOrId);
604
- profileName = profile.profileName;
605
- }
606
- else {
607
- const profile = await service.getProfileByName(nameOrId);
608
- profileId = profile.profileId;
609
- profileName = profile.profileName;
610
- }
611
- if (opts.force) {
612
- if (!opts.updatedBy) {
613
- renderError('--updated-by <email> is required with --force');
614
- process.exit(1);
615
- }
616
- await service.forceDeleteProfile(profileId, opts.updatedBy);
617
- }
618
- else {
619
- await service.deleteProfile(profileId);
620
- }
621
- console.log(` Profile deleted: ${profileName} (${profileId})\n`);
622
- }
623
- catch (err) {
624
- renderError(err instanceof Error ? err.message : String(err));
625
- process.exit(1);
626
- }
627
- });
628
- // Register cleanup under profiles
629
- registerCleanupCommand(profiles);
630
- // Register audit under profiles
631
- registerAuditCommand(profiles);
632
- // -----------------------------------------------------------------------
633
- // runtime resume-poll — resume polling for bulk scans
634
- // -----------------------------------------------------------------------
635
- runtime
636
- .command('resume-poll <stateFile>')
637
- .description('Resume polling for a previously submitted bulk scan')
638
- .option('--output <file>', 'Output CSV file path')
639
- .action(async (stateFile, opts) => {
640
- try {
641
- const config = await loadConfig({});
642
- if (!config.airsApiKey) {
643
- renderError('PANW_AI_SEC_API_KEY is required');
644
- process.exit(1);
645
- }
646
- const state = await loadBulkScanState(stateFile);
647
- const service = new SdkRuntimeService(config.airsApiKey);
648
- console.log(chalk.bold.cyan('\n Prisma AIRS Resume Poll'));
649
- console.log(chalk.dim(` Profile: ${state.profile}`));
650
- console.log(chalk.dim(` Scan IDs: ${state.scanIds.length}`));
651
- console.log(chalk.dim(` Prompts: ${state.promptCount}\n`));
652
- console.log(chalk.dim(' Polling for results...'));
653
- const results = await service.pollResults(state.scanIds, undefined, {
654
- onRetry: (attempt, delayMs) => {
655
- console.log(chalk.yellow(` ⚠ Rate limited — retry ${attempt} in ${(delayMs / 1000).toFixed(0)}s...`));
656
- },
657
- });
658
- const outputPath = opts.output ?? `${state.profile.replace(/\s+/g, '-')}-bulk-scan.csv`;
659
- const csv = SdkRuntimeService.formatResultsCsv(results);
660
- await writeFile(outputPath, csv, 'utf-8');
661
- const blocked = results.filter((r) => r.action === 'block').length;
662
- const allowed = results.filter((r) => r.action === 'allow').length;
663
- console.log(chalk.bold('\n Resume Poll Complete'));
664
- console.log(chalk.dim(' ─────────────────────────'));
665
- console.log(` Total: ${results.length}`);
666
- console.log(` Blocked: ${chalk.red(String(blocked))}`);
667
- console.log(` Allowed: ${chalk.green(String(allowed))}`);
668
- console.log(` Output: ${chalk.cyan(outputPath)}\n`);
669
- }
670
- catch (err) {
671
- renderError(err instanceof Error ? err.message : String(err));
672
- process.exit(1);
673
- }
674
- });
675
- // -----------------------------------------------------------------------
676
- // runtime scan — single prompt scanning
677
- // -----------------------------------------------------------------------
678
- runtime
679
- .command('scan <prompt>')
680
- .description('Scan a single prompt against an AIRS security profile')
681
- .requiredOption('--profile <name>', 'Security profile name')
682
- .option('--response <text>', 'Response text to scan alongside the prompt')
683
- .action(async (prompt, opts) => {
684
- try {
685
- const config = await loadConfig({});
686
- if (!config.airsApiKey) {
687
- renderError('PANW_AI_SEC_API_KEY is required');
688
- process.exit(1);
689
- }
690
- const service = new SdkRuntimeService(config.airsApiKey);
691
- console.log(chalk.bold.cyan('\n Prisma AIRS Runtime Scan'));
692
- console.log(chalk.dim(` Profile: ${opts.profile}`));
693
- console.log(chalk.dim(` Prompt: "${prompt.slice(0, 80)}${prompt.length > 80 ? '...' : ''}"`));
694
- const result = await service.scanPrompt(opts.profile, prompt, opts.response);
695
- renderScanResult(result);
696
- }
697
- catch (err) {
698
- renderError(err instanceof Error ? err.message : String(err));
699
- process.exit(1);
700
- }
701
- });
702
- // -----------------------------------------------------------------------
703
- // runtime scan-logs — scan log query
704
- // -----------------------------------------------------------------------
705
- const scanLogs = runtime.command('scan-logs').description('Query AIRS scan logs');
706
- scanLogs
707
- .command('query')
708
- .description('Query scan logs')
709
- .requiredOption('--interval <n>', 'Time interval')
710
- .requiredOption('--unit <unit>', 'Time unit (hours)')
711
- .option('--filter <filter>', 'Filter: all, benign, threat', 'all')
712
- .option('--page <n>', 'Page number', '1')
713
- .option('--page-size <n>', 'Page size', '50')
714
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
715
- .action(async (opts) => {
716
- try {
717
- const fmt = opts.output;
718
- if (fmt === 'pretty')
719
- renderRuntimeConfigHeader();
720
- const service = await createMgmtService();
721
- const result = await service.queryScanLogs({
722
- timeInterval: Number.parseInt(opts.interval, 10),
723
- timeUnit: opts.unit,
724
- pageNumber: Number.parseInt(opts.page, 10),
725
- pageSize: Number.parseInt(opts.pageSize, 10),
726
- filter: opts.filter,
727
- });
728
- renderScanLogList(result.results, result.pageToken, fmt);
729
- }
730
- catch (err) {
731
- renderError(err instanceof Error ? err.message : String(err));
732
- process.exit(1);
733
- }
734
- });
735
- // -----------------------------------------------------------------------
736
- // runtime topics — custom topic CRUD + guardrail generation subcommands
737
- // -----------------------------------------------------------------------
738
- const topics = runtime
739
- .command('topics')
740
- .description('Manage AIRS custom topics and guardrail generation');
741
- // Register all topics subcommands in alphabetical order
742
- registerApplyCommand(topics);
743
- registerCreateCommand(topics);
744
- topics
745
- .command('delete <topicId>')
746
- .description('Delete a custom topic')
747
- .option('--force', 'Force delete (removes from all referencing profiles)')
748
- .option('--updated-by <email>', 'Email of user performing force deletion')
749
- .action(async (topicId, opts) => {
750
- try {
751
- renderRuntimeConfigHeader();
752
- const service = await createMgmtService();
753
- if (opts.force) {
754
- const result = await service.forceDeleteTopic(topicId, opts.updatedBy);
755
- console.log(` ${result.message}\n`);
756
- }
757
- else {
758
- await service.deleteTopic(topicId);
759
- console.log(` Topic ${topicId} deleted.\n`);
760
- }
761
- }
762
- catch (err) {
763
- renderError(err instanceof Error ? err.message : String(err));
764
- process.exit(1);
765
- }
766
- });
767
- registerEvalCommand(topics);
768
- topics
769
- .command('get <nameOrId>')
770
- .description('Get a custom topic by name or UUID')
771
- .option('--output <format>', 'Output format: pretty, json, yaml', 'pretty')
772
- .action(async (nameOrId, opts) => {
773
- try {
774
- const fmt = opts.output;
775
- if (fmt !== 'pretty' && fmt !== 'json' && fmt !== 'yaml') {
776
- renderError(`Invalid output format "${fmt}". Valid: pretty, json, yaml`);
777
- process.exit(1);
778
- }
779
- if (fmt === 'pretty')
780
- renderRuntimeConfigHeader();
781
- const service = await createMgmtService();
782
- const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId);
783
- const topic = isUuid
784
- ? await service.getTopic(nameOrId)
785
- : await service.getTopicByName(nameOrId);
786
- if (fmt === 'json') {
787
- console.log(JSON.stringify(topic, null, 2));
788
- }
789
- else if (fmt === 'yaml') {
790
- const lines = [`topic_id: ${topic.topic_id}`, `topic_name: ${topic.topic_name}`];
791
- if (topic.revision != null)
792
- lines.push(`revision: ${topic.revision}`);
793
- if (topic.description)
794
- lines.push(`description: ${topic.description}`);
795
- if (topic.examples?.length) {
796
- lines.push('examples:');
797
- for (const ex of topic.examples)
798
- lines.push(` - ${ex}`);
799
- }
800
- if (topic.created_by)
801
- lines.push(`created_by: ${topic.created_by}`);
802
- if (topic.updated_by)
803
- lines.push(`updated_by: ${topic.updated_by}`);
804
- if (topic.last_modified_ts)
805
- lines.push(`last_modified_ts: ${topic.last_modified_ts}`);
806
- console.log(lines.join('\n'));
807
- }
808
- else {
809
- renderTopicDetail(topic);
810
- }
811
- }
812
- catch (err) {
813
- renderError(err instanceof Error ? err.message : String(err));
814
- process.exit(1);
815
- }
816
- });
817
- topics
818
- .command('list')
819
- .description('List custom topics')
820
- .option('--limit <n>', 'Max results', '100')
821
- .option('--offset <n>', 'Starting offset', '0')
822
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
823
- .action(async (opts) => {
824
- try {
825
- const fmt = opts.output;
826
- if (fmt === 'pretty')
827
- renderRuntimeConfigHeader();
828
- const service = await createMgmtService();
829
- const allTopics = await service.listTopics();
830
- // Client-side pagination since SDK returns all
831
- const offset = Number.parseInt(opts.offset, 10);
832
- const limit = Number.parseInt(opts.limit, 10);
833
- const page = allTopics.slice(offset, offset + limit);
834
- renderTopicList(page, fmt);
835
- if (fmt === 'pretty' && offset + limit < allTopics.length) {
836
- console.log(chalk.dim(` Showing ${page.length} of ${allTopics.length} topics\n`));
837
- }
838
- }
839
- catch (err) {
840
- renderError(err instanceof Error ? err.message : String(err));
841
- process.exit(1);
842
- }
843
- });
844
- registerRevertCommand(topics);
845
- registerSampleCommand(topics);
846
- topics
847
- .command('update <topicId>')
848
- .description('Update a custom topic')
849
- .requiredOption('--config <path>', 'JSON file with topic updates')
850
- .action(async (topicId, opts) => {
851
- try {
852
- renderRuntimeConfigHeader();
853
- const service = await createMgmtService();
854
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
855
- const topic = await service.updateTopic(topicId, config);
856
- console.log(` Topic updated: ${topic.topic_id}\n`);
857
- renderTopicDetail(topic);
858
- }
859
- catch (err) {
860
- renderError(err instanceof Error ? err.message : String(err));
861
- process.exit(1);
862
- }
863
- });
864
- // -----------------------------------------------------------------------
865
- // runtime dlp — DLP management subcommands (incl. `generate`)
866
- // -----------------------------------------------------------------------
867
- registerDlpCommands(runtime);
868
- }
869
- //# sourceMappingURL=runtime.js.map