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,459 @@
|
|
|
1
|
+
"""YAML-based configuration management.
|
|
2
|
+
|
|
3
|
+
Modern configuration system using YAML format.
|
|
4
|
+
Provides schema validation, type safety, and clear error messages.
|
|
5
|
+
|
|
6
|
+
Configuration file: ~/.raxe/config.yaml
|
|
7
|
+
|
|
8
|
+
Example YAML config:
|
|
9
|
+
core:
|
|
10
|
+
api_key: ""
|
|
11
|
+
environment: production
|
|
12
|
+
version: "0.0.1"
|
|
13
|
+
|
|
14
|
+
detection:
|
|
15
|
+
l1_enabled: true
|
|
16
|
+
l2_enabled: true
|
|
17
|
+
mode: balanced # fast|balanced|thorough
|
|
18
|
+
confidence_threshold: 0.5
|
|
19
|
+
|
|
20
|
+
telemetry:
|
|
21
|
+
enabled: true
|
|
22
|
+
batch_size: 50
|
|
23
|
+
flush_interval: 300
|
|
24
|
+
|
|
25
|
+
performance:
|
|
26
|
+
max_queue_size: 10000
|
|
27
|
+
scan_timeout: 30
|
|
28
|
+
|
|
29
|
+
logging:
|
|
30
|
+
level: INFO
|
|
31
|
+
directory: ~/.raxe/logs
|
|
32
|
+
rotation_size: 10MB
|
|
33
|
+
rotation_count: 5
|
|
34
|
+
"""
|
|
35
|
+
import os
|
|
36
|
+
from dataclasses import asdict, dataclass, field
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from typing import Any, Literal
|
|
39
|
+
|
|
40
|
+
import yaml
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class CoreConfig:
|
|
45
|
+
"""Core configuration settings."""
|
|
46
|
+
api_key: str = ""
|
|
47
|
+
environment: Literal["development", "production", "test", "local", "staging"] = "production"
|
|
48
|
+
version: str = "0.0.1"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class DetectionConfig:
|
|
53
|
+
"""Detection engine configuration."""
|
|
54
|
+
l1_enabled: bool = True
|
|
55
|
+
l2_enabled: bool = True
|
|
56
|
+
mode: Literal["fast", "balanced", "thorough"] = "balanced"
|
|
57
|
+
confidence_threshold: float = 0.5
|
|
58
|
+
fail_fast_on_critical: bool = False # Changed: Always run both L1 and L2 in parallel
|
|
59
|
+
min_confidence_for_skip: float = 0.7
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class TelemetryConfig:
|
|
64
|
+
"""Telemetry configuration."""
|
|
65
|
+
enabled: bool = True
|
|
66
|
+
batch_size: int = 50
|
|
67
|
+
flush_interval: int = 300 # seconds
|
|
68
|
+
endpoint: str = "" # Will be resolved from centralized endpoints if empty
|
|
69
|
+
async_send: bool = True
|
|
70
|
+
max_queue_size: int = 1000
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass
|
|
74
|
+
class PerformanceConfig:
|
|
75
|
+
"""Performance and reliability configuration."""
|
|
76
|
+
max_queue_size: int = 10000
|
|
77
|
+
scan_timeout: int = 30 # seconds
|
|
78
|
+
circuit_breaker_enabled: bool = True
|
|
79
|
+
circuit_breaker_threshold: int = 5
|
|
80
|
+
circuit_breaker_timeout: int = 30 # seconds
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass
|
|
84
|
+
class LoggingConfig:
|
|
85
|
+
"""Logging configuration."""
|
|
86
|
+
level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] = "INFO"
|
|
87
|
+
directory: str = "~/.raxe/logs"
|
|
88
|
+
rotation_size: str = "10MB"
|
|
89
|
+
rotation_count: int = 5
|
|
90
|
+
enable_file_logging: bool = True
|
|
91
|
+
enable_console_logging: bool = True
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass
|
|
95
|
+
class RaxeConfig:
|
|
96
|
+
"""Complete RAXE configuration.
|
|
97
|
+
|
|
98
|
+
Attributes:
|
|
99
|
+
core: Core settings (API key, environment)
|
|
100
|
+
detection: Detection engine settings
|
|
101
|
+
telemetry: Telemetry settings
|
|
102
|
+
performance: Performance settings
|
|
103
|
+
logging: Logging settings
|
|
104
|
+
"""
|
|
105
|
+
core: CoreConfig = field(default_factory=CoreConfig)
|
|
106
|
+
detection: DetectionConfig = field(default_factory=DetectionConfig)
|
|
107
|
+
telemetry: TelemetryConfig = field(default_factory=TelemetryConfig)
|
|
108
|
+
performance: PerformanceConfig = field(default_factory=PerformanceConfig)
|
|
109
|
+
logging: LoggingConfig = field(default_factory=LoggingConfig)
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def from_file(cls, config_path: Path) -> "RaxeConfig":
|
|
113
|
+
"""Load configuration from YAML file.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
config_path: Path to config.yaml file
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
RaxeConfig loaded from file
|
|
120
|
+
|
|
121
|
+
Raises:
|
|
122
|
+
FileNotFoundError: If config file doesn't exist
|
|
123
|
+
ValueError: If config format is invalid
|
|
124
|
+
"""
|
|
125
|
+
if not config_path.exists():
|
|
126
|
+
raise FileNotFoundError(f"Config file not found: {config_path}")
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
with open(config_path) as f:
|
|
130
|
+
data = yaml.safe_load(f) or {}
|
|
131
|
+
except Exception as e:
|
|
132
|
+
raise ValueError(f"Failed to parse YAML config: {e}") from e
|
|
133
|
+
|
|
134
|
+
return cls._from_dict(data)
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def _filter_known_fields(cls, dataclass_type: type, data: dict[str, Any]) -> dict[str, Any]:
|
|
138
|
+
"""Filter dictionary to only include fields that exist in the dataclass.
|
|
139
|
+
|
|
140
|
+
This allows config files to have extra fields (for forward compatibility)
|
|
141
|
+
without causing errors when loading.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
dataclass_type: The dataclass type to filter for
|
|
145
|
+
data: Dictionary of configuration values
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Filtered dictionary with only known fields
|
|
149
|
+
"""
|
|
150
|
+
import dataclasses
|
|
151
|
+
known_fields = {f.name for f in dataclasses.fields(dataclass_type)}
|
|
152
|
+
return {k: v for k, v in data.items() if k in known_fields}
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def _from_dict(cls, data: dict[str, Any]) -> "RaxeConfig":
|
|
156
|
+
"""Build RaxeConfig from dictionary.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
data: Configuration dictionary from YAML
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
RaxeConfig instance
|
|
163
|
+
|
|
164
|
+
Note:
|
|
165
|
+
Unknown fields in config sections are silently ignored for
|
|
166
|
+
forward compatibility with newer config files.
|
|
167
|
+
"""
|
|
168
|
+
from raxe.infrastructure.config.endpoints import get_telemetry_endpoint
|
|
169
|
+
|
|
170
|
+
# Build sub-configs, filtering unknown fields for compatibility
|
|
171
|
+
core = CoreConfig(**cls._filter_known_fields(CoreConfig, data.get("core", {})))
|
|
172
|
+
detection = DetectionConfig(**cls._filter_known_fields(DetectionConfig, data.get("detection", {})))
|
|
173
|
+
telemetry = TelemetryConfig(**cls._filter_known_fields(TelemetryConfig, data.get("telemetry", {})))
|
|
174
|
+
performance = PerformanceConfig(**cls._filter_known_fields(PerformanceConfig, data.get("performance", {})))
|
|
175
|
+
logging_cfg = LoggingConfig(**cls._filter_known_fields(LoggingConfig, data.get("logging", {})))
|
|
176
|
+
|
|
177
|
+
# Resolve empty telemetry endpoint from centralized config
|
|
178
|
+
if not telemetry.endpoint:
|
|
179
|
+
telemetry = TelemetryConfig(
|
|
180
|
+
enabled=telemetry.enabled,
|
|
181
|
+
batch_size=telemetry.batch_size,
|
|
182
|
+
flush_interval=telemetry.flush_interval,
|
|
183
|
+
endpoint=get_telemetry_endpoint(),
|
|
184
|
+
async_send=telemetry.async_send,
|
|
185
|
+
max_queue_size=telemetry.max_queue_size,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return cls(
|
|
189
|
+
core=core,
|
|
190
|
+
detection=detection,
|
|
191
|
+
telemetry=telemetry,
|
|
192
|
+
performance=performance,
|
|
193
|
+
logging=logging_cfg,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def from_env(cls) -> "RaxeConfig":
|
|
198
|
+
"""Load configuration from environment variables.
|
|
199
|
+
|
|
200
|
+
Environment variables override defaults with pattern:
|
|
201
|
+
RAXE_<SECTION>_<KEY>
|
|
202
|
+
|
|
203
|
+
Examples:
|
|
204
|
+
RAXE_CORE_API_KEY=xxx
|
|
205
|
+
RAXE_DETECTION_L2_ENABLED=true
|
|
206
|
+
RAXE_LOGGING_LEVEL=DEBUG
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
RaxeConfig from environment
|
|
210
|
+
"""
|
|
211
|
+
# Helper to get bool from env
|
|
212
|
+
def get_bool(key: str, default: bool) -> bool:
|
|
213
|
+
return os.getenv(key, str(default)).lower() in ("true", "1", "yes")
|
|
214
|
+
|
|
215
|
+
# Helper to get int from env
|
|
216
|
+
def get_int(key: str, default: int) -> int:
|
|
217
|
+
return int(os.getenv(key, str(default)))
|
|
218
|
+
|
|
219
|
+
# Helper to get float from env
|
|
220
|
+
def get_float(key: str, default: float) -> float:
|
|
221
|
+
return float(os.getenv(key, str(default)))
|
|
222
|
+
|
|
223
|
+
# Core settings
|
|
224
|
+
core = CoreConfig(
|
|
225
|
+
api_key=os.getenv("RAXE_CORE_API_KEY", "") or os.getenv("RAXE_API_KEY", ""),
|
|
226
|
+
environment=os.getenv("RAXE_CORE_ENVIRONMENT", "production"), # type: ignore
|
|
227
|
+
version=os.getenv("RAXE_CORE_VERSION", "0.0.1"),
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Detection settings
|
|
231
|
+
detection = DetectionConfig(
|
|
232
|
+
l1_enabled=get_bool("RAXE_DETECTION_L1_ENABLED", True),
|
|
233
|
+
l2_enabled=get_bool("RAXE_DETECTION_L2_ENABLED", True),
|
|
234
|
+
mode=os.getenv("RAXE_DETECTION_MODE", "balanced"), # type: ignore
|
|
235
|
+
confidence_threshold=get_float("RAXE_DETECTION_CONFIDENCE_THRESHOLD", 0.5),
|
|
236
|
+
fail_fast_on_critical=get_bool("RAXE_DETECTION_FAIL_FAST_ON_CRITICAL", False), # Changed default to False
|
|
237
|
+
min_confidence_for_skip=get_float("RAXE_DETECTION_MIN_CONFIDENCE_FOR_SKIP", 0.7),
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# Telemetry settings - endpoint resolved from centralized config if not overridden
|
|
241
|
+
from raxe.infrastructure.config.endpoints import get_telemetry_endpoint
|
|
242
|
+
|
|
243
|
+
telemetry = TelemetryConfig(
|
|
244
|
+
enabled=get_bool("RAXE_TELEMETRY_ENABLED", True),
|
|
245
|
+
batch_size=get_int("RAXE_TELEMETRY_BATCH_SIZE", 50),
|
|
246
|
+
flush_interval=get_int("RAXE_TELEMETRY_FLUSH_INTERVAL", 300),
|
|
247
|
+
endpoint=os.getenv("RAXE_TELEMETRY_ENDPOINT", "") or get_telemetry_endpoint(),
|
|
248
|
+
async_send=get_bool("RAXE_TELEMETRY_ASYNC_SEND", True),
|
|
249
|
+
max_queue_size=get_int("RAXE_TELEMETRY_MAX_QUEUE_SIZE", 1000),
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Performance settings
|
|
253
|
+
performance = PerformanceConfig(
|
|
254
|
+
max_queue_size=get_int("RAXE_PERFORMANCE_MAX_QUEUE_SIZE", 10000),
|
|
255
|
+
scan_timeout=get_int("RAXE_PERFORMANCE_SCAN_TIMEOUT", 30),
|
|
256
|
+
circuit_breaker_enabled=get_bool("RAXE_PERFORMANCE_CIRCUIT_BREAKER_ENABLED", True),
|
|
257
|
+
circuit_breaker_threshold=get_int("RAXE_PERFORMANCE_CIRCUIT_BREAKER_THRESHOLD", 5),
|
|
258
|
+
circuit_breaker_timeout=get_int("RAXE_PERFORMANCE_CIRCUIT_BREAKER_TIMEOUT", 30),
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
# Logging settings
|
|
262
|
+
logging_cfg = LoggingConfig(
|
|
263
|
+
level=os.getenv("RAXE_LOG_LEVEL", "INFO").upper(), # type: ignore
|
|
264
|
+
directory=os.getenv("RAXE_LOG_DIR", "~/.raxe/logs"),
|
|
265
|
+
rotation_size=os.getenv("RAXE_LOG_ROTATION_SIZE", "10MB"),
|
|
266
|
+
rotation_count=get_int("RAXE_LOG_ROTATION_COUNT", 5),
|
|
267
|
+
enable_file_logging=get_bool("RAXE_ENABLE_FILE_LOGGING", True),
|
|
268
|
+
enable_console_logging=get_bool("RAXE_ENABLE_CONSOLE_LOGGING", True),
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
return cls(
|
|
272
|
+
core=core,
|
|
273
|
+
detection=detection,
|
|
274
|
+
telemetry=telemetry,
|
|
275
|
+
performance=performance,
|
|
276
|
+
logging=logging_cfg,
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
@classmethod
|
|
280
|
+
def load(cls, config_path: Path | None = None) -> "RaxeConfig":
|
|
281
|
+
"""Load configuration with fallback chain.
|
|
282
|
+
|
|
283
|
+
Priority:
|
|
284
|
+
1. Explicit config file path
|
|
285
|
+
2. .raxe/config.yaml in current directory
|
|
286
|
+
3. ~/.raxe/config.yaml in home directory
|
|
287
|
+
4. Environment variables
|
|
288
|
+
5. Defaults
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
config_path: Optional explicit config file path
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
Loaded RaxeConfig
|
|
295
|
+
"""
|
|
296
|
+
# Try explicit path first
|
|
297
|
+
if config_path and config_path.exists():
|
|
298
|
+
return cls.from_file(config_path)
|
|
299
|
+
|
|
300
|
+
# Try current directory
|
|
301
|
+
local_config = Path(".raxe/config.yaml")
|
|
302
|
+
if local_config.exists():
|
|
303
|
+
return cls.from_file(local_config)
|
|
304
|
+
|
|
305
|
+
# Try home directory
|
|
306
|
+
home_config = Path.home() / ".raxe" / "config.yaml"
|
|
307
|
+
if home_config.exists():
|
|
308
|
+
return cls.from_file(home_config)
|
|
309
|
+
|
|
310
|
+
# Fall back to environment variables
|
|
311
|
+
return cls.from_env()
|
|
312
|
+
|
|
313
|
+
def to_dict(self) -> dict[str, Any]:
|
|
314
|
+
"""Convert to dictionary for serialization.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Dictionary representation (suitable for YAML writing)
|
|
318
|
+
"""
|
|
319
|
+
return {
|
|
320
|
+
"core": {
|
|
321
|
+
**asdict(self.core),
|
|
322
|
+
"api_key": "***" if self.core.api_key else "", # Redact
|
|
323
|
+
},
|
|
324
|
+
"detection": asdict(self.detection),
|
|
325
|
+
"telemetry": {
|
|
326
|
+
**asdict(self.telemetry),
|
|
327
|
+
},
|
|
328
|
+
"performance": asdict(self.performance),
|
|
329
|
+
"logging": asdict(self.logging),
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
def save(self, config_path: Path) -> None:
|
|
333
|
+
"""Save configuration to YAML file.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
config_path: Path where to save config
|
|
337
|
+
"""
|
|
338
|
+
# Ensure parent directory exists
|
|
339
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
340
|
+
|
|
341
|
+
# Convert to dict (with redactions)
|
|
342
|
+
config_dict = self.to_dict()
|
|
343
|
+
|
|
344
|
+
# Write YAML
|
|
345
|
+
with open(config_path, "w") as f:
|
|
346
|
+
yaml.dump(config_dict, f, default_flow_style=False, sort_keys=False)
|
|
347
|
+
|
|
348
|
+
def validate(self) -> list[str]:
|
|
349
|
+
"""Validate configuration values.
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
List of validation errors (empty if valid)
|
|
353
|
+
"""
|
|
354
|
+
errors = []
|
|
355
|
+
|
|
356
|
+
# Validate confidence thresholds
|
|
357
|
+
if not 0 <= self.detection.confidence_threshold <= 1:
|
|
358
|
+
errors.append(
|
|
359
|
+
f"detection.confidence_threshold must be 0-1, got {self.detection.confidence_threshold}"
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# Validate queue sizes
|
|
363
|
+
if self.performance.max_queue_size < 100:
|
|
364
|
+
errors.append(
|
|
365
|
+
f"performance.max_queue_size must be >= 100, got {self.performance.max_queue_size}"
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
if self.telemetry.max_queue_size < 10:
|
|
369
|
+
errors.append(
|
|
370
|
+
f"telemetry.max_queue_size must be >= 10, got {self.telemetry.max_queue_size}"
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
# Validate timeouts
|
|
374
|
+
if self.performance.scan_timeout < 1:
|
|
375
|
+
errors.append(
|
|
376
|
+
f"performance.scan_timeout must be >= 1, got {self.performance.scan_timeout}"
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
# Validate batch size
|
|
380
|
+
if self.telemetry.batch_size < 1:
|
|
381
|
+
errors.append(
|
|
382
|
+
f"telemetry.batch_size must be >= 1, got {self.telemetry.batch_size}"
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
# Validate flush interval
|
|
386
|
+
if self.telemetry.flush_interval < 1:
|
|
387
|
+
errors.append(
|
|
388
|
+
f"telemetry.flush_interval must be >= 1, got {self.telemetry.flush_interval}"
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
return errors
|
|
392
|
+
|
|
393
|
+
def update(self, key_path: str, value: Any) -> None:
|
|
394
|
+
"""Update a configuration value by dot-separated path.
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
key_path: Dot-separated path (e.g., "detection.l2_enabled")
|
|
398
|
+
value: New value to set
|
|
399
|
+
|
|
400
|
+
Raises:
|
|
401
|
+
ValueError: If key path is invalid
|
|
402
|
+
"""
|
|
403
|
+
parts = key_path.split(".", 1)
|
|
404
|
+
if len(parts) != 2:
|
|
405
|
+
raise ValueError(f"Invalid key path: {key_path}. Must be <section>.<key>")
|
|
406
|
+
|
|
407
|
+
section, key = parts
|
|
408
|
+
|
|
409
|
+
# Get section object
|
|
410
|
+
section_obj = getattr(self, section, None)
|
|
411
|
+
if section_obj is None:
|
|
412
|
+
raise ValueError(f"Invalid section: {section}")
|
|
413
|
+
|
|
414
|
+
# Check if key exists
|
|
415
|
+
if not hasattr(section_obj, key):
|
|
416
|
+
raise ValueError(f"Invalid key: {key} in section {section}")
|
|
417
|
+
|
|
418
|
+
# Set value
|
|
419
|
+
setattr(section_obj, key, value)
|
|
420
|
+
|
|
421
|
+
def get(self, key_path: str) -> Any:
|
|
422
|
+
"""Get a configuration value by dot-separated path.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
key_path: Dot-separated path (e.g., "detection.l2_enabled")
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
Configuration value
|
|
429
|
+
|
|
430
|
+
Raises:
|
|
431
|
+
ValueError: If key path is invalid
|
|
432
|
+
"""
|
|
433
|
+
parts = key_path.split(".", 1)
|
|
434
|
+
if len(parts) != 2:
|
|
435
|
+
raise ValueError(f"Invalid key path: {key_path}. Must be <section>.<key>")
|
|
436
|
+
|
|
437
|
+
section, key = parts
|
|
438
|
+
|
|
439
|
+
# Get section object
|
|
440
|
+
section_obj = getattr(self, section, None)
|
|
441
|
+
if section_obj is None:
|
|
442
|
+
raise ValueError(f"Invalid section: {section}")
|
|
443
|
+
|
|
444
|
+
# Get value
|
|
445
|
+
return getattr(section_obj, key)
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def create_default_config(config_path: Path) -> RaxeConfig:
|
|
449
|
+
"""Create a default configuration file.
|
|
450
|
+
|
|
451
|
+
Args:
|
|
452
|
+
config_path: Path where to save config
|
|
453
|
+
|
|
454
|
+
Returns:
|
|
455
|
+
Created RaxeConfig instance
|
|
456
|
+
"""
|
|
457
|
+
config = RaxeConfig()
|
|
458
|
+
config.save(config_path)
|
|
459
|
+
return config
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Database connection management with proper pooling.
|
|
2
|
+
|
|
3
|
+
This module provides connection pooling for SQLite databases,
|
|
4
|
+
ensuring thread-safety and efficient resource usage.
|
|
5
|
+
"""
|
|
6
|
+
from contextlib import contextmanager
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from sqlalchemy import Engine, create_engine
|
|
10
|
+
from sqlalchemy.orm import Session, sessionmaker
|
|
11
|
+
from sqlalchemy.pool import StaticPool
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DatabaseManager:
|
|
15
|
+
"""Manages database connections with proper pooling.
|
|
16
|
+
|
|
17
|
+
For SQLite databases, uses StaticPool for thread-safety.
|
|
18
|
+
For other databases, would use QueuePool.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
database_url: str | None = None,
|
|
24
|
+
db_path: Path | None = None,
|
|
25
|
+
echo: bool = False,
|
|
26
|
+
):
|
|
27
|
+
"""Initialize database manager.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
database_url: SQLAlchemy database URL (overrides db_path)
|
|
31
|
+
db_path: Path to SQLite database file
|
|
32
|
+
echo: Whether to echo SQL statements (for debugging)
|
|
33
|
+
"""
|
|
34
|
+
if database_url is None:
|
|
35
|
+
if db_path is None:
|
|
36
|
+
db_path = Path.home() / ".raxe" / "raxe.db"
|
|
37
|
+
database_url = f"sqlite:///{db_path}"
|
|
38
|
+
|
|
39
|
+
self.database_url = database_url
|
|
40
|
+
self._engine: Engine | None = None
|
|
41
|
+
self._session_factory: sessionmaker | None = None
|
|
42
|
+
self.echo = echo
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def engine(self) -> Engine:
|
|
46
|
+
"""Get or create database engine.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
SQLAlchemy engine instance
|
|
50
|
+
"""
|
|
51
|
+
if self._engine is None:
|
|
52
|
+
# SQLite-specific configuration
|
|
53
|
+
if self.database_url.startswith("sqlite"):
|
|
54
|
+
# Use StaticPool for SQLite to maintain a single connection
|
|
55
|
+
# This prevents threading issues while still being efficient
|
|
56
|
+
self._engine = create_engine(
|
|
57
|
+
self.database_url,
|
|
58
|
+
poolclass=StaticPool,
|
|
59
|
+
connect_args={"check_same_thread": False},
|
|
60
|
+
echo=self.echo,
|
|
61
|
+
)
|
|
62
|
+
else:
|
|
63
|
+
# For other databases (PostgreSQL, MySQL), use default QueuePool
|
|
64
|
+
from sqlalchemy.pool import QueuePool
|
|
65
|
+
|
|
66
|
+
self._engine = create_engine(
|
|
67
|
+
self.database_url,
|
|
68
|
+
poolclass=QueuePool,
|
|
69
|
+
pool_size=5,
|
|
70
|
+
max_overflow=10,
|
|
71
|
+
pool_timeout=30,
|
|
72
|
+
pool_recycle=3600,
|
|
73
|
+
pool_pre_ping=True,
|
|
74
|
+
echo=self.echo,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return self._engine
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def session_factory(self) -> sessionmaker:
|
|
81
|
+
"""Get or create session factory.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
SQLAlchemy sessionmaker instance
|
|
85
|
+
"""
|
|
86
|
+
if self._session_factory is None:
|
|
87
|
+
self._session_factory = sessionmaker(
|
|
88
|
+
bind=self.engine,
|
|
89
|
+
autocommit=False,
|
|
90
|
+
autoflush=False,
|
|
91
|
+
expire_on_commit=False,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return self._session_factory
|
|
95
|
+
|
|
96
|
+
def get_session(self) -> Session:
|
|
97
|
+
"""Get a new database session.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
SQLAlchemy Session instance
|
|
101
|
+
|
|
102
|
+
Example:
|
|
103
|
+
>>> manager = DatabaseManager()
|
|
104
|
+
>>> session = manager.get_session()
|
|
105
|
+
>>> try:
|
|
106
|
+
... # Use session
|
|
107
|
+
... session.commit()
|
|
108
|
+
... finally:
|
|
109
|
+
... session.close()
|
|
110
|
+
"""
|
|
111
|
+
return self.session_factory()
|
|
112
|
+
|
|
113
|
+
@contextmanager
|
|
114
|
+
def session_scope(self):
|
|
115
|
+
"""Provide a transactional scope for database operations.
|
|
116
|
+
|
|
117
|
+
Yields:
|
|
118
|
+
Session: Database session
|
|
119
|
+
|
|
120
|
+
Example:
|
|
121
|
+
>>> manager = DatabaseManager()
|
|
122
|
+
>>> with manager.session_scope() as session:
|
|
123
|
+
... # Use session, auto-commits on success
|
|
124
|
+
... session.add(obj)
|
|
125
|
+
"""
|
|
126
|
+
session = self.get_session()
|
|
127
|
+
try:
|
|
128
|
+
yield session
|
|
129
|
+
session.commit()
|
|
130
|
+
except Exception:
|
|
131
|
+
session.rollback()
|
|
132
|
+
raise
|
|
133
|
+
finally:
|
|
134
|
+
session.close()
|
|
135
|
+
|
|
136
|
+
def close(self) -> None:
|
|
137
|
+
"""Close all database connections and dispose of the engine."""
|
|
138
|
+
if self._engine is not None:
|
|
139
|
+
self._engine.dispose()
|
|
140
|
+
self._engine = None
|
|
141
|
+
self._session_factory = None
|
|
142
|
+
|
|
143
|
+
def __enter__(self):
|
|
144
|
+
"""Context manager entry."""
|
|
145
|
+
return self
|
|
146
|
+
|
|
147
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
148
|
+
"""Context manager exit."""
|
|
149
|
+
self.close()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# Global instance for convenience
|
|
153
|
+
_db_manager: DatabaseManager | None = None
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def get_db_manager(db_path: Path | None = None) -> DatabaseManager:
|
|
157
|
+
"""Get or create the global database manager.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
db_path: Optional database path (only used on first call)
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
DatabaseManager instance
|
|
164
|
+
|
|
165
|
+
Example:
|
|
166
|
+
>>> manager = get_db_manager()
|
|
167
|
+
>>> session = manager.get_session()
|
|
168
|
+
"""
|
|
169
|
+
global _db_manager
|
|
170
|
+
if _db_manager is None:
|
|
171
|
+
_db_manager = DatabaseManager(db_path=db_path)
|
|
172
|
+
return _db_manager
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def get_session() -> Session:
|
|
176
|
+
"""Get a database session from the global manager.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
SQLAlchemy Session instance
|
|
180
|
+
|
|
181
|
+
Example:
|
|
182
|
+
>>> session = get_session()
|
|
183
|
+
>>> try:
|
|
184
|
+
... # Use session
|
|
185
|
+
... session.commit()
|
|
186
|
+
... finally:
|
|
187
|
+
... session.close()
|
|
188
|
+
"""
|
|
189
|
+
return get_db_manager().get_session()
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def reset_db_manager() -> None:
|
|
193
|
+
"""Reset the global database manager.
|
|
194
|
+
|
|
195
|
+
Useful for testing or when switching databases.
|
|
196
|
+
"""
|
|
197
|
+
global _db_manager
|
|
198
|
+
if _db_manager is not None:
|
|
199
|
+
_db_manager.close()
|
|
200
|
+
_db_manager = None
|