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
raxe/sdk/exceptions.py
ADDED
|
@@ -0,0 +1,859 @@
|
|
|
1
|
+
"""RAXE SDK exceptions with structured error codes.
|
|
2
|
+
|
|
3
|
+
Custom exception hierarchy for RAXE SDK operations with structured error codes,
|
|
4
|
+
detailed messages, and actionable remediation hints.
|
|
5
|
+
|
|
6
|
+
All RAXE exceptions inherit from RaxeException for easy catching.
|
|
7
|
+
|
|
8
|
+
Error Code Format:
|
|
9
|
+
{CATEGORY}-{NUMBER}
|
|
10
|
+
|
|
11
|
+
Categories:
|
|
12
|
+
- CFG: Configuration errors (001-099)
|
|
13
|
+
- RULE: Rule-related errors (100-199)
|
|
14
|
+
- SEC: Security errors (200-299)
|
|
15
|
+
- DB: Database errors (300-399)
|
|
16
|
+
- VAL: Validation errors (400-499)
|
|
17
|
+
- INFRA: Infrastructure errors (500-599)
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
>>> try:
|
|
21
|
+
... raxe.scan(prompt)
|
|
22
|
+
... except RaxeException as e:
|
|
23
|
+
... print(f"Error {e.error.code}: {e.error.message}")
|
|
24
|
+
... print(f"Fix: {e.error.remediation}")
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from dataclasses import dataclass, field
|
|
28
|
+
from enum import Enum
|
|
29
|
+
from typing import TYPE_CHECKING, Any
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from raxe.application.scan_pipeline import ScanPipelineResult
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ErrorCategory(str, Enum):
|
|
36
|
+
"""Categories for RAXE error codes."""
|
|
37
|
+
|
|
38
|
+
CFG = "CFG" # Configuration errors
|
|
39
|
+
RULE = "RULE" # Rule-related errors
|
|
40
|
+
SEC = "SEC" # Security errors
|
|
41
|
+
DB = "DB" # Database errors
|
|
42
|
+
VAL = "VAL" # Validation errors
|
|
43
|
+
INFRA = "INFRA" # Infrastructure errors
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ErrorCode(str, Enum):
|
|
47
|
+
"""Structured error codes for RAXE exceptions.
|
|
48
|
+
|
|
49
|
+
Each error code follows the format: {CATEGORY}-{NUMBER}
|
|
50
|
+
|
|
51
|
+
Error codes provide:
|
|
52
|
+
- Consistent identification across logs and telemetry
|
|
53
|
+
- Easy lookup in documentation
|
|
54
|
+
- Programmatic error handling
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
# Configuration errors (CFG-001 to CFG-099)
|
|
58
|
+
CFG_NOT_FOUND = "CFG-001"
|
|
59
|
+
CFG_INVALID_FORMAT = "CFG-002"
|
|
60
|
+
CFG_MISSING_REQUIRED = "CFG-003"
|
|
61
|
+
CFG_INVALID_VALUE = "CFG-004"
|
|
62
|
+
CFG_PERMISSION_DENIED = "CFG-005"
|
|
63
|
+
CFG_INITIALIZATION_FAILED = "CFG-006"
|
|
64
|
+
|
|
65
|
+
# Rule errors (RULE-100 to RULE-199)
|
|
66
|
+
RULE_NOT_FOUND = "RULE-100"
|
|
67
|
+
RULE_INVALID_SYNTAX = "RULE-101"
|
|
68
|
+
RULE_INVALID_PATTERN = "RULE-102"
|
|
69
|
+
RULE_LOAD_FAILED = "RULE-103"
|
|
70
|
+
RULE_PACK_NOT_FOUND = "RULE-104"
|
|
71
|
+
RULE_PACK_INVALID = "RULE-105"
|
|
72
|
+
RULE_VERSION_MISMATCH = "RULE-106"
|
|
73
|
+
RULE_DUPLICATE_ID = "RULE-107"
|
|
74
|
+
|
|
75
|
+
# Security errors (SEC-200 to SEC-299)
|
|
76
|
+
SEC_THREAT_DETECTED = "SEC-200"
|
|
77
|
+
SEC_BLOCKED_BY_POLICY = "SEC-201"
|
|
78
|
+
SEC_CRITICAL_THREAT = "SEC-202"
|
|
79
|
+
SEC_SIGNATURE_INVALID = "SEC-203"
|
|
80
|
+
SEC_AUTH_FAILED = "SEC-204"
|
|
81
|
+
SEC_PERMISSION_DENIED = "SEC-205"
|
|
82
|
+
SEC_CREDENTIAL_EXPIRED = "SEC-206"
|
|
83
|
+
|
|
84
|
+
# Database errors (DB-300 to DB-399)
|
|
85
|
+
DB_CONNECTION_FAILED = "DB-300"
|
|
86
|
+
DB_QUERY_FAILED = "DB-301"
|
|
87
|
+
DB_MIGRATION_FAILED = "DB-302"
|
|
88
|
+
DB_INTEGRITY_ERROR = "DB-303"
|
|
89
|
+
DB_NOT_INITIALIZED = "DB-304"
|
|
90
|
+
DB_LOCK_TIMEOUT = "DB-305"
|
|
91
|
+
|
|
92
|
+
# Validation errors (VAL-400 to VAL-499)
|
|
93
|
+
VAL_EMPTY_INPUT = "VAL-400"
|
|
94
|
+
VAL_INPUT_TOO_LONG = "VAL-401"
|
|
95
|
+
VAL_INVALID_FORMAT = "VAL-402"
|
|
96
|
+
VAL_MISSING_FIELD = "VAL-403"
|
|
97
|
+
VAL_TYPE_MISMATCH = "VAL-404"
|
|
98
|
+
VAL_OUT_OF_RANGE = "VAL-405"
|
|
99
|
+
VAL_INVALID_REGEX = "VAL-406"
|
|
100
|
+
VAL_POLICY_INVALID = "VAL-407"
|
|
101
|
+
|
|
102
|
+
# Infrastructure errors (INFRA-500 to INFRA-599)
|
|
103
|
+
INFRA_NETWORK_ERROR = "INFRA-500"
|
|
104
|
+
INFRA_TIMEOUT = "INFRA-501"
|
|
105
|
+
INFRA_SERVICE_UNAVAILABLE = "INFRA-502"
|
|
106
|
+
INFRA_RATE_LIMITED = "INFRA-503"
|
|
107
|
+
INFRA_DISK_FULL = "INFRA-504"
|
|
108
|
+
INFRA_MODEL_LOAD_FAILED = "INFRA-505"
|
|
109
|
+
INFRA_CIRCUIT_BREAKER_OPEN = "INFRA-506"
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def category(self) -> ErrorCategory:
|
|
113
|
+
"""Extract the category from the error code."""
|
|
114
|
+
prefix = self.value.split("-")[0]
|
|
115
|
+
return ErrorCategory(prefix)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def number(self) -> int:
|
|
119
|
+
"""Extract the numeric part of the error code."""
|
|
120
|
+
return int(self.value.split("-")[1])
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# Base URL for error documentation
|
|
124
|
+
_DOCS_BASE_URL = "https://docs.raxe.ai/errors"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@dataclass(frozen=True)
|
|
128
|
+
class RaxeError:
|
|
129
|
+
"""Structured error information for RAXE exceptions.
|
|
130
|
+
|
|
131
|
+
Provides comprehensive error details including:
|
|
132
|
+
- Unique error code for identification
|
|
133
|
+
- Human-readable message
|
|
134
|
+
- Additional context details
|
|
135
|
+
- Actionable remediation steps
|
|
136
|
+
- Link to documentation
|
|
137
|
+
|
|
138
|
+
Attributes:
|
|
139
|
+
code: The ErrorCode enum value
|
|
140
|
+
message: Human-readable error description
|
|
141
|
+
details: Optional additional context as key-value pairs
|
|
142
|
+
remediation: Suggested fix or next steps
|
|
143
|
+
doc_url: Link to detailed documentation
|
|
144
|
+
|
|
145
|
+
Example:
|
|
146
|
+
>>> error = RaxeError(
|
|
147
|
+
... code=ErrorCode.CFG_NOT_FOUND,
|
|
148
|
+
... message="Configuration file not found",
|
|
149
|
+
... details={"path": "/home/user/.raxe/config.yaml"},
|
|
150
|
+
... remediation="Run 'raxe init' to create default configuration"
|
|
151
|
+
... )
|
|
152
|
+
>>> print(error.doc_url)
|
|
153
|
+
'https://docs.raxe.ai/errors/CFG-001'
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
code: ErrorCode
|
|
157
|
+
message: str
|
|
158
|
+
details: dict[str, Any] = field(default_factory=dict)
|
|
159
|
+
remediation: str = ""
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def doc_url(self) -> str:
|
|
163
|
+
"""Generate documentation URL for this error."""
|
|
164
|
+
return f"{_DOCS_BASE_URL}/{self.code.value}"
|
|
165
|
+
|
|
166
|
+
def __str__(self) -> str:
|
|
167
|
+
"""Format error as human-readable string."""
|
|
168
|
+
parts = [f"[{self.code.value}] {self.message}"]
|
|
169
|
+
if self.details:
|
|
170
|
+
detail_str = ", ".join(f"{k}={v}" for k, v in self.details.items())
|
|
171
|
+
parts.append(f"Details: {detail_str}")
|
|
172
|
+
if self.remediation:
|
|
173
|
+
parts.append(f"Fix: {self.remediation}")
|
|
174
|
+
return " | ".join(parts)
|
|
175
|
+
|
|
176
|
+
def to_dict(self) -> dict[str, Any]:
|
|
177
|
+
"""Convert error to dictionary for serialization.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Dictionary representation suitable for JSON serialization.
|
|
181
|
+
"""
|
|
182
|
+
return {
|
|
183
|
+
"code": self.code.value,
|
|
184
|
+
"category": self.code.category.value,
|
|
185
|
+
"message": self.message,
|
|
186
|
+
"details": self.details,
|
|
187
|
+
"remediation": self.remediation,
|
|
188
|
+
"doc_url": self.doc_url,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# ============================================================================
|
|
193
|
+
# Pre-defined error templates for common scenarios
|
|
194
|
+
# ============================================================================
|
|
195
|
+
|
|
196
|
+
def config_not_found_error(path: str) -> RaxeError:
|
|
197
|
+
"""Create error for missing configuration file."""
|
|
198
|
+
return RaxeError(
|
|
199
|
+
code=ErrorCode.CFG_NOT_FOUND,
|
|
200
|
+
message=f"Configuration file not found: {path}",
|
|
201
|
+
details={"path": path},
|
|
202
|
+
remediation="Run 'raxe init' to create default configuration, "
|
|
203
|
+
"or specify a valid config path with --config",
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def config_invalid_format_error(path: str, parse_error: str) -> RaxeError:
|
|
208
|
+
"""Create error for invalid configuration format."""
|
|
209
|
+
return RaxeError(
|
|
210
|
+
code=ErrorCode.CFG_INVALID_FORMAT,
|
|
211
|
+
message=f"Invalid configuration format in {path}",
|
|
212
|
+
details={"path": path, "parse_error": parse_error},
|
|
213
|
+
remediation="Check YAML syntax and ensure the file is valid. "
|
|
214
|
+
"Use 'raxe config validate' to check for errors.",
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def config_missing_required_error(field: str) -> RaxeError:
|
|
219
|
+
"""Create error for missing required configuration field."""
|
|
220
|
+
return RaxeError(
|
|
221
|
+
code=ErrorCode.CFG_MISSING_REQUIRED,
|
|
222
|
+
message=f"Required configuration field missing: {field}",
|
|
223
|
+
details={"field": field},
|
|
224
|
+
remediation=f"Add the '{field}' field to your configuration file. "
|
|
225
|
+
"See 'raxe config show' for current configuration.",
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def rule_not_found_error(rule_id: str) -> RaxeError:
|
|
230
|
+
"""Create error for missing rule."""
|
|
231
|
+
return RaxeError(
|
|
232
|
+
code=ErrorCode.RULE_NOT_FOUND,
|
|
233
|
+
message=f"Rule not found: {rule_id}",
|
|
234
|
+
details={"rule_id": rule_id},
|
|
235
|
+
remediation="Check the rule ID spelling. Use 'raxe rules list' to see available rules.",
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def rule_invalid_pattern_error(rule_id: str, pattern: str, error: str) -> RaxeError:
|
|
240
|
+
"""Create error for invalid regex pattern in rule."""
|
|
241
|
+
return RaxeError(
|
|
242
|
+
code=ErrorCode.RULE_INVALID_PATTERN,
|
|
243
|
+
message=f"Invalid regex pattern in rule {rule_id}",
|
|
244
|
+
details={"rule_id": rule_id, "pattern_preview": pattern[:50] + "..." if len(pattern) > 50 else pattern, "error": error},
|
|
245
|
+
remediation="Fix the regex pattern syntax. Test patterns at regex101.com before adding to rules.",
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def validation_empty_input_error(field: str = "prompt") -> RaxeError:
|
|
250
|
+
"""Create error for empty input."""
|
|
251
|
+
return RaxeError(
|
|
252
|
+
code=ErrorCode.VAL_EMPTY_INPUT,
|
|
253
|
+
message=f"Empty {field} provided",
|
|
254
|
+
details={"field": field},
|
|
255
|
+
remediation=f"Provide a non-empty {field} for scanning.",
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def validation_input_too_long_error(
|
|
260
|
+
field: str,
|
|
261
|
+
length: int,
|
|
262
|
+
max_length: int,
|
|
263
|
+
) -> RaxeError:
|
|
264
|
+
"""Create error for input exceeding maximum length."""
|
|
265
|
+
return RaxeError(
|
|
266
|
+
code=ErrorCode.VAL_INPUT_TOO_LONG,
|
|
267
|
+
message=f"Input {field} exceeds maximum length",
|
|
268
|
+
details={"field": field, "length": length, "max_length": max_length},
|
|
269
|
+
remediation=f"Reduce {field} length to under {max_length} characters.",
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def database_connection_error(db_path: str, error: str) -> RaxeError:
|
|
274
|
+
"""Create error for database connection failure."""
|
|
275
|
+
return RaxeError(
|
|
276
|
+
code=ErrorCode.DB_CONNECTION_FAILED,
|
|
277
|
+
message=f"Failed to connect to database: {db_path}",
|
|
278
|
+
details={"db_path": db_path, "error": error},
|
|
279
|
+
remediation="Check database path permissions and disk space. "
|
|
280
|
+
"Run 'raxe doctor' to diagnose database issues.",
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def infrastructure_timeout_error(
|
|
285
|
+
operation: str,
|
|
286
|
+
timeout_seconds: float,
|
|
287
|
+
) -> RaxeError:
|
|
288
|
+
"""Create error for operation timeout."""
|
|
289
|
+
return RaxeError(
|
|
290
|
+
code=ErrorCode.INFRA_TIMEOUT,
|
|
291
|
+
message=f"Operation timed out: {operation}",
|
|
292
|
+
details={"operation": operation, "timeout_seconds": timeout_seconds},
|
|
293
|
+
remediation="Try again or increase timeout. "
|
|
294
|
+
"If persistent, check system resources with 'raxe doctor'.",
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def security_threat_detected_error(
|
|
299
|
+
severity: str,
|
|
300
|
+
detection_count: int,
|
|
301
|
+
) -> RaxeError:
|
|
302
|
+
"""Create error for detected security threat."""
|
|
303
|
+
return RaxeError(
|
|
304
|
+
code=ErrorCode.SEC_THREAT_DETECTED,
|
|
305
|
+
message=f"Security threat detected: {severity} severity",
|
|
306
|
+
details={"severity": severity, "detection_count": detection_count},
|
|
307
|
+
remediation="Review the detected threat. If false positive, "
|
|
308
|
+
"add a suppression rule or adjust policy thresholds.",
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def security_blocked_by_policy_error(
|
|
313
|
+
policy_decision: str,
|
|
314
|
+
severity: str,
|
|
315
|
+
) -> RaxeError:
|
|
316
|
+
"""Create error when request is blocked by policy."""
|
|
317
|
+
return RaxeError(
|
|
318
|
+
code=ErrorCode.SEC_BLOCKED_BY_POLICY,
|
|
319
|
+
message=f"Request blocked by policy: {policy_decision}",
|
|
320
|
+
details={"policy_decision": policy_decision, "severity": severity},
|
|
321
|
+
remediation="Review policy configuration. Use 'raxe scan --explain' "
|
|
322
|
+
"for detailed threat information.",
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _get_default_console_keys_url() -> str:
|
|
327
|
+
"""Get default console keys URL from centralized endpoints."""
|
|
328
|
+
from raxe.infrastructure.config.endpoints import get_console_url
|
|
329
|
+
return f"{get_console_url()}/keys"
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def credential_expired_error(
|
|
333
|
+
days_expired: int,
|
|
334
|
+
console_url: str | None = None,
|
|
335
|
+
) -> RaxeError:
|
|
336
|
+
"""Create error for expired API credentials.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
days_expired: Number of days since the key expired.
|
|
340
|
+
console_url: URL where users can get a new key (uses centralized endpoint if None).
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
RaxeError with SEC-206 code and helpful remediation.
|
|
344
|
+
"""
|
|
345
|
+
if console_url is None:
|
|
346
|
+
console_url = _get_default_console_keys_url()
|
|
347
|
+
|
|
348
|
+
if days_expired == 0:
|
|
349
|
+
expiry_text = "today"
|
|
350
|
+
elif days_expired == 1:
|
|
351
|
+
expiry_text = "1 day ago"
|
|
352
|
+
else:
|
|
353
|
+
expiry_text = f"{days_expired} days ago"
|
|
354
|
+
|
|
355
|
+
return RaxeError(
|
|
356
|
+
code=ErrorCode.SEC_CREDENTIAL_EXPIRED,
|
|
357
|
+
message=f"Your temporary API key expired {expiry_text}",
|
|
358
|
+
details={"days_expired": days_expired, "console_url": console_url},
|
|
359
|
+
remediation=f"Get a permanent key at: {console_url}\n"
|
|
360
|
+
"Or run: raxe auth login",
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
# ============================================================================
|
|
365
|
+
# Base Exception Classes
|
|
366
|
+
# ============================================================================
|
|
367
|
+
|
|
368
|
+
class RaxeException(Exception):
|
|
369
|
+
"""Base exception for all RAXE errors.
|
|
370
|
+
|
|
371
|
+
Can be initialized with either a simple message (for backwards compatibility)
|
|
372
|
+
or a structured RaxeError for rich error information.
|
|
373
|
+
|
|
374
|
+
Attributes:
|
|
375
|
+
error: Optional RaxeError with structured error details
|
|
376
|
+
message: Human-readable error message
|
|
377
|
+
|
|
378
|
+
Examples:
|
|
379
|
+
# Legacy usage (backwards compatible)
|
|
380
|
+
>>> raise RaxeException("Something went wrong")
|
|
381
|
+
|
|
382
|
+
# Structured usage (preferred)
|
|
383
|
+
>>> error = RaxeError(
|
|
384
|
+
... code=ErrorCode.CFG_NOT_FOUND,
|
|
385
|
+
... message="Config not found",
|
|
386
|
+
... remediation="Run 'raxe init'"
|
|
387
|
+
... )
|
|
388
|
+
>>> raise RaxeException(error)
|
|
389
|
+
"""
|
|
390
|
+
|
|
391
|
+
def __init__(
|
|
392
|
+
self,
|
|
393
|
+
message_or_error: str | RaxeError,
|
|
394
|
+
*,
|
|
395
|
+
error: RaxeError | None = None,
|
|
396
|
+
) -> None:
|
|
397
|
+
"""Initialize RAXE exception.
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
message_or_error: Either a string message (legacy) or RaxeError (structured)
|
|
401
|
+
error: Optional RaxeError (alternative to passing as first argument)
|
|
402
|
+
"""
|
|
403
|
+
if isinstance(message_or_error, RaxeError):
|
|
404
|
+
self.error = message_or_error
|
|
405
|
+
self.message = str(message_or_error)
|
|
406
|
+
elif error is not None:
|
|
407
|
+
self.error = error
|
|
408
|
+
self.message = message_or_error
|
|
409
|
+
else:
|
|
410
|
+
self.error = None
|
|
411
|
+
self.message = message_or_error
|
|
412
|
+
|
|
413
|
+
super().__init__(self.message)
|
|
414
|
+
|
|
415
|
+
@property
|
|
416
|
+
def code(self) -> ErrorCode | None:
|
|
417
|
+
"""Get error code if available."""
|
|
418
|
+
return self.error.code if self.error else None
|
|
419
|
+
|
|
420
|
+
@property
|
|
421
|
+
def remediation(self) -> str | None:
|
|
422
|
+
"""Get remediation hint if available."""
|
|
423
|
+
return self.error.remediation if self.error else None
|
|
424
|
+
|
|
425
|
+
@property
|
|
426
|
+
def doc_url(self) -> str | None:
|
|
427
|
+
"""Get documentation URL if available."""
|
|
428
|
+
return self.error.doc_url if self.error else None
|
|
429
|
+
|
|
430
|
+
def to_dict(self) -> dict[str, Any]:
|
|
431
|
+
"""Convert exception to dictionary for serialization.
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
Dictionary representation suitable for JSON serialization.
|
|
435
|
+
"""
|
|
436
|
+
if self.error:
|
|
437
|
+
return self.error.to_dict()
|
|
438
|
+
return {
|
|
439
|
+
"message": self.message,
|
|
440
|
+
"code": None,
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
# ============================================================================
|
|
445
|
+
# Configuration Exceptions
|
|
446
|
+
# ============================================================================
|
|
447
|
+
|
|
448
|
+
class ConfigurationError(RaxeException):
|
|
449
|
+
"""Raised when configuration is invalid or missing.
|
|
450
|
+
|
|
451
|
+
This exception covers:
|
|
452
|
+
- Missing configuration files
|
|
453
|
+
- Invalid configuration format (YAML parse errors)
|
|
454
|
+
- Missing required configuration fields
|
|
455
|
+
- Invalid configuration values
|
|
456
|
+
- Permission issues with config files
|
|
457
|
+
|
|
458
|
+
Example:
|
|
459
|
+
>>> raise ConfigurationError(config_not_found_error("/path/to/config"))
|
|
460
|
+
"""
|
|
461
|
+
|
|
462
|
+
pass
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
# ============================================================================
|
|
466
|
+
# Validation Exceptions
|
|
467
|
+
# ============================================================================
|
|
468
|
+
|
|
469
|
+
class ValidationError(RaxeException):
|
|
470
|
+
"""Raised when input validation fails.
|
|
471
|
+
|
|
472
|
+
This exception covers:
|
|
473
|
+
- Empty input
|
|
474
|
+
- Input exceeding length limits
|
|
475
|
+
- Invalid format
|
|
476
|
+
- Missing required fields
|
|
477
|
+
- Type mismatches
|
|
478
|
+
- Out of range values
|
|
479
|
+
|
|
480
|
+
Example:
|
|
481
|
+
>>> raise ValidationError(validation_empty_input_error("prompt"))
|
|
482
|
+
"""
|
|
483
|
+
|
|
484
|
+
pass
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
# ============================================================================
|
|
488
|
+
# Rule Exceptions
|
|
489
|
+
# ============================================================================
|
|
490
|
+
|
|
491
|
+
class RuleError(RaxeException):
|
|
492
|
+
"""Raised when rule loading or processing fails.
|
|
493
|
+
|
|
494
|
+
This exception covers:
|
|
495
|
+
- Rule not found
|
|
496
|
+
- Invalid rule syntax
|
|
497
|
+
- Invalid regex patterns
|
|
498
|
+
- Rule pack issues
|
|
499
|
+
- Version mismatches
|
|
500
|
+
|
|
501
|
+
Example:
|
|
502
|
+
>>> raise RuleError(rule_not_found_error("pi-999"))
|
|
503
|
+
"""
|
|
504
|
+
|
|
505
|
+
pass
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
# ============================================================================
|
|
509
|
+
# Database Exceptions
|
|
510
|
+
# ============================================================================
|
|
511
|
+
|
|
512
|
+
class DatabaseError(RaxeException):
|
|
513
|
+
"""Raised when database operations fail.
|
|
514
|
+
|
|
515
|
+
This exception covers:
|
|
516
|
+
- Connection failures
|
|
517
|
+
- Query errors
|
|
518
|
+
- Migration failures
|
|
519
|
+
- Integrity constraint violations
|
|
520
|
+
- Lock timeouts
|
|
521
|
+
|
|
522
|
+
Example:
|
|
523
|
+
>>> raise DatabaseError(database_connection_error("/path/to/db", "disk full"))
|
|
524
|
+
"""
|
|
525
|
+
|
|
526
|
+
pass
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
# ============================================================================
|
|
530
|
+
# Infrastructure Exceptions
|
|
531
|
+
# ============================================================================
|
|
532
|
+
|
|
533
|
+
class InfrastructureError(RaxeException):
|
|
534
|
+
"""Raised when infrastructure operations fail.
|
|
535
|
+
|
|
536
|
+
This exception covers:
|
|
537
|
+
- Network errors
|
|
538
|
+
- Timeouts
|
|
539
|
+
- Service unavailability
|
|
540
|
+
- Rate limiting
|
|
541
|
+
- Disk space issues
|
|
542
|
+
- Model loading failures
|
|
543
|
+
- Circuit breaker activation
|
|
544
|
+
|
|
545
|
+
Example:
|
|
546
|
+
>>> raise InfrastructureError(infrastructure_timeout_error("cloud_sync", 30.0))
|
|
547
|
+
"""
|
|
548
|
+
|
|
549
|
+
pass
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
# ============================================================================
|
|
553
|
+
# Security Exceptions (Backwards Compatible)
|
|
554
|
+
# ============================================================================
|
|
555
|
+
|
|
556
|
+
class SecurityException(RaxeException):
|
|
557
|
+
"""Raised when a security threat is detected and blocking is enabled.
|
|
558
|
+
|
|
559
|
+
This exception is raised when:
|
|
560
|
+
- A threat is detected during scanning
|
|
561
|
+
- The policy dictates blocking (e.g., CRITICAL severity)
|
|
562
|
+
- block_on_threat=True is specified
|
|
563
|
+
|
|
564
|
+
Attributes:
|
|
565
|
+
result: The ScanPipelineResult that triggered the exception
|
|
566
|
+
error: Optional RaxeError with structured details
|
|
567
|
+
|
|
568
|
+
Example:
|
|
569
|
+
>>> # Standard usage with result
|
|
570
|
+
>>> raise SecurityException(result)
|
|
571
|
+
|
|
572
|
+
>>> # Usage with structured error
|
|
573
|
+
>>> error = security_threat_detected_error("HIGH", 3)
|
|
574
|
+
>>> raise SecurityException(result, error=error)
|
|
575
|
+
"""
|
|
576
|
+
|
|
577
|
+
def __init__(
|
|
578
|
+
self,
|
|
579
|
+
result: "ScanPipelineResult",
|
|
580
|
+
*,
|
|
581
|
+
error: RaxeError | None = None,
|
|
582
|
+
) -> None:
|
|
583
|
+
"""Initialize security exception.
|
|
584
|
+
|
|
585
|
+
Args:
|
|
586
|
+
result: ScanPipelineResult containing threat details
|
|
587
|
+
error: Optional structured error information
|
|
588
|
+
"""
|
|
589
|
+
self.result = result
|
|
590
|
+
|
|
591
|
+
# Create default structured error if not provided
|
|
592
|
+
if error is None:
|
|
593
|
+
error = security_threat_detected_error(
|
|
594
|
+
severity=str(result.severity),
|
|
595
|
+
detection_count=result.total_detections,
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
message = (
|
|
599
|
+
f"Security threat detected: {result.severity} "
|
|
600
|
+
f"({result.total_detections} detection(s))"
|
|
601
|
+
)
|
|
602
|
+
super().__init__(message, error=error)
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
class RaxeBlockedError(SecurityException):
|
|
606
|
+
"""Raised when a request is blocked by policy.
|
|
607
|
+
|
|
608
|
+
This is a specialized SecurityException that indicates
|
|
609
|
+
the request was explicitly blocked by policy evaluation.
|
|
610
|
+
|
|
611
|
+
Attributes:
|
|
612
|
+
result: The ScanPipelineResult with blocking decision
|
|
613
|
+
error: RaxeError with SEC-201 code
|
|
614
|
+
|
|
615
|
+
Example:
|
|
616
|
+
>>> raise RaxeBlockedError(result)
|
|
617
|
+
"""
|
|
618
|
+
|
|
619
|
+
def __init__(self, result: "ScanPipelineResult") -> None:
|
|
620
|
+
"""Initialize blocked error.
|
|
621
|
+
|
|
622
|
+
Args:
|
|
623
|
+
result: ScanPipelineResult with blocking decision
|
|
624
|
+
"""
|
|
625
|
+
error = security_blocked_by_policy_error(
|
|
626
|
+
policy_decision=str(result.policy_decision),
|
|
627
|
+
severity=str(result.severity),
|
|
628
|
+
)
|
|
629
|
+
super().__init__(result, error=error)
|
|
630
|
+
|
|
631
|
+
# Override message for backwards compatibility
|
|
632
|
+
self.args = (
|
|
633
|
+
f"Request blocked by policy: {result.policy_decision} "
|
|
634
|
+
f"(Severity: {result.severity})",
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
class ScanTimeoutError(InfrastructureError):
|
|
639
|
+
"""Raised when a scan times out and fail_open=False (fail-closed mode).
|
|
640
|
+
|
|
641
|
+
This exception is raised when:
|
|
642
|
+
- A scan exceeds the configured timeout_ms
|
|
643
|
+
- The config has fail_open=False (fail-closed behavior)
|
|
644
|
+
|
|
645
|
+
When fail_open=True (default), timeouts result in allowing the request
|
|
646
|
+
rather than raising an exception.
|
|
647
|
+
|
|
648
|
+
Attributes:
|
|
649
|
+
timeout_ms: The configured timeout in milliseconds
|
|
650
|
+
|
|
651
|
+
Example:
|
|
652
|
+
>>> config = AgentScannerConfig(timeout_ms=100, fail_open=False)
|
|
653
|
+
>>> # If scan takes >100ms, raises ScanTimeoutError
|
|
654
|
+
"""
|
|
655
|
+
|
|
656
|
+
def __init__(
|
|
657
|
+
self,
|
|
658
|
+
message: str,
|
|
659
|
+
*,
|
|
660
|
+
timeout_ms: float = 100.0,
|
|
661
|
+
) -> None:
|
|
662
|
+
"""Initialize scan timeout error.
|
|
663
|
+
|
|
664
|
+
Args:
|
|
665
|
+
message: Error message describing the timeout
|
|
666
|
+
timeout_ms: The configured timeout value
|
|
667
|
+
"""
|
|
668
|
+
self.timeout_ms = timeout_ms
|
|
669
|
+
error = infrastructure_timeout_error(
|
|
670
|
+
operation="security_scan",
|
|
671
|
+
timeout_seconds=timeout_ms / 1000.0,
|
|
672
|
+
)
|
|
673
|
+
super().__init__(message, error=error)
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
# ============================================================================
|
|
677
|
+
# Exception Mapping Utilities
|
|
678
|
+
# ============================================================================
|
|
679
|
+
|
|
680
|
+
def from_error_code(
|
|
681
|
+
code: ErrorCode,
|
|
682
|
+
message: str | None = None,
|
|
683
|
+
details: dict[str, Any] | None = None,
|
|
684
|
+
remediation: str | None = None,
|
|
685
|
+
) -> RaxeException:
|
|
686
|
+
"""Create appropriate exception from error code.
|
|
687
|
+
|
|
688
|
+
Factory function that creates the correct exception type based on
|
|
689
|
+
the error code category.
|
|
690
|
+
|
|
691
|
+
Args:
|
|
692
|
+
code: The ErrorCode to create exception for
|
|
693
|
+
message: Optional custom message (uses default if not provided)
|
|
694
|
+
details: Optional additional context
|
|
695
|
+
remediation: Optional custom remediation (uses default if not provided)
|
|
696
|
+
|
|
697
|
+
Returns:
|
|
698
|
+
Appropriate RaxeException subclass based on error code category
|
|
699
|
+
|
|
700
|
+
Example:
|
|
701
|
+
>>> exc = from_error_code(
|
|
702
|
+
... ErrorCode.CFG_NOT_FOUND,
|
|
703
|
+
... message="Config missing",
|
|
704
|
+
... details={"path": "/etc/raxe/config.yaml"}
|
|
705
|
+
... )
|
|
706
|
+
>>> isinstance(exc, ConfigurationError)
|
|
707
|
+
True
|
|
708
|
+
"""
|
|
709
|
+
# Default messages for each error code
|
|
710
|
+
default_messages: dict[ErrorCode, str] = {
|
|
711
|
+
ErrorCode.CFG_NOT_FOUND: "Configuration file not found",
|
|
712
|
+
ErrorCode.CFG_INVALID_FORMAT: "Invalid configuration format",
|
|
713
|
+
ErrorCode.CFG_MISSING_REQUIRED: "Required configuration field missing",
|
|
714
|
+
ErrorCode.CFG_INVALID_VALUE: "Invalid configuration value",
|
|
715
|
+
ErrorCode.CFG_PERMISSION_DENIED: "Permission denied accessing configuration",
|
|
716
|
+
ErrorCode.CFG_INITIALIZATION_FAILED: "Configuration initialization failed",
|
|
717
|
+
ErrorCode.RULE_NOT_FOUND: "Detection rule not found",
|
|
718
|
+
ErrorCode.RULE_INVALID_SYNTAX: "Invalid rule syntax",
|
|
719
|
+
ErrorCode.RULE_INVALID_PATTERN: "Invalid regex pattern in rule",
|
|
720
|
+
ErrorCode.RULE_LOAD_FAILED: "Failed to load detection rules",
|
|
721
|
+
ErrorCode.RULE_PACK_NOT_FOUND: "Rule pack not found",
|
|
722
|
+
ErrorCode.RULE_PACK_INVALID: "Invalid rule pack format",
|
|
723
|
+
ErrorCode.RULE_VERSION_MISMATCH: "Rule version mismatch",
|
|
724
|
+
ErrorCode.RULE_DUPLICATE_ID: "Duplicate rule ID detected",
|
|
725
|
+
ErrorCode.SEC_THREAT_DETECTED: "Security threat detected",
|
|
726
|
+
ErrorCode.SEC_BLOCKED_BY_POLICY: "Request blocked by security policy",
|
|
727
|
+
ErrorCode.SEC_CRITICAL_THREAT: "Critical security threat detected",
|
|
728
|
+
ErrorCode.SEC_SIGNATURE_INVALID: "Invalid signature",
|
|
729
|
+
ErrorCode.SEC_AUTH_FAILED: "Authentication failed",
|
|
730
|
+
ErrorCode.SEC_PERMISSION_DENIED: "Permission denied",
|
|
731
|
+
ErrorCode.SEC_CREDENTIAL_EXPIRED: "API key has expired",
|
|
732
|
+
ErrorCode.DB_CONNECTION_FAILED: "Database connection failed",
|
|
733
|
+
ErrorCode.DB_QUERY_FAILED: "Database query failed",
|
|
734
|
+
ErrorCode.DB_MIGRATION_FAILED: "Database migration failed",
|
|
735
|
+
ErrorCode.DB_INTEGRITY_ERROR: "Database integrity error",
|
|
736
|
+
ErrorCode.DB_NOT_INITIALIZED: "Database not initialized",
|
|
737
|
+
ErrorCode.DB_LOCK_TIMEOUT: "Database lock timeout",
|
|
738
|
+
ErrorCode.VAL_EMPTY_INPUT: "Empty input provided",
|
|
739
|
+
ErrorCode.VAL_INPUT_TOO_LONG: "Input exceeds maximum length",
|
|
740
|
+
ErrorCode.VAL_INVALID_FORMAT: "Invalid input format",
|
|
741
|
+
ErrorCode.VAL_MISSING_FIELD: "Required field missing",
|
|
742
|
+
ErrorCode.VAL_TYPE_MISMATCH: "Type mismatch",
|
|
743
|
+
ErrorCode.VAL_OUT_OF_RANGE: "Value out of allowed range",
|
|
744
|
+
ErrorCode.VAL_INVALID_REGEX: "Invalid regular expression",
|
|
745
|
+
ErrorCode.VAL_POLICY_INVALID: "Invalid policy configuration",
|
|
746
|
+
ErrorCode.INFRA_NETWORK_ERROR: "Network error",
|
|
747
|
+
ErrorCode.INFRA_TIMEOUT: "Operation timed out",
|
|
748
|
+
ErrorCode.INFRA_SERVICE_UNAVAILABLE: "Service unavailable",
|
|
749
|
+
ErrorCode.INFRA_RATE_LIMITED: "Rate limit exceeded",
|
|
750
|
+
ErrorCode.INFRA_DISK_FULL: "Disk space exhausted",
|
|
751
|
+
ErrorCode.INFRA_MODEL_LOAD_FAILED: "Failed to load ML model",
|
|
752
|
+
ErrorCode.INFRA_CIRCUIT_BREAKER_OPEN: "Circuit breaker is open",
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
# Default remediations for each error code
|
|
756
|
+
default_remediations: dict[ErrorCode, str] = {
|
|
757
|
+
ErrorCode.CFG_NOT_FOUND: "Run 'raxe init' to create default configuration",
|
|
758
|
+
ErrorCode.CFG_INVALID_FORMAT: "Check YAML syntax with 'raxe config validate'",
|
|
759
|
+
ErrorCode.CFG_MISSING_REQUIRED: "Add the missing field to configuration",
|
|
760
|
+
ErrorCode.CFG_INVALID_VALUE: "Check documentation for valid values",
|
|
761
|
+
ErrorCode.CFG_PERMISSION_DENIED: "Check file permissions on config directory",
|
|
762
|
+
ErrorCode.CFG_INITIALIZATION_FAILED: "Run 'raxe doctor' to diagnose issues",
|
|
763
|
+
ErrorCode.RULE_NOT_FOUND: "Use 'raxe rules list' to see available rules",
|
|
764
|
+
ErrorCode.RULE_INVALID_SYNTAX: "Validate rule with 'raxe validate-rule'",
|
|
765
|
+
ErrorCode.RULE_INVALID_PATTERN: "Test regex patterns at regex101.com",
|
|
766
|
+
ErrorCode.RULE_LOAD_FAILED: "Check rule file permissions and format",
|
|
767
|
+
ErrorCode.RULE_PACK_NOT_FOUND: "Install rule pack with 'raxe pack install'",
|
|
768
|
+
ErrorCode.RULE_PACK_INVALID: "Validate pack structure and manifest",
|
|
769
|
+
ErrorCode.RULE_VERSION_MISMATCH: "Update RAXE or rule pack to compatible version",
|
|
770
|
+
ErrorCode.RULE_DUPLICATE_ID: "Ensure all rule IDs are unique",
|
|
771
|
+
ErrorCode.SEC_THREAT_DETECTED: "Review detection with 'raxe scan --explain'",
|
|
772
|
+
ErrorCode.SEC_BLOCKED_BY_POLICY: "Adjust policy or add suppression rule",
|
|
773
|
+
ErrorCode.SEC_CRITICAL_THREAT: "Investigate immediately - potential attack",
|
|
774
|
+
ErrorCode.SEC_SIGNATURE_INVALID: "Verify rule pack integrity",
|
|
775
|
+
ErrorCode.SEC_AUTH_FAILED: "Get a permanent key at the console or run 'raxe auth login'",
|
|
776
|
+
ErrorCode.SEC_PERMISSION_DENIED: "Contact administrator for access",
|
|
777
|
+
ErrorCode.SEC_CREDENTIAL_EXPIRED: "Get a permanent key at the console or run 'raxe auth login'",
|
|
778
|
+
ErrorCode.DB_CONNECTION_FAILED: "Check database path and permissions",
|
|
779
|
+
ErrorCode.DB_QUERY_FAILED: "Run 'raxe doctor' to check database health",
|
|
780
|
+
ErrorCode.DB_MIGRATION_FAILED: "Backup data and reinitialize database",
|
|
781
|
+
ErrorCode.DB_INTEGRITY_ERROR: "Database may be corrupted - restore from backup",
|
|
782
|
+
ErrorCode.DB_NOT_INITIALIZED: "Run 'raxe init' to initialize database",
|
|
783
|
+
ErrorCode.DB_LOCK_TIMEOUT: "Close other RAXE instances and retry",
|
|
784
|
+
ErrorCode.VAL_EMPTY_INPUT: "Provide non-empty input",
|
|
785
|
+
ErrorCode.VAL_INPUT_TOO_LONG: "Reduce input length",
|
|
786
|
+
ErrorCode.VAL_INVALID_FORMAT: "Check input format requirements",
|
|
787
|
+
ErrorCode.VAL_MISSING_FIELD: "Provide all required fields",
|
|
788
|
+
ErrorCode.VAL_TYPE_MISMATCH: "Check data types match expected format",
|
|
789
|
+
ErrorCode.VAL_OUT_OF_RANGE: "Use value within allowed range",
|
|
790
|
+
ErrorCode.VAL_INVALID_REGEX: "Fix regex syntax",
|
|
791
|
+
ErrorCode.VAL_POLICY_INVALID: "Check policy configuration format",
|
|
792
|
+
ErrorCode.INFRA_NETWORK_ERROR: "Check network connectivity",
|
|
793
|
+
ErrorCode.INFRA_TIMEOUT: "Retry or increase timeout",
|
|
794
|
+
ErrorCode.INFRA_SERVICE_UNAVAILABLE: "Service may be down - retry later",
|
|
795
|
+
ErrorCode.INFRA_RATE_LIMITED: "Wait and retry with backoff. Get higher limits via 'raxe auth login'",
|
|
796
|
+
ErrorCode.INFRA_DISK_FULL: "Free up disk space",
|
|
797
|
+
ErrorCode.INFRA_MODEL_LOAD_FAILED: "Reinstall ML models with 'pip install raxe[ml]'",
|
|
798
|
+
ErrorCode.INFRA_CIRCUIT_BREAKER_OPEN: "Service recovering - retry in a few minutes",
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
# Create the error
|
|
802
|
+
error = RaxeError(
|
|
803
|
+
code=code,
|
|
804
|
+
message=message or default_messages.get(code, f"Error {code.value}"),
|
|
805
|
+
details=details or {},
|
|
806
|
+
remediation=remediation or default_remediations.get(code, ""),
|
|
807
|
+
)
|
|
808
|
+
|
|
809
|
+
# Map category to exception type
|
|
810
|
+
exception_map: dict[ErrorCategory, type[RaxeException]] = {
|
|
811
|
+
ErrorCategory.CFG: ConfigurationError,
|
|
812
|
+
ErrorCategory.RULE: RuleError,
|
|
813
|
+
ErrorCategory.SEC: RaxeException, # Use base for SEC (SecurityException needs result)
|
|
814
|
+
ErrorCategory.DB: DatabaseError,
|
|
815
|
+
ErrorCategory.VAL: ValidationError,
|
|
816
|
+
ErrorCategory.INFRA: InfrastructureError,
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
exception_class = exception_map.get(code.category, RaxeException)
|
|
820
|
+
return exception_class(error)
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
# ============================================================================
|
|
824
|
+
# Re-exports for convenience
|
|
825
|
+
# ============================================================================
|
|
826
|
+
|
|
827
|
+
__all__ = [
|
|
828
|
+
# Core classes
|
|
829
|
+
"ErrorCategory",
|
|
830
|
+
"ErrorCode",
|
|
831
|
+
"RaxeError",
|
|
832
|
+
# Base exception
|
|
833
|
+
"RaxeException",
|
|
834
|
+
# Domain exceptions
|
|
835
|
+
"ConfigurationError",
|
|
836
|
+
"ValidationError",
|
|
837
|
+
"RuleError",
|
|
838
|
+
"DatabaseError",
|
|
839
|
+
"InfrastructureError",
|
|
840
|
+
# Security exceptions (backwards compatible)
|
|
841
|
+
"SecurityException",
|
|
842
|
+
"RaxeBlockedError",
|
|
843
|
+
"ScanTimeoutError",
|
|
844
|
+
# Error factories
|
|
845
|
+
"config_not_found_error",
|
|
846
|
+
"config_invalid_format_error",
|
|
847
|
+
"config_missing_required_error",
|
|
848
|
+
"rule_not_found_error",
|
|
849
|
+
"rule_invalid_pattern_error",
|
|
850
|
+
"validation_empty_input_error",
|
|
851
|
+
"validation_input_too_long_error",
|
|
852
|
+
"database_connection_error",
|
|
853
|
+
"infrastructure_timeout_error",
|
|
854
|
+
"security_threat_detected_error",
|
|
855
|
+
"security_blocked_by_policy_error",
|
|
856
|
+
"credential_expired_error",
|
|
857
|
+
# Utilities
|
|
858
|
+
"from_error_code",
|
|
859
|
+
]
|