@cdot65/prisma-airs-cli 2.11.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 (388) 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 -68
  33. package/dist/airs/management.d.ts.map +0 -1
  34. package/dist/airs/management.js +0 -317
  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 -74
  45. package/dist/airs/redteam.d.ts.map +0 -1
  46. package/dist/airs/redteam.js +0 -406
  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 -780
  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 -1071
  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 -822
  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 -216
  220. package/dist/cli/renderer/redteam.d.ts.map +0 -1
  221. package/dist/cli/renderer/redteam.js +0 -471
  222. package/dist/cli/renderer/redteam.js.map +0 -1
  223. package/dist/cli/renderer/runtime.d.ts +0 -107
  224. package/dist/cli/renderer/runtime.d.ts.map +0 -1
  225. package/dist/cli/renderer/runtime.js +0 -359
  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 -54
  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 -60
  262. package/dist/dlp/embed/jpeg.js.map +0 -1
  263. package/dist/dlp/embed/pdf.d.ts +0 -7
  264. package/dist/dlp/embed/pdf.d.ts.map +0 -1
  265. package/dist/dlp/embed/pdf.js +0 -92
  266. package/dist/dlp/embed/pdf.js.map +0 -1
  267. package/dist/dlp/embed/png-chunks.d.ts +0 -12
  268. package/dist/dlp/embed/png-chunks.d.ts.map +0 -1
  269. package/dist/dlp/embed/png-chunks.js +0 -85
  270. package/dist/dlp/embed/png-chunks.js.map +0 -1
  271. package/dist/dlp/embed/png.d.ts +0 -5
  272. package/dist/dlp/embed/png.d.ts.map +0 -1
  273. package/dist/dlp/embed/png.js +0 -68
  274. package/dist/dlp/embed/png.js.map +0 -1
  275. package/dist/dlp/embed/svg.d.ts +0 -3
  276. package/dist/dlp/embed/svg.d.ts.map +0 -1
  277. package/dist/dlp/embed/svg.js +0 -28
  278. package/dist/dlp/embed/svg.js.map +0 -1
  279. package/dist/dlp/embed/zip.d.ts +0 -3
  280. package/dist/dlp/embed/zip.d.ts.map +0 -1
  281. package/dist/dlp/embed/zip.js +0 -25
  282. package/dist/dlp/embed/zip.js.map +0 -1
  283. package/dist/dlp/generate/docx.d.ts +0 -3
  284. package/dist/dlp/generate/docx.d.ts.map +0 -1
  285. package/dist/dlp/generate/docx.js +0 -24
  286. package/dist/dlp/generate/docx.js.map +0 -1
  287. package/dist/dlp/generate/index.d.ts +0 -5
  288. package/dist/dlp/generate/index.d.ts.map +0 -1
  289. package/dist/dlp/generate/index.js +0 -21
  290. package/dist/dlp/generate/index.js.map +0 -1
  291. package/dist/dlp/generate/jpeg.d.ts +0 -3
  292. package/dist/dlp/generate/jpeg.d.ts.map +0 -1
  293. package/dist/dlp/generate/jpeg.js +0 -8
  294. package/dist/dlp/generate/jpeg.js.map +0 -1
  295. package/dist/dlp/generate/pdf.d.ts +0 -3
  296. package/dist/dlp/generate/pdf.d.ts.map +0 -1
  297. package/dist/dlp/generate/pdf.js +0 -19
  298. package/dist/dlp/generate/pdf.js.map +0 -1
  299. package/dist/dlp/generate/png.d.ts +0 -3
  300. package/dist/dlp/generate/png.d.ts.map +0 -1
  301. package/dist/dlp/generate/png.js +0 -8
  302. package/dist/dlp/generate/png.js.map +0 -1
  303. package/dist/dlp/generate/raster.d.ts +0 -9
  304. package/dist/dlp/generate/raster.d.ts.map +0 -1
  305. package/dist/dlp/generate/raster.js +0 -20
  306. package/dist/dlp/generate/raster.js.map +0 -1
  307. package/dist/dlp/generate/svg.d.ts +0 -3
  308. package/dist/dlp/generate/svg.d.ts.map +0 -1
  309. package/dist/dlp/generate/svg.js +0 -17
  310. package/dist/dlp/generate/svg.js.map +0 -1
  311. package/dist/dlp/index.d.ts +0 -15
  312. package/dist/dlp/index.d.ts.map +0 -1
  313. package/dist/dlp/index.js +0 -54
  314. package/dist/dlp/index.js.map +0 -1
  315. package/dist/dlp/lorem.d.ts +0 -3
  316. package/dist/dlp/lorem.d.ts.map +0 -1
  317. package/dist/dlp/lorem.js +0 -65
  318. package/dist/dlp/lorem.js.map +0 -1
  319. package/dist/dlp/manifest.d.ts +0 -11
  320. package/dist/dlp/manifest.d.ts.map +0 -1
  321. package/dist/dlp/manifest.js +0 -14
  322. package/dist/dlp/manifest.js.map +0 -1
  323. package/dist/dlp/payload.d.ts +0 -6
  324. package/dist/dlp/payload.d.ts.map +0 -1
  325. package/dist/dlp/payload.js +0 -62
  326. package/dist/dlp/payload.js.map +0 -1
  327. package/dist/dlp/rng.d.ts +0 -9
  328. package/dist/dlp/rng.d.ts.map +0 -1
  329. package/dist/dlp/rng.js +0 -28
  330. package/dist/dlp/rng.js.map +0 -1
  331. package/dist/dlp/types.d.ts +0 -26
  332. package/dist/dlp/types.d.ts.map +0 -1
  333. package/dist/dlp/types.js +0 -2
  334. package/dist/dlp/types.js.map +0 -1
  335. package/dist/index.d.ts.map +0 -1
  336. package/dist/index.js.map +0 -1
  337. package/dist/llm/prompts/analyze-results.d.ts +0 -3
  338. package/dist/llm/prompts/analyze-results.d.ts.map +0 -1
  339. package/dist/llm/prompts/analyze-results.js +0 -52
  340. package/dist/llm/prompts/analyze-results.js.map +0 -1
  341. package/dist/llm/prompts/generate-companion.d.ts +0 -3
  342. package/dist/llm/prompts/generate-companion.d.ts.map +0 -1
  343. package/dist/llm/prompts/generate-companion.js +0 -42
  344. package/dist/llm/prompts/generate-companion.js.map +0 -1
  345. package/dist/llm/prompts/generate-tests.d.ts +0 -3
  346. package/dist/llm/prompts/generate-tests.d.ts.map +0 -1
  347. package/dist/llm/prompts/generate-tests.js +0 -46
  348. package/dist/llm/prompts/generate-tests.js.map +0 -1
  349. package/dist/llm/prompts/generate-topic.d.ts +0 -4
  350. package/dist/llm/prompts/generate-topic.d.ts.map +0 -1
  351. package/dist/llm/prompts/generate-topic.js +0 -41
  352. package/dist/llm/prompts/generate-topic.js.map +0 -1
  353. package/dist/llm/prompts/improve-topic.d.ts +0 -3
  354. package/dist/llm/prompts/improve-topic.d.ts.map +0 -1
  355. package/dist/llm/prompts/improve-topic.js +0 -77
  356. package/dist/llm/prompts/improve-topic.js.map +0 -1
  357. package/dist/llm/prompts/simplify-topic.d.ts +0 -3
  358. package/dist/llm/prompts/simplify-topic.d.ts.map +0 -1
  359. package/dist/llm/prompts/simplify-topic.js +0 -50
  360. package/dist/llm/prompts/simplify-topic.js.map +0 -1
  361. package/dist/llm/provider.d.ts +0 -21
  362. package/dist/llm/provider.d.ts.map +0 -1
  363. package/dist/llm/provider.js +0 -76
  364. package/dist/llm/provider.js.map +0 -1
  365. package/dist/llm/schemas.d.ts +0 -97
  366. package/dist/llm/schemas.d.ts.map +0 -1
  367. package/dist/llm/schemas.js +0 -24
  368. package/dist/llm/schemas.js.map +0 -1
  369. package/dist/llm/service.d.ts +0 -34
  370. package/dist/llm/service.d.ts.map +0 -1
  371. package/dist/llm/service.js +0 -268
  372. package/dist/llm/service.js.map +0 -1
  373. package/dist/llm/types.d.ts +0 -18
  374. package/dist/llm/types.d.ts.map +0 -1
  375. package/dist/llm/types.js +0 -2
  376. package/dist/llm/types.js.map +0 -1
  377. package/dist/report/html.d.ts +0 -6
  378. package/dist/report/html.d.ts.map +0 -1
  379. package/dist/report/html.js +0 -200
  380. package/dist/report/html.js.map +0 -1
  381. package/dist/report/json.d.ts +0 -11
  382. package/dist/report/json.d.ts.map +0 -1
  383. package/dist/report/json.js +0 -74
  384. package/dist/report/json.js.map +0 -1
  385. package/dist/report/types.d.ts +0 -58
  386. package/dist/report/types.d.ts.map +0 -1
  387. package/dist/report/types.js +0 -5
  388. package/dist/report/types.js.map +0 -1
