@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,1075 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import chalk from 'chalk';
4
- import { SdkPromptSetService } from '../../airs/promptsets.js';
5
- import { SdkRedTeamService } from '../../airs/redteam.js';
6
- import { resolveOutputDir } from '../../backup/io.js';
7
- import { loadConfig } from '../../config/loader.js';
8
- import { buildAttackListFootnote, renderAttackList, renderAuthValidation, renderBackupHeader, renderBackupSummary, renderCategories, renderCustomAttackList, renderCustomReport, renderDynamicReport, renderError, renderEulaContent, renderEulaStatus, renderInstanceDetail, renderInstanceResponse, renderPromptDetail, renderPromptList, renderPromptSetDetail, renderPromptSetList, renderPropertyNames, renderPropertyValues, renderRedteamHeader, renderRegistryCredentials, renderRestoreSummary, renderScanList, renderScanProgress, renderScanStatus, renderStaticReport, renderTargetDetail, renderTargetList, renderTargetTemplates, renderVersionInfo, } from '../renderer/index.js';
9
- import { backupTargets } from './backup.js';
10
- import { restoreTargets } from './restore.js';
11
- /** Create an SdkRedTeamService from config. */
12
- async function createService() {
13
- const config = await loadConfig();
14
- return new SdkRedTeamService({
15
- clientId: config.mgmtClientId,
16
- clientSecret: config.mgmtClientSecret,
17
- tsgId: config.mgmtTsgId,
18
- tokenEndpoint: config.mgmtTokenEndpoint,
19
- });
20
- }
21
- /** Create an SdkPromptSetService from config. */
22
- async function createPromptSetService() {
23
- const config = await loadConfig();
24
- return new SdkPromptSetService({
25
- clientId: config.mgmtClientId,
26
- clientSecret: config.mgmtClientSecret,
27
- tsgId: config.mgmtTsgId,
28
- tokenEndpoint: config.mgmtTokenEndpoint,
29
- });
30
- }
31
- /** Parse `--goals` arg as inline JSON array (starts with `[`) or path to a JSON file. */
32
- export function parseAttackGoals(input) {
33
- const trimmed = input.trim();
34
- const raw = trimmed.startsWith('[') ? trimmed : fs.readFileSync(trimmed, 'utf-8');
35
- let parsed;
36
- try {
37
- parsed = JSON.parse(raw);
38
- }
39
- catch (err) {
40
- throw new Error(`--goals: invalid JSON (${err instanceof Error ? err.message : err})`);
41
- }
42
- if (!Array.isArray(parsed) || !parsed.every((g) => typeof g === 'string' && g.length > 0)) {
43
- throw new Error('--goals: expected a JSON array of non-empty strings');
44
- }
45
- return parsed;
46
- }
47
- /** Parse a string flag as a positive integer. */
48
- export function parsePositiveInt(input, flag) {
49
- const n = Number.parseInt(input, 10);
50
- if (!Number.isFinite(n) || n <= 0) {
51
- throw new Error(`${flag}: expected a positive integer, got "${input}"`);
52
- }
53
- return n;
54
- }
55
- /** Valid provider names for target init templates. */
56
- export const VALID_TARGET_PROVIDERS = [
57
- 'OPENAI',
58
- 'HUGGING_FACE',
59
- 'DATABRICKS',
60
- 'BEDROCK',
61
- 'REST',
62
- 'STREAMING',
63
- ];
64
- /** Build a target config scaffold from a provider template. */
65
- export function buildTargetScaffold(provider, templates) {
66
- const key = provider.toUpperCase();
67
- if (!VALID_TARGET_PROVIDERS.includes(key)) {
68
- throw new Error(`Unknown provider "${provider}". Valid providers: ${VALID_TARGET_PROVIDERS.join(', ')}`);
69
- }
70
- return {
71
- name: '',
72
- target_type: 'APPLICATION',
73
- connection_params: templates[key] ?? {},
74
- target_background: {},
75
- additional_context: {},
76
- target_metadata: {},
77
- };
78
- }
79
- /** Register the `redteam` command group. */
80
- export function registerRedteamCommand(program) {
81
- const redteam = program.command('redteam').description('AI Red Team scan operations');
82
- // -----------------------------------------------------------------------
83
- // redteam abort — abort a running scan
84
- // -----------------------------------------------------------------------
85
- redteam
86
- .command('abort <jobId>')
87
- .description('Abort a running scan')
88
- .action(async (jobId) => {
89
- try {
90
- renderRedteamHeader();
91
- const service = await createService();
92
- await service.abortScan(jobId);
93
- console.log(` Scan ${jobId} aborted.\n`);
94
- }
95
- catch (err) {
96
- renderError(err instanceof Error ? err.message : String(err));
97
- process.exit(1);
98
- }
99
- });
100
- // -----------------------------------------------------------------------
101
- // redteam categories — list attack categories
102
- // -----------------------------------------------------------------------
103
- redteam
104
- .command('categories')
105
- .description('List available attack categories')
106
- .action(async () => {
107
- try {
108
- renderRedteamHeader();
109
- const service = await createService();
110
- const categories = await service.getCategories();
111
- renderCategories(categories);
112
- }
113
- catch (err) {
114
- renderError(err instanceof Error ? err.message : String(err));
115
- process.exit(1);
116
- }
117
- });
118
- // -----------------------------------------------------------------------
119
- // redteam eula — EULA management subcommands
120
- // -----------------------------------------------------------------------
121
- const eula = redteam.command('eula').description('Manage Red Team EULA');
122
- eula
123
- .command('status')
124
- .description('Check EULA acceptance status')
125
- .action(async () => {
126
- try {
127
- renderRedteamHeader();
128
- const service = await createService();
129
- const status = await service.getEulaStatus();
130
- renderEulaStatus(status);
131
- }
132
- catch (err) {
133
- renderError(err instanceof Error ? err.message : String(err));
134
- process.exit(1);
135
- }
136
- });
137
- eula
138
- .command('content')
139
- .description('Display EULA content')
140
- .action(async () => {
141
- try {
142
- renderRedteamHeader();
143
- const service = await createService();
144
- const content = await service.getEulaContent();
145
- renderEulaContent(content);
146
- }
147
- catch (err) {
148
- renderError(err instanceof Error ? err.message : String(err));
149
- process.exit(1);
150
- }
151
- });
152
- eula
153
- .command('accept')
154
- .description('Accept the EULA')
155
- .option('--confirm', 'Skip confirmation prompt')
156
- .action(async (opts) => {
157
- try {
158
- renderRedteamHeader();
159
- const service = await createService();
160
- const content = await service.getEulaContent();
161
- if (!opts.confirm) {
162
- renderEulaContent(content);
163
- console.log(' Pass --confirm to accept.\n');
164
- return;
165
- }
166
- const result = await service.acceptEula(content.content);
167
- renderEulaStatus(result);
168
- console.log(' EULA accepted.\n');
169
- }
170
- catch (err) {
171
- renderError(err instanceof Error ? err.message : String(err));
172
- process.exit(1);
173
- }
174
- });
175
- // -----------------------------------------------------------------------
176
- // redteam instances — instance CRUD subcommands
177
- // -----------------------------------------------------------------------
178
- const instances = redteam.command('instances').description('Manage Red Team instances');
179
- instances
180
- .command('create')
181
- .description('Create an instance')
182
- .requiredOption('--tsg-id <id>', 'TSG ID')
183
- .requiredOption('--tenant-id <id>', 'Tenant ID')
184
- .requiredOption('--app-id <id>', 'App ID')
185
- .requiredOption('--region <region>', 'Region')
186
- .action(async (opts) => {
187
- try {
188
- renderRedteamHeader();
189
- const service = await createService();
190
- const result = await service.createInstance({
191
- tsgId: opts.tsgId,
192
- tenantId: opts.tenantId,
193
- appId: opts.appId,
194
- region: opts.region,
195
- });
196
- renderInstanceResponse(result);
197
- }
198
- catch (err) {
199
- renderError(err instanceof Error ? err.message : String(err));
200
- process.exit(1);
201
- }
202
- });
203
- instances
204
- .command('get <tenantId>')
205
- .description('Get instance details')
206
- .action(async (tenantId) => {
207
- try {
208
- renderRedteamHeader();
209
- const service = await createService();
210
- const result = await service.getInstance(tenantId);
211
- renderInstanceDetail(result);
212
- }
213
- catch (err) {
214
- renderError(err instanceof Error ? err.message : String(err));
215
- process.exit(1);
216
- }
217
- });
218
- instances
219
- .command('update <tenantId>')
220
- .description('Update an instance')
221
- .requiredOption('--tsg-id <id>', 'TSG ID')
222
- .requiredOption('--app-id <id>', 'App ID')
223
- .requiredOption('--region <region>', 'Region')
224
- .action(async (tenantId, opts) => {
225
- try {
226
- renderRedteamHeader();
227
- const service = await createService();
228
- const result = await service.updateInstance(tenantId, {
229
- tsgId: opts.tsgId,
230
- tenantId,
231
- appId: opts.appId,
232
- region: opts.region,
233
- });
234
- renderInstanceResponse(result);
235
- }
236
- catch (err) {
237
- renderError(err instanceof Error ? err.message : String(err));
238
- process.exit(1);
239
- }
240
- });
241
- instances
242
- .command('delete <tenantId>')
243
- .description('Delete an instance')
244
- .action(async (tenantId) => {
245
- try {
246
- renderRedteamHeader();
247
- const service = await createService();
248
- const result = await service.deleteInstance(tenantId);
249
- renderInstanceResponse(result);
250
- console.log(` Instance ${tenantId} deleted.\n`);
251
- }
252
- catch (err) {
253
- renderError(err instanceof Error ? err.message : String(err));
254
- process.exit(1);
255
- }
256
- });
257
- // -----------------------------------------------------------------------
258
- // redteam devices — device management subcommands
259
- // -----------------------------------------------------------------------
260
- const devices = redteam.command('devices').description('Manage Red Team devices');
261
- devices
262
- .command('create <tenantId>')
263
- .description('Create devices for an instance')
264
- .requiredOption('--config <path>', 'JSON file with device request')
265
- .action(async (tenantId, opts) => {
266
- try {
267
- renderRedteamHeader();
268
- const service = await createService();
269
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
270
- const result = await service.createDevices(tenantId, config);
271
- console.log(' Devices created:');
272
- console.log(` ${JSON.stringify(result, null, 2)}\n`);
273
- }
274
- catch (err) {
275
- renderError(err instanceof Error ? err.message : String(err));
276
- process.exit(1);
277
- }
278
- });
279
- devices
280
- .command('update <tenantId>')
281
- .description('Update devices for an instance (PATCH)')
282
- .requiredOption('--config <path>', 'JSON file with device request')
283
- .action(async (tenantId, opts) => {
284
- try {
285
- renderRedteamHeader();
286
- const service = await createService();
287
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
288
- const result = await service.updateDevices(tenantId, config);
289
- console.log(' Devices updated:');
290
- console.log(` ${JSON.stringify(result, null, 2)}\n`);
291
- }
292
- catch (err) {
293
- renderError(err instanceof Error ? err.message : String(err));
294
- process.exit(1);
295
- }
296
- });
297
- devices
298
- .command('delete <tenantId>')
299
- .description('Delete devices by serial numbers')
300
- .requiredOption('--serial-numbers <list>', 'Comma-separated serial numbers')
301
- .action(async (tenantId, opts) => {
302
- try {
303
- renderRedteamHeader();
304
- const service = await createService();
305
- const result = await service.deleteDevices(tenantId, opts.serialNumbers);
306
- console.log(' Devices deleted:');
307
- console.log(` ${JSON.stringify(result, null, 2)}\n`);
308
- }
309
- catch (err) {
310
- renderError(err instanceof Error ? err.message : String(err));
311
- process.exit(1);
312
- }
313
- });
314
- // -----------------------------------------------------------------------
315
- // redteam registry-credentials — registry credentials
316
- // -----------------------------------------------------------------------
317
- redteam
318
- .command('registry-credentials')
319
- .description('Get or create registry credentials')
320
- .action(async () => {
321
- try {
322
- renderRedteamHeader();
323
- const service = await createService();
324
- const creds = await service.getRegistryCredentials();
325
- renderRegistryCredentials(creds);
326
- }
327
- catch (err) {
328
- renderError(err instanceof Error ? err.message : String(err));
329
- process.exit(1);
330
- }
331
- });
332
- // -----------------------------------------------------------------------
333
- // redteam list — list recent scans
334
- // -----------------------------------------------------------------------
335
- redteam
336
- .command('list')
337
- .description('List recent scans')
338
- .option('--status <status>', 'Filter by status (QUEUED, RUNNING, COMPLETED, FAILED, ABORTED)')
339
- .option('--type <type>', 'Filter by job type (STATIC, DYNAMIC, CUSTOM)')
340
- .option('--target <uuid>', 'Filter by target UUID')
341
- .option('--limit <n>', 'Max results', '10')
342
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
343
- .action(async (opts) => {
344
- try {
345
- const fmt = opts.output;
346
- if (fmt === 'pretty')
347
- renderRedteamHeader();
348
- const service = await createService();
349
- const scans = await service.listScans({
350
- status: opts.status,
351
- jobType: opts.type,
352
- targetId: opts.target,
353
- limit: Number.parseInt(opts.limit, 10),
354
- });
355
- renderScanList(scans, fmt);
356
- }
357
- catch (err) {
358
- renderError(err instanceof Error ? err.message : String(err));
359
- process.exit(1);
360
- }
361
- });
362
- // -----------------------------------------------------------------------
363
- // redteam prompt-sets — prompt set CRUD subcommands
364
- // -----------------------------------------------------------------------
365
- const promptSets = redteam.command('prompt-sets').description('Manage custom prompt sets');
366
- promptSets
367
- .command('list')
368
- .description('List custom prompt sets')
369
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
370
- .action(async (opts) => {
371
- try {
372
- const fmt = opts.output;
373
- if (fmt === 'pretty')
374
- renderRedteamHeader();
375
- const service = await createPromptSetService();
376
- const sets = await service.listPromptSets();
377
- renderPromptSetList(sets, fmt);
378
- }
379
- catch (err) {
380
- renderError(err instanceof Error ? err.message : String(err));
381
- process.exit(1);
382
- }
383
- });
384
- promptSets
385
- .command('get <uuid>')
386
- .description('Get prompt set details')
387
- .option('--output <format>', 'Output format: pretty, json, yaml', 'pretty')
388
- .action(async (uuid, opts) => {
389
- try {
390
- const fmt = opts.output;
391
- if (fmt === 'pretty')
392
- renderRedteamHeader();
393
- const service = await createPromptSetService();
394
- const ps = await service.getPromptSet(uuid);
395
- const info = await service.getPromptSetVersionInfo(uuid);
396
- if (fmt === 'pretty') {
397
- renderPromptSetDetail(ps);
398
- renderVersionInfo(info);
399
- }
400
- else {
401
- renderPromptSetDetail(ps, fmt, info);
402
- }
403
- }
404
- catch (err) {
405
- renderError(err instanceof Error ? err.message : String(err));
406
- process.exit(1);
407
- }
408
- });
409
- promptSets
410
- .command('create')
411
- .description('Create a new prompt set')
412
- .requiredOption('--name <name>', 'Prompt set name')
413
- .option('--description <desc>', 'Prompt set description')
414
- .action(async (opts) => {
415
- try {
416
- renderRedteamHeader();
417
- const service = await createPromptSetService();
418
- const result = await service.createPromptSet(opts.name, opts.description);
419
- console.log(` Prompt set created: ${result.uuid}\n`);
420
- console.log(` Name: ${result.name}\n`);
421
- }
422
- catch (err) {
423
- renderError(err instanceof Error ? err.message : String(err));
424
- process.exit(1);
425
- }
426
- });
427
- promptSets
428
- .command('update <uuid>')
429
- .description('Update a prompt set')
430
- .option('--name <name>', 'New name')
431
- .option('--description <desc>', 'New description')
432
- .action(async (uuid, opts) => {
433
- try {
434
- renderRedteamHeader();
435
- const service = await createPromptSetService();
436
- const request = {};
437
- if (opts.name)
438
- request.name = opts.name;
439
- if (opts.description)
440
- request.description = opts.description;
441
- const result = await service.updatePromptSet(uuid, request);
442
- renderPromptSetDetail(result);
443
- }
444
- catch (err) {
445
- renderError(err instanceof Error ? err.message : String(err));
446
- process.exit(1);
447
- }
448
- });
449
- promptSets
450
- .command('archive <uuid>')
451
- .description('Archive a prompt set')
452
- .option('--unarchive', 'Unarchive instead')
453
- .action(async (uuid, opts) => {
454
- try {
455
- renderRedteamHeader();
456
- const service = await createPromptSetService();
457
- const archive = !opts.unarchive;
458
- await service.archivePromptSet(uuid, archive);
459
- console.log(` Prompt set ${uuid} ${archive ? 'archived' : 'unarchived'}.\n`);
460
- }
461
- catch (err) {
462
- renderError(err instanceof Error ? err.message : String(err));
463
- process.exit(1);
464
- }
465
- });
466
- promptSets
467
- .command('download <uuid>')
468
- .description('Download CSV template for a prompt set')
469
- .option('--output <path>', 'Output file path')
470
- .action(async (uuid, opts) => {
471
- try {
472
- renderRedteamHeader();
473
- const service = await createPromptSetService();
474
- const csv = await service.downloadTemplate(uuid);
475
- const outPath = opts.output || `${uuid}-template.csv`;
476
- fs.writeFileSync(outPath, csv, 'utf-8');
477
- console.log(` Template saved to ${outPath}\n`);
478
- }
479
- catch (err) {
480
- renderError(err instanceof Error ? err.message : String(err));
481
- process.exit(1);
482
- }
483
- });
484
- promptSets
485
- .command('upload <uuid> <file>')
486
- .description('Upload CSV prompts to a prompt set')
487
- .action(async (uuid, file) => {
488
- try {
489
- renderRedteamHeader();
490
- const service = await createPromptSetService();
491
- const content = fs.readFileSync(file);
492
- const filename = path.basename(file);
493
- const blob = new File([content], filename, { type: 'text/csv' });
494
- const result = await service.uploadPromptsCsv(uuid, blob);
495
- console.log(` ${result.message}\n`);
496
- }
497
- catch (err) {
498
- renderError(err instanceof Error ? err.message : String(err));
499
- process.exit(1);
500
- }
501
- });
502
- // -----------------------------------------------------------------------
503
- // redteam prompts — individual prompt CRUD subcommands
504
- // -----------------------------------------------------------------------
505
- const prompts = redteam.command('prompts').description('Manage prompts within prompt sets');
506
- prompts
507
- .command('list <setUuid>')
508
- .description('List prompts in a prompt set')
509
- .option('--limit <n>', 'Max results', '50')
510
- .action(async (setUuid, opts) => {
511
- try {
512
- renderRedteamHeader();
513
- const service = await createPromptSetService();
514
- const list = await service.listPrompts(setUuid, {
515
- limit: Number.parseInt(opts.limit, 10),
516
- });
517
- renderPromptList(list);
518
- }
519
- catch (err) {
520
- renderError(err instanceof Error ? err.message : String(err));
521
- process.exit(1);
522
- }
523
- });
524
- prompts
525
- .command('get <setUuid> <promptUuid>')
526
- .description('Get prompt details')
527
- .action(async (setUuid, promptUuid) => {
528
- try {
529
- renderRedteamHeader();
530
- const service = await createPromptSetService();
531
- const prompt = await service.getPrompt(setUuid, promptUuid);
532
- renderPromptDetail(prompt);
533
- }
534
- catch (err) {
535
- renderError(err instanceof Error ? err.message : String(err));
536
- process.exit(1);
537
- }
538
- });
539
- prompts
540
- .command('add <setUuid>')
541
- .description('Add a prompt to a prompt set')
542
- .requiredOption('--prompt <text>', 'Prompt text')
543
- .option('--goal <text>', 'Prompt goal')
544
- .action(async (setUuid, opts) => {
545
- try {
546
- renderRedteamHeader();
547
- const service = await createPromptSetService();
548
- const result = await service.addPrompt(setUuid, opts.prompt, opts.goal);
549
- console.log(` Prompt added: ${result.uuid}\n`);
550
- }
551
- catch (err) {
552
- renderError(err instanceof Error ? err.message : String(err));
553
- process.exit(1);
554
- }
555
- });
556
- prompts
557
- .command('update <setUuid> <promptUuid>')
558
- .description('Update a prompt')
559
- .option('--prompt <text>', 'New prompt text')
560
- .option('--goal <text>', 'New goal')
561
- .action(async (setUuid, promptUuid, opts) => {
562
- try {
563
- renderRedteamHeader();
564
- const service = await createPromptSetService();
565
- const request = {};
566
- if (opts.prompt)
567
- request.prompt = opts.prompt;
568
- if (opts.goal)
569
- request.goal = opts.goal;
570
- const result = await service.updatePrompt(setUuid, promptUuid, request);
571
- renderPromptDetail(result);
572
- }
573
- catch (err) {
574
- renderError(err instanceof Error ? err.message : String(err));
575
- process.exit(1);
576
- }
577
- });
578
- prompts
579
- .command('delete <setUuid> <promptUuid>')
580
- .description('Delete a prompt')
581
- .action(async (setUuid, promptUuid) => {
582
- try {
583
- renderRedteamHeader();
584
- const service = await createPromptSetService();
585
- await service.deletePrompt(setUuid, promptUuid);
586
- console.log(` Prompt ${promptUuid} deleted.\n`);
587
- }
588
- catch (err) {
589
- renderError(err instanceof Error ? err.message : String(err));
590
- process.exit(1);
591
- }
592
- });
593
- // -----------------------------------------------------------------------
594
- // redteam properties — property name/value management
595
- // -----------------------------------------------------------------------
596
- const properties = redteam.command('properties').description('Manage custom attack properties');
597
- properties
598
- .command('list')
599
- .description('List property names')
600
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
601
- .action(async (opts) => {
602
- try {
603
- const fmt = opts.output;
604
- if (fmt === 'pretty')
605
- renderRedteamHeader();
606
- const service = await createPromptSetService();
607
- const names = await service.getPropertyNames();
608
- renderPropertyNames(names, fmt);
609
- }
610
- catch (err) {
611
- renderError(err instanceof Error ? err.message : String(err));
612
- process.exit(1);
613
- }
614
- });
615
- properties
616
- .command('create')
617
- .description('Create a property name')
618
- .requiredOption('--name <name>', 'Property name')
619
- .action(async (opts) => {
620
- try {
621
- renderRedteamHeader();
622
- const service = await createPromptSetService();
623
- const result = await service.createPropertyName(opts.name);
624
- console.log(` ${result.message}\n`);
625
- }
626
- catch (err) {
627
- renderError(err instanceof Error ? err.message : String(err));
628
- process.exit(1);
629
- }
630
- });
631
- properties
632
- .command('values <name>')
633
- .description('List values for a property')
634
- .option('--output <format>', 'Output format: pretty, json, yaml', 'pretty')
635
- .action(async (name, opts) => {
636
- try {
637
- const fmt = opts.output;
638
- if (fmt === 'pretty')
639
- renderRedteamHeader();
640
- const service = await createPromptSetService();
641
- const values = await service.getPropertyValues(name);
642
- renderPropertyValues(values, fmt);
643
- }
644
- catch (err) {
645
- renderError(err instanceof Error ? err.message : String(err));
646
- process.exit(1);
647
- }
648
- });
649
- properties
650
- .command('add-value')
651
- .description('Create a property value')
652
- .requiredOption('--name <name>', 'Property name')
653
- .requiredOption('--value <value>', 'Property value')
654
- .action(async (opts) => {
655
- try {
656
- renderRedteamHeader();
657
- const service = await createPromptSetService();
658
- const result = await service.createPropertyValue(opts.name, opts.value);
659
- console.log(` ${result.message}\n`);
660
- }
661
- catch (err) {
662
- renderError(err instanceof Error ? err.message : String(err));
663
- process.exit(1);
664
- }
665
- });
666
- // -----------------------------------------------------------------------
667
- // redteam report — view scan report
668
- // -----------------------------------------------------------------------
669
- redteam
670
- .command('report <jobId>')
671
- .description('View scan report')
672
- .option('--attacks', 'Include attack list', false)
673
- .option('--severity <level>', 'Filter attacks by severity')
674
- .option('--limit <n>', 'Max attacks to show', '20')
675
- .action(async (jobId, opts) => {
676
- try {
677
- renderRedteamHeader();
678
- const service = await createService();
679
- const job = await service.getScan(jobId);
680
- renderScanStatus(job);
681
- if (job.jobType === 'CUSTOM') {
682
- const report = await service.getCustomReport(jobId);
683
- renderCustomReport(report);
684
- if (opts.attacks) {
685
- const attacks = await service.listCustomAttacks(jobId, {
686
- limit: Number.parseInt(opts.limit, 10),
687
- });
688
- renderCustomAttackList(attacks);
689
- }
690
- }
691
- else if (job.jobType === 'DYNAMIC') {
692
- const report = await service.getDynamicReport(jobId);
693
- renderDynamicReport(report);
694
- }
695
- else {
696
- const report = await service.getStaticReport(jobId);
697
- renderStaticReport(report);
698
- if (opts.attacks) {
699
- const { attacks, totalItems } = await service.listAttacks(jobId, {
700
- severity: opts.severity,
701
- limit: Number.parseInt(opts.limit, 10),
702
- });
703
- const footnote = buildAttackListFootnote({
704
- severity: opts.severity,
705
- totalItems,
706
- severityBreakdown: report.severityBreakdown,
707
- });
708
- renderAttackList(attacks, { footnote });
709
- }
710
- }
711
- }
712
- catch (err) {
713
- renderError(err instanceof Error ? err.message : String(err));
714
- process.exit(1);
715
- }
716
- });
717
- // -----------------------------------------------------------------------
718
- // redteam scan — execute a red team scan
719
- // -----------------------------------------------------------------------
720
- redteam
721
- .command('scan')
722
- .description('Execute a red team scan against a target')
723
- .requiredOption('--target <uuid>', 'Target UUID')
724
- .requiredOption('--name <name>', 'Scan name')
725
- .option('--type <type>', 'Job type: STATIC, DYNAMIC, or CUSTOM', 'STATIC')
726
- .option('--categories <json>', 'Category filter JSON (STATIC scans)')
727
- .option('--prompt-sets <uuids>', 'Comma-separated prompt set UUIDs (CUSTOM scans)')
728
- .option('--goals <file>', 'JSON file or inline JSON array of attack goals (DYNAMIC scans)')
729
- .option('--depth <number>', 'Max conversation turns per goal (DYNAMIC scans)', '10')
730
- .option('--breadth <number>', 'Parallel agents per goal (DYNAMIC scans)', '6')
731
- .option('--no-wait', 'Submit scan without waiting for completion')
732
- .action(async (opts) => {
733
- try {
734
- renderRedteamHeader();
735
- const service = await createService();
736
- let categories;
737
- if (opts.categories) {
738
- categories = JSON.parse(opts.categories);
739
- }
740
- const customPromptSets = opts.promptSets
741
- ? opts.promptSets.split(',').map((s) => s.trim())
742
- : undefined;
743
- const attackGoals = opts.goals ? parseAttackGoals(opts.goals) : undefined;
744
- const streamDepth = parsePositiveInt(opts.depth, '--depth');
745
- const streamBreadth = parsePositiveInt(opts.breadth, '--breadth');
746
- console.log(` Creating ${opts.type} scan "${opts.name}"...`);
747
- const job = await service.createScan({
748
- name: opts.name,
749
- targetUuid: opts.target,
750
- jobType: opts.type,
751
- categories,
752
- customPromptSets,
753
- attackGoals,
754
- streamDepth,
755
- streamBreadth,
756
- });
757
- renderScanStatus(job);
758
- if (opts.wait !== false) {
759
- console.log(' Waiting for completion...\n');
760
- const completed = await service.waitForCompletion(job.uuid, (progress) => renderScanProgress(progress));
761
- console.log('\n');
762
- renderScanStatus(completed);
763
- console.log(` Job ID: ${completed.uuid}`);
764
- console.log(' Run `airs redteam report <jobId>` to view results.\n');
765
- }
766
- else {
767
- console.log(` Job ID: ${job.uuid}`);
768
- console.log(' Run `airs redteam status <jobId>` to check progress.\n');
769
- }
770
- }
771
- catch (err) {
772
- renderError(err instanceof Error ? err.message : String(err));
773
- process.exit(1);
774
- }
775
- });
776
- // -----------------------------------------------------------------------
777
- // redteam status — check scan status
778
- // -----------------------------------------------------------------------
779
- redteam
780
- .command('status <jobId>')
781
- .description('Check scan status')
782
- .action(async (jobId) => {
783
- try {
784
- renderRedteamHeader();
785
- const service = await createService();
786
- const job = await service.getScan(jobId);
787
- renderScanStatus(job);
788
- }
789
- catch (err) {
790
- renderError(err instanceof Error ? err.message : String(err));
791
- process.exit(1);
792
- }
793
- });
794
- // -----------------------------------------------------------------------
795
- // redteam targets — target CRUD subcommands
796
- // -----------------------------------------------------------------------
797
- const targets = redteam.command('targets').description('Manage red team targets');
798
- targets
799
- .command('list')
800
- .description('List configured red team targets')
801
- .option('--output <format>', 'Output format: pretty, table, csv, json, yaml', 'pretty')
802
- .action(async (opts) => {
803
- try {
804
- const fmt = opts.output;
805
- if (fmt === 'pretty')
806
- renderRedteamHeader();
807
- const service = await createService();
808
- const list = await service.listTargets();
809
- renderTargetList(list, fmt);
810
- }
811
- catch (err) {
812
- renderError(err instanceof Error ? err.message : String(err));
813
- process.exit(1);
814
- }
815
- });
816
- targets
817
- .command('get <uuid>')
818
- .description('Get target details')
819
- .option('--output <format>', 'Output format: pretty, json, yaml', 'pretty')
820
- .action(async (uuid, opts) => {
821
- try {
822
- const fmt = opts.output;
823
- if (fmt === 'pretty')
824
- renderRedteamHeader();
825
- const service = await createService();
826
- const target = await service.getTarget(uuid);
827
- renderTargetDetail(target, fmt);
828
- }
829
- catch (err) {
830
- renderError(err instanceof Error ? err.message : String(err));
831
- process.exit(1);
832
- }
833
- });
834
- targets
835
- .command('create')
836
- .description('Create a new red team target')
837
- .requiredOption('--config <path>', 'JSON file with target configuration')
838
- .option('--validate', 'Validate target connection before saving')
839
- .action(async (opts) => {
840
- try {
841
- renderRedteamHeader();
842
- const service = await createService();
843
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
844
- const target = await service.createTarget(config, opts.validate ? { validate: true } : undefined);
845
- console.log(` Target created: ${target.uuid}\n`);
846
- renderTargetDetail(target);
847
- }
848
- catch (err) {
849
- renderError(err instanceof Error ? err.message : String(err));
850
- process.exit(1);
851
- }
852
- });
853
- targets
854
- .command('update <uuid>')
855
- .description('Update a red team target')
856
- .requiredOption('--config <path>', 'JSON file with target updates')
857
- .option('--validate', 'Validate target connection before saving')
858
- .action(async (uuid, opts) => {
859
- try {
860
- renderRedteamHeader();
861
- const service = await createService();
862
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
863
- const target = await service.updateTarget(uuid, config, opts.validate ? { validate: true } : undefined);
864
- console.log(` Target updated: ${target.uuid}\n`);
865
- renderTargetDetail(target);
866
- }
867
- catch (err) {
868
- renderError(err instanceof Error ? err.message : String(err));
869
- process.exit(1);
870
- }
871
- });
872
- targets
873
- .command('delete <uuid>')
874
- .description('Delete a red team target')
875
- .action(async (uuid) => {
876
- try {
877
- renderRedteamHeader();
878
- const service = await createService();
879
- await service.deleteTarget(uuid);
880
- console.log(` Target ${uuid} deleted.\n`);
881
- }
882
- catch (err) {
883
- renderError(err instanceof Error ? err.message : String(err));
884
- process.exit(1);
885
- }
886
- });
887
- targets
888
- .command('probe')
889
- .description('Test target connection without saving')
890
- .requiredOption('--config <path>', 'JSON file with connection params')
891
- .action(async (opts) => {
892
- try {
893
- renderRedteamHeader();
894
- const service = await createService();
895
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
896
- const result = await service.probeTarget(config);
897
- console.log(' Probe result:');
898
- console.log(` ${JSON.stringify(result, null, 2)}\n`);
899
- }
900
- catch (err) {
901
- renderError(err instanceof Error ? err.message : String(err));
902
- process.exit(1);
903
- }
904
- });
905
- targets
906
- .command('profile <uuid>')
907
- .description('View target profile')
908
- .action(async (uuid) => {
909
- try {
910
- renderRedteamHeader();
911
- const service = await createService();
912
- const profile = await service.getTargetProfile(uuid);
913
- console.log(' Target Profile:');
914
- console.log(` ${JSON.stringify(profile, null, 2)}\n`);
915
- }
916
- catch (err) {
917
- renderError(err instanceof Error ? err.message : String(err));
918
- process.exit(1);
919
- }
920
- });
921
- targets
922
- .command('update-profile <uuid>')
923
- .description('Update target profile')
924
- .requiredOption('--config <path>', 'JSON file with profile updates')
925
- .action(async (uuid, opts) => {
926
- try {
927
- renderRedteamHeader();
928
- const service = await createService();
929
- const config = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
930
- const result = await service.updateTargetProfile(uuid, config);
931
- console.log(' Profile updated:');
932
- console.log(` ${JSON.stringify(result, null, 2)}\n`);
933
- }
934
- catch (err) {
935
- renderError(err instanceof Error ? err.message : String(err));
936
- process.exit(1);
937
- }
938
- });
939
- targets
940
- .command('validate-auth')
941
- .description('Validate target auth credentials')
942
- .requiredOption('--auth-type <type>', 'Auth type: HEADERS, BASIC_AUTH, OAUTH2')
943
- .requiredOption('--config <path>', 'JSON file with auth_config')
944
- .option('--target-id <uuid>', 'Existing target UUID')
945
- .action(async (opts) => {
946
- try {
947
- renderRedteamHeader();
948
- const service = await createService();
949
- const authConfig = JSON.parse(fs.readFileSync(opts.config, 'utf-8'));
950
- const result = await service.validateTargetAuth({
951
- authType: opts.authType,
952
- authConfig,
953
- targetId: opts.targetId,
954
- });
955
- renderAuthValidation(result);
956
- }
957
- catch (err) {
958
- renderError(err instanceof Error ? err.message : String(err));
959
- process.exit(1);
960
- }
961
- });
962
- targets
963
- .command('metadata')
964
- .description('Get target field metadata')
965
- .action(async () => {
966
- try {
967
- renderRedteamHeader();
968
- const service = await createService();
969
- const metadata = await service.getTargetMetadata();
970
- console.log(JSON.stringify(metadata, null, 2));
971
- }
972
- catch (err) {
973
- renderError(err instanceof Error ? err.message : String(err));
974
- process.exit(1);
975
- }
976
- });
977
- targets
978
- .command('init <provider>')
979
- .description('Scaffold a target config JSON from a provider template')
980
- .option('--output <file>', 'Output file path')
981
- .action(async (provider, opts) => {
982
- try {
983
- renderRedteamHeader();
984
- const service = await createService();
985
- const templates = await service.getTargetTemplates();
986
- const scaffold = buildTargetScaffold(provider, templates);
987
- const filename = opts.output ?? `${provider.toLowerCase()}-target.json`;
988
- const outputPath = path.resolve(filename);
989
- if (fs.existsSync(outputPath)) {
990
- renderError(`File already exists: ${outputPath} (use --output to specify a different path)`);
991
- process.exit(1);
992
- }
993
- fs.writeFileSync(outputPath, `${JSON.stringify(scaffold, null, 2)}\n`);
994
- console.log(chalk.bold('\n Target config scaffolded:\n'));
995
- console.log(` File: ${chalk.cyan(outputPath)}`);
996
- console.log(` Provider: ${chalk.dim(provider.toUpperCase())}`);
997
- console.log(`\n ${chalk.yellow('Next steps:')} Edit the file to fill in ${chalk.bold('name')} and credentials, then run:`);
998
- console.log(` ${chalk.cyan(`airs redteam targets create --config ${filename} --validate`)}\n`);
999
- }
1000
- catch (err) {
1001
- renderError(err instanceof Error ? err.message : String(err));
1002
- process.exit(1);
1003
- }
1004
- });
1005
- targets
1006
- .command('templates')
1007
- .description('Get provider-specific target templates')
1008
- .action(async () => {
1009
- try {
1010
- renderRedteamHeader();
1011
- const service = await createService();
1012
- const templates = await service.getTargetTemplates();
1013
- renderTargetTemplates(templates);
1014
- }
1015
- catch (err) {
1016
- renderError(err instanceof Error ? err.message : String(err));
1017
- process.exit(1);
1018
- }
1019
- });
1020
- targets
1021
- .command('backup')
1022
- .description('Backup red team targets to local JSON/YAML files')
1023
- .option('--output-dir <path>', 'Output directory')
1024
- .option('--format <format>', 'Output format: json or yaml', 'json')
1025
- .option('--name <targetName>', 'Backup a single target by name')
1026
- .action(async (opts) => {
1027
- try {
1028
- renderBackupHeader();
1029
- const outputDir = resolveOutputDir(opts.outputDir, 'targets');
1030
- const results = await backupTargets({
1031
- outputDir,
1032
- format: (opts.format ?? 'json'),
1033
- name: opts.name,
1034
- });
1035
- renderBackupSummary(results, outputDir);
1036
- const failed = results.filter((r) => r.status === 'failed').length;
1037
- if (failed > 0)
1038
- process.exit(1);
1039
- }
1040
- catch (err) {
1041
- renderError(err instanceof Error ? err.message : String(err));
1042
- process.exit(1);
1043
- }
1044
- });
1045
- targets
1046
- .command('restore')
1047
- .description('Restore red team targets from local JSON/YAML backup files')
1048
- .option('--input-dir <path>', 'Directory containing backup files')
1049
- .option('--file <path>', 'Single backup file to restore')
1050
- .option('--overwrite', 'Update existing targets with same name (default: skip)')
1051
- .option('--validate', 'Validate target connection before saving')
1052
- .action(async (opts) => {
1053
- try {
1054
- renderBackupHeader();
1055
- if (!opts.file && !opts.inputDir) {
1056
- throw new Error('Specify --file <path> or --input-dir <path>');
1057
- }
1058
- const results = await restoreTargets({
1059
- file: opts.file,
1060
- inputDir: opts.inputDir,
1061
- overwrite: opts.overwrite,
1062
- validate: opts.validate,
1063
- });
1064
- renderRestoreSummary(results);
1065
- const failed = results.filter((r) => r.action === 'failed').length;
1066
- if (failed > 0)
1067
- process.exit(1);
1068
- }
1069
- catch (err) {
1070
- renderError(err instanceof Error ? err.message : String(err));
1071
- process.exit(1);
1072
- }
1073
- });
1074
- }
1075
- //# sourceMappingURL=redteam.js.map