bla-agents 1.1.0 → 1.5.3

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 (276) hide show
  1. package/.agents/skills/blind-llm-agents/SKILL.md +20 -14
  2. package/DISCLAIMER.md +15 -7
  3. package/README.md +153 -198
  4. package/dist/bundler/index.d.ts +19 -2
  5. package/dist/bundler/index.d.ts.map +1 -1
  6. package/dist/bundler/index.js +47 -4
  7. package/dist/bundler/index.js.map +1 -1
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +123 -18
  11. package/dist/cli.js.map +1 -1
  12. package/dist/core/config.d.ts +54 -0
  13. package/dist/core/config.d.ts.map +1 -0
  14. package/dist/core/config.js +160 -0
  15. package/dist/core/config.js.map +1 -0
  16. package/dist/core/coverage-contract.d.ts +97 -0
  17. package/dist/core/coverage-contract.d.ts.map +1 -0
  18. package/dist/core/coverage-contract.js +164 -0
  19. package/dist/core/coverage-contract.js.map +1 -0
  20. package/dist/core/debug-posture.d.ts +40 -0
  21. package/dist/core/debug-posture.d.ts.map +1 -0
  22. package/dist/core/debug-posture.js +197 -0
  23. package/dist/core/debug-posture.js.map +1 -0
  24. package/dist/core/detector.d.ts.map +1 -1
  25. package/dist/core/detector.js +58 -6
  26. package/dist/core/detector.js.map +1 -1
  27. package/dist/core/identifiers.d.ts +32 -0
  28. package/dist/core/identifiers.d.ts.map +1 -0
  29. package/dist/core/identifiers.js +263 -0
  30. package/dist/core/identifiers.js.map +1 -0
  31. package/dist/core/llm-directives.d.ts +12 -0
  32. package/dist/core/llm-directives.d.ts.map +1 -0
  33. package/dist/core/llm-directives.js +23 -0
  34. package/dist/core/llm-directives.js.map +1 -0
  35. package/dist/core/prng.d.ts +10 -1
  36. package/dist/core/prng.d.ts.map +1 -1
  37. package/dist/core/prng.js +27 -2
  38. package/dist/core/prng.js.map +1 -1
  39. package/dist/core/release-plan.d.ts +68 -0
  40. package/dist/core/release-plan.d.ts.map +1 -0
  41. package/dist/core/release-plan.js +235 -0
  42. package/dist/core/release-plan.js.map +1 -0
  43. package/dist/core/sarif.d.ts +53 -0
  44. package/dist/core/sarif.d.ts.map +1 -0
  45. package/dist/core/sarif.js +91 -0
  46. package/dist/core/sarif.js.map +1 -0
  47. package/dist/core/sqlite-runtime.d.ts +13 -0
  48. package/dist/core/sqlite-runtime.d.ts.map +1 -1
  49. package/dist/core/sqlite-runtime.js +38 -8
  50. package/dist/core/sqlite-runtime.js.map +1 -1
  51. package/dist/core/types.d.ts +7 -2
  52. package/dist/core/types.d.ts.map +1 -1
  53. package/dist/engine/auditor.d.ts.map +1 -1
  54. package/dist/engine/auditor.js +251 -8
  55. package/dist/engine/auditor.js.map +1 -1
  56. package/dist/engine/benchmark.d.ts +1 -1
  57. package/dist/engine/benchmark.d.ts.map +1 -1
  58. package/dist/engine/benchmark.js +121 -41
  59. package/dist/engine/benchmark.js.map +1 -1
  60. package/dist/engine/defender.d.ts +1 -0
  61. package/dist/engine/defender.d.ts.map +1 -1
  62. package/dist/engine/defender.js +7 -1
  63. package/dist/engine/defender.js.map +1 -1
  64. package/dist/engine/harden.d.ts +61 -0
  65. package/dist/engine/harden.d.ts.map +1 -0
  66. package/dist/engine/harden.js +292 -0
  67. package/dist/engine/harden.js.map +1 -0
  68. package/dist/engine/protector.d.ts.map +1 -1
  69. package/dist/engine/protector.js +162 -21
  70. package/dist/engine/protector.js.map +1 -1
  71. package/dist/identity.d.ts +112 -2
  72. package/dist/identity.d.ts.map +1 -1
  73. package/dist/identity.js +112 -2
  74. package/dist/identity.js.map +1 -1
  75. package/dist/index.d.ts +26 -9
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +26 -9
  78. package/dist/index.js.map +1 -1
  79. package/dist/mcp/server.d.ts +59 -152
  80. package/dist/mcp/server.d.ts.map +1 -1
  81. package/dist/mcp/server.js +466 -50
  82. package/dist/mcp/server.js.map +1 -1
  83. package/dist/setup/clients.d.ts +49 -1
  84. package/dist/setup/clients.d.ts.map +1 -1
  85. package/dist/setup/clients.js +1193 -20
  86. package/dist/setup/clients.js.map +1 -1
  87. package/dist/setup/doctor.d.ts +58 -14
  88. package/dist/setup/doctor.d.ts.map +1 -1
  89. package/dist/setup/doctor.js +316 -22
  90. package/dist/setup/doctor.js.map +1 -1
  91. package/dist/setup/setup.d.ts +77 -7
  92. package/dist/setup/setup.d.ts.map +1 -1
  93. package/dist/setup/setup.js +591 -62
  94. package/dist/setup/setup.js.map +1 -1
  95. package/dist/shields/chaff/chaff-generator.d.ts.map +1 -1
  96. package/dist/shields/chaff/chaff-generator.js +12 -3
  97. package/dist/shields/chaff/chaff-generator.js.map +1 -1
  98. package/dist/shields/deception/architecture-mirage.js +1 -1
  99. package/dist/shields/deception/architecture-mirage.js.map +1 -1
  100. package/dist/shields/deception/canary-honeypot.d.ts +33 -0
  101. package/dist/shields/deception/canary-honeypot.d.ts.map +1 -0
  102. package/dist/shields/deception/canary-honeypot.js +95 -0
  103. package/dist/shields/deception/canary-honeypot.js.map +1 -0
  104. package/dist/shields/deception/cognitive-armor-trigger.d.ts +43 -0
  105. package/dist/shields/deception/cognitive-armor-trigger.d.ts.map +1 -0
  106. package/dist/shields/deception/cognitive-armor-trigger.js +204 -0
  107. package/dist/shields/deception/cognitive-armor-trigger.js.map +1 -0
  108. package/dist/shields/deception/crash-trace-decoy.js +1 -1
  109. package/dist/shields/deception/crash-trace-decoy.js.map +1 -1
  110. package/dist/shields/deception/decompiler-illusion.js +1 -1
  111. package/dist/shields/deception/decompiler-illusion.js.map +1 -1
  112. package/dist/shields/deception/diff-noise-injector.js +1 -1
  113. package/dist/shields/deception/diff-noise-injector.js.map +1 -1
  114. package/dist/shields/deception/evidence-contract-poison.js +1 -1
  115. package/dist/shields/deception/evidence-contract-poison.js.map +1 -1
  116. package/dist/shields/deception/format-payloads.d.ts +21 -0
  117. package/dist/shields/deception/format-payloads.d.ts.map +1 -0
  118. package/dist/shields/deception/format-payloads.js +24 -0
  119. package/dist/shields/deception/format-payloads.js.map +1 -0
  120. package/dist/shields/deception/index.d.ts +10 -2
  121. package/dist/shields/deception/index.d.ts.map +1 -1
  122. package/dist/shields/deception/index.js +20 -3
  123. package/dist/shields/deception/index.js.map +1 -1
  124. package/dist/shields/deception/prompt-completion-poison.d.ts +3 -2
  125. package/dist/shields/deception/prompt-completion-poison.d.ts.map +1 -1
  126. package/dist/shields/deception/prompt-completion-poison.js +6 -3
  127. package/dist/shields/deception/prompt-completion-poison.js.map +1 -1
  128. package/dist/shields/deception/shadow-business-logic.js +4 -4
  129. package/dist/shields/deception/shadow-business-logic.js.map +1 -1
  130. package/dist/shields/deception/system-diagnostic-decoy.d.ts +36 -0
  131. package/dist/shields/deception/system-diagnostic-decoy.d.ts.map +1 -0
  132. package/dist/shields/deception/system-diagnostic-decoy.js +101 -0
  133. package/dist/shields/deception/system-diagnostic-decoy.js.map +1 -0
  134. package/dist/shields/exhaustion/asar-header-amplifier.d.ts +12 -3
  135. package/dist/shields/exhaustion/asar-header-amplifier.d.ts.map +1 -1
  136. package/dist/shields/exhaustion/asar-header-amplifier.js +30 -8
  137. package/dist/shields/exhaustion/asar-header-amplifier.js.map +1 -1
  138. package/dist/shields/exhaustion/bpe-token-amplifier.js +2 -2
  139. package/dist/shields/exhaustion/bpe-token-amplifier.js.map +1 -1
  140. package/dist/shields/exhaustion/callgraph-labyrinth.js +2 -2
  141. package/dist/shields/exhaustion/callgraph-labyrinth.js.map +1 -1
  142. package/dist/shields/exhaustion/cdp-shape-budget-breaker.js +1 -1
  143. package/dist/shields/exhaustion/cdp-shape-budget-breaker.js.map +1 -1
  144. package/dist/shields/exhaustion/frida-capture-saturation.d.ts +10 -5
  145. package/dist/shields/exhaustion/frida-capture-saturation.d.ts.map +1 -1
  146. package/dist/shields/exhaustion/frida-capture-saturation.js +21 -8
  147. package/dist/shields/exhaustion/frida-capture-saturation.js.map +1 -1
  148. package/dist/shields/exhaustion/index.d.ts +2 -2
  149. package/dist/shields/exhaustion/index.d.ts.map +1 -1
  150. package/dist/shields/exhaustion/index.js +2 -2
  151. package/dist/shields/exhaustion/index.js.map +1 -1
  152. package/dist/shields/exhaustion/obligation-flooder.d.ts +17 -5
  153. package/dist/shields/exhaustion/obligation-flooder.d.ts.map +1 -1
  154. package/dist/shields/exhaustion/obligation-flooder.js +20 -8
  155. package/dist/shields/exhaustion/obligation-flooder.js.map +1 -1
  156. package/dist/shields/exhaustion/rea-budget-matrix.d.ts +8 -2
  157. package/dist/shields/exhaustion/rea-budget-matrix.d.ts.map +1 -1
  158. package/dist/shields/exhaustion/rea-budget-matrix.js +139 -16
  159. package/dist/shields/exhaustion/rea-budget-matrix.js.map +1 -1
  160. package/dist/shields/exhaustion/regex-worker-tarpit.d.ts.map +1 -1
  161. package/dist/shields/exhaustion/regex-worker-tarpit.js +2 -1
  162. package/dist/shields/exhaustion/regex-worker-tarpit.js.map +1 -1
  163. package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts +7 -4
  164. package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts.map +1 -1
  165. package/dist/shields/exhaustion/wasm-interface-exhaustion.js +16 -7
  166. package/dist/shields/exhaustion/wasm-interface-exhaustion.js.map +1 -1
  167. package/dist/shields/formats/android-dex-xref.d.ts +19 -0
  168. package/dist/shields/formats/android-dex-xref.d.ts.map +1 -0
  169. package/dist/shields/formats/android-dex-xref.js +427 -0
  170. package/dist/shields/formats/android-dex-xref.js.map +1 -0
  171. package/dist/shields/formats/android-manifest.d.ts +44 -0
  172. package/dist/shields/formats/android-manifest.d.ts.map +1 -0
  173. package/dist/shields/formats/android-manifest.js +240 -0
  174. package/dist/shields/formats/android-manifest.js.map +1 -0
  175. package/dist/shields/formats/android-r8.d.ts +44 -0
  176. package/dist/shields/formats/android-r8.d.ts.map +1 -0
  177. package/dist/shields/formats/android-r8.js +246 -0
  178. package/dist/shields/formats/android-r8.js.map +1 -0
  179. package/dist/shields/formats/apple-plist.d.ts +15 -0
  180. package/dist/shields/formats/apple-plist.d.ts.map +1 -1
  181. package/dist/shields/formats/apple-plist.js +59 -1
  182. package/dist/shields/formats/apple-plist.js.map +1 -1
  183. package/dist/shields/formats/archive.d.ts +27 -6
  184. package/dist/shields/formats/archive.d.ts.map +1 -1
  185. package/dist/shields/formats/archive.js +247 -45
  186. package/dist/shields/formats/archive.js.map +1 -1
  187. package/dist/shields/formats/asar.d.ts +50 -10
  188. package/dist/shields/formats/asar.d.ts.map +1 -1
  189. package/dist/shields/formats/asar.js +265 -39
  190. package/dist/shields/formats/asar.js.map +1 -1
  191. package/dist/shields/formats/bun-standalone.d.ts +78 -0
  192. package/dist/shields/formats/bun-standalone.d.ts.map +1 -0
  193. package/dist/shields/formats/bun-standalone.js +272 -0
  194. package/dist/shields/formats/bun-standalone.js.map +1 -0
  195. package/dist/shields/formats/dotnet-managed.d.ts +9 -0
  196. package/dist/shields/formats/dotnet-managed.d.ts.map +1 -1
  197. package/dist/shields/formats/dotnet-managed.js +26 -1
  198. package/dist/shields/formats/dotnet-managed.js.map +1 -1
  199. package/dist/shields/formats/electron-fuses.d.ts +63 -8
  200. package/dist/shields/formats/electron-fuses.d.ts.map +1 -1
  201. package/dist/shields/formats/electron-fuses.js +297 -65
  202. package/dist/shields/formats/electron-fuses.js.map +1 -1
  203. package/dist/shields/formats/erlang-beam.d.ts +34 -0
  204. package/dist/shields/formats/erlang-beam.d.ts.map +1 -0
  205. package/dist/shields/formats/erlang-beam.js +319 -0
  206. package/dist/shields/formats/erlang-beam.js.map +1 -0
  207. package/dist/shields/formats/evm-bytecode.d.ts +28 -0
  208. package/dist/shields/formats/evm-bytecode.d.ts.map +1 -0
  209. package/dist/shields/formats/evm-bytecode.js +124 -0
  210. package/dist/shields/formats/evm-bytecode.js.map +1 -0
  211. package/dist/shields/formats/go-flutter-exhaustion.d.ts +55 -0
  212. package/dist/shields/formats/go-flutter-exhaustion.d.ts.map +1 -0
  213. package/dist/shields/formats/go-flutter-exhaustion.js +346 -0
  214. package/dist/shields/formats/go-flutter-exhaustion.js.map +1 -0
  215. package/dist/shields/formats/gpu-ptx.d.ts +40 -0
  216. package/dist/shields/formats/gpu-ptx.d.ts.map +1 -0
  217. package/dist/shields/formats/gpu-ptx.js +62 -0
  218. package/dist/shields/formats/gpu-ptx.js.map +1 -0
  219. package/dist/shields/formats/headers.d.ts.map +1 -1
  220. package/dist/shields/formats/headers.js +54 -14
  221. package/dist/shields/formats/headers.js.map +1 -1
  222. package/dist/shields/formats/jvm-bytecode.d.ts +20 -0
  223. package/dist/shields/formats/jvm-bytecode.d.ts.map +1 -0
  224. package/dist/shields/formats/jvm-bytecode.js +134 -0
  225. package/dist/shields/formats/jvm-bytecode.js.map +1 -0
  226. package/dist/shields/formats/mobile-game.d.ts +4 -0
  227. package/dist/shields/formats/mobile-game.d.ts.map +1 -1
  228. package/dist/shields/formats/mobile-game.js +16 -0
  229. package/dist/shields/formats/mobile-game.js.map +1 -1
  230. package/dist/shields/formats/model.d.ts +22 -8
  231. package/dist/shields/formats/model.d.ts.map +1 -1
  232. package/dist/shields/formats/model.js +231 -59
  233. package/dist/shields/formats/model.js.map +1 -1
  234. package/dist/shields/formats/native.d.ts +65 -11
  235. package/dist/shields/formats/native.d.ts.map +1 -1
  236. package/dist/shields/formats/native.js +413 -108
  237. package/dist/shields/formats/native.js.map +1 -1
  238. package/dist/shields/formats/pcap-capture.d.ts +27 -0
  239. package/dist/shields/formats/pcap-capture.d.ts.map +1 -0
  240. package/dist/shields/formats/pcap-capture.js +201 -0
  241. package/dist/shields/formats/pcap-capture.js.map +1 -0
  242. package/dist/shields/formats/python.d.ts +22 -1
  243. package/dist/shields/formats/python.d.ts.map +1 -1
  244. package/dist/shields/formats/python.js +568 -27
  245. package/dist/shields/formats/python.js.map +1 -1
  246. package/dist/shields/formats/sourcemap.d.ts.map +1 -1
  247. package/dist/shields/formats/sourcemap.js +2 -0
  248. package/dist/shields/formats/sourcemap.js.map +1 -1
  249. package/dist/shields/formats/sqlite.d.ts +87 -15
  250. package/dist/shields/formats/sqlite.d.ts.map +1 -1
  251. package/dist/shields/formats/sqlite.js +377 -42
  252. package/dist/shields/formats/sqlite.js.map +1 -1
  253. package/dist/shields/formats/wasm.d.ts +6 -0
  254. package/dist/shields/formats/wasm.d.ts.map +1 -1
  255. package/dist/shields/formats/wasm.js +118 -3
  256. package/dist/shields/formats/wasm.js.map +1 -1
  257. package/dist/shields/javascript/ast-shield.d.ts +25 -5
  258. package/dist/shields/javascript/ast-shield.d.ts.map +1 -1
  259. package/dist/shields/javascript/ast-shield.js +428 -58
  260. package/dist/shields/javascript/ast-shield.js.map +1 -1
  261. package/dist/shields/runtime/memory-diff-shield.d.ts +56 -0
  262. package/dist/shields/runtime/memory-diff-shield.d.ts.map +1 -0
  263. package/dist/shields/runtime/memory-diff-shield.js +170 -0
  264. package/dist/shields/runtime/memory-diff-shield.js.map +1 -0
  265. package/dist/shields/runtime/runtime-shield.d.ts +12 -16
  266. package/dist/shields/runtime/runtime-shield.d.ts.map +1 -1
  267. package/dist/shields/runtime/runtime-shield.js +30 -24
  268. package/dist/shields/runtime/runtime-shield.js.map +1 -1
  269. package/dist/shields/tarpit/opaque-predicates.d.ts.map +1 -1
  270. package/dist/shields/tarpit/opaque-predicates.js +3 -3
  271. package/dist/shields/tarpit/opaque-predicates.js.map +1 -1
  272. package/dist/shields/tarpit/tarpit-generator.d.ts +9 -4
  273. package/dist/shields/tarpit/tarpit-generator.d.ts.map +1 -1
  274. package/dist/shields/tarpit/tarpit-generator.js +30 -23
  275. package/dist/shields/tarpit/tarpit-generator.js.map +1 -1
  276. package/package.json +13 -6
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Process-local stack for risky LLM-facing directive layers
3
+ * (fake COPPA/medical notices, dual-use imitation vocabulary, in-band AI chat markers).
4
+ *
5
+ * Default is OFF. Enable only inside `withLlmDirectives(true, …)` or via CLI `--llm-directives` / MCP `llm_directives`.
6
+ * All shield generation is synchronous, so a nested stack is enough (no AsyncLocalStorage).
7
+ */
8
+ /** Run `fn` with risky LLM directive layers forced on or off. */
9
+ export declare function withLlmDirectives<T>(enabled: boolean, fn: () => T): T;
10
+ /** True only when an enclosing `withLlmDirectives(true, …)` (or CLI/MCP opt-in) is active. */
11
+ export declare function areLlmDirectivesEnabled(): boolean;
12
+ //# sourceMappingURL=llm-directives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-directives.d.ts","sourceRoot":"","sources":["../../src/core/llm-directives.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOrE;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Process-local stack for risky LLM-facing directive layers
3
+ * (fake COPPA/medical notices, dual-use imitation vocabulary, in-band AI chat markers).
4
+ *
5
+ * Default is OFF. Enable only inside `withLlmDirectives(true, …)` or via CLI `--llm-directives` / MCP `llm_directives`.
6
+ * All shield generation is synchronous, so a nested stack is enough (no AsyncLocalStorage).
7
+ */
8
+ const stack = [];
9
+ /** Run `fn` with risky LLM directive layers forced on or off. */
10
+ export function withLlmDirectives(enabled, fn) {
11
+ stack.push(enabled);
12
+ try {
13
+ return fn();
14
+ }
15
+ finally {
16
+ stack.pop();
17
+ }
18
+ }
19
+ /** True only when an enclosing `withLlmDirectives(true, …)` (or CLI/MCP opt-in) is active. */
20
+ export function areLlmDirectivesEnabled() {
21
+ return stack.length > 0 ? stack[stack.length - 1] : false;
22
+ }
23
+ //# sourceMappingURL=llm-directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-directives.js","sourceRoot":"","sources":["../../src/core/llm-directives.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,KAAK,GAAc,EAAE,CAAC;AAE5B,iEAAiE;AACjE,MAAM,UAAU,iBAAiB,CAAI,OAAgB,EAAE,EAAW;IAChE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type RealisticIdentifierOptions } from "./identifiers.js";
1
2
  /**
2
3
  * Deterministic seeded PRNG (SplitMix32 / Mulberry32) so BLA builds can be
3
4
  * 100% reproducible given a seed while producing high-entropy decoy identifiers,
@@ -13,6 +14,14 @@ export declare class SeededPrng {
13
14
  pick<T>(items: readonly T[]): T;
14
15
  shuffle<T>(items: readonly T[]): T[];
15
16
  hex(length: number): string;
16
- identifier(prefix?: string): string;
17
+ /**
18
+ * Emit a realistic identifier. The legacy `prefix` argument is IGNORED for
19
+ * emitted output — every call draws from the realistic vocabulary so that
20
+ * hardened artifacts contain no greppable `_bla` / `$00_AAA` markers.
21
+ *
22
+ * Pass `style` / `hint` via the second argument (or as RealisticIdentifierOptions)
23
+ * when a specific casing convention is needed.
24
+ */
25
+ identifier(prefixOrOptions?: string | RealisticIdentifierOptions, maybeOptions?: RealisticIdentifierOptions): string;
17
26
  }
