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,156 @@
|
|
|
1
|
+
"""Composite suppression repository (YAML + SQLite).
|
|
2
|
+
|
|
3
|
+
This infrastructure layer module combines:
|
|
4
|
+
- YamlSuppressionRepository: .raxe/suppressions.yaml file storage
|
|
5
|
+
- SQLiteSuppressionRepository: Audit log persistence
|
|
6
|
+
|
|
7
|
+
This is the recommended repository for new projects as it provides
|
|
8
|
+
the full YAML format with action overrides, expiration dates, and
|
|
9
|
+
proper audit logging.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from raxe.domain.suppression import AuditEntry, Suppression
|
|
17
|
+
from raxe.infrastructure.suppression.sqlite_repository import (
|
|
18
|
+
SQLiteSuppressionRepository,
|
|
19
|
+
)
|
|
20
|
+
from raxe.infrastructure.suppression.yaml_repository import (
|
|
21
|
+
DEFAULT_SUPPRESSIONS_PATH,
|
|
22
|
+
YamlSuppressionRepository,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class YamlCompositeSuppressionRepository:
|
|
29
|
+
"""Repository that combines YAML storage + SQLite audit logging.
|
|
30
|
+
|
|
31
|
+
This is the recommended repository for new projects as it provides:
|
|
32
|
+
- Full YAML format with action overrides (SUPPRESS, FLAG, LOG)
|
|
33
|
+
- Expiration dates with proper validation
|
|
34
|
+
- Schema versioning
|
|
35
|
+
- SQLite audit logging for compliance
|
|
36
|
+
|
|
37
|
+
This is what should be used for projects adopting the new
|
|
38
|
+
.raxe/suppressions.yaml format.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
yaml_path: Path | None = None,
|
|
44
|
+
db_path: Path | None = None,
|
|
45
|
+
) -> None:
|
|
46
|
+
"""Initialize composite repository.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
yaml_path: Path to suppressions.yaml file
|
|
50
|
+
(default: ./.raxe/suppressions.yaml)
|
|
51
|
+
db_path: Path to SQLite database
|
|
52
|
+
(default: ~/.raxe/suppressions.db)
|
|
53
|
+
"""
|
|
54
|
+
if yaml_path is None:
|
|
55
|
+
yaml_path = Path.cwd() / DEFAULT_SUPPRESSIONS_PATH
|
|
56
|
+
|
|
57
|
+
self.yaml_repo = YamlSuppressionRepository(config_path=yaml_path)
|
|
58
|
+
self.sqlite_repo = SQLiteSuppressionRepository(db_path=db_path)
|
|
59
|
+
|
|
60
|
+
logger.debug(
|
|
61
|
+
"yaml_composite_repository_initialized",
|
|
62
|
+
extra={
|
|
63
|
+
"yaml_path": str(self.yaml_repo.config_path),
|
|
64
|
+
"db_path": str(self.sqlite_repo.db_path),
|
|
65
|
+
},
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def load_suppressions(self) -> list[Suppression]:
|
|
69
|
+
"""Load suppressions from .raxe/suppressions.yaml file.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
List of Suppression objects
|
|
73
|
+
"""
|
|
74
|
+
return self.yaml_repo.load_suppressions()
|
|
75
|
+
|
|
76
|
+
def save_suppression(self, suppression: Suppression) -> None:
|
|
77
|
+
"""Save a suppression to YAML repository.
|
|
78
|
+
|
|
79
|
+
Note: This only updates the in-memory cache.
|
|
80
|
+
Call save_all_suppressions() to persist to file.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
suppression: Suppression to save
|
|
84
|
+
"""
|
|
85
|
+
self.yaml_repo.save_suppression(suppression)
|
|
86
|
+
|
|
87
|
+
def remove_suppression(self, pattern: str) -> bool:
|
|
88
|
+
"""Remove a suppression from YAML repository.
|
|
89
|
+
|
|
90
|
+
Note: This only updates the in-memory cache.
|
|
91
|
+
Call save_all_suppressions() to persist to file.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
pattern: Pattern to remove
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if removed, False if not found
|
|
98
|
+
"""
|
|
99
|
+
return self.yaml_repo.remove_suppression(pattern)
|
|
100
|
+
|
|
101
|
+
def save_all_suppressions(self, suppressions: list[Suppression]) -> None:
|
|
102
|
+
"""Replace all suppressions and write to .raxe/suppressions.yaml file.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
suppressions: List of suppressions to save
|
|
106
|
+
"""
|
|
107
|
+
self.yaml_repo.save_all_suppressions(suppressions)
|
|
108
|
+
|
|
109
|
+
def log_audit(self, entry: AuditEntry) -> None:
|
|
110
|
+
"""Log audit entry to SQLite database.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
entry: Audit entry to log
|
|
114
|
+
"""
|
|
115
|
+
self.sqlite_repo.log_audit(entry)
|
|
116
|
+
|
|
117
|
+
def get_audit_log(
|
|
118
|
+
self,
|
|
119
|
+
limit: int = 100,
|
|
120
|
+
pattern: str | None = None,
|
|
121
|
+
action: str | None = None,
|
|
122
|
+
) -> list[dict[str, Any]]:
|
|
123
|
+
"""Get audit log entries from SQLite database.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
limit: Maximum entries to return
|
|
127
|
+
pattern: Filter by pattern (optional)
|
|
128
|
+
action: Filter by action (added/removed/applied, optional)
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
List of audit log entries as dictionaries
|
|
132
|
+
"""
|
|
133
|
+
return self.sqlite_repo.get_audit_log(
|
|
134
|
+
limit=limit,
|
|
135
|
+
pattern=pattern,
|
|
136
|
+
action=action,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def config_path(self) -> Path:
|
|
141
|
+
"""Get the YAML config file path (for backward compatibility)."""
|
|
142
|
+
return self.yaml_repo.config_path
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def db_path(self) -> Path:
|
|
146
|
+
"""Get the database path (for backward compatibility)."""
|
|
147
|
+
return self.sqlite_repo.db_path
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def file_exists(self) -> bool:
|
|
151
|
+
"""Check if the YAML configuration file exists.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
True if file exists, False otherwise
|
|
155
|
+
"""
|
|
156
|
+
return self.yaml_repo.file_exists
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
"""YAML-based suppression repository (.raxe/suppressions.yaml).
|
|
2
|
+
|
|
3
|
+
This infrastructure layer module handles ALL YAML file I/O operations:
|
|
4
|
+
- Reading .raxe/suppressions.yaml files
|
|
5
|
+
- Writing .raxe/suppressions.yaml files
|
|
6
|
+
- Parsing suppression entries with full validation
|
|
7
|
+
- Error handling with graceful degradation
|
|
8
|
+
|
|
9
|
+
File format (v1.0):
|
|
10
|
+
```yaml
|
|
11
|
+
version: "1.0"
|
|
12
|
+
suppressions:
|
|
13
|
+
- pattern: "pi-001"
|
|
14
|
+
reason: "Known false positive in authentication flow"
|
|
15
|
+
expires: "2025-06-01"
|
|
16
|
+
|
|
17
|
+
- pattern: "jb-*"
|
|
18
|
+
action: FLAG
|
|
19
|
+
reason: "Under investigation by security team"
|
|
20
|
+
|
|
21
|
+
- pattern: "enc-003"
|
|
22
|
+
action: LOG
|
|
23
|
+
reason: "Monitoring for false positive rate"
|
|
24
|
+
expires: "2025-03-01"
|
|
25
|
+
```
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import logging
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from typing import Any
|
|
32
|
+
|
|
33
|
+
from raxe.domain.suppression import (
|
|
34
|
+
AuditEntry,
|
|
35
|
+
Suppression,
|
|
36
|
+
SuppressionAction,
|
|
37
|
+
SuppressionValidationError,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
# Schema version supported by this repository
|
|
43
|
+
SUPPORTED_SCHEMA_VERSION = "1.0"
|
|
44
|
+
|
|
45
|
+
# Default location for suppressions YAML file
|
|
46
|
+
DEFAULT_SUPPRESSIONS_PATH = ".raxe/suppressions.yaml"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class YamlSuppressionRepository:
|
|
50
|
+
"""Repository that loads/saves suppressions from .raxe/suppressions.yaml files.
|
|
51
|
+
|
|
52
|
+
This repository provides a more structured YAML format compared to the
|
|
53
|
+
legacy .raxeignore file format. It supports:
|
|
54
|
+
- Explicit version control
|
|
55
|
+
- Action overrides (SUPPRESS, FLAG, LOG)
|
|
56
|
+
- Expiration dates
|
|
57
|
+
- Better validation and error messages
|
|
58
|
+
|
|
59
|
+
Handles:
|
|
60
|
+
- YAML file I/O operations
|
|
61
|
+
- Schema validation
|
|
62
|
+
- Graceful error handling (invalid entries logged and skipped)
|
|
63
|
+
- Directory creation
|
|
64
|
+
|
|
65
|
+
Does NOT handle:
|
|
66
|
+
- Audit logging (use SQLiteSuppressionRepository for that)
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, config_path: Path | None = None) -> None:
|
|
70
|
+
"""Initialize YAML repository.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
config_path: Path to suppressions.yaml file.
|
|
74
|
+
Default: ./.raxe/suppressions.yaml
|
|
75
|
+
"""
|
|
76
|
+
if config_path is None:
|
|
77
|
+
config_path = Path.cwd() / DEFAULT_SUPPRESSIONS_PATH
|
|
78
|
+
|
|
79
|
+
self.config_path = Path(config_path)
|
|
80
|
+
self._suppressions: dict[str, Suppression] = {}
|
|
81
|
+
|
|
82
|
+
def load_suppressions(self) -> list[Suppression]:
|
|
83
|
+
"""Load suppressions from .raxe/suppressions.yaml file.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
List of valid Suppression objects. Invalid entries are logged
|
|
87
|
+
and skipped. If the file doesn't exist, returns empty list.
|
|
88
|
+
|
|
89
|
+
Note:
|
|
90
|
+
This method does not raise exceptions for missing files or
|
|
91
|
+
invalid entries. It logs warnings and continues gracefully.
|
|
92
|
+
"""
|
|
93
|
+
if not self.config_path.exists():
|
|
94
|
+
logger.debug(
|
|
95
|
+
"suppression_yaml_not_found",
|
|
96
|
+
extra={"path": str(self.config_path)},
|
|
97
|
+
)
|
|
98
|
+
return []
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
# Import yaml here to avoid dependency issues if not installed
|
|
102
|
+
import yaml # type: ignore[import-untyped]
|
|
103
|
+
except ImportError:
|
|
104
|
+
logger.warning(
|
|
105
|
+
"yaml_module_not_available",
|
|
106
|
+
extra={
|
|
107
|
+
"message": "PyYAML not installed, cannot load suppressions.yaml"
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
return []
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
with open(self.config_path, encoding="utf-8") as f:
|
|
114
|
+
data = yaml.safe_load(f)
|
|
115
|
+
except yaml.YAMLError as e:
|
|
116
|
+
logger.warning(
|
|
117
|
+
"yaml_parse_error",
|
|
118
|
+
extra={
|
|
119
|
+
"path": str(self.config_path),
|
|
120
|
+
"error": str(e),
|
|
121
|
+
},
|
|
122
|
+
)
|
|
123
|
+
return []
|
|
124
|
+
except OSError as e:
|
|
125
|
+
logger.warning(
|
|
126
|
+
"yaml_file_read_error",
|
|
127
|
+
extra={
|
|
128
|
+
"path": str(self.config_path),
|
|
129
|
+
"error": str(e),
|
|
130
|
+
},
|
|
131
|
+
)
|
|
132
|
+
return []
|
|
133
|
+
|
|
134
|
+
if data is None:
|
|
135
|
+
logger.debug(
|
|
136
|
+
"yaml_file_empty",
|
|
137
|
+
extra={"path": str(self.config_path)},
|
|
138
|
+
)
|
|
139
|
+
return []
|
|
140
|
+
|
|
141
|
+
return self._parse_yaml_data(data)
|
|
142
|
+
|
|
143
|
+
def _parse_yaml_data(self, data: dict[str, Any]) -> list[Suppression]:
|
|
144
|
+
"""Parse YAML data into Suppression objects.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
data: Parsed YAML data dictionary
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
List of valid Suppression objects
|
|
151
|
+
"""
|
|
152
|
+
# Validate schema version
|
|
153
|
+
version = data.get("version", "1.0")
|
|
154
|
+
if version != SUPPORTED_SCHEMA_VERSION:
|
|
155
|
+
logger.warning(
|
|
156
|
+
"yaml_unsupported_version",
|
|
157
|
+
extra={
|
|
158
|
+
"version": version,
|
|
159
|
+
"supported": SUPPORTED_SCHEMA_VERSION,
|
|
160
|
+
"path": str(self.config_path),
|
|
161
|
+
},
|
|
162
|
+
)
|
|
163
|
+
# Continue anyway - try to parse what we can
|
|
164
|
+
|
|
165
|
+
suppressions_data = data.get("suppressions", [])
|
|
166
|
+
if not isinstance(suppressions_data, list):
|
|
167
|
+
logger.warning(
|
|
168
|
+
"yaml_invalid_suppressions_field",
|
|
169
|
+
extra={
|
|
170
|
+
"type": type(suppressions_data).__name__,
|
|
171
|
+
"path": str(self.config_path),
|
|
172
|
+
},
|
|
173
|
+
)
|
|
174
|
+
return []
|
|
175
|
+
|
|
176
|
+
suppressions: list[Suppression] = []
|
|
177
|
+
for idx, entry in enumerate(suppressions_data):
|
|
178
|
+
suppression = self._parse_suppression_entry(entry, idx)
|
|
179
|
+
if suppression is not None:
|
|
180
|
+
suppressions.append(suppression)
|
|
181
|
+
|
|
182
|
+
logger.info(
|
|
183
|
+
"yaml_suppressions_loaded",
|
|
184
|
+
extra={
|
|
185
|
+
"count": len(suppressions),
|
|
186
|
+
"path": str(self.config_path),
|
|
187
|
+
},
|
|
188
|
+
)
|
|
189
|
+
return suppressions
|
|
190
|
+
|
|
191
|
+
def _parse_suppression_entry(
|
|
192
|
+
self,
|
|
193
|
+
entry: Any,
|
|
194
|
+
index: int,
|
|
195
|
+
) -> Suppression | None:
|
|
196
|
+
"""Parse a single suppression entry from YAML.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
entry: Raw entry data from YAML
|
|
200
|
+
index: Index in the suppressions list (for error messages)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Suppression object if valid, None if invalid
|
|
204
|
+
"""
|
|
205
|
+
if not isinstance(entry, dict):
|
|
206
|
+
logger.warning(
|
|
207
|
+
"yaml_invalid_entry_type",
|
|
208
|
+
extra={
|
|
209
|
+
"index": index,
|
|
210
|
+
"type": type(entry).__name__,
|
|
211
|
+
"path": str(self.config_path),
|
|
212
|
+
},
|
|
213
|
+
)
|
|
214
|
+
return None
|
|
215
|
+
|
|
216
|
+
# Extract and validate pattern (required)
|
|
217
|
+
pattern = entry.get("pattern")
|
|
218
|
+
if not pattern:
|
|
219
|
+
logger.warning(
|
|
220
|
+
"yaml_missing_pattern",
|
|
221
|
+
extra={
|
|
222
|
+
"index": index,
|
|
223
|
+
"path": str(self.config_path),
|
|
224
|
+
},
|
|
225
|
+
)
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
pattern = str(pattern).strip()
|
|
229
|
+
|
|
230
|
+
# Validate pattern is not bare wildcard
|
|
231
|
+
if pattern == "*":
|
|
232
|
+
logger.warning(
|
|
233
|
+
"yaml_bare_wildcard_forbidden",
|
|
234
|
+
extra={
|
|
235
|
+
"index": index,
|
|
236
|
+
"pattern": pattern,
|
|
237
|
+
"path": str(self.config_path),
|
|
238
|
+
"hint": "Use family prefix like 'pi-*' instead of '*'",
|
|
239
|
+
},
|
|
240
|
+
)
|
|
241
|
+
return None
|
|
242
|
+
|
|
243
|
+
# Extract and validate reason (required)
|
|
244
|
+
reason = entry.get("reason")
|
|
245
|
+
if not reason:
|
|
246
|
+
logger.warning(
|
|
247
|
+
"yaml_missing_reason",
|
|
248
|
+
extra={
|
|
249
|
+
"index": index,
|
|
250
|
+
"pattern": pattern,
|
|
251
|
+
"path": str(self.config_path),
|
|
252
|
+
},
|
|
253
|
+
)
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
reason = str(reason).strip()
|
|
257
|
+
|
|
258
|
+
# Extract and validate action (optional, default: SUPPRESS)
|
|
259
|
+
action = SuppressionAction.SUPPRESS
|
|
260
|
+
action_str = entry.get("action")
|
|
261
|
+
if action_str is not None:
|
|
262
|
+
action_str = str(action_str).strip().upper()
|
|
263
|
+
try:
|
|
264
|
+
action = SuppressionAction(action_str)
|
|
265
|
+
except ValueError:
|
|
266
|
+
valid_actions = [a.value for a in SuppressionAction]
|
|
267
|
+
logger.warning(
|
|
268
|
+
"yaml_invalid_action",
|
|
269
|
+
extra={
|
|
270
|
+
"index": index,
|
|
271
|
+
"pattern": pattern,
|
|
272
|
+
"action": action_str,
|
|
273
|
+
"valid_actions": valid_actions,
|
|
274
|
+
"path": str(self.config_path),
|
|
275
|
+
},
|
|
276
|
+
)
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
# Extract and validate expires (optional)
|
|
280
|
+
expires_at: str | None = None
|
|
281
|
+
expires_str = entry.get("expires")
|
|
282
|
+
if expires_str is not None:
|
|
283
|
+
expires_at = self._parse_expiration_date(expires_str, index, pattern)
|
|
284
|
+
if expires_str is not None and expires_at is None:
|
|
285
|
+
# Invalid date format - skip this entry
|
|
286
|
+
return None
|
|
287
|
+
|
|
288
|
+
# Create suppression
|
|
289
|
+
try:
|
|
290
|
+
suppression = Suppression(
|
|
291
|
+
pattern=pattern,
|
|
292
|
+
reason=reason,
|
|
293
|
+
action=action,
|
|
294
|
+
expires_at=expires_at,
|
|
295
|
+
created_at=datetime.now(timezone.utc).isoformat(),
|
|
296
|
+
created_by=f"yaml:{self.config_path.name}",
|
|
297
|
+
)
|
|
298
|
+
return suppression
|
|
299
|
+
except SuppressionValidationError as e:
|
|
300
|
+
logger.warning(
|
|
301
|
+
"yaml_suppression_validation_failed",
|
|
302
|
+
extra={
|
|
303
|
+
"index": index,
|
|
304
|
+
"pattern": pattern,
|
|
305
|
+
"error": str(e),
|
|
306
|
+
"path": str(self.config_path),
|
|
307
|
+
},
|
|
308
|
+
)
|
|
309
|
+
return None
|
|
310
|
+
|
|
311
|
+
def _parse_expiration_date(
|
|
312
|
+
self,
|
|
313
|
+
expires_str: Any,
|
|
314
|
+
index: int,
|
|
315
|
+
pattern: str,
|
|
316
|
+
) -> str | None:
|
|
317
|
+
"""Parse and validate expiration date.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
expires_str: Raw expiration date string
|
|
321
|
+
index: Entry index for error messages
|
|
322
|
+
pattern: Pattern for error messages
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
ISO format date string if valid, None if invalid
|
|
326
|
+
"""
|
|
327
|
+
expires_str = str(expires_str).strip()
|
|
328
|
+
|
|
329
|
+
# Try parsing as ISO date (YYYY-MM-DD)
|
|
330
|
+
try:
|
|
331
|
+
# Parse as date only (no time)
|
|
332
|
+
expiry_date = datetime.strptime(expires_str, "%Y-%m-%d")
|
|
333
|
+
# Convert to end of day UTC
|
|
334
|
+
expiry_datetime = expiry_date.replace(
|
|
335
|
+
hour=23, minute=59, second=59, tzinfo=timezone.utc
|
|
336
|
+
)
|
|
337
|
+
return expiry_datetime.isoformat()
|
|
338
|
+
except ValueError:
|
|
339
|
+
pass
|
|
340
|
+
|
|
341
|
+
# Try parsing as full ISO datetime
|
|
342
|
+
try:
|
|
343
|
+
expiry_datetime = datetime.fromisoformat(expires_str)
|
|
344
|
+
# Ensure timezone aware
|
|
345
|
+
if expiry_datetime.tzinfo is None:
|
|
346
|
+
expiry_datetime = expiry_datetime.replace(tzinfo=timezone.utc)
|
|
347
|
+
return expiry_datetime.isoformat()
|
|
348
|
+
except ValueError:
|
|
349
|
+
pass
|
|
350
|
+
|
|
351
|
+
logger.warning(
|
|
352
|
+
"yaml_invalid_expiration_date",
|
|
353
|
+
extra={
|
|
354
|
+
"index": index,
|
|
355
|
+
"pattern": pattern,
|
|
356
|
+
"expires": expires_str,
|
|
357
|
+
"hint": "Use ISO format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS",
|
|
358
|
+
"path": str(self.config_path),
|
|
359
|
+
},
|
|
360
|
+
)
|
|
361
|
+
return None
|
|
362
|
+
|
|
363
|
+
def save_suppression(self, suppression: Suppression) -> None:
|
|
364
|
+
"""Save a single suppression (adds to in-memory cache).
|
|
365
|
+
|
|
366
|
+
Note: This only updates the in-memory cache.
|
|
367
|
+
Call save_all_suppressions() to persist to file.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
suppression: Suppression to save
|
|
371
|
+
"""
|
|
372
|
+
self._suppressions[suppression.pattern] = suppression
|
|
373
|
+
|
|
374
|
+
def remove_suppression(self, pattern: str) -> bool:
|
|
375
|
+
"""Remove a suppression from in-memory cache.
|
|
376
|
+
|
|
377
|
+
Note: This only updates the in-memory cache.
|
|
378
|
+
Call save_all_suppressions() to persist to file.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
pattern: Pattern to remove
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
True if removed, False if not found
|
|
385
|
+
"""
|
|
386
|
+
if pattern in self._suppressions:
|
|
387
|
+
del self._suppressions[pattern]
|
|
388
|
+
return True
|
|
389
|
+
return False
|
|
390
|
+
|
|
391
|
+
def save_all_suppressions(self, suppressions: list[Suppression]) -> None:
|
|
392
|
+
"""Replace all suppressions and write to .raxe/suppressions.yaml file.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
suppressions: List of suppressions to save
|
|
396
|
+
"""
|
|
397
|
+
try:
|
|
398
|
+
import yaml
|
|
399
|
+
except ImportError:
|
|
400
|
+
logger.error(
|
|
401
|
+
"yaml_module_not_available",
|
|
402
|
+
extra={
|
|
403
|
+
"message": "PyYAML not installed, cannot save suppressions.yaml"
|
|
404
|
+
},
|
|
405
|
+
)
|
|
406
|
+
return
|
|
407
|
+
|
|
408
|
+
# Ensure directory exists
|
|
409
|
+
self.config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
410
|
+
|
|
411
|
+
# Build YAML data structure
|
|
412
|
+
data: dict[str, Any] = {
|
|
413
|
+
"version": SUPPORTED_SCHEMA_VERSION,
|
|
414
|
+
"suppressions": [],
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
for suppression in sorted(suppressions, key=lambda s: s.pattern):
|
|
418
|
+
entry: dict[str, Any] = {
|
|
419
|
+
"pattern": suppression.pattern,
|
|
420
|
+
"reason": suppression.reason,
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# Only include action if not default
|
|
424
|
+
if suppression.action != SuppressionAction.SUPPRESS:
|
|
425
|
+
entry["action"] = suppression.action.value
|
|
426
|
+
|
|
427
|
+
# Convert expires_at back to date format if possible
|
|
428
|
+
if suppression.expires_at:
|
|
429
|
+
entry["expires"] = self._format_expiration_date(suppression.expires_at)
|
|
430
|
+
|
|
431
|
+
data["suppressions"].append(entry)
|
|
432
|
+
|
|
433
|
+
# Write YAML file with header comment
|
|
434
|
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
435
|
+
f.write("# RAXE Suppressions Configuration\n")
|
|
436
|
+
f.write("# Format: .raxe/suppressions.yaml\n")
|
|
437
|
+
f.write("# Documentation: https://docs.raxe.ai/suppressions\n")
|
|
438
|
+
f.write("#\n")
|
|
439
|
+
f.write(f"# Generated at: {datetime.now(timezone.utc).isoformat()}\n")
|
|
440
|
+
f.write("# DO NOT EDIT MANUALLY unless you know what you're doing\n")
|
|
441
|
+
f.write("\n")
|
|
442
|
+
yaml.dump(data, f, default_flow_style=False, sort_keys=False)
|
|
443
|
+
|
|
444
|
+
logger.info(
|
|
445
|
+
"yaml_suppressions_saved",
|
|
446
|
+
extra={
|
|
447
|
+
"count": len(suppressions),
|
|
448
|
+
"path": str(self.config_path),
|
|
449
|
+
},
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
def _format_expiration_date(self, iso_datetime: str) -> str:
|
|
453
|
+
"""Format ISO datetime back to simple date if possible.
|
|
454
|
+
|
|
455
|
+
Args:
|
|
456
|
+
iso_datetime: ISO format datetime string
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
YYYY-MM-DD format if time is end of day, otherwise full ISO
|
|
460
|
+
"""
|
|
461
|
+
try:
|
|
462
|
+
dt = datetime.fromisoformat(iso_datetime)
|
|
463
|
+
# If it's end of day, just return the date
|
|
464
|
+
if dt.hour == 23 and dt.minute == 59 and dt.second == 59:
|
|
465
|
+
return dt.strftime("%Y-%m-%d")
|
|
466
|
+
return iso_datetime
|
|
467
|
+
except ValueError:
|
|
468
|
+
return iso_datetime
|
|
469
|
+
|
|
470
|
+
def log_audit(self, entry: AuditEntry) -> None:
|
|
471
|
+
"""Log audit entry (NO-OP for YAML repository).
|
|
472
|
+
|
|
473
|
+
YAML repository doesn't support audit logging.
|
|
474
|
+
Use SQLiteSuppressionRepository or CompositeSuppressionRepository.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
entry: Audit entry to log (ignored)
|
|
478
|
+
"""
|
|
479
|
+
# NO-OP: YAML repository doesn't do audit logging
|
|
480
|
+
pass
|
|
481
|
+
|
|
482
|
+
def get_audit_log(
|
|
483
|
+
self,
|
|
484
|
+
limit: int = 100,
|
|
485
|
+
pattern: str | None = None,
|
|
486
|
+
action: str | None = None,
|
|
487
|
+
) -> list[dict[str, Any]]:
|
|
488
|
+
"""Get audit log entries (NO-OP for YAML repository).
|
|
489
|
+
|
|
490
|
+
YAML repository doesn't support audit logging.
|
|
491
|
+
Use SQLiteSuppressionRepository or CompositeSuppressionRepository.
|
|
492
|
+
|
|
493
|
+
Args:
|
|
494
|
+
limit: Maximum entries to return (ignored)
|
|
495
|
+
pattern: Filter by pattern (ignored)
|
|
496
|
+
action: Filter by action (ignored)
|
|
497
|
+
|
|
498
|
+
Returns:
|
|
499
|
+
Empty list (no audit log stored)
|
|
500
|
+
"""
|
|
501
|
+
return []
|
|
502
|
+
|
|
503
|
+
@property
|
|
504
|
+
def file_exists(self) -> bool:
|
|
505
|
+
"""Check if the configuration file exists.
|
|
506
|
+
|
|
507
|
+
Returns:
|
|
508
|
+
True if file exists, False otherwise
|
|
509
|
+
"""
|
|
510
|
+
return self.config_path.exists()
|