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,215 @@
|
|
|
1
|
+
"""Scoped suppression context manager for SDK.
|
|
2
|
+
|
|
3
|
+
Provides a context manager that temporarily applies suppressions
|
|
4
|
+
to all scans within its scope.
|
|
5
|
+
|
|
6
|
+
Example:
|
|
7
|
+
with raxe.suppressed("pi-*", reason="Testing auth flow"):
|
|
8
|
+
result = raxe.scan(text)
|
|
9
|
+
# All scans within this block have pi-* suppressed
|
|
10
|
+
|
|
11
|
+
Clean Architecture:
|
|
12
|
+
- SDK layer convenience that wraps domain suppression logic
|
|
13
|
+
- Thread-safe using contextvars
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import contextvars
|
|
18
|
+
from collections.abc import Iterator
|
|
19
|
+
from contextlib import contextmanager
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from datetime import datetime, timezone
|
|
22
|
+
from typing import TYPE_CHECKING, Any
|
|
23
|
+
|
|
24
|
+
from raxe.domain.suppression import Suppression, SuppressionAction
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from raxe.sdk.client import Raxe
|
|
28
|
+
|
|
29
|
+
# Thread-local storage for scoped suppressions
|
|
30
|
+
# Note: We use a factory function to avoid mutable default issues
|
|
31
|
+
_scoped_suppressions: contextvars.ContextVar[list[Suppression]] = contextvars.ContextVar(
|
|
32
|
+
"scoped_suppressions"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _get_or_init_scoped_suppressions() -> list[Suppression]:
|
|
37
|
+
"""Get scoped suppressions, initializing with empty list if needed."""
|
|
38
|
+
try:
|
|
39
|
+
return _scoped_suppressions.get()
|
|
40
|
+
except LookupError:
|
|
41
|
+
# First access in this context - initialize with empty list
|
|
42
|
+
empty_list: list[Suppression] = []
|
|
43
|
+
_scoped_suppressions.set(empty_list)
|
|
44
|
+
return empty_list
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass(frozen=True)
|
|
48
|
+
class ScopedSuppressionConfig:
|
|
49
|
+
"""Configuration for scoped suppression.
|
|
50
|
+
|
|
51
|
+
Attributes:
|
|
52
|
+
pattern: Rule ID pattern to suppress
|
|
53
|
+
action: Action to take (default: SUPPRESS)
|
|
54
|
+
reason: Reason for suppression
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
pattern: str
|
|
58
|
+
action: SuppressionAction = SuppressionAction.SUPPRESS
|
|
59
|
+
reason: str = "Scoped suppression"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_scoped_suppressions() -> list[Suppression]:
|
|
63
|
+
"""Get current thread's scoped suppressions.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
List of suppressions active in the current context
|
|
67
|
+
"""
|
|
68
|
+
return _get_or_init_scoped_suppressions()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _create_scoped_suppression(
|
|
72
|
+
pattern: str,
|
|
73
|
+
*,
|
|
74
|
+
action: SuppressionAction = SuppressionAction.SUPPRESS,
|
|
75
|
+
reason: str = "Scoped suppression",
|
|
76
|
+
) -> Suppression:
|
|
77
|
+
"""Create a scoped suppression.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
pattern: Rule ID pattern
|
|
81
|
+
action: Action to take
|
|
82
|
+
reason: Reason for suppression
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Suppression object
|
|
86
|
+
"""
|
|
87
|
+
return Suppression(
|
|
88
|
+
pattern=pattern,
|
|
89
|
+
reason=reason,
|
|
90
|
+
action=action,
|
|
91
|
+
created_at=datetime.now(timezone.utc).isoformat(),
|
|
92
|
+
created_by="scoped",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@contextmanager
|
|
97
|
+
def suppression_scope(
|
|
98
|
+
*patterns: str,
|
|
99
|
+
action: SuppressionAction | str = SuppressionAction.SUPPRESS,
|
|
100
|
+
reason: str = "Scoped suppression",
|
|
101
|
+
) -> Iterator[None]:
|
|
102
|
+
"""Context manager for scoped suppression.
|
|
103
|
+
|
|
104
|
+
All scans within the context will have the specified patterns suppressed.
|
|
105
|
+
This is thread-safe using contextvars.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
*patterns: One or more rule ID patterns to suppress
|
|
109
|
+
action: Action to take (SUPPRESS, FLAG, or LOG)
|
|
110
|
+
reason: Reason for suppression
|
|
111
|
+
|
|
112
|
+
Yields:
|
|
113
|
+
None
|
|
114
|
+
|
|
115
|
+
Example:
|
|
116
|
+
with suppression_scope("pi-*", "jb-*", reason="Testing"):
|
|
117
|
+
result = pipeline.scan(text)
|
|
118
|
+
# pi-* and jb-* patterns are suppressed
|
|
119
|
+
"""
|
|
120
|
+
# Convert string action to enum if needed
|
|
121
|
+
if isinstance(action, str):
|
|
122
|
+
action = SuppressionAction(action.upper())
|
|
123
|
+
|
|
124
|
+
# Create suppressions for all patterns
|
|
125
|
+
new_suppressions = [
|
|
126
|
+
_create_scoped_suppression(pattern, action=action, reason=reason)
|
|
127
|
+
for pattern in patterns
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
# Get current suppressions and add new ones
|
|
131
|
+
current = _get_or_init_scoped_suppressions()
|
|
132
|
+
combined = list(current) + new_suppressions
|
|
133
|
+
|
|
134
|
+
# Set new suppressions
|
|
135
|
+
token = _scoped_suppressions.set(combined)
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
yield
|
|
139
|
+
finally:
|
|
140
|
+
# Restore previous suppressions
|
|
141
|
+
_scoped_suppressions.reset(token)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class SuppressedContext:
|
|
145
|
+
"""Context manager bound to a specific Raxe client.
|
|
146
|
+
|
|
147
|
+
This is returned by Raxe.suppressed() and provides a more
|
|
148
|
+
convenient API that's bound to the client instance.
|
|
149
|
+
|
|
150
|
+
Example:
|
|
151
|
+
raxe = Raxe()
|
|
152
|
+
with raxe.suppressed("pi-*", reason="Testing"):
|
|
153
|
+
result = raxe.scan(text)
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
def __init__(
|
|
157
|
+
self,
|
|
158
|
+
client: Raxe,
|
|
159
|
+
*patterns: str,
|
|
160
|
+
action: SuppressionAction | str = SuppressionAction.SUPPRESS,
|
|
161
|
+
reason: str = "Scoped suppression",
|
|
162
|
+
) -> None:
|
|
163
|
+
"""Initialize suppressed context.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
client: The Raxe client this context is bound to
|
|
167
|
+
*patterns: Rule ID patterns to suppress
|
|
168
|
+
action: Action to take
|
|
169
|
+
reason: Reason for suppression
|
|
170
|
+
"""
|
|
171
|
+
self._client = client
|
|
172
|
+
self._patterns = patterns
|
|
173
|
+
self._action = action
|
|
174
|
+
self._reason = reason
|
|
175
|
+
self._token: contextvars.Token[list[Suppression]] | None = None
|
|
176
|
+
|
|
177
|
+
def __enter__(self) -> SuppressedContext:
|
|
178
|
+
"""Enter the suppression context."""
|
|
179
|
+
# Convert string action to enum if needed
|
|
180
|
+
action = self._action
|
|
181
|
+
if isinstance(action, str):
|
|
182
|
+
action = SuppressionAction(action.upper())
|
|
183
|
+
|
|
184
|
+
# Create suppressions for all patterns
|
|
185
|
+
new_suppressions = [
|
|
186
|
+
_create_scoped_suppression(pattern, action=action, reason=self._reason)
|
|
187
|
+
for pattern in self._patterns
|
|
188
|
+
]
|
|
189
|
+
|
|
190
|
+
# Get current suppressions and add new ones
|
|
191
|
+
current = _get_or_init_scoped_suppressions()
|
|
192
|
+
combined = list(current) + new_suppressions
|
|
193
|
+
|
|
194
|
+
# Set new suppressions
|
|
195
|
+
self._token = _scoped_suppressions.set(combined)
|
|
196
|
+
return self
|
|
197
|
+
|
|
198
|
+
def __exit__(
|
|
199
|
+
self,
|
|
200
|
+
exc_type: type[BaseException] | None,
|
|
201
|
+
exc_val: BaseException | None,
|
|
202
|
+
exc_tb: Any,
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Exit the suppression context."""
|
|
205
|
+
if self._token is not None:
|
|
206
|
+
_scoped_suppressions.reset(self._token)
|
|
207
|
+
self._token = None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
__all__ = [
|
|
211
|
+
"ScopedSuppressionConfig",
|
|
212
|
+
"SuppressedContext",
|
|
213
|
+
"get_scoped_suppressions",
|
|
214
|
+
"suppression_scope",
|
|
215
|
+
]
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""LLM Client Wrappers.
|
|
2
|
+
|
|
3
|
+
Drop-in replacements for popular LLM clients that add RAXE scanning.
|
|
4
|
+
|
|
5
|
+
This module provides wrappers for:
|
|
6
|
+
- OpenAI client wrapper (RaxeOpenAI)
|
|
7
|
+
- Anthropic client wrapper (RaxeAnthropic)
|
|
8
|
+
- Google Vertex AI wrapper (RaxeVertexAI)
|
|
9
|
+
- wrap_client() helper for runtime wrapping
|
|
10
|
+
|
|
11
|
+
Integrations are available via raxe.sdk.integrations:
|
|
12
|
+
- LangChain callback handler (RaxeCallbackHandler)
|
|
13
|
+
- Hugging Face pipeline wrapper (RaxePipeline)
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING, Any
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from raxe.sdk.client import Raxe
|
|
21
|
+
from raxe.sdk.wrappers.anthropic import RaxeAnthropic
|
|
22
|
+
from raxe.sdk.wrappers.openai import RaxeOpenAI
|
|
23
|
+
from raxe.sdk.wrappers.vertexai import RaxeVertexAI
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"RaxeAnthropic",
|
|
27
|
+
"RaxeOpenAI",
|
|
28
|
+
"RaxeVertexAI",
|
|
29
|
+
"wrap_client",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
# Availability flags
|
|
33
|
+
_OPENAI_AVAILABLE = False
|
|
34
|
+
_ANTHROPIC_AVAILABLE = False
|
|
35
|
+
_VERTEXAI_AVAILABLE = False
|
|
36
|
+
|
|
37
|
+
# Lazy imports to avoid requiring all dependencies
|
|
38
|
+
RaxeOpenAI = None
|
|
39
|
+
RaxeAnthropic = None
|
|
40
|
+
RaxeVertexAI = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def __getattr__(name: str):
|
|
44
|
+
"""Lazy import wrappers to avoid requiring all dependencies.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
name: Name of the wrapper to import
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
The requested wrapper class
|
|
51
|
+
|
|
52
|
+
Raises:
|
|
53
|
+
ImportError: If the wrapper's dependencies are not installed
|
|
54
|
+
AttributeError: If the wrapper name is not recognized
|
|
55
|
+
"""
|
|
56
|
+
global RaxeOpenAI, RaxeAnthropic, RaxeVertexAI
|
|
57
|
+
global _OPENAI_AVAILABLE, _ANTHROPIC_AVAILABLE, _VERTEXAI_AVAILABLE
|
|
58
|
+
|
|
59
|
+
if name == "RaxeOpenAI":
|
|
60
|
+
if RaxeOpenAI is None:
|
|
61
|
+
try:
|
|
62
|
+
from raxe.sdk.wrappers.openai import RaxeOpenAI as _RaxeOpenAI
|
|
63
|
+
RaxeOpenAI = _RaxeOpenAI
|
|
64
|
+
_OPENAI_AVAILABLE = True
|
|
65
|
+
except ImportError as e:
|
|
66
|
+
raise ImportError(
|
|
67
|
+
"OpenAI wrapper requires openai package. "
|
|
68
|
+
"Install with: pip install openai"
|
|
69
|
+
) from e
|
|
70
|
+
return RaxeOpenAI
|
|
71
|
+
|
|
72
|
+
elif name == "RaxeAnthropic":
|
|
73
|
+
if RaxeAnthropic is None:
|
|
74
|
+
try:
|
|
75
|
+
from raxe.sdk.wrappers.anthropic import RaxeAnthropic as _RaxeAnthropic
|
|
76
|
+
RaxeAnthropic = _RaxeAnthropic
|
|
77
|
+
_ANTHROPIC_AVAILABLE = True
|
|
78
|
+
except ImportError as e:
|
|
79
|
+
raise ImportError(
|
|
80
|
+
"Anthropic wrapper requires anthropic package. "
|
|
81
|
+
"Install with: pip install anthropic"
|
|
82
|
+
) from e
|
|
83
|
+
return RaxeAnthropic
|
|
84
|
+
|
|
85
|
+
elif name == "RaxeVertexAI":
|
|
86
|
+
if RaxeVertexAI is None:
|
|
87
|
+
try:
|
|
88
|
+
from raxe.sdk.wrappers.vertexai import RaxeVertexAI as _RaxeVertexAI
|
|
89
|
+
RaxeVertexAI = _RaxeVertexAI
|
|
90
|
+
_VERTEXAI_AVAILABLE = True
|
|
91
|
+
except ImportError as e:
|
|
92
|
+
raise ImportError(
|
|
93
|
+
"Vertex AI wrapper requires google-cloud-aiplatform package. "
|
|
94
|
+
"Install with: pip install google-cloud-aiplatform"
|
|
95
|
+
) from e
|
|
96
|
+
return RaxeVertexAI
|
|
97
|
+
|
|
98
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def wrap_client(raxe_client: Raxe, client: Any) -> Any:
|
|
102
|
+
"""Wrap an LLM client with RAXE scanning.
|
|
103
|
+
|
|
104
|
+
This helper function wraps an existing LLM client instance
|
|
105
|
+
with RAXE scanning capabilities. It detects the client type
|
|
106
|
+
and returns the appropriate wrapper.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
raxe_client: Raxe instance to use for scanning
|
|
110
|
+
client: LLM client to wrap (OpenAI, Anthropic, etc.)
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Wrapped client with automatic scanning
|
|
114
|
+
|
|
115
|
+
Raises:
|
|
116
|
+
ImportError: If required wrapper package not installed
|
|
117
|
+
NotImplementedError: If client type not supported
|
|
118
|
+
|
|
119
|
+
Usage:
|
|
120
|
+
>>> from raxe import Raxe
|
|
121
|
+
>>> from openai import OpenAI
|
|
122
|
+
>>> raxe = Raxe()
|
|
123
|
+
>>> client = raxe.wrap(OpenAI(api_key="sk-..."))
|
|
124
|
+
>>> # All calls automatically scanned
|
|
125
|
+
|
|
126
|
+
Supported Clients:
|
|
127
|
+
- openai.OpenAI -> RaxeOpenAI
|
|
128
|
+
- anthropic.Anthropic -> RaxeAnthropic
|
|
129
|
+
- More coming soon...
|
|
130
|
+
"""
|
|
131
|
+
client_type = type(client).__name__
|
|
132
|
+
|
|
133
|
+
if client_type == "OpenAI":
|
|
134
|
+
# Wrap OpenAI client - import directly from submodule to avoid lazy loading issues
|
|
135
|
+
from raxe.sdk.wrappers.openai import RaxeOpenAI
|
|
136
|
+
|
|
137
|
+
# Copy API key from original if available
|
|
138
|
+
api_key = getattr(client, "api_key", None)
|
|
139
|
+
|
|
140
|
+
# Create wrapped version with same config
|
|
141
|
+
# RaxeOpenAI inherits from OpenAI, so api_key is passed to the constructor
|
|
142
|
+
wrapped = RaxeOpenAI(api_key=api_key, raxe=raxe_client)
|
|
143
|
+
|
|
144
|
+
return wrapped
|
|
145
|
+
|
|
146
|
+
elif client_type == "Anthropic":
|
|
147
|
+
# Wrap Anthropic client - import directly from submodule to avoid lazy loading issues
|
|
148
|
+
from raxe.sdk.wrappers.anthropic import RaxeAnthropic
|
|
149
|
+
|
|
150
|
+
# Create wrapped version with same config
|
|
151
|
+
wrapped = RaxeAnthropic(raxe=raxe_client)
|
|
152
|
+
|
|
153
|
+
# Copy API key from original if available
|
|
154
|
+
if hasattr(client, "api_key"):
|
|
155
|
+
wrapped._anthropic_client.api_key = client.api_key
|
|
156
|
+
|
|
157
|
+
return wrapped
|
|
158
|
+
|
|
159
|
+
else:
|
|
160
|
+
raise NotImplementedError(
|
|
161
|
+
f"Wrapper for {client_type} not implemented yet. "
|
|
162
|
+
f"Supported: OpenAI, Anthropic"
|
|
163
|
+
)
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"""Anthropic client wrapper with automatic RAXE scanning.
|
|
2
|
+
|
|
3
|
+
Drop-in replacement for anthropic.Anthropic that scans all prompts and responses.
|
|
4
|
+
|
|
5
|
+
This wrapper allows users to replace:
|
|
6
|
+
from anthropic import Anthropic
|
|
7
|
+
client = Anthropic()
|
|
8
|
+
|
|
9
|
+
With:
|
|
10
|
+
from raxe.sdk.wrappers import RaxeAnthropic
|
|
11
|
+
client = RaxeAnthropic() # All calls automatically scanned
|
|
12
|
+
|
|
13
|
+
The wrapper intercepts messages.create calls, scans user messages
|
|
14
|
+
before sending to Claude, and optionally scans responses.
|
|
15
|
+
|
|
16
|
+
Default behavior is LOG-ONLY (safe to add to production without breaking flows).
|
|
17
|
+
Enable blocking with `raxe_block_on_threat=True` for strict mode.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import logging
|
|
22
|
+
from collections.abc import Iterator
|
|
23
|
+
from typing import TYPE_CHECKING, Any
|
|
24
|
+
|
|
25
|
+
from raxe.sdk.agent_scanner import (
|
|
26
|
+
AgentScannerConfig,
|
|
27
|
+
create_agent_scanner,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from raxe.sdk.client import Raxe
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class RaxeAnthropic:
|
|
37
|
+
"""Drop-in replacement for anthropic.Anthropic with automatic scanning.
|
|
38
|
+
|
|
39
|
+
This wrapper wraps the Anthropic client and intercepts all
|
|
40
|
+
messages.create calls to scan prompts and responses.
|
|
41
|
+
|
|
42
|
+
Usage:
|
|
43
|
+
# Instead of:
|
|
44
|
+
from anthropic import Anthropic
|
|
45
|
+
client = Anthropic(api_key="sk-ant-...")
|
|
46
|
+
|
|
47
|
+
# Use:
|
|
48
|
+
from raxe.sdk.wrappers import RaxeAnthropic
|
|
49
|
+
client = RaxeAnthropic(api_key="sk-ant-...")
|
|
50
|
+
|
|
51
|
+
# All messages.create calls are automatically scanned
|
|
52
|
+
response = client.messages.create(
|
|
53
|
+
model="claude-3-opus-20240229",
|
|
54
|
+
messages=[{"role": "user", "content": "Hello"}]
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
Attributes:
|
|
58
|
+
raxe: Raxe client instance for scanning
|
|
59
|
+
raxe_block_on_threat: Whether to block requests on threat detection
|
|
60
|
+
raxe_scan_responses: Whether to scan Claude responses
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(
|
|
64
|
+
self,
|
|
65
|
+
*args,
|
|
66
|
+
raxe: Raxe | None = None,
|
|
67
|
+
raxe_block_on_threat: bool = False,
|
|
68
|
+
raxe_scan_responses: bool = True,
|
|
69
|
+
**kwargs
|
|
70
|
+
):
|
|
71
|
+
"""Initialize RaxeAnthropic client.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
*args: Passed to Anthropic.__init__
|
|
75
|
+
raxe: Optional Raxe client (creates default if not provided)
|
|
76
|
+
raxe_block_on_threat: Block requests on threat detection.
|
|
77
|
+
Default is False (log-only mode, safe for production).
|
|
78
|
+
raxe_scan_responses: Also scan Claude responses
|
|
79
|
+
**kwargs: Passed to Anthropic.__init__
|
|
80
|
+
|
|
81
|
+
Example:
|
|
82
|
+
# With default Raxe client (log-only mode)
|
|
83
|
+
client = RaxeAnthropic(api_key="sk-ant-...")
|
|
84
|
+
|
|
85
|
+
# With custom Raxe client
|
|
86
|
+
raxe = Raxe(telemetry=False)
|
|
87
|
+
client = RaxeAnthropic(api_key="sk-ant-...", raxe=raxe)
|
|
88
|
+
|
|
89
|
+
# Enable blocking (strict mode)
|
|
90
|
+
client = RaxeAnthropic(
|
|
91
|
+
api_key="sk-ant-...",
|
|
92
|
+
raxe_block_on_threat=True
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
ImportError: If anthropic package not installed
|
|
97
|
+
"""
|
|
98
|
+
# Try to import Anthropic
|
|
99
|
+
try:
|
|
100
|
+
from anthropic import Anthropic
|
|
101
|
+
except ImportError as e:
|
|
102
|
+
raise ImportError(
|
|
103
|
+
"anthropic package is required for RaxeAnthropic. "
|
|
104
|
+
"Install with: pip install anthropic"
|
|
105
|
+
) from e
|
|
106
|
+
|
|
107
|
+
# Initialize parent Anthropic client
|
|
108
|
+
self._anthropic_client = Anthropic(*args, **kwargs)
|
|
109
|
+
|
|
110
|
+
# Create or use provided Raxe client
|
|
111
|
+
if raxe is None:
|
|
112
|
+
from raxe.sdk.client import Raxe
|
|
113
|
+
raxe = Raxe()
|
|
114
|
+
|
|
115
|
+
self.raxe = raxe
|
|
116
|
+
self.raxe_block_on_threat = raxe_block_on_threat
|
|
117
|
+
self.raxe_scan_responses = raxe_scan_responses
|
|
118
|
+
|
|
119
|
+
# Create AgentScanner for unified scanning
|
|
120
|
+
config = AgentScannerConfig(
|
|
121
|
+
scan_prompts=True,
|
|
122
|
+
scan_responses=raxe_scan_responses,
|
|
123
|
+
on_threat="block" if raxe_block_on_threat else "log",
|
|
124
|
+
)
|
|
125
|
+
self._scanner = create_agent_scanner(raxe, config, integration_type="anthropic")
|
|
126
|
+
|
|
127
|
+
# Wrap the messages resource
|
|
128
|
+
self._wrap_messages()
|
|
129
|
+
|
|
130
|
+
logger.debug(
|
|
131
|
+
f"RaxeAnthropic initialized: block={raxe_block_on_threat}, "
|
|
132
|
+
f"scan_responses={raxe_scan_responses}"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
def _wrap_messages(self):
|
|
136
|
+
"""Wrap messages.create method with scanning."""
|
|
137
|
+
# Get original create method
|
|
138
|
+
original_create = self._anthropic_client.messages.create
|
|
139
|
+
|
|
140
|
+
def wrapped_create(*args, **kwargs):
|
|
141
|
+
"""Wrapped messages.create with RAXE scanning."""
|
|
142
|
+
# Extract messages
|
|
143
|
+
messages = kwargs.get("messages", [])
|
|
144
|
+
|
|
145
|
+
# Scan each user message
|
|
146
|
+
for message in messages:
|
|
147
|
+
if isinstance(message, dict):
|
|
148
|
+
# Handle dict-style messages
|
|
149
|
+
if message.get("role") == "user":
|
|
150
|
+
content = message.get("content", "")
|
|
151
|
+
if content:
|
|
152
|
+
self._scan_message(content)
|
|
153
|
+
elif hasattr(message, "role") and hasattr(message, "content"):
|
|
154
|
+
# Handle object-style messages
|
|
155
|
+
if message.role == "user":
|
|
156
|
+
self._scan_message(message.content)
|
|
157
|
+
|
|
158
|
+
# Check if streaming is requested
|
|
159
|
+
stream = kwargs.get("stream", False)
|
|
160
|
+
|
|
161
|
+
# Call original Anthropic
|
|
162
|
+
response = original_create(*args, **kwargs)
|
|
163
|
+
|
|
164
|
+
# Handle streaming and non-streaming differently
|
|
165
|
+
if stream:
|
|
166
|
+
# For streaming, wrap the iterator
|
|
167
|
+
return self._wrap_streaming_response(response)
|
|
168
|
+
else:
|
|
169
|
+
# For non-streaming, scan the complete response
|
|
170
|
+
if self.raxe_scan_responses:
|
|
171
|
+
self._scan_response(response)
|
|
172
|
+
return response
|
|
173
|
+
|
|
174
|
+
# Replace the method
|
|
175
|
+
self._anthropic_client.messages.create = wrapped_create
|
|
176
|
+
|
|
177
|
+
def _scan_message(self, content: Any):
|
|
178
|
+
"""Scan a user message for threats.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
content: Message content to scan (str or list of content blocks)
|
|
182
|
+
|
|
183
|
+
Raises:
|
|
184
|
+
ThreatDetectedError: If threat detected and blocking enabled
|
|
185
|
+
"""
|
|
186
|
+
# Extract text from content (may be string or list of blocks)
|
|
187
|
+
text = self._extract_text_from_content(content)
|
|
188
|
+
|
|
189
|
+
if not text:
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
# Use AgentScanner for unified scanning with integration telemetry
|
|
193
|
+
result = self._scanner.scan_prompt(text)
|
|
194
|
+
|
|
195
|
+
# AgentScanner handles blocking if configured
|
|
196
|
+
# Log for monitoring
|
|
197
|
+
if result.has_threats:
|
|
198
|
+
logger.warning(
|
|
199
|
+
f"Threat detected in user message: {result.severity} "
|
|
200
|
+
f"(action={result.action_taken})"
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
def _scan_response(self, response: Any):
|
|
204
|
+
"""Scan Claude response for threats.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
response: Anthropic response object
|
|
208
|
+
"""
|
|
209
|
+
try:
|
|
210
|
+
# Extract text from response content
|
|
211
|
+
if hasattr(response, "content"):
|
|
212
|
+
for content_block in response.content:
|
|
213
|
+
if hasattr(content_block, "text"):
|
|
214
|
+
text = content_block.text
|
|
215
|
+
if text:
|
|
216
|
+
# Scan response (AgentScanner handles blocking based on config)
|
|
217
|
+
result = self._scanner.scan_response(text)
|
|
218
|
+
if result.has_threats:
|
|
219
|
+
logger.info(
|
|
220
|
+
f"Threat detected in Claude response: {result.severity}"
|
|
221
|
+
)
|
|
222
|
+
except Exception as e:
|
|
223
|
+
# Don't fail on response scanning
|
|
224
|
+
logger.error(f"Failed to scan response: {e}")
|
|
225
|
+
|
|
226
|
+
def _wrap_streaming_response(self, stream: Iterator) -> Iterator:
|
|
227
|
+
"""Wrap streaming response to scan chunks.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
stream: Original streaming response iterator
|
|
231
|
+
|
|
232
|
+
Yields:
|
|
233
|
+
Response chunks with scanning
|
|
234
|
+
"""
|
|
235
|
+
accumulated_text = ""
|
|
236
|
+
|
|
237
|
+
for chunk in stream:
|
|
238
|
+
# Accumulate text from chunks
|
|
239
|
+
if hasattr(chunk, "delta") and hasattr(chunk.delta, "text"):
|
|
240
|
+
accumulated_text += chunk.delta.text
|
|
241
|
+
|
|
242
|
+
yield chunk
|
|
243
|
+
|
|
244
|
+
# Scan accumulated text after stream completes
|
|
245
|
+
if self.raxe_scan_responses and accumulated_text:
|
|
246
|
+
try:
|
|
247
|
+
result = self._scanner.scan_response(accumulated_text)
|
|
248
|
+
if result.has_threats:
|
|
249
|
+
logger.info(
|
|
250
|
+
f"Threat detected in Claude streaming response: {result.severity}"
|
|
251
|
+
)
|
|
252
|
+
except Exception as e:
|
|
253
|
+
logger.error(f"Failed to scan streaming response: {e}")
|
|
254
|
+
|
|
255
|
+
def _extract_text_from_content(self, content: Any) -> str:
|
|
256
|
+
"""Extract text from Anthropic content format.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
content: Content in various formats (str, list, etc.)
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
Extracted text string
|
|
263
|
+
"""
|
|
264
|
+
# Handle string content
|
|
265
|
+
if isinstance(content, str):
|
|
266
|
+
return content
|
|
267
|
+
|
|
268
|
+
# Handle list of content blocks
|
|
269
|
+
if isinstance(content, list):
|
|
270
|
+
texts = []
|
|
271
|
+
for block in content:
|
|
272
|
+
if isinstance(block, dict) and "text" in block:
|
|
273
|
+
texts.append(block["text"])
|
|
274
|
+
elif hasattr(block, "text"):
|
|
275
|
+
texts.append(block.text)
|
|
276
|
+
return " ".join(texts)
|
|
277
|
+
|
|
278
|
+
# Handle single content block
|
|
279
|
+
if isinstance(content, dict) and "text" in content:
|
|
280
|
+
return content["text"]
|
|
281
|
+
|
|
282
|
+
if hasattr(content, "text"):
|
|
283
|
+
return content.text
|
|
284
|
+
|
|
285
|
+
return ""
|
|
286
|
+
|
|
287
|
+
def __getattr__(self, name):
|
|
288
|
+
"""Proxy all other attributes to the Anthropic client.
|
|
289
|
+
|
|
290
|
+
This makes RaxeAnthropic a true drop-in replacement by forwarding
|
|
291
|
+
all attributes and methods we don't explicitly override.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
name: Attribute name
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
Attribute from underlying Anthropic client
|
|
298
|
+
"""
|
|
299
|
+
return getattr(self._anthropic_client, name)
|
|
300
|
+
|
|
301
|
+
def __repr__(self) -> str:
|
|
302
|
+
"""String representation of RaxeAnthropic client.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
Human-readable string
|
|
306
|
+
"""
|
|
307
|
+
return (
|
|
308
|
+
f"RaxeAnthropic(block_on_threat={self.raxe_block_on_threat}, "
|
|
309
|
+
f"scan_responses={self.raxe_scan_responses})"
|
|
310
|
+
)
|