18
27
  //# sourceMappingURL=prng.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../../src/core/prng.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,UAAU;;IAErB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,GAAE,MAAM,GAAG,MAA8B;IAOzD,UAAU,IAAI,MAAM;IAOpB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAM3D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC;IAO/B,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE;IAWpC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAS3B,UAAU,CAAC,MAAM,SAAS,GAAG,MAAM;CAGpC"}
1
+ {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../../src/core/prng.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,qBAAa,UAAU;;IAErB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,GAAE,MAAM,GAAG,MAA8B;IAOzD,UAAU,IAAI,MAAM;IAOpB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAM3D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC;IAO/B,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE;IAWpC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAS3B;;;;;;;OAOG;IACH,UAAU,CACR,eAAe,GAAE,MAAM,GAAG,0BAAoC,EAC9D,YAAY,CAAC,EAAE,0BAA0B,GACxC,MAAM;CAmBV"}
package/dist/core/prng.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { realisticIdentifier, } from "./identifiers.js";
2
3
  /**
3
4
  * Deterministic seeded PRNG (SplitMix32 / Mulberry32) so BLA builds can be
4
5
  * 100% reproducible given a seed while producing high-entropy decoy identifiers,
@@ -53,8 +54,32 @@ export class SeededPrng {
53
54
  }
54
55
  return out;
55
56
  }
56
- identifier(prefix = "_bla") {
57
- return `${prefix}_${this.hex(6)}`;
57
+ /**
58
+ * Emit a realistic identifier. The legacy `prefix` argument is IGNORED for
59
+ * emitted output — every call draws from the realistic vocabulary so that
60
+ * hardened artifacts contain no greppable `_bla` / `$00_AAA` markers.
61
+ *
62
+ * Pass `style` / `hint` via the second argument (or as RealisticIdentifierOptions)
63
+ * when a specific casing convention is needed.
64
+ */
65
+ identifier(prefixOrOptions = "camel", maybeOptions) {
66
+ let options;
67
+ if (typeof prefixOrOptions === "string") {
68
+ // Legacy callers passed a prefix like "_bla". Map common prefixes to styles;
69
+ // never emit the prefix literally.
70
+ const style = prefixOrOptions.startsWith("__")
71
+ ? "privateCamel"
72
+ : prefixOrOptions.startsWith("$")
73
+ ? "earlySort"
74
+ : prefixOrOptions.startsWith("_")
75
+ ? "privateCamel"
76
+ : maybeOptions?.style ?? "camel";
77
+ options = { style, ...(maybeOptions ?? {}) };
78
+ }
79
+ else {
80
+ options = prefixOrOptions;
81
+ }
82
+ return realisticIdentifier(this, options);
58
83
  }
59
84
  }
