raxe 0.4.6__py3-none-any.whl
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.
- raxe/__init__.py +101 -0
- raxe/application/__init__.py +48 -0
- raxe/application/ab_testing.py +170 -0
- raxe/application/analytics/__init__.py +30 -0
- raxe/application/analytics/achievement_service.py +444 -0
- raxe/application/analytics/repositories.py +172 -0
- raxe/application/analytics/retention_service.py +267 -0
- raxe/application/analytics/statistics_service.py +419 -0
- raxe/application/analytics/streak_service.py +283 -0
- raxe/application/apply_policy.py +291 -0
- raxe/application/eager_l2.py +503 -0
- raxe/application/preloader.py +353 -0
- raxe/application/scan_merger.py +321 -0
- raxe/application/scan_pipeline.py +1059 -0
- raxe/application/scan_pipeline_async.py +403 -0
- raxe/application/session_tracker.py +458 -0
- raxe/application/telemetry_manager.py +357 -0
- raxe/application/telemetry_orchestrator.py +1210 -0
- raxe/async_sdk/__init__.py +34 -0
- raxe/async_sdk/cache.py +286 -0
- raxe/async_sdk/client.py +556 -0
- raxe/async_sdk/wrappers/__init__.py +23 -0
- raxe/async_sdk/wrappers/openai.py +238 -0
- raxe/cli/__init__.py +21 -0
- raxe/cli/auth.py +1047 -0
- raxe/cli/branding.py +235 -0
- raxe/cli/config.py +334 -0
- raxe/cli/custom_rules.py +458 -0
- raxe/cli/doctor.py +686 -0
- raxe/cli/error_handler.py +665 -0
- raxe/cli/event.py +648 -0
- raxe/cli/exit_codes.py +57 -0
- raxe/cli/expiry_warning.py +302 -0
- raxe/cli/export.py +183 -0
- raxe/cli/history.py +247 -0
- raxe/cli/l2_formatter.py +872 -0
- raxe/cli/main.py +1137 -0
- raxe/cli/models.py +590 -0
- raxe/cli/output.py +403 -0
- raxe/cli/privacy.py +84 -0
- raxe/cli/profiler.py +262 -0
- raxe/cli/progress.py +379 -0
- raxe/cli/progress_context.py +101 -0
- raxe/cli/repl.py +394 -0
- raxe/cli/rules.py +542 -0
- raxe/cli/setup_wizard.py +721 -0
- raxe/cli/stats.py +292 -0
- raxe/cli/suppress.py +501 -0
- raxe/cli/telemetry.py +1384 -0
- raxe/cli/test.py +130 -0
- raxe/cli/tune.py +315 -0
- raxe/cli/validate.py +218 -0
- raxe/domain/__init__.py +30 -0
- raxe/domain/analytics/__init__.py +97 -0
- raxe/domain/analytics/achievements.py +306 -0
- raxe/domain/analytics/models.py +120 -0
- raxe/domain/analytics/retention.py +168 -0
- raxe/domain/analytics/statistics.py +207 -0
- raxe/domain/analytics/streaks.py +173 -0
- raxe/domain/engine/__init__.py +15 -0
- raxe/domain/engine/executor.py +396 -0
- raxe/domain/engine/matcher.py +212 -0
- raxe/domain/inline_suppression.py +176 -0
- raxe/domain/ml/__init__.py +133 -0
- raxe/domain/ml/embedding_cache.py +309 -0
- raxe/domain/ml/gemma_detector.py +921 -0
- raxe/domain/ml/gemma_models.py +346 -0
- raxe/domain/ml/l2_config.py +428 -0
- raxe/domain/ml/l2_output_schema.py +443 -0
- raxe/domain/ml/manifest_loader.py +309 -0
- raxe/domain/ml/manifest_schema.py +345 -0
- raxe/domain/ml/model_metadata.py +263 -0
- raxe/domain/ml/model_registry.py +786 -0
- raxe/domain/ml/protocol.py +282 -0
- raxe/domain/ml/scoring_models.py +419 -0
- raxe/domain/ml/stub_detector.py +397 -0
- raxe/domain/ml/threat_scorer.py +757 -0
- raxe/domain/ml/tokenizer_registry.py +372 -0
- raxe/domain/ml/voting/__init__.py +89 -0
- raxe/domain/ml/voting/config.py +595 -0
- raxe/domain/ml/voting/engine.py +465 -0
- raxe/domain/ml/voting/head_voters.py +378 -0
- raxe/domain/ml/voting/models.py +222 -0
- raxe/domain/models.py +82 -0
- raxe/domain/packs/__init__.py +17 -0
- raxe/domain/packs/models.py +304 -0
- raxe/domain/policies/__init__.py +20 -0
- raxe/domain/policies/evaluator.py +212 -0
- raxe/domain/policies/models.py +223 -0
- raxe/domain/rules/__init__.py +32 -0
- raxe/domain/rules/custom.py +286 -0
- raxe/domain/rules/models.py +273 -0
- raxe/domain/rules/schema.py +166 -0
- raxe/domain/rules/validator.py +556 -0
- raxe/domain/suppression.py +801 -0
- raxe/domain/suppression_factory.py +174 -0
- raxe/domain/telemetry/__init__.py +116 -0
- raxe/domain/telemetry/backpressure.py +424 -0
- raxe/domain/telemetry/event_creator.py +362 -0
- raxe/domain/telemetry/events.py +1282 -0
- raxe/domain/telemetry/priority.py +263 -0
- raxe/domain/telemetry/scan_telemetry_builder.py +670 -0
- raxe/infrastructure/__init__.py +25 -0
- raxe/infrastructure/analytics/__init__.py +18 -0
- raxe/infrastructure/analytics/aggregator.py +484 -0
- raxe/infrastructure/analytics/aggregator_optimized.py +184 -0
- raxe/infrastructure/analytics/engine.py +748 -0
- raxe/infrastructure/analytics/repository.py +409 -0
- raxe/infrastructure/analytics/streaks.py +467 -0
- raxe/infrastructure/analytics/views.py +178 -0
- raxe/infrastructure/cloud/__init__.py +9 -0
- raxe/infrastructure/config/__init__.py +56 -0
- raxe/infrastructure/config/endpoints.py +641 -0
- raxe/infrastructure/config/scan_config.py +352 -0
- raxe/infrastructure/config/yaml_config.py +459 -0
- raxe/infrastructure/database/__init__.py +10 -0
- raxe/infrastructure/database/connection.py +200 -0
- raxe/infrastructure/database/models.py +325 -0
- raxe/infrastructure/database/scan_history.py +764 -0
- raxe/infrastructure/ml/__init__.py +0 -0
- raxe/infrastructure/ml/download_progress.py +438 -0
- raxe/infrastructure/ml/model_downloader.py +457 -0
- raxe/infrastructure/models/__init__.py +16 -0
- raxe/infrastructure/models/discovery.py +461 -0
- raxe/infrastructure/packs/__init__.py +13 -0
- raxe/infrastructure/packs/loader.py +407 -0
- raxe/infrastructure/packs/registry.py +381 -0
- raxe/infrastructure/policies/__init__.py +16 -0
- raxe/infrastructure/policies/api_client.py +256 -0
- raxe/infrastructure/policies/validator.py +227 -0
- raxe/infrastructure/policies/yaml_loader.py +250 -0
- raxe/infrastructure/rules/__init__.py +18 -0
- raxe/infrastructure/rules/custom_loader.py +224 -0
- raxe/infrastructure/rules/versioning.py +222 -0
- raxe/infrastructure/rules/yaml_loader.py +286 -0
- raxe/infrastructure/security/__init__.py +31 -0
- raxe/infrastructure/security/auth.py +145 -0
- raxe/infrastructure/security/policy_validator.py +124 -0
- raxe/infrastructure/security/signatures.py +171 -0
- raxe/infrastructure/suppression/__init__.py +36 -0
- raxe/infrastructure/suppression/composite_repository.py +154 -0
- raxe/infrastructure/suppression/sqlite_repository.py +231 -0
- raxe/infrastructure/suppression/yaml_composite_repository.py +156 -0
- raxe/infrastructure/suppression/yaml_repository.py +510 -0
- raxe/infrastructure/telemetry/__init__.py +79 -0
- raxe/infrastructure/telemetry/acquisition.py +179 -0
- raxe/infrastructure/telemetry/config.py +254 -0
- raxe/infrastructure/telemetry/credential_store.py +947 -0
- raxe/infrastructure/telemetry/dual_queue.py +1123 -0
- raxe/infrastructure/telemetry/flush_helper.py +343 -0
- raxe/infrastructure/telemetry/flush_scheduler.py +776 -0
- raxe/infrastructure/telemetry/health_client.py +394 -0
- raxe/infrastructure/telemetry/hook.py +347 -0
- raxe/infrastructure/telemetry/queue.py +520 -0
- raxe/infrastructure/telemetry/sender.py +476 -0
- raxe/infrastructure/tracking/__init__.py +13 -0
- raxe/infrastructure/tracking/usage.py +389 -0
- raxe/integrations/__init__.py +55 -0
- raxe/integrations/availability.py +143 -0
- raxe/integrations/registry.py +122 -0
- raxe/integrations/utils.py +135 -0
- raxe/mcp/__init__.py +62 -0
- raxe/mcp/cli.py +97 -0
- raxe/mcp/server.py +409 -0
- raxe/monitoring/__init__.py +51 -0
- raxe/monitoring/metrics.py +372 -0
- raxe/monitoring/profiler.py +388 -0
- raxe/monitoring/server.py +136 -0
- raxe/packs/core/v1.0.0/pack.yaml +1394 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-001@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-006@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-014@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-017@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-022@1.0.0.yaml +67 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-023@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-024@1.0.0.yaml +80 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-025@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-026@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-027@1.0.0.yaml +77 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-028@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-029@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-030@1.0.0.yaml +55 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-033@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-035@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-046@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-047@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-048@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-049@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-050@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-068@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-078@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2001@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2004@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-201@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-202@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-203@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3007@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3016@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3027@1.0.0.yaml +64 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3028@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3029@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3030@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3031@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3032@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3033@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-007@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-015@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-017@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-022@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-023@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-025@1.0.0.yaml +93 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-026@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-027@1.0.0.yaml +82 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-028@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-033@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-036@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-037@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-052@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-054@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-056@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-065@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-075@1.0.0.yaml +45 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-079@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1080@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1090@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1104@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1105@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1112@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-201@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-202@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-203@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-204@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-205@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-206@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-207@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-208@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-209@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-210@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-211@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-212@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-213@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-214@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-215@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-216@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-217@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-218@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-219@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-220@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-221@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-222@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-223@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-224@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-225@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-226@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-227@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-228@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-229@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-230@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-231@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-232@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-233@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-234@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-235@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-236@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-237@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-238@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-013@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-019@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-029@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-038@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-044@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-067@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-069@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-100@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-101@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-102@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-103@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-104@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-105@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-106@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-107@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-108@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-109@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-110@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-111@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-201@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-203@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3004@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3006@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3011@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-5016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6001@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-70@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-71@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-72@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-73@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-74@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-75@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-76@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-77@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-78@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-99@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-001@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-002@1.0.0.yaml +71 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-003@1.0.0.yaml +65 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-004@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-101@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-102@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-104@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-105@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-106@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-107@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-108@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-109@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-111@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-112@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-113@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-114@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-115@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-116@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-117@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-118@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-119@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-120@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-121@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-122@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-123@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-124@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-125@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-126@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-127@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-128@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-129@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-130@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-131@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-132@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-133@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-134@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-135@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-136@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-137@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-138@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-139@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-140@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-141@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-142@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-143@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-144@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-145@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-146@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-147@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-148@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-149@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-150@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-151@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-152@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-153@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-154@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-155@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-156@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-157@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-158@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-159@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-160@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-161@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-001@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-009@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-028@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-033@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-034@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-039@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-066@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-076@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-098@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-104@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-105@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-111@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-121@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-122@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-123@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-124@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-125@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-126@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-127@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-128@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-129@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-130@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-131@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-132@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-133@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-134@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-135@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-136@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-137@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-138@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-139@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-140@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-141@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-142@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-143@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-144@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-145@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-146@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-147@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-148@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-149@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-150@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-151@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-152@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-153@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-154@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-155@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-156@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-157@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-158@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-159@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-160@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-161@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-162@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-201@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-203@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-204@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-205@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-206@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-207@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-009@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-012@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-017@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-025@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-027@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-034@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-037@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-040@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-041@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-050@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-051@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-052@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-053@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-054@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-055@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-056@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-058@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2015@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2025@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2035@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2037@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2042@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3001@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3003@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3004@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3005@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3006@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3007@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3008@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3009@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3010@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3011@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3012@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3013@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3014@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3015@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3016@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3017@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3018@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3019@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3020@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3021@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3022@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3023@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3024@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3025@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3026@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3027@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3028@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3029@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3030@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3031@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3032@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3033@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3034@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3035@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3037@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3038@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3039@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3040@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3041@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3042@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3043@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3044@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3045@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3046@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3047@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3048@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3049@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3050@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3051@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3052@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3053@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3054@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3055@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3057@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3058@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3059@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3060@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3061@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3062@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3063@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3064@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3065@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3066@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3067@1.0.0.yaml +88 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3068@1.0.0.yaml +94 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3069@1.0.0.yaml +90 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3070@1.0.0.yaml +99 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3071@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3072@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3073@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3074@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3075@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3076@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3077@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3078@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3079@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3080@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3081@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3082@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3083@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3084@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3085@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-016@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-042@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-045@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-050@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-201@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3001@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3006@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3009@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3012@1.0.0.yaml +41 -0
- raxe/plugins/__init__.py +98 -0
- raxe/plugins/custom_rules.py +380 -0
- raxe/plugins/loader.py +389 -0
- raxe/plugins/manager.py +538 -0
- raxe/plugins/protocol.py +428 -0
- raxe/py.typed +0 -0
- raxe/sdk/__init__.py +77 -0
- raxe/sdk/agent_scanner.py +1918 -0
- raxe/sdk/client.py +1603 -0
- raxe/sdk/decorator.py +175 -0
- raxe/sdk/exceptions.py +859 -0
- raxe/sdk/integrations/__init__.py +277 -0
- raxe/sdk/integrations/agent_scanner.py +71 -0
- raxe/sdk/integrations/autogen.py +872 -0
- raxe/sdk/integrations/crewai.py +1368 -0
- raxe/sdk/integrations/dspy.py +845 -0
- raxe/sdk/integrations/extractors.py +363 -0
- raxe/sdk/integrations/huggingface.py +395 -0
- raxe/sdk/integrations/langchain.py +948 -0
- raxe/sdk/integrations/litellm.py +484 -0
- raxe/sdk/integrations/llamaindex.py +1049 -0
- raxe/sdk/integrations/portkey.py +831 -0
- raxe/sdk/suppression_context.py +215 -0
- raxe/sdk/wrappers/__init__.py +163 -0
- raxe/sdk/wrappers/anthropic.py +310 -0
- raxe/sdk/wrappers/openai.py +221 -0
- raxe/sdk/wrappers/vertexai.py +484 -0
- raxe/utils/__init__.py +12 -0
- raxe/utils/error_sanitizer.py +135 -0
- raxe/utils/logging.py +241 -0
- raxe/utils/performance.py +414 -0
- raxe/utils/profiler.py +339 -0
- raxe/utils/validators.py +170 -0
- raxe-0.4.6.dist-info/METADATA +471 -0
- raxe-0.4.6.dist-info/RECORD +668 -0
- raxe-0.4.6.dist-info/WHEEL +5 -0
- raxe-0.4.6.dist-info/entry_points.txt +2 -0
- raxe-0.4.6.dist-info/licenses/LICENSE +56 -0
- raxe-0.4.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"""Preload and optimize components for fast scanning.
|
|
2
|
+
|
|
3
|
+
Application layer - loads and caches components at startup to minimize
|
|
4
|
+
per-scan overhead. This is critical for achieving <10ms P95 latency.
|
|
5
|
+
|
|
6
|
+
Optimization strategies:
|
|
7
|
+
1. Preload rule packs at startup (not per scan)
|
|
8
|
+
2. Compile regex patterns upfront
|
|
9
|
+
3. Warm up L2 detector
|
|
10
|
+
4. Cache configuration
|
|
11
|
+
|
|
12
|
+
Performance impact:
|
|
13
|
+
- Startup time: +100-200ms (one-time cost)
|
|
14
|
+
- Per-scan latency: -5-10ms (recurring benefit)
|
|
15
|
+
"""
|
|
16
|
+
import logging
|
|
17
|
+
import time
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from raxe.application.scan_merger import ScanMerger
|
|
22
|
+
from raxe.application.scan_pipeline import ScanPipeline
|
|
23
|
+
from raxe.domain.engine.executor import RuleExecutor
|
|
24
|
+
from raxe.domain.ml import StubL2Detector
|
|
25
|
+
from raxe.infrastructure.config.scan_config import ScanConfig
|
|
26
|
+
from raxe.infrastructure.packs.registry import PackRegistry, RegistryConfig
|
|
27
|
+
from raxe.infrastructure.telemetry.hook import TelemetryHook
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_bundled_packs_root() -> Path:
|
|
33
|
+
"""Get path to bundled core packs shipped with the package.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
Path to src/raxe/packs directory in installed package
|
|
37
|
+
"""
|
|
38
|
+
# __file__ is this module (preloader.py)
|
|
39
|
+
# src/raxe/application/preloader.py -> src/raxe/packs
|
|
40
|
+
return Path(__file__).parent.parent / "packs"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class PreloadStats:
|
|
45
|
+
"""Statistics from preloading operation.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
duration_ms: Total preload time
|
|
49
|
+
packs_loaded: Number of packs loaded
|
|
50
|
+
rules_loaded: Number of rules loaded
|
|
51
|
+
patterns_compiled: Number of regex patterns compiled
|
|
52
|
+
config_loaded: True if config loaded successfully
|
|
53
|
+
telemetry_initialized: True if telemetry initialized
|
|
54
|
+
l2_init_time_ms: L2 model initialization time (separate from preload)
|
|
55
|
+
l2_model_type: Type of L2 model loaded (onnx_int8, sentence_transformers, stub)
|
|
56
|
+
"""
|
|
57
|
+
duration_ms: float
|
|
58
|
+
packs_loaded: int
|
|
59
|
+
rules_loaded: int
|
|
60
|
+
patterns_compiled: int
|
|
61
|
+
config_loaded: bool
|
|
62
|
+
telemetry_initialized: bool
|
|
63
|
+
l2_init_time_ms: float = 0.0
|
|
64
|
+
l2_model_type: str = "none"
|
|
65
|
+
|
|
66
|
+
def __str__(self) -> str:
|
|
67
|
+
"""Human-readable summary."""
|
|
68
|
+
base_msg = (
|
|
69
|
+
f"Preload complete in {self.duration_ms:.1f}ms: "
|
|
70
|
+
f"{self.packs_loaded} packs, {self.rules_loaded} rules, "
|
|
71
|
+
f"{self.patterns_compiled} patterns compiled"
|
|
72
|
+
)
|
|
73
|
+
if self.l2_init_time_ms > 0:
|
|
74
|
+
base_msg += f", L2 initialized in {self.l2_init_time_ms:.1f}ms ({self.l2_model_type})"
|
|
75
|
+
return base_msg
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PipelinePreloader:
|
|
79
|
+
"""Preload and optimize scan pipeline at startup.
|
|
80
|
+
|
|
81
|
+
This class handles one-time initialization to ensure subsequent
|
|
82
|
+
scans are as fast as possible.
|
|
83
|
+
|
|
84
|
+
Example usage:
|
|
85
|
+
# At application startup
|
|
86
|
+
preloader = PipelinePreloader()
|
|
87
|
+
pipeline, stats = preloader.preload()
|
|
88
|
+
|
|
89
|
+
print(f"Startup: {stats}")
|
|
90
|
+
# Startup complete in 150ms: 3 packs, 15 rules, 45 patterns
|
|
91
|
+
|
|
92
|
+
# Fast scans (everything cached)
|
|
93
|
+
result = pipeline.scan("test")
|
|
94
|
+
# <5ms per scan
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(
|
|
98
|
+
self,
|
|
99
|
+
config_path: Path | None = None,
|
|
100
|
+
config: ScanConfig | None = None,
|
|
101
|
+
suppression_manager: object | None = None,
|
|
102
|
+
progress_callback = None,
|
|
103
|
+
voting_preset: str | None = None,
|
|
104
|
+
):
|
|
105
|
+
"""Initialize preloader.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
config_path: Optional path to config file
|
|
109
|
+
config: Optional explicit config (overrides config_path)
|
|
110
|
+
suppression_manager: Optional suppression manager for false positive handling
|
|
111
|
+
progress_callback: Optional progress indicator
|
|
112
|
+
voting_preset: Voting preset override (balanced, high_security, low_fp)
|
|
113
|
+
"""
|
|
114
|
+
self.config_path = config_path
|
|
115
|
+
self._config = config
|
|
116
|
+
self.suppression_manager = suppression_manager
|
|
117
|
+
self.voting_preset = voting_preset
|
|
118
|
+
|
|
119
|
+
# Store progress callback (use NullProgress if none provided)
|
|
120
|
+
from raxe.cli.progress import NullProgress
|
|
121
|
+
self._progress = progress_callback or NullProgress()
|
|
122
|
+
|
|
123
|
+
def preload(self) -> tuple[ScanPipeline, PreloadStats]:
|
|
124
|
+
"""Preload all components and create ready-to-use pipeline.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Tuple of (pipeline, stats)
|
|
128
|
+
|
|
129
|
+
Raises:
|
|
130
|
+
Exception: If critical components fail to load
|
|
131
|
+
"""
|
|
132
|
+
start_time = time.perf_counter()
|
|
133
|
+
logger.info("Starting pipeline preload")
|
|
134
|
+
|
|
135
|
+
# 1. Load configuration
|
|
136
|
+
if self._config:
|
|
137
|
+
config = self._config
|
|
138
|
+
config_loaded = True
|
|
139
|
+
else:
|
|
140
|
+
try:
|
|
141
|
+
config = ScanConfig.load(self.config_path)
|
|
142
|
+
config_loaded = True
|
|
143
|
+
logger.info(f"Loaded config from {config.packs_root}")
|
|
144
|
+
except Exception as e:
|
|
145
|
+
logger.warning(f"Failed to load config: {e}. Using defaults.")
|
|
146
|
+
config = ScanConfig()
|
|
147
|
+
config_loaded = False
|
|
148
|
+
|
|
149
|
+
# 2. Load pack registry and rules
|
|
150
|
+
# Update progress: loading rules
|
|
151
|
+
self._progress.update_component("rules", "loading", 0)
|
|
152
|
+
|
|
153
|
+
# Try user packs first, fall back to bundled packs if needed
|
|
154
|
+
packs_root = config.packs_root
|
|
155
|
+
|
|
156
|
+
# Check if user packs exist, if not use bundled packs
|
|
157
|
+
if not packs_root.exists() or not any(packs_root.iterdir()):
|
|
158
|
+
bundled_root = get_bundled_packs_root()
|
|
159
|
+
logger.info(
|
|
160
|
+
f"User packs not found at {packs_root}, "
|
|
161
|
+
f"falling back to bundled packs at {bundled_root}"
|
|
162
|
+
)
|
|
163
|
+
packs_root = bundled_root
|
|
164
|
+
|
|
165
|
+
registry_config = RegistryConfig(
|
|
166
|
+
packs_root=packs_root,
|
|
167
|
+
precedence=["custom", "community", "core"],
|
|
168
|
+
strict=False,
|
|
169
|
+
)
|
|
170
|
+
pack_registry = PackRegistry(registry_config)
|
|
171
|
+
|
|
172
|
+
rules_start = time.perf_counter()
|
|
173
|
+
try:
|
|
174
|
+
pack_registry.load_all_packs()
|
|
175
|
+
packs_loaded = len(pack_registry.list_packs())
|
|
176
|
+
all_rules = pack_registry.get_all_rules()
|
|
177
|
+
rules_loaded = len(all_rules)
|
|
178
|
+
rules_time = (time.perf_counter() - rules_start) * 1000
|
|
179
|
+
|
|
180
|
+
# Report rules loading completion
|
|
181
|
+
self._progress.update_component(
|
|
182
|
+
"rules",
|
|
183
|
+
"complete",
|
|
184
|
+
rules_time,
|
|
185
|
+
metadata={"count": rules_loaded}
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
logger.info(
|
|
189
|
+
f"Loaded {rules_loaded} rules from {packs_loaded} packs"
|
|
190
|
+
)
|
|
191
|
+
except Exception as e:
|
|
192
|
+
logger.error(f"Failed to load packs: {e}")
|
|
193
|
+
# Continue with empty registry (degraded mode)
|
|
194
|
+
packs_loaded = 0
|
|
195
|
+
rules_loaded = 0
|
|
196
|
+
all_rules = []
|
|
197
|
+
|
|
198
|
+
# 3. Initialize and warm up rule executor
|
|
199
|
+
rule_executor = RuleExecutor()
|
|
200
|
+
|
|
201
|
+
# Warm up: compile all patterns
|
|
202
|
+
patterns_compiled = 0
|
|
203
|
+
if all_rules:
|
|
204
|
+
try:
|
|
205
|
+
# Run a dummy scan to compile all patterns
|
|
206
|
+
warmup_text = "warmup scan to compile patterns"
|
|
207
|
+
rule_executor.execute_rules(warmup_text, all_rules)
|
|
208
|
+
patterns_compiled = sum(len(r.patterns) for r in all_rules)
|
|
209
|
+
logger.info(f"Compiled {patterns_compiled} regex patterns")
|
|
210
|
+
except Exception as e:
|
|
211
|
+
logger.warning(f"Failed to warm up rule executor: {e}")
|
|
212
|
+
|
|
213
|
+
# 4. Initialize L2 detector (EAGER LOADING to avoid timeout issues)
|
|
214
|
+
# EagerL2Detector loads model during __init__() to avoid first-scan timeouts
|
|
215
|
+
# Uses ONNX-first strategy for fast loading (~500ms vs ~5s for bundle)
|
|
216
|
+
# Initialization time tracked separately from preload stats
|
|
217
|
+
|
|
218
|
+
# Update progress: loading ML model
|
|
219
|
+
self._progress.update_component("ml_model", "loading", 0)
|
|
220
|
+
|
|
221
|
+
from raxe.application.eager_l2 import EagerL2Detector
|
|
222
|
+
|
|
223
|
+
l2_init_start = time.perf_counter()
|
|
224
|
+
l2_detector = EagerL2Detector(
|
|
225
|
+
config=config,
|
|
226
|
+
use_production=config.use_production_l2,
|
|
227
|
+
confidence_threshold=config.l2_confidence_threshold,
|
|
228
|
+
voting_preset=self.voting_preset,
|
|
229
|
+
)
|
|
230
|
+
l2_init_time_ms = (time.perf_counter() - l2_init_start) * 1000
|
|
231
|
+
|
|
232
|
+
# Get model type from initialization stats
|
|
233
|
+
l2_init_stats = l2_detector.initialization_stats
|
|
234
|
+
l2_model_type = l2_init_stats.get("model_type", "unknown")
|
|
235
|
+
|
|
236
|
+
# Report ML model loading completion
|
|
237
|
+
self._progress.update_component(
|
|
238
|
+
"ml_model",
|
|
239
|
+
"complete",
|
|
240
|
+
l2_init_time_ms
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
logger.info(
|
|
244
|
+
f"L2 detector initialized: {l2_model_type} in {l2_init_time_ms:.1f}ms "
|
|
245
|
+
f"(Stub: {l2_init_stats.get('is_stub', False)})"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# 5. Initialize scan merger
|
|
249
|
+
scan_merger = ScanMerger()
|
|
250
|
+
|
|
251
|
+
# 6. Initialize telemetry (if enabled)
|
|
252
|
+
telemetry_hook = None
|
|
253
|
+
telemetry_initialized = False
|
|
254
|
+
if config.telemetry.enabled:
|
|
255
|
+
try:
|
|
256
|
+
telemetry_hook = TelemetryHook(config.telemetry)
|
|
257
|
+
telemetry_initialized = True
|
|
258
|
+
logger.info("Telemetry initialized")
|
|
259
|
+
except Exception as e:
|
|
260
|
+
logger.error(f"Failed to initialize telemetry: {e}")
|
|
261
|
+
|
|
262
|
+
# 7. Create pipeline with all preloaded components
|
|
263
|
+
pipeline = ScanPipeline(
|
|
264
|
+
pack_registry=pack_registry,
|
|
265
|
+
rule_executor=rule_executor,
|
|
266
|
+
l2_detector=l2_detector,
|
|
267
|
+
scan_merger=scan_merger,
|
|
268
|
+
telemetry_hook=telemetry_hook,
|
|
269
|
+
suppression_manager=self.suppression_manager,
|
|
270
|
+
enable_l2=config.enable_l2,
|
|
271
|
+
fail_fast_on_critical=config.fail_fast_on_critical,
|
|
272
|
+
min_confidence_for_skip=config.min_confidence_for_skip,
|
|
273
|
+
enable_schema_validation=config.enable_schema_validation,
|
|
274
|
+
schema_validation_mode=config.schema_validation_mode,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
# Calculate stats
|
|
278
|
+
duration_ms = (time.perf_counter() - start_time) * 1000
|
|
279
|
+
stats = PreloadStats(
|
|
280
|
+
duration_ms=duration_ms,
|
|
281
|
+
packs_loaded=packs_loaded,
|
|
282
|
+
rules_loaded=rules_loaded,
|
|
283
|
+
patterns_compiled=patterns_compiled,
|
|
284
|
+
config_loaded=config_loaded,
|
|
285
|
+
telemetry_initialized=telemetry_initialized,
|
|
286
|
+
l2_init_time_ms=l2_init_time_ms,
|
|
287
|
+
l2_model_type=l2_model_type,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
logger.info(f"Preload complete: {stats}")
|
|
291
|
+
return pipeline, stats
|
|
292
|
+
|
|
293
|
+
@staticmethod
|
|
294
|
+
def create_default_pipeline() -> ScanPipeline:
|
|
295
|
+
"""Create pipeline with default configuration (no preloading).
|
|
296
|
+
|
|
297
|
+
This is slower than using preload() but simpler for quick usage.
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
ScanPipeline with default settings
|
|
301
|
+
"""
|
|
302
|
+
config = ScanConfig()
|
|
303
|
+
|
|
304
|
+
registry_config = RegistryConfig(
|
|
305
|
+
packs_root=config.packs_root,
|
|
306
|
+
strict=False,
|
|
307
|
+
)
|
|
308
|
+
pack_registry = PackRegistry(registry_config)
|
|
309
|
+
pack_registry.load_all_packs()
|
|
310
|
+
|
|
311
|
+
# Bundle support removed - use stub detector
|
|
312
|
+
# For production L2 detection, use preload() with EagerL2Detector
|
|
313
|
+
l2_detector = StubL2Detector()
|
|
314
|
+
|
|
315
|
+
return ScanPipeline(
|
|
316
|
+
pack_registry=pack_registry,
|
|
317
|
+
rule_executor=RuleExecutor(),
|
|
318
|
+
l2_detector=l2_detector,
|
|
319
|
+
scan_merger=ScanMerger(),
|
|
320
|
+
enable_l2=config.enable_l2,
|
|
321
|
+
enable_schema_validation=config.enable_schema_validation,
|
|
322
|
+
schema_validation_mode=config.schema_validation_mode,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def preload_pipeline(
|
|
327
|
+
config_path: Path | None = None,
|
|
328
|
+
config: ScanConfig | None = None,
|
|
329
|
+
suppression_manager: object | None = None,
|
|
330
|
+
progress_callback = None,
|
|
331
|
+
voting_preset: str | None = None,
|
|
332
|
+
) -> tuple[ScanPipeline, PreloadStats]:
|
|
333
|
+
"""Convenience function to preload pipeline.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
config_path: Optional path to config file
|
|
337
|
+
config: Optional explicit config
|
|
338
|
+
suppression_manager: Optional suppression manager for false positive handling
|
|
339
|
+
progress_callback: Optional progress indicator
|
|
340
|
+
voting_preset: Voting preset override (balanced, high_security, low_fp)
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
Tuple of (pipeline, stats)
|
|
344
|
+
|
|
345
|
+
Example:
|
|
346
|
+
pipeline, stats = preload_pipeline()
|
|
347
|
+
print(stats)
|
|
348
|
+
result = pipeline.scan("test")
|
|
349
|
+
"""
|
|
350
|
+
preloader = PipelinePreloader(
|
|
351
|
+
config_path, config, suppression_manager, progress_callback, voting_preset
|
|
352
|
+
)
|
|
353
|
+
return preloader.preload()
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"""Merge L1 and L2 scan results.
|
|
2
|
+
|
|
3
|
+
Application layer - orchestrates domain logic to combine rule-based (L1)
|
|
4
|
+
and ML-based (L2) threat detection results.
|
|
5
|
+
|
|
6
|
+
This is the integration point between the two detection layers:
|
|
7
|
+
- L1: Fast, deterministic rule-based detection
|
|
8
|
+
- L2: Slower, probabilistic ML-based detection
|
|
9
|
+
|
|
10
|
+
The merger preserves both L1 and L2 results while providing a unified
|
|
11
|
+
view for downstream processing (logging, blocking, alerting, etc.).
|
|
12
|
+
"""
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import ClassVar
|
|
15
|
+
|
|
16
|
+
from raxe.domain.engine.executor import ScanResult as L1ScanResult
|
|
17
|
+
from raxe.domain.ml.protocol import L2Result
|
|
18
|
+
from raxe.domain.rules.models import Severity
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class CombinedScanResult:
|
|
23
|
+
"""Combined result from L1 + L2 detection.
|
|
24
|
+
|
|
25
|
+
Preserves both rule-based and ML-based detections for complete visibility.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
l1_result: Rule-based detection results (always present)
|
|
29
|
+
l2_result: ML-based prediction results (optional, may be None)
|
|
30
|
+
combined_severity: Maximum severity across both L1 and L2
|
|
31
|
+
total_processing_ms: Total time for L1 + L2 combined
|
|
32
|
+
metadata: Additional metadata about the scan
|
|
33
|
+
"""
|
|
34
|
+
l1_result: L1ScanResult
|
|
35
|
+
l2_result: L2Result | None
|
|
36
|
+
combined_severity: Severity | None
|
|
37
|
+
total_processing_ms: float
|
|
38
|
+
metadata: dict[str, object] = None
|
|
39
|
+
|
|
40
|
+
def __post_init__(self) -> None:
|
|
41
|
+
"""Validate combined result."""
|
|
42
|
+
if self.total_processing_ms < 0:
|
|
43
|
+
raise ValueError(
|
|
44
|
+
f"total_processing_ms must be non-negative, got {self.total_processing_ms}"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def has_threats(self) -> bool:
|
|
49
|
+
"""True if either L1 or L2 detected threats.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
True if any threats detected by L1 rules or L2 predictions
|
|
53
|
+
"""
|
|
54
|
+
l1_threats = self.l1_result.has_detections
|
|
55
|
+
l2_threats = (
|
|
56
|
+
self.l2_result.has_predictions
|
|
57
|
+
if self.l2_result else False
|
|
58
|
+
)
|
|
59
|
+
return l1_threats or l2_threats
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def l1_detection_count(self) -> int:
|
|
63
|
+
"""Number of L1 rule detections."""
|
|
64
|
+
return self.l1_result.detection_count
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def l2_prediction_count(self) -> int:
|
|
68
|
+
"""Number of L2 ML predictions."""
|
|
69
|
+
if not self.l2_result:
|
|
70
|
+
return 0
|
|
71
|
+
return self.l2_result.prediction_count
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def total_threat_count(self) -> int:
|
|
75
|
+
"""Total threats across both L1 and L2.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
Sum of L1 detections and L2 predictions
|
|
79
|
+
"""
|
|
80
|
+
return self.l1_detection_count + self.l2_prediction_count
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def l1_processing_ms(self) -> float:
|
|
84
|
+
"""L1 processing time in milliseconds."""
|
|
85
|
+
return self.l1_result.scan_duration_ms
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def l2_processing_ms(self) -> float:
|
|
89
|
+
"""L2 processing time in milliseconds."""
|
|
90
|
+
if not self.l2_result:
|
|
91
|
+
return 0.0
|
|
92
|
+
return self.l2_result.processing_time_ms
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def l1_detections(self) -> list:
|
|
96
|
+
"""List of L1 detections."""
|
|
97
|
+
return self.l1_result.detections
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def l2_predictions(self) -> list:
|
|
101
|
+
"""List of L2 predictions."""
|
|
102
|
+
if not self.l2_result:
|
|
103
|
+
return []
|
|
104
|
+
return self.l2_result.predictions
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def plugin_detection_count(self) -> int:
|
|
108
|
+
"""Number of plugin detections (embedded in L1 result)."""
|
|
109
|
+
return sum(1 for d in self.l1_result.detections if d.detection_layer == "PLUGIN")
|
|
110
|
+
|
|
111
|
+
def layer_breakdown(self) -> dict[str, int]:
|
|
112
|
+
"""Return detection count by layer.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Dictionary with keys L1, L2, PLUGIN and their respective counts
|
|
116
|
+
"""
|
|
117
|
+
l1_count = sum(1 for d in self.l1_result.detections if d.detection_layer == "L1")
|
|
118
|
+
plugin_count = self.plugin_detection_count
|
|
119
|
+
l2_count = self.l2_prediction_count
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
"L1": l1_count,
|
|
123
|
+
"L2": l2_count,
|
|
124
|
+
"PLUGIN": plugin_count,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def threat_summary(self) -> str:
|
|
129
|
+
"""Human-readable threat summary.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Summary string like:
|
|
133
|
+
"HIGH: 2 L1 detections, 1 L2 prediction (8.5ms total)"
|
|
134
|
+
"""
|
|
135
|
+
l1_count = self.l1_detection_count
|
|
136
|
+
l2_count = self.l2_prediction_count
|
|
137
|
+
|
|
138
|
+
severity_str = (
|
|
139
|
+
self.combined_severity.value.upper()
|
|
140
|
+
if self.combined_severity else "NONE"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
parts = []
|
|
144
|
+
if l1_count > 0:
|
|
145
|
+
parts.append(f"{l1_count} L1 detection{'s' if l1_count > 1 else ''}")
|
|
146
|
+
if l2_count > 0:
|
|
147
|
+
parts.append(f"{l2_count} L2 prediction{'s' if l2_count > 1 else ''}")
|
|
148
|
+
|
|
149
|
+
if not parts:
|
|
150
|
+
return f"No threats detected ({self.total_processing_ms:.2f}ms)"
|
|
151
|
+
|
|
152
|
+
threats_str = ", ".join(parts)
|
|
153
|
+
return (
|
|
154
|
+
f"{severity_str}: {threats_str} "
|
|
155
|
+
f"({self.total_processing_ms:.2f}ms total)"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
def to_dict(self) -> dict[str, object]:
|
|
159
|
+
"""Convert to dictionary for serialization.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
Dictionary representation including both L1 and L2 data
|
|
163
|
+
"""
|
|
164
|
+
result = {
|
|
165
|
+
"has_threats": self.has_threats,
|
|
166
|
+
"combined_severity": self.combined_severity.value if self.combined_severity else None,
|
|
167
|
+
"total_processing_ms": self.total_processing_ms,
|
|
168
|
+
"l1": self.l1_result.to_dict(),
|
|
169
|
+
"l2": self.l2_result.to_summary() if self.l2_result else None,
|
|
170
|
+
"summary": self.threat_summary,
|
|
171
|
+
"layer_breakdown": self.layer_breakdown(),
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if self.metadata:
|
|
175
|
+
result["metadata"] = self.metadata
|
|
176
|
+
|
|
177
|
+
return result
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ScanMerger:
|
|
181
|
+
"""Merge L1 rule-based and L2 ML-based results.
|
|
182
|
+
|
|
183
|
+
Application layer orchestration - combines domain layer results.
|
|
184
|
+
|
|
185
|
+
This class is stateless and thread-safe.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
# Confidence thresholds for mapping L2 predictions to severity
|
|
189
|
+
# These are conservative - L2 must be quite confident to elevate severity
|
|
190
|
+
SEVERITY_CONFIDENCE_THRESHOLDS: ClassVar[dict[Severity, float]] = {
|
|
191
|
+
Severity.CRITICAL: 0.95, # Very high confidence required for CRITICAL
|
|
192
|
+
Severity.HIGH: 0.85, # High confidence for HIGH
|
|
193
|
+
Severity.MEDIUM: 0.70, # Moderate confidence for MEDIUM
|
|
194
|
+
Severity.LOW: 0.50, # Low confidence for LOW
|
|
195
|
+
Severity.INFO: 0.30, # Very low confidence for INFO
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
def merge(
|
|
199
|
+
self,
|
|
200
|
+
l1_result: L1ScanResult,
|
|
201
|
+
l2_result: L2Result | None = None,
|
|
202
|
+
metadata: dict[str, object] | None = None
|
|
203
|
+
) -> CombinedScanResult:
|
|
204
|
+
"""Combine L1 and L2 results.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
l1_result: Rule-based detection results (required)
|
|
208
|
+
l2_result: ML-based prediction results (optional)
|
|
209
|
+
metadata: Optional metadata to attach to result
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
CombinedScanResult with merged data
|
|
213
|
+
"""
|
|
214
|
+
# Calculate combined severity (max of L1 and L2)
|
|
215
|
+
combined_severity = self._calculate_combined_severity(
|
|
216
|
+
l1_result,
|
|
217
|
+
l2_result
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Sum processing time
|
|
221
|
+
total_time = l1_result.scan_duration_ms
|
|
222
|
+
if l2_result:
|
|
223
|
+
total_time += l2_result.processing_time_ms
|
|
224
|
+
|
|
225
|
+
return CombinedScanResult(
|
|
226
|
+
l1_result=l1_result,
|
|
227
|
+
l2_result=l2_result,
|
|
228
|
+
combined_severity=combined_severity,
|
|
229
|
+
total_processing_ms=total_time,
|
|
230
|
+
metadata=metadata or {}
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def _calculate_combined_severity(
|
|
234
|
+
self,
|
|
235
|
+
l1_result: L1ScanResult,
|
|
236
|
+
l2_result: L2Result | None
|
|
237
|
+
) -> Severity | None:
|
|
238
|
+
"""Calculate combined severity from L1 and L2.
|
|
239
|
+
|
|
240
|
+
Takes maximum severity from:
|
|
241
|
+
1. L1 detections (direct severity from rules)
|
|
242
|
+
2. L2 predictions (mapped from confidence to severity)
|
|
243
|
+
|
|
244
|
+
L2 confidence → severity mapping:
|
|
245
|
+
- ≥0.95 → CRITICAL
|
|
246
|
+
- ≥0.85 → HIGH
|
|
247
|
+
- ≥0.70 → MEDIUM
|
|
248
|
+
- ≥0.50 → LOW
|
|
249
|
+
- ≥0.30 → INFO
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
l1_result: L1 scan result
|
|
253
|
+
l2_result: L2 scan result (optional)
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Maximum severity or None if no threats
|
|
257
|
+
"""
|
|
258
|
+
severities = []
|
|
259
|
+
|
|
260
|
+
# Add L1 highest severity
|
|
261
|
+
if l1_result.highest_severity:
|
|
262
|
+
severities.append(l1_result.highest_severity)
|
|
263
|
+
|
|
264
|
+
# Map L2 confidence to severity
|
|
265
|
+
if l2_result and l2_result.has_predictions:
|
|
266
|
+
l2_severity = self._map_confidence_to_severity(
|
|
267
|
+
l2_result.highest_confidence
|
|
268
|
+
)
|
|
269
|
+
if l2_severity:
|
|
270
|
+
severities.append(l2_severity)
|
|
271
|
+
|
|
272
|
+
if not severities:
|
|
273
|
+
return None
|
|
274
|
+
|
|
275
|
+
# Return maximum severity (lower enum value = more severe)
|
|
276
|
+
return self._max_severity(severities)
|
|
277
|
+
|
|
278
|
+
def _map_confidence_to_severity(self, confidence: float) -> Severity | None:
|
|
279
|
+
"""Map L2 confidence score to severity level.
|
|
280
|
+
|
|
281
|
+
Uses conservative thresholds - L2 must be quite confident
|
|
282
|
+
to map to higher severity levels.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
confidence: Confidence score (0.0-1.0)
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
Severity level or None if below minimum threshold
|
|
289
|
+
"""
|
|
290
|
+
if confidence >= self.SEVERITY_CONFIDENCE_THRESHOLDS[Severity.CRITICAL]:
|
|
291
|
+
return Severity.CRITICAL
|
|
292
|
+
elif confidence >= self.SEVERITY_CONFIDENCE_THRESHOLDS[Severity.HIGH]:
|
|
293
|
+
return Severity.HIGH
|
|
294
|
+
elif confidence >= self.SEVERITY_CONFIDENCE_THRESHOLDS[Severity.MEDIUM]:
|
|
295
|
+
return Severity.MEDIUM
|
|
296
|
+
elif confidence >= self.SEVERITY_CONFIDENCE_THRESHOLDS[Severity.LOW]:
|
|
297
|
+
return Severity.LOW
|
|
298
|
+
elif confidence >= self.SEVERITY_CONFIDENCE_THRESHOLDS[Severity.INFO]:
|
|
299
|
+
return Severity.INFO
|
|
300
|
+
else:
|
|
301
|
+
return None
|
|
302
|
+
|
|
303
|
+
def _max_severity(self, severities: list[Severity]) -> Severity:
|
|
304
|
+
"""Get maximum severity from list.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
severities: List of severity levels
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
Most severe level (CRITICAL > HIGH > MEDIUM > LOW > INFO)
|
|
311
|
+
"""
|
|
312
|
+
# Severity order (lower number = more severe)
|
|
313
|
+
severity_order = {
|
|
314
|
+
Severity.CRITICAL: 0,
|
|
315
|
+
Severity.HIGH: 1,
|
|
316
|
+
Severity.MEDIUM: 2,
|
|
317
|
+
Severity.LOW: 3,
|
|
318
|
+
Severity.INFO: 4,
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return min(severities, key=lambda s: severity_order[s])
|