@@ -0,0 +1,710 @@
1
+ // src/dlp/index.ts
2
+ import { mkdir, writeFile as writeFile2 } from "fs/promises";
3
+ import { join as join5 } from "path";
4
+
5
+ // src/dlp/embed/docx.ts
6
+ import { Document, HeadingLevel, Packer, Paragraph, ShadingType, TextRun } from "docx";
7
+
8
+ // src/dlp/rng.ts
9
+ function makeRng(seed) {
10
+ let a = seed >>> 0;
11
+ return () => {
12
+ a |= 0;
13
+ a = a + 1831565813 | 0;
14
+ let t = Math.imul(a ^ a >>> 15, 1 | a);
15
+ t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
16
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
17
+ };
18
+ }
19
+ function pick(rng, xs) {
20
+ return xs[Math.floor(rng() * xs.length)];
21
+ }
22
+ function digits(rng, n) {
23
+ let out = "";
24
+ for (let i = 0; i < n; i++) {
25
+ out += Math.floor(rng() * 10).toString();
26
+ }
27
+ return out;
28
+ }
29
+ function subSeed(seed, index) {
30
+ return Math.imul(seed ^ 2654435769, 2246822507) + index * 668265263 >>> 0;
31
+ }
32
+
33
+ // src/dlp/lorem.ts
34
+ var WORDS = [
35
+ "lorem",
36
+ "ipsum",
37
+ "dolor",
38
+ "sit",
39
+ "amet",
40
+ "consectetur",
41
+ "adipiscing",
42
+ "elit",
43
+ "sed",
44
+ "do",
45
+ "eiusmod",
46
+ "tempor",
47
+ "incididunt",
48
+ "ut",
49
+ "labore",
50
+ "et",
51
+ "dolore",
52
+ "magna",
53
+ "aliqua",
54
+ "enim",
55
+ "ad",
56
+ "minim",
57
+ "veniam",
58
+ "quis",
59
+ "nostrud",
60
+ "exercitation",
61
+ "ullamco",
62
+ "laboris",
63
+ "nisi",
64
+ "aliquip",
65
+ "ex",
66
+ "ea",
67
+ "commodo",
68
+ "consequat",
69
+ "duis",
70
+ "aute",
71
+ "irure",
72
+ "in",
73
+ "reprehenderit",
74
+ "voluptate",
75
+ "velit",
76
+ "esse",
77
+ "cillum",
78
+ "fugiat",
79
+ "nulla",
80
+ "pariatur",
81
+ "excepteur",
82
+ "sint"
83
+ ];
84
+ function sentence(rng) {
85
+ const len = 8 + Math.floor(rng() * 8);
86
+ const words = Array.from({ length: len }, () => pick(rng, WORDS));
87
+ const text = words.join(" ");
88
+ return `${text.charAt(0).toUpperCase()}${text.slice(1)}.`;
89
+ }
90
+ function lorem(rng, paragraphs) {
91
+ return Array.from({ length: paragraphs }, () => {
92
+ const sentences = 3 + Math.floor(rng() * 3);
93
+ return Array.from({ length: sentences }, () => sentence(rng)).join(" ");
94
+ }).join("\n\n");
95
+ }
96
+
97
+ // src/dlp/embed/docx.ts
98
+ var join = (p) => p.map((v) => `${v.category}: ${v.value}`).join(" | ");
99
+ function bodyParagraphs() {
100
+ return lorem(makeRng(1), 2).split("\n\n").map((t) => new Paragraph({ children: [new TextRun(t)] }));
101
+ }
102
+ async function build(extra, core = {}) {
103
+ const doc = new Document({
104
+ title: core.title,
105
+ subject: core.subject,
106
+ keywords: core.keywords,
107
+ sections: [
108
+ {
109
+ children: [
110
+ new Paragraph({ text: "Generated Document", heading: HeadingLevel.HEADING_1 }),
111
+ ...bodyParagraphs(),
112
+ ...extra
113
+ ]
114
+ }
115
+ ]
116
+ });
117
+ return Packer.toBuffer(doc);
118
+ }
119
+ var docxTechniques = {
120
+ "core-props": {
121
+ id: "core-props",
122
+ format: "docx",
123
+ label: "core document properties",
124
+ embed: (_clean, p) => build([], { title: join(p), subject: join(p), keywords: join(p) })
125
+ },
126
+ "hidden-run": {
127
+ id: "hidden-run",
128
+ format: "docx",
129
+ label: "hidden (vanish) run",
130
+ embed: (_clean, p) => build([new Paragraph({ children: [new TextRun({ text: join(p), vanish: true })] })])
131
+ },
132
+ visible: {
133
+ id: "visible",
134
+ format: "docx",
135
+ label: "visible body text (foreground != background)",
136
+ embed: (_clean, p) => build([new Paragraph({ children: [new TextRun(join(p))] })])
137
+ },
138
+ "visible-samecolor": {
139
+ id: "visible-samecolor",
140
+ format: "docx",
141
+ label: "visible run, same color as background (camouflaged)",
142
+ embed: (_clean, p) => build([
143
+ new Paragraph({
144
+ children: [
145
+ new TextRun({
146
+ text: join(p),
147
+ color: "D9D9D9",
148
+ shading: { type: ShadingType.CLEAR, color: "auto", fill: "D9D9D9" }
149
+ })
150
+ ]
151
+ })
152
+ ])
153
+ }
154
+ };
155
+
156
+ // src/dlp/embed/jpeg.ts
157
+ import piexif from "piexifjs";
158
+
159
+ // src/dlp/embed/overlay.ts
160
+ import sharp from "sharp";
161
+ var esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
162
+ async function renderVisibleText(clean, payload, format) {
163
+ const meta = await sharp(clean).metadata();
164
+ const w = meta.width ?? 256;
165
+ const h = meta.height ?? 192;
166
+ const lines = payload.map(
167
+ (v, i) => `<text x="8" y="${18 + i * 16}" font-family="sans-serif" font-size="11" fill="#000000">${esc(`${v.category}: ${v.value}`)}</text>`
168
+ ).join("");
169
+ const bandH = Math.min(h, 18 + payload.length * 16);
170
+ const overlay = `<svg xmlns="http://www.w3.org/2000/svg" width="${w}" height="${h}"><rect x="0" y="0" width="${w}" height="${bandH}" fill="#fafafa"/>${lines}</svg>`;
171
+ const img = sharp(clean).composite([{ input: Buffer.from(overlay), top: 0, left: 0 }]);
172
+ return format === "png" ? img.png().toBuffer() : img.jpeg({ quality: 90 }).toBuffer();
173
+ }
174
+
175
+ // src/dlp/embed/jpeg.ts
176
+ var join2 = (p) => p.map((v) => `${v.category}: ${v.value}`).join(" | ");
177
+ function u16(n) {
178
+ const b = Buffer.alloc(2);
179
+ b.writeUInt16BE(n, 0);
180
+ return b;
181
+ }
182
+ function setExif(clean, text) {
183
+ const zeroth = {};
184
+ zeroth[piexif.ImageIFD.ImageDescription] = text;
185
+ zeroth[piexif.ImageIFD.Artist] = text;
186
+ zeroth[piexif.ImageIFD.Copyright] = text;
187
+ const exifStr = piexif.dump({
188
+ "0th": zeroth,
189
+ Exif: {},
190
+ GPS: {},
191
+ Interop: {},
192
+ "1st": {},
193
+ thumbnail: null
194
+ });
195
+ return Buffer.from(piexif.insert(exifStr, clean.toString("binary")), "binary");
196
+ }
197
+ var jpegTechniques = {
198
+ exif: {
199
+ id: "exif",
200
+ format: "jpeg",
201
+ label: "EXIF ImageDescription/Artist/Copyright",
202
+ embed: (c, p) => setExif(c, join2(p))
203
+ },
204
+ com: {
205
+ id: "com",
206
+ format: "jpeg",
207
+ label: "COM comment segment",
208
+ embed: (c, p) => {
209
+ const d = Buffer.from(`DLP ${join2(p)}`, "utf8");
210
+ return Buffer.concat([
211
+ c.subarray(0, 2),
212
+ Buffer.from([255, 254]),
213
+ u16(d.length + 2),
214
+ d,
215
+ c.subarray(2)
216
+ ]);
217
+ }
218
+ },
219
+ trailer: {
220
+ id: "trailer",
221
+ format: "jpeg",
222
+ label: "bytes after EOI",
223
+ embed: (c, p) => Buffer.concat([c, Buffer.from(`
224
+ DLP ${join2(p)}
225
+ `, "utf8")])
226
+ },
227
+ visible: {
228
+ id: "visible",
229
+ format: "jpeg",
230
+ label: "visible rendered text (dark on light)",
231
+ embed: (c, p) => renderVisibleText(c, p, "jpeg")
232
+ }
233
+ };
234
+
235
+ // src/dlp/embed/pdf.ts
236
+ import { inflateSync } from "zlib";
237
+ import { PDFDocument, rgb } from "pdf-lib";
238
+ var join3 = (p) => p.map((v) => `${v.category}: ${v.value}`).join(" | ");
239
+ async function setMeta(clean, p) {
240
+ const doc = await PDFDocument.load(clean);
241
+ doc.setTitle(join3(p));
242
+ doc.setSubject(join3(p));
243
+ doc.setKeywords(p.map((v) => v.value));
244
+ doc.setAuthor(p.find((v) => v.category === "email")?.value ?? "synthetic");
245
+ return Buffer.from(await doc.save());
246
+ }
247
+ async function hiddenText(clean, p) {
248
+ const doc = await PDFDocument.load(clean);
249
+ const page = doc.getPage(0);
250
+ let y = 760;
251
+ for (const v of p) {
252
+ page.drawText(`${v.category}: ${v.value}`, { x: 40, y, size: 6, color: rgb(1, 1, 1) });
253
+ y -= 8;
254
+ }
255
+ return Buffer.from(await doc.save());
256
+ }
257
+ var trailer = (clean, p) => Buffer.concat([clean, Buffer.from(`
258
+ % DLP ${join3(p)}
259
+ `, "utf8")]);
260
+ async function visibleText(clean, p, sameColor) {
261
+ const doc = await PDFDocument.load(clean);
262
+ const page = doc.getPage(0);
263
+ const bg = rgb(0.93, 0.93, 0.85);
264
+ page.drawRectangle({ x: 36, y: 592, width: 524, height: 136, color: bg });
265
+ let y = 712;
266
+ for (const v of p) {
267
+ page.drawText(`${v.category}: ${v.value}`, {
268
+ x: 44,
269
+ y,
270
+ size: 9,
271
+ color: sameColor ? bg : rgb(0, 0, 0)
272
+ });
273
+ y -= 14;
274
+ }
275
+ return Buffer.from(await doc.save());
276
+ }
277
+ var pdfTechniques = {
278
+ meta: {
279
+ id: "meta",
280
+ format: "pdf",
281
+ label: "document info dict",
282
+ embed: (c, p) => setMeta(c, p)
283
+ },
284
+ "hidden-text": {
285
+ id: "hidden-text",
286
+ format: "pdf",
287
+ label: "white (hidden) text layer",
288
+ embed: (c, p) => hiddenText(c, p)
289
+ },
290
+ trailer: {
291
+ id: "trailer",
292
+ format: "pdf",
293
+ label: "bytes after %%EOF",
294
+ embed: (c, p) => trailer(c, p)
295
+ },
296
+ visible: {
297
+ id: "visible",
298
+ format: "pdf",
299
+ label: "visible page text (dark on light band)",
300
+ embed: (c, p) => visibleText(c, p, false)
301
+ },
302
+ "visible-samecolor": {
303
+ id: "visible-samecolor",
304
+ format: "pdf",
305
+ label: "visible page text, same color as background (camouflaged)",
306
+ embed: (c, p) => visibleText(c, p, true)
307
+ }
308
+ };
309
+
310
+ // src/dlp/embed/png.ts
311
+ import sharp2 from "sharp";
312
+
313
+ // src/dlp/embed/png-chunks.ts
314
+ import { deflateSync, inflateSync as inflateSync2 } from "zlib";
315
+ var CRC_TABLE = (() => {
316
+ const t = new Uint32Array(256);
317
+ for (let n = 0; n < 256; n++) {
318
+ let c = n;
319
+ for (let k = 0; k < 8; k++) {
320
+ c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
321
+ }
322
+ t[n] = c >>> 0;
323
+ }
324
+ return t;
325
+ })();
326
+ function crc32(buf) {
327
+ let c = 4294967295;
328
+ for (let i = 0; i < buf.length; i++) {
329
+ c = CRC_TABLE[(c ^ buf[i]) & 255] ^ c >>> 8;
330
+ }
331
+ return (c ^ 4294967295) >>> 0;
332
+ }
333
+ function buildChunk(type, data) {
334
+ const len = Buffer.alloc(4);
335
+ len.writeUInt32BE(data.length, 0);
336
+ const typeBuf = Buffer.from(type, "latin1");
337
+ const crc = Buffer.alloc(4);
338
+ crc.writeUInt32BE(crc32(Buffer.concat([typeBuf, data])), 0);
339
+ return Buffer.concat([len, typeBuf, data, crc]);
340
+ }
341
+ function insertBeforeIEND(png2, extra) {
342
+ let off = 8;
343
+ while (off + 8 <= png2.length) {
344
+ const len = png2.readUInt32BE(off);
345
+ const type = png2.toString("latin1", off + 4, off + 8);
346
+ if (type === "IEND") {
347
+ break;
348
+ }
349
+ off += 12 + len;
350
+ }
351
+ return Buffer.concat([png2.subarray(0, off), extra, png2.subarray(off)]);
352
+ }
353
+ var tEXt = (keyword, text) => buildChunk(
354
+ "tEXt",
355
+ Buffer.concat([Buffer.from(keyword, "latin1"), Buffer.from([0]), Buffer.from(text, "latin1")])
356
+ );
357
+ var zTXt = (keyword, text) => buildChunk(
358
+ "zTXt",
359
+ Buffer.concat([
360
+ Buffer.from(keyword, "latin1"),
361
+ Buffer.from([0, 0]),
362
+ deflateSync(Buffer.from(text, "latin1"))
363
+ ])
364
+ );
365
+ var iTXt = (keyword, text) => buildChunk(
366
+ "iTXt",
367
+ Buffer.concat([
368
+ Buffer.from(keyword, "latin1"),
369
+ Buffer.from([0, 0, 0, 0, 0]),
370
+ Buffer.from(text, "utf8")
371
+ ])
372
+ );
373
+
374
+ // src/dlp/embed/png.ts
375
+ var join4 = (p) => p.map((v) => `${v.category}: ${v.value}`).join(" | ");
376
+ async function lsbEmbed(png2, text) {
377
+ const { data, info } = await sharp2(png2).raw().toBuffer({ resolveWithObject: true });
378
+ const payload = Buffer.from(text, "utf8");
379
+ const header = Buffer.alloc(4);
380
+ header.writeUInt32BE(payload.length, 0);
381
+ const blob = Buffer.concat([header, payload]);
382
+ const bits = blob.length * 8;
383
+ if (bits > data.length) {
384
+ throw new Error("cover image too small for stego payload");
385
+ }
386
+ for (let i = 0; i < bits; i++) {
387
+ const bit = blob[i >> 3] >> 7 - (i & 7) & 1;
388
+ data[i] = data[i] & 254 | bit;
389
+ }
390
+ return sharp2(data, {
391
+ raw: { width: info.width, height: info.height, channels: info.channels }
392
+ }).png().toBuffer();
393
+ }
394
+ var pngTechniques = {
395
+ "text-chunks": {
396
+ id: "text-chunks",
397
+ format: "png",
398
+ label: "tEXt/zTXt/iTXt chunks",
399
+ embed: (c, p) => insertBeforeIEND(
400
+ c,
401
+ Buffer.concat([
402
+ tEXt("Comment", join4(p)),
403
+ zTXt("Description", join4(p)),
404
+ iTXt("Keywords", join4(p))
405
+ ])
406
+ )
407
+ },
408
+ trailer: {
409
+ id: "trailer",
410
+ format: "png",
411
+ label: "bytes after IEND",
412
+ embed: (c, p) => Buffer.concat([c, Buffer.from(`
413
+ DLP ${join4(p)}
414
+ `, "utf8")])
415
+ },
416
+ "stego-lsb": {
417
+ id: "stego-lsb",
418
+ format: "png",
419
+ label: "LSB steganography",
420
+ embed: (c, p) => lsbEmbed(c, join4(p))
421
+ },
422
+ visible: {
423
+ id: "visible",
424
+ format: "png",
425
+ label: "visible rendered text (dark on light)",
426
+ embed: (c, p) => renderVisibleText(c, p, "png")
427
+ }
428
+ };
429
+
430
+ // src/dlp/embed/svg.ts
431
+ var line = (vals) => vals.map((v) => `${v.category}: ${v.value}`).join(" | ");
432
+ function inject(clean, snippet) {
433
+ const s = clean.toString("utf8");
434
+ const idx = s.indexOf(">") + 1;
435
+ return Buffer.from(s.slice(0, idx) + snippet + s.slice(idx), "utf8");
436
+ }
437
+ function appendBeforeClose(clean, snippet) {
438
+ const s = clean.toString("utf8");
439
+ const idx = s.lastIndexOf("</svg>");
440
+ return Buffer.from(s.slice(0, idx) + snippet + s.slice(idx), "utf8");
441
+ }
442
+ var svgTechniques = {
443
+ meta: {
444
+ id: "meta",
445
+ format: "svg",
446
+ label: "metadata + desc",
447
+ embed: (c, p) => inject(c, `<metadata>${line(p)}</metadata><desc>${line(p)}</desc>`)
448
+ },
449
+ "hidden-text": {
450
+ id: "hidden-text",
451
+ format: "svg",
452
+ label: "off-canvas <text>",
453
+ embed: (c, p) => inject(
454
+ c,
455
+ p.map((v) => `<text x="-9999" y="-9999">${v.category}: ${v.value}</text>`).join("")
456
+ )
457
+ },
458
+ comment: {
459
+ id: "comment",
460
+ format: "svg",
461
+ label: "XML comment",
462
+ embed: (c, p) => inject(c, `<!-- ${line(p)} -->`)
463
+ },
464
+ visible: {
465
+ id: "visible",
466
+ format: "svg",
467
+ label: "visible on-canvas text (dark on light)",
468
+ embed: (c, p) => appendBeforeClose(
469
+ c,
470
+ `<rect x="6" y="6" width="228" height="${Math.min(148, 12 + p.length * 15)}" fill="#fafafa"/>` + p.map(
471
+ (v, i) => `<text x="10" y="${20 + i * 15}" font-size="10" fill="#111111">${v.category}: ${v.value}</text>`
472
+ ).join("")
473
+ )
474
+ }
475
+ };
476
+
477
+ // src/dlp/embed/index.ts
478
+ var techniquesByFormat = {
479
+ pdf: Object.values(pdfTechniques),
480
+ png: Object.values(pngTechniques),
481
+ jpeg: Object.values(jpegTechniques),
482
+ svg: Object.values(svgTechniques),
483
+ docx: Object.values(docxTechniques)
484
+ };
485
+ var ALL_TECHNIQUE_IDS = [
486
+ ...new Set(
487
+ Object.values(techniquesByFormat).flat().map((t) => t.id)
488
+ )
489
+ ];
490
+
491
+ // src/dlp/generate/docx.ts
492
+ async function docx(rng) {
493
+ const { Document: Document2, HeadingLevel: HeadingLevel2, Packer: Packer2, Paragraph: Paragraph2, TextRun: TextRun2 } = await import("docx");
494
+ const paragraphs = lorem(rng, 3).split("\n\n").map((p) => new Paragraph2({ children: [new TextRun2(p)] }));
495
+ const doc = new Document2({
496
+ sections: [
497
+ {
498
+ children: [
499
+ new Paragraph2({ text: "Generated Document", heading: HeadingLevel2.HEADING_1 }),
500
+ ...paragraphs
501
+ ]
502
+ }
503
+ ]
504
+ });
505
+ return Packer2.toBuffer(doc);
506
+ }
507
+
508
+ // src/dlp/generate/jpeg.ts
509
+ import sharp3 from "sharp";
510
+
511
+ // src/dlp/generate/raster.ts
512
+ function raster(rng) {
513
+ const width = 256;
514
+ const height = 192;
515
+ const channels = 3;
516
+ const data = Buffer.alloc(width * height * channels);
517
+ const rb = Math.floor(rng() * 256);
518
+ const gb = Math.floor(rng() * 256);
519
+ const bb = Math.floor(rng() * 256);
520
+ for (let y = 0; y < height; y++) {
521
+ for (let x = 0; x < width; x++) {
522
+ const i = (y * width + x) * channels;
523
+ data[i] = x + rb & 255;
524
+ data[i + 1] = y + gb & 255;
525
+ data[i + 2] = x + y + bb & 255;
526
+ }
527
+ }
528
+ return { data, width, height, channels };
529
+ }
530
+
531
+ // src/dlp/generate/jpeg.ts
532
+ async function jpeg(rng) {
533
+ const { data, width, height, channels } = raster(rng);
534
+ return sharp3(data, { raw: { width, height, channels } }).jpeg({ quality: 90 }).toBuffer();
535
+ }
536
+
537
+ // src/dlp/generate/pdf.ts
538
+ import { PDFDocument as PDFDocument2, StandardFonts } from "pdf-lib";
539
+ async function pdf(rng) {
540
+ const doc = await PDFDocument2.create();
541
+ const font = await doc.embedFont(StandardFonts.Helvetica);
542
+ const page = doc.addPage([612, 792]);
543
+ page.drawText(lorem(rng, 3), {
544
+ x: 54,
545
+ y: 720,
546
+ size: 11,
547
+ font,
548
+ lineHeight: 15,
549
+ maxWidth: 504
550
+ });
551
+ const bytes = await doc.save();
552
+ return Buffer.from(bytes);
553
+ }
554
+
555
+ // src/dlp/generate/png.ts
556
+ import sharp4 from "sharp";
557
+ async function png(rng) {
558
+ const { data, width, height, channels } = raster(rng);
559
+ return sharp4(data, { raw: { width, height, channels } }).png().toBuffer();
560
+ }
561
+
562
+ // src/dlp/generate/svg.ts
563
+ function svg(rng) {
564
+ const width = 240;
565
+ const height = 160;
566
+ const fill = pick(rng, ["#673ab7", "#2196f3", "#4caf50", "#ff9800"]);
567
+ const cx = 40 + Math.floor(rng() * 160);
568
+ const xml = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img"><title>Generated image</title><desc>A generated placeholder graphic.</desc><rect width="${width}" height="${height}" fill="#ffffff"/><circle cx="${cx}" cy="80" r="48" fill="${fill}"/></svg>`;
569
+ return Buffer.from(xml, "utf8");
570
+ }
571
+
572
+ // src/dlp/generate/index.ts
573
+ var generators = {
574
+ pdf,
575
+ png,
576
+ jpeg,
577
+ svg,
578
+ docx
579
+ };
580
+ var EXT = {
581
+ pdf: "pdf",
582
+ png: "png",
583
+ jpeg: "jpg",
584
+ svg: "svg",
585
+ docx: "docx"
586
+ };
587
+
588
+ // src/dlp/manifest.ts
589
+ import { writeFile } from "fs/promises";
590
+ function buildManifest(entries) {
591
+ return {
592
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
593
+ count: entries.length,
594
+ entries
595
+ };
596
+ }
597
+ async function writeManifest(path, manifest) {
598
+ await writeFile(path, `${JSON.stringify(manifest, null, 2)}
599
+ `);
600
+ }
601
+
602
+ // src/dlp/payload.ts
603
+ var BASE32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
604
+ function luhnValid(pan) {
605
+ if (pan.length === 0) {
606
+ return false;
607
+ }
608
+ let sum = 0;
609
+ let alt = false;
610
+ for (let i = pan.length - 1; i >= 0; i--) {
611
+ let d = pan.charCodeAt(i) - 48;
612
+ if (alt) {
613
+ d *= 2;
614
+ if (d > 9) {
615
+ d -= 9;
616
+ }
617
+ }
618
+ sum += d;
619
+ alt = !alt;
620
+ }
621
+ return sum % 10 === 0;
622
+ }
623
+ function testPan(rng) {
624
+ const body = `4${digits(rng, 14)}`;
625
+ for (let c = 0; c < 10; c++) {
626
+ const candidate = `${body}${c}`;
627
+ if (luhnValid(candidate)) {
628
+ return candidate;
629
+ }
630
+ }
631
+ return `${body}0`;
632
+ }
633
+ var ssn = (rng) => `9${digits(rng, 2)}-${digits(rng, 2)}-${digits(rng, 4)}`;
634
+ var phone = (rng) => `555-01${digits(rng, 2)}`;
635
+ var email = (rng) => `${pick(rng, ["john.public", "jane.doe", "sam.roe"])}.${digits(rng, 3)}@${pick(rng, [
636
+ "example.com",
637
+ "example.org",
638
+ "example.net"
639
+ ])}`;
640
+ var awsKey = (rng) => `AKIA${Array.from({ length: 9 }, () => pick(rng, [...BASE32])).join("")}EXAMPLE`;
641
+ var dob = (rng) => {
642
+ const year = 1960 + Math.floor(rng() * 40);
643
+ const month = String(1 + Math.floor(rng() * 12)).padStart(2, "0");
644
+ const day = String(1 + Math.floor(rng() * 28)).padStart(2, "0");
645
+ return `${year}-${month}-${day}`;
646
+ };
647
+ function makePayload(rng) {
648
+ const pan = testPan(rng);
649
+ return [
650
+ { category: "ssn", value: ssn(rng) },
651
+ { category: "credit_card", value: pan.replace(/(\d{4})(?=\d)/g, "$1 ").trim() },
652
+ { category: "email", value: email(rng) },
653
+ { category: "phone", value: phone(rng) },
654
+ { category: "aws_key", value: awsKey(rng) },
655
+ { category: "passport", value: `X${digits(rng, 8)}` },
656
+ { category: "dob", value: dob(rng) }
657
+ ];
658
+ }
659
+
660
+ // src/dlp/index.ts
661
+ async function generateCorpus(opts) {
662
+ const seed = opts.seed ?? Math.floor(Math.random() * 2147483647);
663
+ const entries = [];
664
+ const byFormat = {};
665
+ let cleanCount = 0;
666
+ let typeIndex = 0;
667
+ for (const fmt of opts.types) {
668
+ const ext = EXT[fmt];
669
+ const cleanDir = join5(opts.out, "clean", fmt);
670
+ const dirtyDir = join5(opts.out, "dirty", fmt);
671
+ await mkdir(cleanDir, { recursive: true });
672
+ await mkdir(dirtyDir, { recursive: true });
673
+ byFormat[fmt] = { clean: 0, dirty: 0 };
674
+ const wanted = techniquesByFormat[fmt].filter(
675
+ (t) => opts.techniques === "all" || opts.techniques.includes(t.id)
676
+ );
677
+ for (let i = 0; i < opts.count; i++) {
678
+ const fileSeed = subSeed(seed, typeIndex * 1e3 + i);
679
+ const base = `${fmt}-${fileSeed.toString(16).padStart(8, "0")}`;
680
+ const cleanBuf = Buffer.from(await generators[fmt](makeRng(fileSeed)));
681
+ const cleanPath = join5(cleanDir, `${base}.${ext}`);
682
+ await writeFile2(cleanPath, cleanBuf);
683
+ cleanCount++;
684
+ byFormat[fmt].clean++;
685
+ let tIdx = 0;
686
+ for (const technique of wanted) {
687
+ const payload = makePayload(makeRng(subSeed(fileSeed, 7919 + tIdx)));
688
+ const dirtyBuf = Buffer.from(await technique.embed(cleanBuf, payload));
689
+ const dirtyPath = join5(dirtyDir, `${base}__${technique.id}.${ext}`);
690
+ await writeFile2(dirtyPath, dirtyBuf);
691
+ entries.push({
692
+ format: fmt,
693
+ technique: technique.id,
694
+ clean: cleanPath,
695
+ dirty: dirtyPath,
696
+ values: payload
697
+ });
698
+ byFormat[fmt].dirty++;
699
+ tIdx++;
700
+ }
701
+ }
702
+ typeIndex++;
703
+ }
704
+ const manifestPath = join5(opts.out, "manifest.json");
705
+ await writeManifest(manifestPath, buildManifest(entries));
706
+ return { clean: cleanCount, dirty: entries.length, out: opts.out, manifestPath, seed, byFormat };
707
+ }
708
+ export {
709
+ generateCorpus
710
+ };