bla-agents 0.0.0-stage → 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.
- package/.agents/skills/blind-llm-agents/SKILL.md +56 -0
- package/.agents/skills/blind-llm-agents/references/counter-rea-matrix.md +28 -0
- package/DISCLAIMER.md +28 -0
- package/LICENSE +21 -0
- package/README.md +246 -2
- package/dist/bundler/index.d.ts +117 -0
- package/dist/bundler/index.d.ts.map +1 -0
- package/dist/bundler/index.js +167 -0
- package/dist/bundler/index.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +447 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +160 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage-contract.d.ts +97 -0
- package/dist/core/coverage-contract.d.ts.map +1 -0
- package/dist/core/coverage-contract.js +164 -0
- package/dist/core/coverage-contract.js.map +1 -0
- package/dist/core/debug-posture.d.ts +40 -0
- package/dist/core/debug-posture.d.ts.map +1 -0
- package/dist/core/debug-posture.js +197 -0
- package/dist/core/debug-posture.js.map +1 -0
- package/dist/core/detector.d.ts +7 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +190 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/identifiers.d.ts +32 -0
- package/dist/core/identifiers.d.ts.map +1 -0
- package/dist/core/identifiers.js +263 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/llm-directives.d.ts +12 -0
- package/dist/core/llm-directives.d.ts.map +1 -0
- package/dist/core/llm-directives.js +23 -0
- package/dist/core/llm-directives.js.map +1 -0
- package/dist/core/output-path.d.ts +3 -0
- package/dist/core/output-path.d.ts.map +1 -0
- package/dist/core/output-path.js +51 -0
- package/dist/core/output-path.js.map +1 -0
- package/dist/core/prng.d.ts +27 -0
- package/dist/core/prng.d.ts.map +1 -0
- package/dist/core/prng.js +85 -0
- package/dist/core/prng.js.map +1 -0
- package/dist/core/release-exposure.d.ts +26 -0
- package/dist/core/release-exposure.d.ts.map +1 -0
- package/dist/core/release-exposure.js +213 -0
- package/dist/core/release-exposure.js.map +1 -0
- package/dist/core/release-plan.d.ts +68 -0
- package/dist/core/release-plan.d.ts.map +1 -0
- package/dist/core/release-plan.js +235 -0
- package/dist/core/release-plan.js.map +1 -0
- package/dist/core/sarif.d.ts +53 -0
- package/dist/core/sarif.d.ts.map +1 -0
- package/dist/core/sarif.js +91 -0
- package/dist/core/sarif.js.map +1 -0
- package/dist/core/sqlite-runtime.d.ts +17 -0
- package/dist/core/sqlite-runtime.d.ts.map +1 -0
- package/dist/core/sqlite-runtime.js +49 -0
- package/dist/core/sqlite-runtime.js.map +1 -0
- package/dist/core/token-estimator.d.ts +11 -0
- package/dist/core/token-estimator.d.ts.map +1 -0
- package/dist/core/token-estimator.js +87 -0
- package/dist/core/token-estimator.js.map +1 -0
- package/dist/core/types.d.ts +159 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/engine/auditor.d.ts +6 -0
- package/dist/engine/auditor.d.ts.map +1 -0
- package/dist/engine/auditor.js +977 -0
- package/dist/engine/auditor.js.map +1 -0
- package/dist/engine/benchmark.d.ts +6 -0
- package/dist/engine/benchmark.d.ts.map +1 -0
- package/dist/engine/benchmark.js +425 -0
- package/dist/engine/benchmark.js.map +1 -0
- package/dist/engine/defender.d.ts +57 -0
- package/dist/engine/defender.d.ts.map +1 -0
- package/dist/engine/defender.js +130 -0
- package/dist/engine/defender.js.map +1 -0
- package/dist/engine/harden.d.ts +61 -0
- package/dist/engine/harden.d.ts.map +1 -0
- package/dist/engine/harden.js +292 -0
- package/dist/engine/harden.js.map +1 -0
- package/dist/engine/protector.d.ts +8 -0
- package/dist/engine/protector.d.ts.map +1 -0
- package/dist/engine/protector.js +500 -0
- package/dist/engine/protector.js.map +1 -0
- package/dist/engine/verifier.d.ts +6 -0
- package/dist/engine/verifier.d.ts.map +1 -0
- package/dist/engine/verifier.js +91 -0
- package/dist/engine/verifier.js.map +1 -0
- package/dist/identity.d.ts +180 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +180 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +81 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +730 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/setup/clients.d.ts +58 -0
- package/dist/setup/clients.d.ts.map +1 -0
- package/dist/setup/clients.js +1268 -0
- package/dist/setup/clients.js.map +1 -0
- package/dist/setup/doctor.d.ts +69 -0
- package/dist/setup/doctor.d.ts.map +1 -0
- package/dist/setup/doctor.js +339 -0
- package/dist/setup/doctor.js.map +1 -0
- package/dist/setup/setup.d.ts +99 -0
- package/dist/setup/setup.d.ts.map +1 -0
- package/dist/setup/setup.js +652 -0
- package/dist/setup/setup.js.map +1 -0
- package/dist/shields/chaff/chaff-generator.d.ts +17 -0
- package/dist/shields/chaff/chaff-generator.d.ts.map +1 -0
- package/dist/shields/chaff/chaff-generator.js +80 -0
- package/dist/shields/chaff/chaff-generator.js.map +1 -0
- package/dist/shields/deception/architecture-mirage.d.ts +16 -0
- package/dist/shields/deception/architecture-mirage.d.ts.map +1 -0
- package/dist/shields/deception/architecture-mirage.js +46 -0
- package/dist/shields/deception/architecture-mirage.js.map +1 -0
- package/dist/shields/deception/canary-honeypot.d.ts +33 -0
- package/dist/shields/deception/canary-honeypot.d.ts.map +1 -0
- package/dist/shields/deception/canary-honeypot.js +95 -0
- package/dist/shields/deception/canary-honeypot.js.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts +43 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.js +204 -0
- package/dist/shields/deception/cognitive-armor-trigger.js.map +1 -0
- package/dist/shields/deception/crash-trace-decoy.d.ts +16 -0
- package/dist/shields/deception/crash-trace-decoy.d.ts.map +1 -0
- package/dist/shields/deception/crash-trace-decoy.js +36 -0
- package/dist/shields/deception/crash-trace-decoy.js.map +1 -0
- package/dist/shields/deception/decompiler-illusion.d.ts +15 -0
- package/dist/shields/deception/decompiler-illusion.d.ts.map +1 -0
- package/dist/shields/deception/decompiler-illusion.js +29 -0
- package/dist/shields/deception/decompiler-illusion.js.map +1 -0
- package/dist/shields/deception/diff-noise-injector.d.ts +17 -0
- package/dist/shields/deception/diff-noise-injector.d.ts.map +1 -0
- package/dist/shields/deception/diff-noise-injector.js +29 -0
- package/dist/shields/deception/diff-noise-injector.js.map +1 -0
- package/dist/shields/deception/evidence-contract-poison.d.ts +25 -0
- package/dist/shields/deception/evidence-contract-poison.d.ts.map +1 -0
- package/dist/shields/deception/evidence-contract-poison.js +66 -0
- package/dist/shields/deception/evidence-contract-poison.js.map +1 -0
- package/dist/shields/deception/format-payloads.d.ts +21 -0
- package/dist/shields/deception/format-payloads.d.ts.map +1 -0
- package/dist/shields/deception/format-payloads.js +24 -0
- package/dist/shields/deception/format-payloads.js.map +1 -0
- package/dist/shields/deception/index.d.ts +35 -0
- package/dist/shields/deception/index.d.ts.map +1 -0
- package/dist/shields/deception/index.js +69 -0
- package/dist/shields/deception/index.js.map +1 -0
- package/dist/shields/deception/prompt-completion-poison.d.ts +19 -0
- package/dist/shields/deception/prompt-completion-poison.d.ts.map +1 -0
- package/dist/shields/deception/prompt-completion-poison.js +45 -0
- package/dist/shields/deception/prompt-completion-poison.js.map +1 -0
- package/dist/shields/deception/semantic-honeypot.d.ts +17 -0
- package/dist/shields/deception/semantic-honeypot.d.ts.map +1 -0
- package/dist/shields/deception/semantic-honeypot.js +45 -0
- package/dist/shields/deception/semantic-honeypot.js.map +1 -0
- package/dist/shields/deception/shadow-business-logic.d.ts +24 -0
- package/dist/shields/deception/shadow-business-logic.d.ts.map +1 -0
- package/dist/shields/deception/shadow-business-logic.js +66 -0
- package/dist/shields/deception/shadow-business-logic.js.map +1 -0
- package/dist/shields/deception/system-diagnostic-decoy.d.ts +36 -0
- package/dist/shields/deception/system-diagnostic-decoy.d.ts.map +1 -0
- package/dist/shields/deception/system-diagnostic-decoy.js +101 -0
- package/dist/shields/deception/system-diagnostic-decoy.js.map +1 -0
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts +25 -0
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts.map +1 -0
- package/dist/shields/exhaustion/asar-header-amplifier.js +59 -0
- package/dist/shields/exhaustion/asar-header-amplifier.js.map +1 -0
- package/dist/shields/exhaustion/bpe-token-amplifier.d.ts +21 -0
- package/dist/shields/exhaustion/bpe-token-amplifier.d.ts.map +1 -0
- package/dist/shields/exhaustion/bpe-token-amplifier.js +68 -0
- package/dist/shields/exhaustion/bpe-token-amplifier.js.map +1 -0
- package/dist/shields/exhaustion/callgraph-labyrinth.d.ts +20 -0
- package/dist/shields/exhaustion/callgraph-labyrinth.d.ts.map +1 -0
- package/dist/shields/exhaustion/callgraph-labyrinth.js +62 -0
- package/dist/shields/exhaustion/callgraph-labyrinth.js.map +1 -0
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.d.ts +20 -0
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.d.ts.map +1 -0
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js +40 -0
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js.map +1 -0
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts +33 -0
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts.map +1 -0
- package/dist/shields/exhaustion/frida-capture-saturation.js +58 -0
- package/dist/shields/exhaustion/frida-capture-saturation.js.map +1 -0
- package/dist/shields/exhaustion/index.d.ts +30 -0
- package/dist/shields/exhaustion/index.d.ts.map +1 -0
- package/dist/shields/exhaustion/index.js +43 -0
- package/dist/shields/exhaustion/index.js.map +1 -0
- package/dist/shields/exhaustion/obligation-flooder.d.ts +128 -0
- package/dist/shields/exhaustion/obligation-flooder.d.ts.map +1 -0
- package/dist/shields/exhaustion/obligation-flooder.js +145 -0
- package/dist/shields/exhaustion/obligation-flooder.js.map +1 -0
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts +54 -0
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts.map +1 -0
- package/dist/shields/exhaustion/rea-budget-matrix.js +300 -0
- package/dist/shields/exhaustion/rea-budget-matrix.js.map +1 -0
- package/dist/shields/exhaustion/regex-worker-tarpit.d.ts +23 -0
- package/dist/shields/exhaustion/regex-worker-tarpit.d.ts.map +1 -0
- package/dist/shields/exhaustion/regex-worker-tarpit.js +43 -0
- package/dist/shields/exhaustion/regex-worker-tarpit.js.map +1 -0
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts +26 -0
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts.map +1 -0
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js +59 -0
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js.map +1 -0
- package/dist/shields/formats/android-dex-xref.d.ts +19 -0
- package/dist/shields/formats/android-dex-xref.d.ts.map +1 -0
- package/dist/shields/formats/android-dex-xref.js +427 -0
- package/dist/shields/formats/android-dex-xref.js.map +1 -0
- package/dist/shields/formats/android-manifest.d.ts +44 -0
- package/dist/shields/formats/android-manifest.d.ts.map +1 -0
- package/dist/shields/formats/android-manifest.js +240 -0
- package/dist/shields/formats/android-manifest.js.map +1 -0
- package/dist/shields/formats/android-r8.d.ts +44 -0
- package/dist/shields/formats/android-r8.d.ts.map +1 -0
- package/dist/shields/formats/android-r8.js +246 -0
- package/dist/shields/formats/android-r8.js.map +1 -0
- package/dist/shields/formats/apple-plist.d.ts +46 -0
- package/dist/shields/formats/apple-plist.d.ts.map +1 -0
- package/dist/shields/formats/apple-plist.js +119 -0
- package/dist/shields/formats/apple-plist.js.map +1 -0
- package/dist/shields/formats/archive.d.ts +55 -0
- package/dist/shields/formats/archive.d.ts.map +1 -0
- package/dist/shields/formats/archive.js +369 -0
- package/dist/shields/formats/archive.js.map +1 -0
- package/dist/shields/formats/asar.d.ts +72 -0
- package/dist/shields/formats/asar.d.ts.map +1 -0
- package/dist/shields/formats/asar.js +343 -0
- package/dist/shields/formats/asar.js.map +1 -0
- package/dist/shields/formats/bun-standalone.d.ts +78 -0
- package/dist/shields/formats/bun-standalone.d.ts.map +1 -0
- package/dist/shields/formats/bun-standalone.js +272 -0
- package/dist/shields/formats/bun-standalone.js.map +1 -0
- package/dist/shields/formats/dotnet-managed.d.ts +30 -0
- package/dist/shields/formats/dotnet-managed.d.ts.map +1 -0
- package/dist/shields/formats/dotnet-managed.js +66 -0
- package/dist/shields/formats/dotnet-managed.js.map +1 -0
- package/dist/shields/formats/electron-fuses.d.ts +93 -0
- package/dist/shields/formats/electron-fuses.d.ts.map +1 -0
- package/dist/shields/formats/electron-fuses.js +349 -0
- package/dist/shields/formats/electron-fuses.js.map +1 -0
- package/dist/shields/formats/erlang-beam.d.ts +34 -0
- package/dist/shields/formats/erlang-beam.d.ts.map +1 -0
- package/dist/shields/formats/erlang-beam.js +319 -0
- package/dist/shields/formats/erlang-beam.js.map +1 -0
- package/dist/shields/formats/evm-bytecode.d.ts +28 -0
- package/dist/shields/formats/evm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/evm-bytecode.js +124 -0
- package/dist/shields/formats/evm-bytecode.js.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts +55 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.js +346 -0
- package/dist/shields/formats/go-flutter-exhaustion.js.map +1 -0
- package/dist/shields/formats/gpu-ptx.d.ts +40 -0
- package/dist/shields/formats/gpu-ptx.d.ts.map +1 -0
- package/dist/shields/formats/gpu-ptx.js +62 -0
- package/dist/shields/formats/gpu-ptx.js.map +1 -0
- package/dist/shields/formats/headers.d.ts +22 -0
- package/dist/shields/formats/headers.d.ts.map +1 -0
- package/dist/shields/formats/headers.js +193 -0
- package/dist/shields/formats/headers.js.map +1 -0
- package/dist/shields/formats/jvm-bytecode.d.ts +20 -0
- package/dist/shields/formats/jvm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/jvm-bytecode.js +134 -0
- package/dist/shields/formats/jvm-bytecode.js.map +1 -0
- package/dist/shields/formats/mobile-game.d.ts +42 -0
- package/dist/shields/formats/mobile-game.d.ts.map +1 -0
- package/dist/shields/formats/mobile-game.js +131 -0
- package/dist/shields/formats/mobile-game.js.map +1 -0
- package/dist/shields/formats/model.d.ts +66 -0
- package/dist/shields/formats/model.d.ts.map +1 -0
- package/dist/shields/formats/model.js +461 -0
- package/dist/shields/formats/model.js.map +1 -0
- package/dist/shields/formats/native.d.ts +101 -0
- package/dist/shields/formats/native.d.ts.map +1 -0
- package/dist/shields/formats/native.js +585 -0
- package/dist/shields/formats/native.js.map +1 -0
- package/dist/shields/formats/pcap-capture.d.ts +27 -0
- package/dist/shields/formats/pcap-capture.d.ts.map +1 -0
- package/dist/shields/formats/pcap-capture.js +201 -0
- package/dist/shields/formats/pcap-capture.js.map +1 -0
- package/dist/shields/formats/python.d.ts +62 -0
- package/dist/shields/formats/python.d.ts.map +1 -0
- package/dist/shields/formats/python.js +637 -0
- package/dist/shields/formats/python.js.map +1 -0
- package/dist/shields/formats/sourcemap.d.ts +22 -0
- package/dist/shields/formats/sourcemap.d.ts.map +1 -0
- package/dist/shields/formats/sourcemap.js +66 -0
- package/dist/shields/formats/sourcemap.js.map +1 -0
- package/dist/shields/formats/sqlite.d.ts +115 -0
- package/dist/shields/formats/sqlite.d.ts.map +1 -0
- package/dist/shields/formats/sqlite.js +528 -0
- package/dist/shields/formats/sqlite.js.map +1 -0
- package/dist/shields/formats/wasm.d.ts +38 -0
- package/dist/shields/formats/wasm.d.ts.map +1 -0
- package/dist/shields/formats/wasm.js +314 -0
- package/dist/shields/formats/wasm.js.map +1 -0
- package/dist/shields/javascript/ast-shield.d.ts +37 -0
- package/dist/shields/javascript/ast-shield.d.ts.map +1 -0
- package/dist/shields/javascript/ast-shield.js +645 -0
- package/dist/shields/javascript/ast-shield.js.map +1 -0
- package/dist/shields/runtime/memory-diff-shield.d.ts +56 -0
- package/dist/shields/runtime/memory-diff-shield.d.ts.map +1 -0
- package/dist/shields/runtime/memory-diff-shield.js +170 -0
- package/dist/shields/runtime/memory-diff-shield.js.map +1 -0
- package/dist/shields/runtime/runtime-shield.d.ts +24 -0
- package/dist/shields/runtime/runtime-shield.d.ts.map +1 -0
- package/dist/shields/runtime/runtime-shield.js +84 -0
- package/dist/shields/runtime/runtime-shield.js.map +1 -0
- package/dist/shields/tarpit/opaque-predicates.d.ts +10 -0
- package/dist/shields/tarpit/opaque-predicates.d.ts.map +1 -0
- package/dist/shields/tarpit/opaque-predicates.js +40 -0
- package/dist/shields/tarpit/opaque-predicates.js.map +1 -0
- package/dist/shields/tarpit/tarpit-generator.d.ts +31 -0
- package/dist/shields/tarpit/tarpit-generator.d.ts.map +1 -0
- package/dist/shields/tarpit/tarpit-generator.js +194 -0
- package/dist/shields/tarpit/tarpit-generator.js.map +1 -0
- package/dist/ui/reporter.d.ts +13 -0
- package/dist/ui/reporter.d.ts.map +1 -0
- package/dist/ui/reporter.js +197 -0
- package/dist/ui/reporter.js.map +1 -0
- package/package.json +89 -4
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { SeededPrng } from "../core/prng.js";
|
|
2
|
+
import { generateChaffPayloads } from "../shields/chaff/chaff-generator.js";
|
|
3
|
+
import { generateHoneySourceMap } from "../shields/formats/sourcemap.js";
|
|
4
|
+
import { inferJsCarrierFromPath, inferJsLoaderFromPath, transformJavaScriptWithBlaShield, } from "../shields/javascript/ast-shield.js";
|
|
5
|
+
/**
|
|
6
|
+
* Infers the exact esbuild loader (`"js" | "jsx" | "ts" | "tsx"`) from a module path.
|
|
7
|
+
*/
|
|
8
|
+
export function inferEsbuildLoader(filePath) {
|
|
9
|
+
return inferJsLoaderFromPath(filePath);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Maps a Rollup/Vite output format (`"es"`, `"cjs"`, `"iife"`, `"umd"`, `"amd"`, `"system"`)
|
|
13
|
+
* or chunk filename to a BLA JavaScript carrier contract.
|
|
14
|
+
*/
|
|
15
|
+
export function inferCarrierFromRollupFormat(format, fileName) {
|
|
16
|
+
if (format) {
|
|
17
|
+
const normalized = format.toLowerCase().trim();
|
|
18
|
+
if (normalized === "es" ||
|
|
19
|
+
normalized === "esm" ||
|
|
20
|
+
normalized === "module") {
|
|
21
|
+
return "module";
|
|
22
|
+
}
|
|
23
|
+
if (normalized === "cjs" || normalized === "commonjs") {
|
|
24
|
+
return "commonjs";
|
|
25
|
+
}
|
|
26
|
+
if (normalized === "iife" ||
|
|
27
|
+
normalized === "umd" ||
|
|
28
|
+
normalized === "amd" ||
|
|
29
|
+
normalized === "system") {
|
|
30
|
+
return "script";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return inferJsCarrierFromPath(fileName);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Vite & Rollup plugin (`blaVitePlugin` / `blaRollupPlugin`) that automatically
|
|
37
|
+
* injects BLA's three-stage adversarial shield into generated JS chunks during `renderChunk`.
|
|
38
|
+
*
|
|
39
|
+
* Usage in `vite.config.ts`:
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { defineConfig } from "vite";
|
|
42
|
+
* import { blaVitePlugin } from "bla-shield";
|
|
43
|
+
*
|
|
44
|
+
* export default defineConfig({
|
|
45
|
+
* plugins: [blaVitePlugin({ intensity: "bankrupt" })],
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function blaRollupPlugin(options = {}) {
|
|
50
|
+
const intensity = options.intensity ?? "balanced";
|
|
51
|
+
const include = options.include ?? /\.(?:m?js|cjs)$/i;
|
|
52
|
+
const emitMap = options.honeySourceMap ?? true;
|
|
53
|
+
return {
|
|
54
|
+
name: "bla-shield-rollup-plugin",
|
|
55
|
+
renderChunk(code, chunk, outputOptions) {
|
|
56
|
+
if (!include.test(chunk.fileName)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const seed = `${options.seed ?? "bla-rollup"}:${chunk.fileName}`;
|
|
60
|
+
const sourceType = inferCarrierFromRollupFormat(outputOptions?.format, chunk.fileName);
|
|
61
|
+
const loader = inferEsbuildLoader(chunk.fileName);
|
|
62
|
+
const transformed = transformJavaScriptWithBlaShield(code, {
|
|
63
|
+
intensity,
|
|
64
|
+
seed,
|
|
65
|
+
filename: chunk.fileName,
|
|
66
|
+
sourceType,
|
|
67
|
+
loader,
|
|
68
|
+
});
|
|
69
|
+
if (!emitMap) {
|
|
70
|
+
return { code: transformed.code, map: null };
|
|
71
|
+
}
|
|
72
|
+
const prng = new SeededPrng(seed);
|
|
73
|
+
const chaff = generateChaffPayloads(prng, intensity);
|
|
74
|
+
const lineCount = transformed.code.split("\n").length;
|
|
75
|
+
const honeyMap = generateHoneySourceMap(chunk.fileName, lineCount, prng, chaff);
|
|
76
|
+
return {
|
|
77
|
+
code: transformed.code,
|
|
78
|
+
map: honeyMap.mapObject,
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Alias of `blaRollupPlugin` with `enforce: "post"` for Vite 4/5/6.
|
|
85
|
+
*/
|
|
86
|
+
export function blaVitePlugin(options = {}) {
|
|
87
|
+
return {
|
|
88
|
+
...blaRollupPlugin(options),
|
|
89
|
+
name: "vite-plugin-bla-shield",
|
|
90
|
+
enforce: "post",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Webpack 5 / Rspack plugin class (`BlaWebpackPlugin`) that shields emitted JS assets.
|
|
95
|
+
*/
|
|
96
|
+
export class BlaWebpackPlugin {
|
|
97
|
+
options;
|
|
98
|
+
constructor(options = {}) {
|
|
99
|
+
this.options = options;
|
|
100
|
+
}
|
|
101
|
+
apply(compiler) {
|
|
102
|
+
const intensity = this.options.intensity ?? "balanced";
|
|
103
|
+
const include = this.options.include ?? /\.(?:m?js|cjs)$/i;
|
|
104
|
+
compiler.hooks.compilation.tap("BlaWebpackPlugin", (compilation) => {
|
|
105
|
+
compilation.hooks.processAssets.tap({
|
|
106
|
+
name: "BlaWebpackPlugin",
|
|
107
|
+
stage: 400, // PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
|
|
108
|
+
}, (assets) => {
|
|
109
|
+
for (const assetName of Object.keys(assets)) {
|
|
110
|
+
if (!include.test(assetName))
|
|
111
|
+
continue;
|
|
112
|
+
const rawAsset = assets[assetName];
|
|
113
|
+
if (!rawAsset)
|
|
114
|
+
continue;
|
|
115
|
+
const rawSource = rawAsset.source().toString("utf8");
|
|
116
|
+
const sourceType = inferJsCarrierFromPath(assetName);
|
|
117
|
+
const loader = inferEsbuildLoader(assetName);
|
|
118
|
+
const transformed = transformJavaScriptWithBlaShield(rawSource, {
|
|
119
|
+
intensity,
|
|
120
|
+
seed: `${this.options.seed ?? "bla-webpack"}:${assetName}`,
|
|
121
|
+
filename: assetName,
|
|
122
|
+
sourceType,
|
|
123
|
+
loader,
|
|
124
|
+
});
|
|
125
|
+
const shieldedCode = transformed.code;
|
|
126
|
+
compilation.updateAsset(assetName, {
|
|
127
|
+
source: () => shieldedCode,
|
|
128
|
+
size: () => Buffer.byteLength(shieldedCode, "utf8"),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* esbuild plugin (`blaEsbuildPlugin`) that shields JS/TS/JSX/TSX entrypoints or modules
|
|
137
|
+
* while preserving the exact esbuild loader (`js`, `jsx`, `ts`, `tsx`) and module carrier.
|
|
138
|
+
*/
|
|
139
|
+
export function blaEsbuildPlugin(options = {}) {
|
|
140
|
+
const intensity = options.intensity ?? "balanced";
|
|
141
|
+
const include = options.include ?? /\.(?:[cm]?[jt]sx?)$/i;
|
|
142
|
+
return {
|
|
143
|
+
name: "bla-shield-esbuild-plugin",
|
|
144
|
+
setup(build) {
|
|
145
|
+
build.onLoad({ filter: include }, async (args) => {
|
|
146
|
+
if (args.path.includes("node_modules"))
|
|
147
|
+
return null;
|
|
148
|
+
const fs = await import("node:fs/promises");
|
|
149
|
+
const source = await fs.readFile(args.path, "utf8");
|
|
150
|
+
const loader = inferEsbuildLoader(args.path);
|
|
151
|
+
const sourceType = inferJsCarrierFromPath(args.path);
|
|
152
|
+
const transformed = transformJavaScriptWithBlaShield(source, {
|
|
153
|
+
intensity,
|
|
154
|
+
seed: `${options.seed ?? "bla-esbuild"}:${args.path}`,
|
|
155
|
+
filename: args.path,
|
|
156
|
+
loader,
|
|
157
|
+
sourceType,
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
contents: transformed.code,
|
|
161
|
+
loader,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bundler/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { ProtectionIntensity } from "./core/types.js";
|
|
3
|
+
import { type NativeHeaderLanguage } from "./shields/formats/headers.js";
|
|
4
|
+
import { type SupportedAgentClientId } from "./setup/clients.js";
|
|
5
|
+
interface ParsedCliArgs {
|
|
6
|
+
readonly command: string;
|
|
7
|
+
readonly positionals: string[];
|
|
8
|
+
readonly output?: string;
|
|
9
|
+
readonly configPath?: string;
|
|
10
|
+
readonly inPlace: boolean;
|
|
11
|
+
readonly intensity: ProtectionIntensity;
|
|
12
|
+
readonly seed?: string;
|
|
13
|
+
readonly manifest: boolean;
|
|
14
|
+
readonly llmDirectives: boolean;
|
|
15
|
+
readonly lang: NativeHeaderLanguage;
|
|
16
|
+
readonly clients: SupportedAgentClientId[];
|
|
17
|
+
readonly allDetected: boolean;
|
|
18
|
+
readonly dryRun: boolean;
|
|
19
|
+
readonly yes: boolean;
|
|
20
|
+
readonly json: boolean;
|
|
21
|
+
readonly sarif: boolean;
|
|
22
|
+
readonly failUnder?: number;
|
|
23
|
+
readonly honeyMaps: boolean;
|
|
24
|
+
readonly help: boolean;
|
|
25
|
+
readonly version: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function parseCliArgs(argv: readonly string[]): ParsedCliArgs;
|
|
28
|
+
export declare function runCli(argv?: readonly string[]): Promise<number>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAO3D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AA8DjE,UAAU,aAAa;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAmGnE;AAED,wBAAsB,MAAM,CAAC,IAAI,GAAE,SAAS,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwP7F"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { BLA_IDENTITY } from "./identity.js";
|
|
5
|
+
import { initBlaConfig, loadBlaConfig, resolveProjectSeed } from "./core/config.js";
|
|
6
|
+
import { inspectReleaseExposure } from "./core/release-exposure.js";
|
|
7
|
+
import { buildSarifReport } from "./core/sarif.js";
|
|
8
|
+
import { auditTarget } from "./engine/auditor.js";
|
|
9
|
+
import { protectTarget } from "./engine/protector.js";
|
|
10
|
+
import { verifyTarget } from "./engine/verifier.js";
|
|
11
|
+
import { defendTarget } from "./engine/defender.js";
|
|
12
|
+
import { formatHardenProjectReport, hardenProject } from "./engine/harden.js";
|
|
13
|
+
import { runShowcaseBenchmark } from "./engine/benchmark.js";
|
|
14
|
+
import { emitCompileTimeNativeHeader, } from "./shields/formats/headers.js";
|
|
15
|
+
import { runSetup, runUninstall } from "./setup/setup.js";
|
|
16
|
+
import { runDoctor } from "./setup/doctor.js";
|
|
17
|
+
import { startMcpStdioServer } from "./mcp/server.js";
|
|
18
|
+
import { formatAuditReport, formatBanner, formatBenchmarkReport, formatDoctorReport, formatOneClickDefenseReport, formatProtectionResult, formatSetupReport, formatVerificationReport, } from "./ui/reporter.js";
|
|
19
|
+
function printHelp() {
|
|
20
|
+
console.log(`${formatBanner()}
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
npx bla-agents <command> [options]
|
|
24
|
+
npx bla-shield <command> [options]
|
|
25
|
+
bla <command> [options]
|
|
26
|
+
|
|
27
|
+
Quick start:
|
|
28
|
+
npx bla-agents setup -y # register bla_harden with your agent
|
|
29
|
+
bla harden . # one-sentence Counter-REA hardening
|
|
30
|
+
# or tell your agent: "Harden my software against REA"
|
|
31
|
+
|
|
32
|
+
Commands:
|
|
33
|
+
setup Configure agent MCP integrations & install the BLA skill
|
|
34
|
+
harden [dir] DEFAULT: auto-discover build outputs under a project/build dir and bankrupt-harden all of them
|
|
35
|
+
defend <target> One-click full Counter-REA pipeline (inspect -> audit -> bankrupt protect -> verify)
|
|
36
|
+
inspect-release <target> Read-only local source-map & symbol exposure check
|
|
37
|
+
audit <target> Pre-flight REA exposure & vulnerability scan
|
|
38
|
+
protect <target> Inject multi-layer Counter-REA adversarial shield
|
|
39
|
+
verify <target> [original] Verify Counter-REA defense invariants & token amplification
|
|
40
|
+
benchmark Run the 14-target Counter-REA Showcase Benchmark suite
|
|
41
|
+
emit-headers Generate compile-time C/C++, Rust, or Go defense headers
|
|
42
|
+
doctor Check readiness of BLA engines & agent registrations
|
|
43
|
+
update Update global bla-shield installation & print setup refresh instructions
|
|
44
|
+
uninstall Remove BLA MCP configuration & skill files
|
|
45
|
+
mcp Start the BLA Model Context Protocol (MCP) server over stdio
|
|
46
|
+
|
|
47
|
+
Options:
|
|
48
|
+
-o, --output <path> Output file or directory path (for protect / emit-headers)
|
|
49
|
+
--in-place Overwrite input target in-place (for protect)
|
|
50
|
+
--intensity <preset> stealth | balanced | maximum | bankrupt
|
|
51
|
+
(harden/defend default: bankrupt; protect default: balanced)
|
|
52
|
+
--seed <seed> Deterministic PRNG seed (default: per-project random in .blarc)
|
|
53
|
+
--manifest Emit unsigned .bla-manifest.json next to protected artifacts (opt-in)
|
|
54
|
+
--llm-directives Opt-in risky LLM directive layers (COPPA/medical bait, dual-use imitation, AI chat markers); OFF by default
|
|
55
|
+
--lang <c|rust|go> Target language for emit-headers (default: c)
|
|
56
|
+
--client <id> Agent client ID for setup (repeatable: claude_code, cursor, codex, etc.)
|
|
57
|
+
--all-detected Configure all detected coding agents on this machine
|
|
58
|
+
--dry-run Preview planned setup changes without writing files
|
|
59
|
+
-y, --yes Approve setup actions without interactive confirmation
|
|
60
|
+
--json Emit structured JSON output
|
|
61
|
+
-v, --version Print BLA version
|
|
62
|
+
-h, --help Print this help guide
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
export function parseCliArgs(argv) {
|
|
66
|
+
let command = "";
|
|
67
|
+
const positionals = [];
|
|
68
|
+
let output;
|
|
69
|
+
let configPath;
|
|
70
|
+
let inPlace = false;
|
|
71
|
+
let intensity = "balanced";
|
|
72
|
+
let seed;
|
|
73
|
+
let manifest = false;
|
|
74
|
+
let llmDirectives = false;
|
|
75
|
+
let lang = "c";
|
|
76
|
+
const clients = [];
|
|
77
|
+
let allDetected = false;
|
|
78
|
+
let dryRun = false;
|
|
79
|
+
let yes = false;
|
|
80
|
+
let json = false;
|
|
81
|
+
let sarif = false;
|
|
82
|
+
let failUnder;
|
|
83
|
+
let honeyMaps = true;
|
|
84
|
+
let help = false;
|
|
85
|
+
let version = false;
|
|
86
|
+
for (let i = 0; i < argv.length; i++) {
|
|
87
|
+
const arg = argv[i];
|
|
88
|
+
if (arg === "-h" || arg === "--help") {
|
|
89
|
+
help = true;
|
|
90
|
+
}
|
|
91
|
+
else if (arg === "-v" || arg === "--version") {
|
|
92
|
+
version = true;
|
|
93
|
+
}
|
|
94
|
+
else if (arg === "--json") {
|
|
95
|
+
json = true;
|
|
96
|
+
}
|
|
97
|
+
else if (arg === "--sarif") {
|
|
98
|
+
sarif = true;
|
|
99
|
+
}
|
|
100
|
+
else if (arg === "-y" || arg === "--yes") {
|
|
101
|
+
yes = true;
|
|
102
|
+
}
|
|
103
|
+
else if (arg === "--dry-run") {
|
|
104
|
+
dryRun = true;
|
|
105
|
+
}
|
|
106
|
+
else if (arg === "--all-detected") {
|
|
107
|
+
allDetected = true;
|
|
108
|
+
}
|
|
109
|
+
else if (arg === "--in-place") {
|
|
110
|
+
inPlace = true;
|
|
111
|
+
}
|
|
112
|
+
else if (arg === "--no-honey-maps") {
|
|
113
|
+
honeyMaps = false;
|
|
114
|
+
}
|
|
115
|
+
else if (arg === "--manifest") {
|
|
116
|
+
manifest = true;
|
|
117
|
+
}
|
|
118
|
+
else if (arg === "--llm-directives") {
|
|
119
|
+
llmDirectives = true;
|
|
120
|
+
}
|
|
121
|
+
else if (arg === "--mcp") {
|
|
122
|
+
command = "mcp";
|
|
123
|
+
}
|
|
124
|
+
else if (arg === "--update") {
|
|
125
|
+
command = "update";
|
|
126
|
+
}
|
|
127
|
+
else if ((arg === "-o" || arg === "--output") && i + 1 < argv.length) {
|
|
128
|
+
output = argv[++i];
|
|
129
|
+
}
|
|
130
|
+
else if ((arg === "-c" || arg === "--config") && i + 1 < argv.length) {
|
|
131
|
+
configPath = argv[++i];
|
|
132
|
+
}
|
|
133
|
+
else if (arg === "--fail-under" && i + 1 < argv.length) {
|
|
134
|
+
const n = Number(argv[++i]);
|
|
135
|
+
if (Number.isFinite(n))
|
|
136
|
+
failUnder = n;
|
|
137
|
+
}
|
|
138
|
+
else if (arg === "--intensity" && i + 1 < argv.length) {
|
|
139
|
+
const val = argv[++i];
|
|
140
|
+
if (["stealth", "balanced", "maximum", "bankrupt"].includes(val)) {
|
|
141
|
+
intensity = val;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else if (arg === "--seed" && i + 1 < argv.length) {
|
|
145
|
+
seed = argv[++i];
|
|
146
|
+
}
|
|
147
|
+
else if (arg === "--lang" && i + 1 < argv.length) {
|
|
148
|
+
const val = argv[++i];
|
|
149
|
+
if (["c", "rust", "go"].includes(val)) {
|
|
150
|
+
lang = val;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (arg === "--client" && i + 1 < argv.length) {
|
|
154
|
+
clients.push(argv[++i]);
|
|
155
|
+
}
|
|
156
|
+
else if (!arg.startsWith("-")) {
|
|
157
|
+
if (!command)
|
|
158
|
+
command = arg;
|
|
159
|
+
else
|
|
160
|
+
positionals.push(arg);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
command,
|
|
165
|
+
positionals,
|
|
166
|
+
...(output !== undefined ? { output } : {}),
|
|
167
|
+
...(configPath !== undefined ? { configPath } : {}),
|
|
168
|
+
inPlace,
|
|
169
|
+
intensity,
|
|
170
|
+
...(seed !== undefined ? { seed } : {}),
|
|
171
|
+
manifest,
|
|
172
|
+
llmDirectives,
|
|
173
|
+
lang,
|
|
174
|
+
clients,
|
|
175
|
+
allDetected,
|
|
176
|
+
dryRun,
|
|
177
|
+
yes,
|
|
178
|
+
json,
|
|
179
|
+
sarif,
|
|
180
|
+
...(failUnder !== undefined ? { failUnder } : {}),
|
|
181
|
+
honeyMaps,
|
|
182
|
+
help,
|
|
183
|
+
version,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export async function runCli(argv = process.argv.slice(2)) {
|
|
187
|
+
const parsed = parseCliArgs(argv);
|
|
188
|
+
if (parsed.version) {
|
|
189
|
+
console.log(BLA_IDENTITY.version);
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
if (parsed.command === "mcp") {
|
|
193
|
+
startMcpStdioServer();
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
if (parsed.help || !parsed.command) {
|
|
197
|
+
printHelp();
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
switch (parsed.command) {
|
|
202
|
+
case "setup": {
|
|
203
|
+
const res = runSetup({
|
|
204
|
+
...(parsed.clients.length > 0 ? { clientIds: parsed.clients } : {}),
|
|
205
|
+
allDetected: parsed.allDetected,
|
|
206
|
+
dryRun: parsed.dryRun,
|
|
207
|
+
yes: parsed.yes,
|
|
208
|
+
});
|
|
209
|
+
if (parsed.json)
|
|
210
|
+
console.log(JSON.stringify(res, null, 2));
|
|
211
|
+
else
|
|
212
|
+
console.log(formatSetupReport(res));
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
case "doctor": {
|
|
216
|
+
const doc = runDoctor();
|
|
217
|
+
if (parsed.json)
|
|
218
|
+
console.log(JSON.stringify(doc, null, 2));
|
|
219
|
+
else
|
|
220
|
+
console.log(formatDoctorReport(doc));
|
|
221
|
+
return doc.healthy ? 0 : 1;
|
|
222
|
+
}
|
|
223
|
+
case "update": {
|
|
224
|
+
const updateInfo = {
|
|
225
|
+
currentVersion: BLA_IDENTITY.version,
|
|
226
|
+
package: BLA_IDENTITY.packageName,
|
|
227
|
+
packageAlias: BLA_IDENTITY.packageAlias,
|
|
228
|
+
refreshSetupCommand: "npx bla-agents@latest setup",
|
|
229
|
+
globalUpdateCommand: "npm install --global bla-agents@latest",
|
|
230
|
+
};
|
|
231
|
+
if (parsed.json) {
|
|
232
|
+
console.log(JSON.stringify(updateInfo, null, 2));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.log(`${formatBanner()}\n\nBLA v${BLA_IDENTITY.version} update workflow:\n • Global CLI update: npm install --global bla-agents@latest\n • Agent MCP refresh: npx bla-agents@latest setup\n`);
|
|
236
|
+
}
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
case "uninstall": {
|
|
240
|
+
const res = runUninstall();
|
|
241
|
+
if (parsed.json)
|
|
242
|
+
console.log(JSON.stringify(res, null, 2));
|
|
243
|
+
else
|
|
244
|
+
console.log(`Removed BLA configuration from ${res.removedClients.length} client(s).`);
|
|
245
|
+
return 0;
|
|
246
|
+
}
|
|
247
|
+
case "init": {
|
|
248
|
+
const dir = parsed.positionals[0] ?? process.cwd();
|
|
249
|
+
const res = initBlaConfig(dir, parsed.inPlace);
|
|
250
|
+
if (parsed.json) {
|
|
251
|
+
console.log(JSON.stringify(res, null, 2));
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
console.log(res.created
|
|
255
|
+
? `Created ${res.configPath} (default input: "${res.config.input}", intensity: "${res.config.intensity}").`
|
|
256
|
+
: `Config already exists at ${res.configPath}. Pass --in-place to overwrite.`);
|
|
257
|
+
}
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
case "inspect-release": {
|
|
261
|
+
const target = parsed.positionals[0];
|
|
262
|
+
if (!target) {
|
|
263
|
+
console.error("Error: Missing <target> path for `bla inspect-release <target>`.");
|
|
264
|
+
return 1;
|
|
265
|
+
}
|
|
266
|
+
const report = inspectReleaseExposure(target);
|
|
267
|
+
console.log(JSON.stringify(report, null, 2));
|
|
268
|
+
return report.status === "complete" ? 0 : 2;
|
|
269
|
+
}
|
|
270
|
+
case "harden": {
|
|
271
|
+
const loaded = loadBlaConfig(process.cwd(), parsed.configPath);
|
|
272
|
+
const directory = parsed.positionals[0] ?? loaded.config.input ?? process.cwd();
|
|
273
|
+
const explicitIntensity = argv.includes("--intensity")
|
|
274
|
+
? parsed.intensity
|
|
275
|
+
: (loaded.config.intensity ?? "bankrupt");
|
|
276
|
+
const resolved = resolveProjectSeed(typeof directory === "string" ? directory : process.cwd(), parsed.seed, parsed.configPath);
|
|
277
|
+
const report = hardenProject({
|
|
278
|
+
directory,
|
|
279
|
+
intensity: explicitIntensity,
|
|
280
|
+
seed: resolved.seed,
|
|
281
|
+
emitManifest: parsed.manifest || loaded.config.emitManifest === true,
|
|
282
|
+
llmDirectives: parsed.llmDirectives || loaded.config.llmDirectives === true,
|
|
283
|
+
...(parsed.output !== undefined ? { outputDirectory: parsed.output } : {}),
|
|
284
|
+
});
|
|
285
|
+
if (parsed.json) {
|
|
286
|
+
console.log(JSON.stringify(report, null, 2));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
console.log(formatHardenProjectReport(report));
|
|
290
|
+
}
|
|
291
|
+
return report.overallSuccess || report.discoveredCount === 0 ? (report.discoveredCount === 0 ? 2 : 0) : 2;
|
|
292
|
+
}
|
|
293
|
+
case "defend": {
|
|
294
|
+
const loaded = loadBlaConfig(process.cwd(), parsed.configPath);
|
|
295
|
+
const target = parsed.positionals[0] ?? loaded.config.input;
|
|
296
|
+
if (!target) {
|
|
297
|
+
console.error("Error: Missing <target> path for `bla defend <target>`.");
|
|
298
|
+
return 1;
|
|
299
|
+
}
|
|
300
|
+
const explicitIntensity = argv.includes("--intensity")
|
|
301
|
+
? parsed.intensity
|
|
302
|
+
: (loaded.config.intensity ?? "bankrupt");
|
|
303
|
+
const resolved = resolveProjectSeed(process.cwd(), parsed.seed, parsed.configPath);
|
|
304
|
+
const report = defendTarget({
|
|
305
|
+
inputPath: target,
|
|
306
|
+
...((parsed.output ?? loaded.config.output) !== undefined
|
|
307
|
+
? { outputPath: (parsed.output ?? loaded.config.output) }
|
|
308
|
+
: {}),
|
|
309
|
+
inPlace: parsed.inPlace,
|
|
310
|
+
intensity: explicitIntensity,
|
|
311
|
+
seed: resolved.seed,
|
|
312
|
+
emitManifest: parsed.manifest || loaded.config.emitManifest === true,
|
|
313
|
+
llmDirectives: parsed.llmDirectives || loaded.config.llmDirectives === true,
|
|
314
|
+
});
|
|
315
|
+
if (parsed.sarif) {
|
|
316
|
+
console.log(JSON.stringify(buildSarifReport(report.beforeAudit, report.releaseExposure), null, 2));
|
|
317
|
+
}
|
|
318
|
+
else if (parsed.json) {
|
|
319
|
+
console.log(JSON.stringify(report, null, 2));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
console.log(formatOneClickDefenseReport(report));
|
|
323
|
+
}
|
|
324
|
+
const threshold = parsed.failUnder ?? loaded.config.minDefenseScore;
|
|
325
|
+
if (threshold !== undefined && report.verification.defenseScore < threshold) {
|
|
326
|
+
return 2;
|
|
327
|
+
}
|
|
328
|
+
return report.overallSuccess ? 0 : 2;
|
|
329
|
+
}
|
|
330
|
+
case "audit": {
|
|
331
|
+
const loaded = loadBlaConfig(process.cwd(), parsed.configPath);
|
|
332
|
+
const target = parsed.positionals[0] ?? loaded.config.input;
|
|
333
|
+
if (!target) {
|
|
334
|
+
console.error("Error: Missing <target> path for `bla audit <target>`.");
|
|
335
|
+
return 1;
|
|
336
|
+
}
|
|
337
|
+
const report = auditTarget(target);
|
|
338
|
+
if (parsed.sarif) {
|
|
339
|
+
console.log(JSON.stringify(buildSarifReport(report), null, 2));
|
|
340
|
+
}
|
|
341
|
+
else if (parsed.json) {
|
|
342
|
+
console.log(JSON.stringify(report, null, 2));
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.log(formatAuditReport(report));
|
|
346
|
+
}
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
case "protect": {
|
|
350
|
+
const loaded = loadBlaConfig(process.cwd(), parsed.configPath);
|
|
351
|
+
const target = parsed.positionals[0] ?? loaded.config.input;
|
|
352
|
+
if (!target) {
|
|
353
|
+
console.error("Error: Missing <target> path for `bla protect <target>`.");
|
|
354
|
+
return 1;
|
|
355
|
+
}
|
|
356
|
+
const resolved = resolveProjectSeed(process.cwd(), parsed.seed, parsed.configPath);
|
|
357
|
+
const res = protectTarget({
|
|
358
|
+
inputPath: target,
|
|
359
|
+
...((parsed.output ?? loaded.config.output) !== undefined
|
|
360
|
+
? { outputPath: (parsed.output ?? loaded.config.output) }
|
|
361
|
+
: {}),
|
|
362
|
+
inPlace: parsed.inPlace,
|
|
363
|
+
intensity: argv.includes("--intensity")
|
|
364
|
+
? parsed.intensity
|
|
365
|
+
: (loaded.config.intensity ?? parsed.intensity),
|
|
366
|
+
seed: resolved.seed,
|
|
367
|
+
honeySourceMaps: parsed.honeyMaps,
|
|
368
|
+
llmDirectives: parsed.llmDirectives || loaded.config.llmDirectives === true,
|
|
369
|
+
});
|
|
370
|
+
if (parsed.json)
|
|
371
|
+
console.log(JSON.stringify(res, null, 2));
|
|
372
|
+
else
|
|
373
|
+
console.log(formatProtectionResult(res));
|
|
374
|
+
return 0;
|
|
375
|
+
}
|
|
376
|
+
case "verify": {
|
|
377
|
+
const target = parsed.positionals[0];
|
|
378
|
+
if (!target) {
|
|
379
|
+
console.error("Error: Missing <target> path for `bla verify <target> [original]`.");
|
|
380
|
+
return 1;
|
|
381
|
+
}
|
|
382
|
+
const report = verifyTarget(target, parsed.positionals[1]);
|
|
383
|
+
if (parsed.json)
|
|
384
|
+
console.log(JSON.stringify(report, null, 2));
|
|
385
|
+
else
|
|
386
|
+
console.log(formatVerificationReport(report));
|
|
387
|
+
if (parsed.failUnder !== undefined && report.defenseScore < parsed.failUnder) {
|
|
388
|
+
return 2;
|
|
389
|
+
}
|
|
390
|
+
return report.overallPassed ? 0 : 2;
|
|
391
|
+
}
|
|
392
|
+
case "benchmark": {
|
|
393
|
+
const bench = await runShowcaseBenchmark();
|
|
394
|
+
if (parsed.json)
|
|
395
|
+
console.log(JSON.stringify(bench, null, 2));
|
|
396
|
+
else
|
|
397
|
+
console.log(formatBenchmarkReport(bench));
|
|
398
|
+
return 0;
|
|
399
|
+
}
|
|
400
|
+
case "emit-headers": {
|
|
401
|
+
const emitted = emitCompileTimeNativeHeader(parsed.lang, {
|
|
402
|
+
intensity: parsed.intensity,
|
|
403
|
+
...(parsed.seed !== undefined ? { seed: parsed.seed } : {}),
|
|
404
|
+
});
|
|
405
|
+
if (parsed.output) {
|
|
406
|
+
const outPath = resolve(parsed.output);
|
|
407
|
+
writeFileSync(outPath, emitted.content, "utf8");
|
|
408
|
+
if (parsed.json) {
|
|
409
|
+
console.log(JSON.stringify({ ...emitted, outputPath: outPath }, null, 2));
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
console.log(`Emitted ${emitted.language.toUpperCase()} defense header to ${outPath} (${emitted.decoyFunctionsCount} decoy tarpit functions).`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
else if (parsed.json) {
|
|
416
|
+
console.log(JSON.stringify(emitted, null, 2));
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
console.log(emitted.content);
|
|
420
|
+
}
|
|
421
|
+
return 0;
|
|
422
|
+
}
|
|
423
|
+
default:
|
|
424
|
+
console.error(`Unknown command: ${parsed.command}. Run "bla --help" for available commands.`);
|
|
425
|
+
return 1;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
430
|
+
return 1;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// Run when invoked directly
|
|
434
|
+
const isDirectExecution = process.argv[1] !== undefined &&
|
|
435
|
+
(process.argv[1].endsWith("cli.js") ||
|
|
436
|
+
process.argv[1].endsWith("cli.ts") ||
|
|
437
|
+
process.argv[1].endsWith("bla") ||
|
|
438
|
+
process.argv[1].endsWith("bla-agents") ||
|
|
439
|
+
process.argv[1].endsWith("bla-shield"));
|
|
440
|
+
if (isDirectExecution) {
|
|
441
|
+
runCli().then((code) => {
|
|
442
|
+
if (process.argv[2] !== "mcp" && !process.argv.includes("--mcp")) {
|
|
443
|
+
process.exitCode = code;
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=cli.js.map
|