60
85
  //# sourceMappingURL=prng.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prng.js","sourceRoot":"","sources":["../../src/core/prng.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prng.js","sourceRoot":"","sources":["../../src/core/prng.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export type ReleaseConsistencyErrorCode = "INVALID_PACKAGE_VERSION" | "IDENTITY_VERSION_MISMATCH" | "DISPATCH_VERSION_MISMATCH" | "TRIGGER_TAG_MISMATCH" | "INVALID_COMMIT_SHA" | "TAG_COMMIT_MISMATCH" | "INVALID_TARBALL_HASH" | "ASSET_HASH_CONFLICT";
2
+ export declare class ReleaseConsistencyError extends Error {
3
+ readonly code: ReleaseConsistencyErrorCode;
4
+ constructor(code: ReleaseConsistencyErrorCode, message: string);
5
+ }
6
+ export interface ReleaseConsistencyInput {
7
+ readonly packageVersion: string;
8
+ readonly identityVersion?: string | null;
9
+ readonly dispatchVersion?: string | null;
10
+ readonly triggerRef?: string | null;
11
+ readonly headSha: string;
12
+ readonly existingTagSha?: string | null;
13
+ readonly tarballSha256: string;
14
+ readonly existingReleaseAssetSha256?: string | null;
15
+ readonly aliasTarballSha256?: string | null;
16
+ readonly existingAliasReleaseAssetSha256?: string | null;
17
+ }
18
+ export interface ReleaseConsistencyPlan {
19
+ readonly version: string;
20
+ readonly canonicalTag: string;
21
+ readonly headSha: string;
22
+ readonly tagAction: "create" | "verify-existing-idempotent";
23
+ readonly releaseAssetAction: "upload-new" | "skip-identical";
24
+ readonly tarballSha256: string;
25
+ readonly aliasTarballSha256: string | null;
26
+ }
27
+ export declare function verifyReleaseConsistency(input: ReleaseConsistencyInput): ReleaseConsistencyPlan;
28
+ export interface PackagePublishInputState {
29
+ readonly primaryPublished: boolean;
30
+ readonly aliasPublished?: boolean;
31
+ readonly primaryTarballSha256?: string;
32
+ readonly publishedPrimarySha256?: string | null;
33
+ readonly aliasTarballSha256?: string;
34
+ readonly publishedAliasSha256?: string | null;
35
+ }
36
+ export interface NpmPublishRetryPlan {
37
+ readonly primaryAction: "publish" | "skip-already-published";
38
+ readonly aliasAction: "publish" | "skip-already-published";
39
+ readonly shouldPublishPrimary: boolean;
40
+ readonly shouldPublishAlias: boolean;
41
+ readonly requiresPublish: boolean;
42
+ readonly allCompletedAfterPlan: boolean;
43
+ }
44
+ /**
45
+ * Computes an idempotent dual-package (`bla-agents` primary + `bla-shield` alias)
46
+ * npm publish plan so that a retry after `primary` succeeds and `alias` fails
47
+ * safely completes `alias` without failing on `primary` or clobbering different bytes.
48
+ */
49
+ export declare function planNpmPublishRetry(state: PackagePublishInputState): NpmPublishRetryPlan;
50
+ export interface PackedPackageArtifact {
51
+ readonly packageName: string;
52
+ readonly version: string;
53
+ readonly tarballPath: string;
54
+ readonly tarballFilename: string;
55
+ readonly sha256: string;
56
+ }
57
+ export interface DualPackResult {
58
+ readonly version: string;
59
+ readonly primary: PackedPackageArtifact;
60
+ readonly alias: PackedPackageArtifact;
61
+ readonly sha256SumsPath: string;
62
+ }
63
+ /**
64
+ * Packs both `bla-agents` (primary) and `bla-shield` (alias) tarballs into `outDir`
65
+ * without mutating the repository working tree, and writes `SHA256SUMS.txt`.
66
+ */
67
+ export declare function packDualReleaseTarballs(repoDir: string, outDir: string): DualPackResult;
68
+ //# sourceMappingURL=release-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-plan.d.ts","sourceRoot":"","sources":["../../src/core/release-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { basename, join, resolve } from "node:path";
6
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
7
+ export class ReleaseConsistencyError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.name = "ReleaseConsistencyError";
12
+ this.code = code;
13
+ }
14
+ }
15
+ const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
16
+ const GIT_SHA_RE = /^[0-9a-f]{7,40}$/i;
17
+ const SHA256_RE = /^[0-9a-f]{64}$/i;
18
+ export function verifyReleaseConsistency(input) {
19
+ const pkgVer = (input.packageVersion ?? "").trim();
20
+ if (!SEMVER_RE.test(pkgVer)) {
21
+ throw new ReleaseConsistencyError("INVALID_PACKAGE_VERSION", `Invalid package.json version '${input.packageVersion}': expected strict semver (X.Y.Z)`);
22
+ }
23
+ if (input.identityVersion !== undefined && input.identityVersion !== null) {
24
+ const idVer = input.identityVersion.trim();
25
+ if (idVer !== pkgVer) {
26
+ throw new ReleaseConsistencyError("IDENTITY_VERSION_MISMATCH", `BLA_IDENTITY.version '${idVer}' does not match package.json version '${pkgVer}'`);
27
+ }
28
+ }
29
+ const headSha = (input.headSha ?? "").trim().toLowerCase();
30
+ if (!GIT_SHA_RE.test(headSha)) {
31
+ throw new ReleaseConsistencyError("INVALID_COMMIT_SHA", `Invalid checkout commit SHA '${input.headSha}'`);
32
+ }
33
+ const tarballSha256 = (input.tarballSha256 ?? "").trim().toLowerCase();
34
+ if (!SHA256_RE.test(tarballSha256)) {
35
+ throw new ReleaseConsistencyError("INVALID_TARBALL_HASH", `Invalid tarball SHA-256 digest '${input.tarballSha256}'`);
36
+ }
37
+ let aliasTarballSha256 = null;
38
+ if (input.aliasTarballSha256 !== undefined && input.aliasTarballSha256 !== null) {
39
+ aliasTarballSha256 = input.aliasTarballSha256.trim().toLowerCase();
40
+ if (!SHA256_RE.test(aliasTarballSha256)) {
41
+ throw new ReleaseConsistencyError("INVALID_TARBALL_HASH", `Invalid alias tarball SHA-256 digest '${input.aliasTarballSha256}'`);
42
+ }
43
+ }
44
+ // 1. Validate workflow_dispatch version input if provided
45
+ if (input.dispatchVersion !== undefined && input.dispatchVersion !== null) {
46
+ const rawDispatch = input.dispatchVersion.trim();
47
+ if (rawDispatch.length > 0 && rawDispatch !== "none") {
48
+ const normalizedDispatch = rawDispatch.startsWith("v")
49
+ ? rawDispatch.slice(1)
50
+ : rawDispatch.startsWith("bla-agents-")
51
+ ? rawDispatch.slice("bla-agents-".length)
52
+ : rawDispatch;
53
+ if (normalizedDispatch !== pkgVer) {
54
+ throw new ReleaseConsistencyError("DISPATCH_VERSION_MISMATCH", `workflow_dispatch version input '${rawDispatch}' does not match package.json version '${pkgVer}'`);
55
+ }
56
+ }
57
+ }
58
+ // 2. Validate trigger tag ref if triggered by a tag push
59
+ if (input.triggerRef !== undefined && input.triggerRef !== null) {
60
+ const ref = input.triggerRef.trim();
61
+ if (ref.startsWith("refs/tags/") ||
62
+ ref.startsWith("bla-agents-") ||
63
+ /^v\d+\./.test(ref)) {
64
+ const tagName = ref.startsWith("refs/tags/") ? ref.slice("refs/tags/".length) : ref;
65
+ let extractedVersion = null;
66
+ if (tagName.startsWith("bla-agents-")) {
67
+ extractedVersion = tagName.slice("bla-agents-".length);
68
+ }
69
+ else if (tagName.startsWith("v")) {
70
+ extractedVersion = tagName.slice(1);
71
+ }
72
+ if (!extractedVersion || extractedVersion !== pkgVer) {
73
+ throw new ReleaseConsistencyError("TRIGGER_TAG_MISMATCH", `Trigger tag '${tagName}' does not match package.json version '${pkgVer}'`);
74
+ }
75
+ }
76
+ }
77
+ const canonicalTag = `bla-agents-${pkgVer}`;
78
+ // 3. Verify existing tag commit matches checkout commit
79
+ let tagAction = "create";
80
+ if (input.existingTagSha !== undefined &&
81
+ input.existingTagSha !== null &&
82
+ input.existingTagSha.trim().length > 0) {
83
+ const existingSha = input.existingTagSha.trim().toLowerCase();
84
+ if (!GIT_SHA_RE.test(existingSha)) {
85
+ throw new ReleaseConsistencyError("INVALID_COMMIT_SHA", `Invalid existing tag commit SHA '${input.existingTagSha}'`);
86
+ }
87
+ if (existingSha !== headSha) {
88
+ throw new ReleaseConsistencyError("TAG_COMMIT_MISMATCH", `Existing tag '${canonicalTag}' points to commit ${existingSha}, which differs from checkout commit ${headSha}; refusing cross-commit release overwrite`);
89
+ }
90
+ tagAction = "verify-existing-idempotent";
91
+ }
92
+ // 4. Verify existing release asset SHA-256 matches packed tarball SHA-256
93
+ let releaseAssetAction = "upload-new";
94
+ if (input.existingReleaseAssetSha256 !== undefined &&
95
+ input.existingReleaseAssetSha256 !== null &&
96
+ input.existingReleaseAssetSha256.trim().length > 0) {
97
+ const existingAssetHash = input.existingReleaseAssetSha256.trim().toLowerCase();
98
+ if (existingAssetHash !== tarballSha256) {
99
+ throw new ReleaseConsistencyError("ASSET_HASH_CONFLICT", `Existing release asset SHA-256 (${existingAssetHash}) differs from packed tarball SHA-256 (${tarballSha256}); refusing to clobber`);
100
+ }
101
+ releaseAssetAction = "skip-identical";
102
+ }
103
+ if (aliasTarballSha256 !== null &&
104
+ input.existingAliasReleaseAssetSha256 !== undefined &&
105
+ input.existingAliasReleaseAssetSha256 !== null &&
106
+ input.existingAliasReleaseAssetSha256.trim().length > 0) {
107
+ const existingAliasHash = input.existingAliasReleaseAssetSha256.trim().toLowerCase();
108
+ if (existingAliasHash !== aliasTarballSha256) {
109
+ throw new ReleaseConsistencyError("ASSET_HASH_CONFLICT", `Existing alias release asset SHA-256 (${existingAliasHash}) differs from packed alias tarball SHA-256 (${aliasTarballSha256}); refusing to clobber`);
110
+ }
111
+ }
112
+ return {
113
+ version: pkgVer,
114
+ canonicalTag,
115
+ headSha,
116
+ tagAction,
117
+ releaseAssetAction,
118
+ tarballSha256,
119
+ aliasTarballSha256,
120
+ };
121
+ }
122
+ /**
123
+ * Computes an idempotent dual-package (`bla-agents` primary + `bla-shield` alias)
124
+ * npm publish plan so that a retry after `primary` succeeds and `alias` fails
125
+ * safely completes `alias` without failing on `primary` or clobbering different bytes.
126
+ */
127
+ export function planNpmPublishRetry(state) {
128
+ if (state.primaryPublished &&
129
+ state.primaryTarballSha256 &&
130
+ state.publishedPrimarySha256 &&
131
+ state.primaryTarballSha256.trim().toLowerCase() !==
132
+ state.publishedPrimarySha256.trim().toLowerCase()) {
133
+ throw new ReleaseConsistencyError("ASSET_HASH_CONFLICT", `Published primary package SHA-256 (${state.publishedPrimarySha256}) differs from local tarball SHA-256 (${state.primaryTarballSha256})`);
134
+ }
135
+ if (state.aliasPublished &&
136
+ state.aliasTarballSha256 &&
137
+ state.publishedAliasSha256 &&
138
+ state.aliasTarballSha256.trim().toLowerCase() !==
139
+ state.publishedAliasSha256.trim().toLowerCase()) {
140
+ throw new ReleaseConsistencyError("ASSET_HASH_CONFLICT", `Published alias package SHA-256 (${state.publishedAliasSha256}) differs from local alias tarball SHA-256 (${state.aliasTarballSha256})`);
141
+ }
142
+ const shouldPublishPrimary = !state.primaryPublished;
143
+ const shouldPublishAlias = !(state.aliasPublished ?? false);
144
+ return {
145
+ primaryAction: shouldPublishPrimary ? "publish" : "skip-already-published",
146
+ aliasAction: shouldPublishAlias ? "publish" : "skip-already-published",
147
+ shouldPublishPrimary,
148
+ shouldPublishAlias,
149
+ requiresPublish: shouldPublishPrimary || shouldPublishAlias,
150
+ allCompletedAfterPlan: true,
151
+ };
152
+ }
153
+ function sha256File(filePath) {
154
+ return createHash("sha256").update(readFileSync(filePath)).digest("hex");
155
+ }
156
+ /**
157
+ * Packs both `bla-agents` (primary) and `bla-shield` (alias) tarballs into `outDir`
158
+ * without mutating the repository working tree, and writes `SHA256SUMS.txt`.
159
+ */
160
+ export function packDualReleaseTarballs(repoDir, outDir) {
161
+ const absRepo = resolve(repoDir);
162
+ const absOut = resolve(outDir);
163
+ mkdirSync(absOut, { recursive: true });
164
+ const pkgJsonPath = join(absRepo, "package.json");
165
+ if (!existsSync(pkgJsonPath)) {
166
+ throw new Error(`package.json not found in '${absRepo}'`);
167
+ }
168
+ const pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
169
+ const version = pkgJson.version;
170
+ // 1. Pack primary (`bla-agents-<version>.tgz`) directly into `absOut`
171
+ execFileSync(npmCmd, ["pack", "--pack-destination", absOut], {
172
+ cwd: absRepo,
173
+ stdio: "pipe",
174
+ // .cmd shims on Windows require a shell; bare execFile EINVAL otherwise.
175
+ shell: process.platform === "win32",
176
+ });
177
+ const primaryFilename = `bla-agents-${version}.tgz`;
178
+ const primaryPath = join(absOut, primaryFilename);
179
+ if (!existsSync(primaryPath)) {
180
+ throw new Error(`Expected packed tarball at '${primaryPath}'`);
181
+ }
182
+ const primarySha256 = sha256File(primaryPath);
183
+ // 2. Build alias (`bla-shield-<version>.tgz`) in an isolated temp staging directory
184
+ const stageDir = mkdtempSync(join(tmpdir(), "bla-alias-pack-"));
185
+ try {
186
+ execFileSync("tar", ["-xzf", primaryPath, "-C", stageDir], {
187
+ stdio: "pipe",
188
+ });
189
+ const unpackedPkgDir = join(stageDir, "package");
190
+ const unpackedPkgJsonPath = join(unpackedPkgDir, "package.json");
191
+ const unpackedPkg = JSON.parse(readFileSync(unpackedPkgJsonPath, "utf8"));
192
+ unpackedPkg.name = "bla-shield";
193
+ writeFileSync(unpackedPkgJsonPath, JSON.stringify(unpackedPkg, null, 2) + "\n", "utf8");
194
+ execFileSync(npmCmd, ["pack", "--pack-destination", absOut, "--ignore-scripts"], {
195
+ cwd: unpackedPkgDir,
196
+ stdio: "pipe",
197
+ shell: process.platform === "win32",
198
+ });
199
+ }
200
+ finally {
201
+ rmSync(stageDir, { recursive: true, force: true });
202
+ }
203
+ const aliasFilename = `bla-shield-${version}.tgz`;
204
+ const aliasPath = join(absOut, aliasFilename);
205
+ if (!existsSync(aliasPath)) {
206
+ throw new Error(`Expected packed alias tarball at '${aliasPath}'`);
207
+ }
208
+ const aliasSha256 = sha256File(aliasPath);
209
+ const sha256SumsPath = join(absOut, "SHA256SUMS.txt");
210
+ const sumsContent = [
211
+ `${primarySha256} ${basename(primaryPath)}`,
212
+ `${aliasSha256} ${basename(aliasPath)}`,
213
+ "",
214
+ ].join("\n");
215
+ writeFileSync(sha256SumsPath, sumsContent, "utf8");
216
+ return {
217
+ version,
218
+ primary: {
219
+ packageName: "bla-agents",
220
+ version,
221
+ tarballPath: primaryPath,
222
+ tarballFilename: primaryFilename,
223
+ sha256: primarySha256,
224
+ },
225
+ alias: {
226
+ packageName: "bla-shield",
227
+ version,
228
+ tarballPath: aliasPath,
229
+ tarballFilename: aliasFilename,
230
+ sha256: aliasSha256,
231
+ },
232
+ sha256SumsPath,
233
+ };
234
+ }
235
+ //# sourceMappingURL=release-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-plan.js","sourceRoot":"","sources":["../../src/core/release-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { AuditReport } from "./types.js";
2
+ import type { ReleaseExposureReport } from "./release-exposure.js";
3
+ export interface SarifLog {
4
+ readonly $schema: string;
5
+ readonly version: "2.1.0";
6
+ readonly runs: readonly [
7
+ {
8
+ readonly tool: {
9
+ readonly driver: {
10
+ readonly name: string;
11
+ readonly fullName: string;
12
+ readonly version: string;
13
+ readonly informationUri: string;
14
+ readonly rules: readonly {
15
+ readonly id: string;
16
+ readonly name: string;
17
+ readonly shortDescription: {
18
+ readonly text: string;
19
+ };
20
+ readonly defaultConfiguration: {
21
+ readonly level: "error" | "warning" | "note";
22
+ };
23
+ }[];
24
+ };
25
+ };
26
+ readonly results: readonly {
27
+ readonly ruleId: string;
28
+ readonly level: "error" | "warning" | "note";
29
+ readonly message: {
30
+ readonly text: string;
31
+ };
32
+ readonly locations: readonly [
33
+ {
34
+ readonly physicalLocation: {
35
+ readonly artifactLocation: {
36
+ readonly uri: string;
37
+ };
38
+ readonly region?: {
39
+ readonly startLine: number;
40
+ };
41
+ };
42
+ }
43
+ ];
44
+ }[];
45
+ }
46
+ ];
47
+ }
48
+ /**
49
+ * Formats an `AuditReport` (and optional `ReleaseExposureReport`) as a SARIF 2.1.0 JSON document
50
+ * compatible with GitHub Code Scanning (`github/codeql-action/upload-sarif`).
51
+ */
52
+ export declare function buildSarifReport(audit: AuditReport, releaseExposure?: ReleaseExposureReport | null): SarifLog;
53
+ //# sourceMappingURL=sarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/core/sarif.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS;QACtB;YACE,QAAQ,CAAC,IAAI,EAAE;gBACb,QAAQ,CAAC,MAAM,EAAE;oBACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;oBACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;oBAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;oBACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;oBAChC,QAAQ,CAAC,KAAK,EAAE,SAAS;wBACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;wBACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;wBACtB,QAAQ,CAAC,gBAAgB,EAAE;4BAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;yBAAE,CAAC;wBACrD,QAAQ,CAAC,oBAAoB,EAAE;4BAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;yBAC9C,CAAC;qBACH,EAAE,CAAC;iBACL,CAAC;aACH,CAAC;YACF,QAAQ,CAAC,OAAO,EAAE,SAAS;gBACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;gBAC7C,QAAQ,CAAC,OAAO,EAAE;oBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;iBAAE,CAAC;gBAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS;oBAC3B;wBACE,QAAQ,CAAC,gBAAgB,EAAE;4BACzB,QAAQ,CAAC,gBAAgB,EAAE;gCAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;6BAAE,CAAC;4BACpD,QAAQ,CAAC,MAAM,CAAC,EAAE;gCAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;6BAAE,CAAC;yBAClD,CAAC;qBACH;iBACF,CAAC;aACH,EAAE,CAAC;SACL;KACF,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,eAAe,CAAC,EAAE,qBAAqB,GAAG,IAAI,GAC7C,QAAQ,CAqGV"}
@@ -0,0 +1,91 @@
1
+ import { BLA_IDENTITY } from "../identity.js";
2
+ /**
3
+ * Formats an `AuditReport` (and optional `ReleaseExposureReport`) as a SARIF 2.1.0 JSON document
4
+ * compatible with GitHub Code Scanning (`github/codeql-action/upload-sarif`).
5
+ */
6
+ export function buildSarifReport(audit, releaseExposure) {
7
+ const rulesMap = new Map();
8
+ const results = [];
9
+ for (const item of audit.exposedItems) {
10
+ const ruleId = `BLA-AUDIT-${item.kind.toUpperCase()}`;
11
+ const level = item.riskLevel === "critical"
12
+ ? "error"
13
+ : item.riskLevel === "high"
14
+ ? "warning"
15
+ : "note";
16
+ if (!rulesMap.has(ruleId)) {
17
+ rulesMap.set(ruleId, {
18
+ id: ruleId,
19
+ name: `ExposedArtifact_${item.kind}`,
20
+ shortDescription: {
21
+ text: `Artifact surface (${item.kind}) exposed to automated reverse-engineering tool (${item.reaToolUsed})`,
22
+ },
23
+ defaultConfiguration: { level },
24
+ });
25
+ }
26
+ const [uriPart, linePart] = item.location.split(":");
27
+ const startLine = linePart ? Number.parseInt(linePart, 10) : undefined;
28
+ results.push({
29
+ ruleId,
30
+ level,
31
+ message: {
32
+ text: `${item.name}: ${item.reason} (Est. reconstruction: ${item.estimatedTokensToReconstruct} tokens / $${item.estimatedCostUsd.toFixed(2)})`,
33
+ },
34
+ locations: [
35
+ {
36
+ physicalLocation: {
37
+ artifactLocation: { uri: uriPart || audit.targetPath },
38
+ ...(startLine && Number.isFinite(startLine) ? { region: { startLine } } : {}),
39
+ },
40
+ },
41
+ ],
42
+ });
43
+ }
44
+ if (releaseExposure) {
45
+ for (const f of releaseExposure.findings) {
46
+ const ruleId = `BLA-RELEASE-${f.kind.toUpperCase()}`;
47
+ const level = f.kind === "embedded-source-text" ? "error" : "warning";
48
+ if (!rulesMap.has(ruleId)) {
49
+ rulesMap.set(ruleId, {
50
+ id: ruleId,
51
+ name: `ReleaseExposure_${f.kind}`,
52
+ shortDescription: { text: `Release source-map exposure (${f.kind}, ${f.representation})` },
53
+ defaultConfiguration: { level },
54
+ });
55
+ }
56
+ results.push({
57
+ ruleId,
58
+ level,
59
+ message: {
60
+ text: `${f.kind} (${f.representation}) in ${f.file} — Run "npx bla-agents defend" to replace with decoy source maps.`,
61
+ },
62
+ locations: [
63
+ {
64
+ physicalLocation: {
65
+ artifactLocation: { uri: f.file },
66
+ },
67
+ },
68
+ ],
69
+ });
70
+ }
71
+ }
72
+ return {
73
+ $schema: "https://json.schemastore.org/sarif-2.1.0.json",
74
+ version: "2.1.0",
75
+ runs: [
76
+ {
77
+ tool: {
78
+ driver: {
79
+ name: BLA_IDENTITY.packageName,
80
+ fullName: BLA_IDENTITY.fullName,
81
+ version: BLA_IDENTITY.version,
82
+ informationUri: "https://bla.tools",
83
+ rules: [...rulesMap.values()],
84
+ },
85
+ },
86
+ results,
87
+ },
88
+ ],
89
+ };
90
+ }
91
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/core/sarif.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
1
  import type { DatabaseSync } from "node:sqlite";
2
+ /**
3
+ * Probe whether the current Node runtime exposes a usable `node:sqlite`
4
+ * `DatabaseSync` with custom scalar `function()` support (Node ^22.13 || >=24).
5
+ * Result is memoized for the process lifetime.
6
+ */
7
+ export declare function isNodeSqliteAvailable(): boolean;
8
+ /**
9
+ * Load `DatabaseSync` when available; return `null` on unsupported runtimes
10
+ * (Node < 22.13, `--no-experimental-sqlite`, or missing `function` API).
11
+ * Prefer this for optional/degraded paths; use `getDatabaseSyncClass()` when
12
+ * SQLite is required and a clear hard-error is appropriate.
13
+ */
14
+ export declare function tryGetDatabaseSyncClass(): typeof DatabaseSync | null;
2
15
  /** Load lazily so non-SQLite commands can still explain an unsupported setup. */
3
16
  export declare function getDatabaseSyncClass(): typeof DatabaseSync;
4
17
  //# sourceMappingURL=sqlite-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-runtime.d.ts","sourceRoot":"","sources":["../../src/core/sqlite-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,iFAAiF;AACjF,wBAAgB,oBAAoB,IAAI,OAAO,YAAY,CAkB1D"}
1
+ {"version":3,"file":"sqlite-runtime.d.ts","sourceRoot":"","sources":["../../src/core/sqlite-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,YAAY,GAAG,IAAI,CAiBpE;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,IAAI,OAAO,YAAY,CAQ1D"}