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,135 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Utility functions for safe optional imports.
|
|
3
|
+
|
|
4
|
+
This module provides patterns for handling optional dependencies
|
|
5
|
+
in a type-safe and user-friendly way.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from contextlib import contextmanager
|
|
10
|
+
from typing import Any, TypeVar
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@contextmanager
|
|
16
|
+
def optional_import(package_name: str, install_hint: str):
|
|
17
|
+
"""
|
|
18
|
+
Context manager for optional imports with helpful error messages.
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
with optional_import("langchain", "pip install raxe[langchain]"):
|
|
22
|
+
from langchain.callbacks import BaseCallbackHandler
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
package_name: Name of the package being imported
|
|
26
|
+
install_hint: Installation command to show on error
|
|
27
|
+
|
|
28
|
+
Yields:
|
|
29
|
+
None
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
ImportError: With helpful message if import fails
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
yield
|
|
36
|
+
except ImportError as e:
|
|
37
|
+
raise ImportError(
|
|
38
|
+
f"Could not import {package_name}. "
|
|
39
|
+
f"This feature requires additional dependencies.\n"
|
|
40
|
+
f"Install with: {install_hint}\n"
|
|
41
|
+
f"Original error: {e}"
|
|
42
|
+
) from e
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def safe_import(
|
|
46
|
+
module_path: str,
|
|
47
|
+
attribute: str | None = None,
|
|
48
|
+
fallback: T | None = None,
|
|
49
|
+
) -> T | Any:
|
|
50
|
+
"""
|
|
51
|
+
Safely import a module or attribute, returning fallback on failure.
|
|
52
|
+
|
|
53
|
+
This is useful when you need a base class or type that may not
|
|
54
|
+
be available, and want to provide a fallback.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
module_path: Full module path (e.g., "langchain.callbacks")
|
|
58
|
+
attribute: Optional attribute to get from module
|
|
59
|
+
fallback: Value to return if import fails
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
The imported module/attribute or fallback value
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
# Use object as fallback base class when langchain not installed
|
|
66
|
+
BaseHandler = safe_import(
|
|
67
|
+
"langchain.callbacks.base",
|
|
68
|
+
"BaseCallbackHandler",
|
|
69
|
+
fallback=object
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
class MyHandler(BaseHandler):
|
|
73
|
+
...
|
|
74
|
+
"""
|
|
75
|
+
try:
|
|
76
|
+
import importlib
|
|
77
|
+
|
|
78
|
+
module = importlib.import_module(module_path)
|
|
79
|
+
if attribute:
|
|
80
|
+
return getattr(module, attribute)
|
|
81
|
+
return module
|
|
82
|
+
except (ImportError, AttributeError):
|
|
83
|
+
return fallback
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_version(package: str) -> str | None:
|
|
87
|
+
"""
|
|
88
|
+
Get the installed version of a package.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
package: Package name
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Version string or None if not installed
|
|
95
|
+
"""
|
|
96
|
+
try:
|
|
97
|
+
from importlib.metadata import version
|
|
98
|
+
|
|
99
|
+
return version(package)
|
|
100
|
+
except Exception:
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def check_version_compatibility(
|
|
105
|
+
package: str,
|
|
106
|
+
min_version: str | None = None,
|
|
107
|
+
max_version: str | None = None,
|
|
108
|
+
) -> tuple[bool, str | None]:
|
|
109
|
+
"""
|
|
110
|
+
Check if installed package version is compatible.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
package: Package name
|
|
114
|
+
min_version: Minimum required version (inclusive)
|
|
115
|
+
max_version: Maximum allowed version (exclusive)
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Tuple of (is_compatible, installed_version)
|
|
119
|
+
"""
|
|
120
|
+
from packaging.version import Version
|
|
121
|
+
|
|
122
|
+
installed = get_version(package)
|
|
123
|
+
if installed is None:
|
|
124
|
+
return False, None
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
ver = Version(installed)
|
|
128
|
+
if min_version and ver < Version(min_version):
|
|
129
|
+
return False, installed
|
|
130
|
+
if max_version and ver >= Version(max_version):
|
|
131
|
+
return False, installed
|
|
132
|
+
return True, installed
|
|
133
|
+
except Exception:
|
|
134
|
+
# If version parsing fails, assume compatible
|
|
135
|
+
return True, installed
|
raxe/mcp/__init__.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RAXE MCP (Model Context Protocol) Server.
|
|
3
|
+
|
|
4
|
+
This module provides an MCP server that exposes RAXE's threat detection
|
|
5
|
+
capabilities to AI assistants like Claude Desktop and IDE extensions.
|
|
6
|
+
|
|
7
|
+
Installation:
|
|
8
|
+
pip install raxe[mcp]
|
|
9
|
+
|
|
10
|
+
Usage (CLI):
|
|
11
|
+
raxe-mcp # Start server with stdio transport
|
|
12
|
+
raxe-mcp --transport sse # Start server with SSE transport
|
|
13
|
+
raxe-mcp --port 8765 # Specify port for HTTP transport
|
|
14
|
+
|
|
15
|
+
Usage (Python):
|
|
16
|
+
from raxe.mcp import create_server
|
|
17
|
+
server = create_server()
|
|
18
|
+
server.run()
|
|
19
|
+
|
|
20
|
+
Available Tools:
|
|
21
|
+
- scan_prompt: Scan a prompt for security threats
|
|
22
|
+
- get_scan_result: Get detailed result for a previous scan
|
|
23
|
+
- list_rules: List available detection rules
|
|
24
|
+
- get_rule_info: Get details about a specific rule
|
|
25
|
+
|
|
26
|
+
Available Resources:
|
|
27
|
+
- raxe://rules/{family}: Detection rules by family
|
|
28
|
+
- raxe://stats: Current scan statistics
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from typing import TYPE_CHECKING
|
|
33
|
+
|
|
34
|
+
from raxe.integrations.availability import require_integration
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from raxe.mcp.server import RaxeMCPServer
|
|
38
|
+
|
|
39
|
+
__all__ = ["create_server", "run_server", "RaxeMCPServer"]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def __getattr__(name: str):
|
|
43
|
+
"""Lazy import to avoid loading MCP dependencies until needed."""
|
|
44
|
+
if name == "create_server":
|
|
45
|
+
require_integration("mcp")
|
|
46
|
+
from raxe.mcp.server import create_server
|
|
47
|
+
|
|
48
|
+
return create_server
|
|
49
|
+
|
|
50
|
+
if name == "run_server":
|
|
51
|
+
require_integration("mcp")
|
|
52
|
+
from raxe.mcp.server import run_server
|
|
53
|
+
|
|
54
|
+
return run_server
|
|
55
|
+
|
|
56
|
+
if name == "RaxeMCPServer":
|
|
57
|
+
require_integration("mcp")
|
|
58
|
+
from raxe.mcp.server import RaxeMCPServer
|
|
59
|
+
|
|
60
|
+
return RaxeMCPServer
|
|
61
|
+
|
|
62
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
raxe/mcp/cli.py
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RAXE MCP Server CLI Entry Point.
|
|
3
|
+
|
|
4
|
+
This module provides the raxe-mcp command for running the MCP server.
|
|
5
|
+
Requires: pip install raxe[mcp]
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main() -> int:
|
|
13
|
+
"""
|
|
14
|
+
Main entry point for raxe-mcp command.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
Exit code (0 for success, non-zero for errors)
|
|
18
|
+
"""
|
|
19
|
+
# Check for MCP availability before importing heavy modules
|
|
20
|
+
try:
|
|
21
|
+
import mcp # noqa: F401
|
|
22
|
+
except ImportError:
|
|
23
|
+
print(
|
|
24
|
+
"ERROR: MCP dependencies not installed.\n"
|
|
25
|
+
"Install with: pip install raxe[mcp]",
|
|
26
|
+
file=sys.stderr,
|
|
27
|
+
)
|
|
28
|
+
return 1
|
|
29
|
+
|
|
30
|
+
# Parse command line arguments
|
|
31
|
+
import argparse
|
|
32
|
+
|
|
33
|
+
parser = argparse.ArgumentParser(
|
|
34
|
+
prog="raxe-mcp",
|
|
35
|
+
description="RAXE MCP Server - AI Security for LLM Assistants",
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument(
|
|
38
|
+
"--transport",
|
|
39
|
+
choices=["stdio", "sse"],
|
|
40
|
+
default="stdio",
|
|
41
|
+
help="Transport protocol (default: stdio)",
|
|
42
|
+
)
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"--host",
|
|
45
|
+
default="127.0.0.1",
|
|
46
|
+
help="Host to bind for SSE transport (default: 127.0.0.1)",
|
|
47
|
+
)
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"--port",
|
|
50
|
+
type=int,
|
|
51
|
+
default=8765,
|
|
52
|
+
help="Port to bind for SSE transport (default: 8765)",
|
|
53
|
+
)
|
|
54
|
+
parser.add_argument(
|
|
55
|
+
"--verbose",
|
|
56
|
+
"-v",
|
|
57
|
+
action="store_true",
|
|
58
|
+
help="Enable verbose logging",
|
|
59
|
+
)
|
|
60
|
+
parser.add_argument(
|
|
61
|
+
"--version",
|
|
62
|
+
action="store_true",
|
|
63
|
+
help="Show version and exit",
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
args = parser.parse_args()
|
|
67
|
+
|
|
68
|
+
if args.version:
|
|
69
|
+
from raxe import __version__
|
|
70
|
+
|
|
71
|
+
print(f"raxe-mcp {__version__}")
|
|
72
|
+
return 0
|
|
73
|
+
|
|
74
|
+
# Import server after confirming dependencies are available
|
|
75
|
+
try:
|
|
76
|
+
from raxe.mcp.server import run_server
|
|
77
|
+
|
|
78
|
+
return run_server(
|
|
79
|
+
transport=args.transport,
|
|
80
|
+
host=args.host,
|
|
81
|
+
port=args.port,
|
|
82
|
+
verbose=args.verbose,
|
|
83
|
+
)
|
|
84
|
+
except KeyboardInterrupt:
|
|
85
|
+
print("\nServer stopped.")
|
|
86
|
+
return 0
|
|
87
|
+
except Exception as e:
|
|
88
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
89
|
+
if args.verbose:
|
|
90
|
+
import traceback
|
|
91
|
+
|
|
92
|
+
traceback.print_exc()
|
|
93
|
+
return 1
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if __name__ == "__main__":
|
|
97
|
+
sys.exit(main())
|
raxe/mcp/server.py
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RAXE MCP Server Implementation.
|
|
3
|
+
|
|
4
|
+
This module implements the Model Context Protocol server for RAXE,
|
|
5
|
+
exposing threat detection capabilities to AI assistants.
|
|
6
|
+
|
|
7
|
+
The server is sync-first and uses the MCP SDK's synchronous APIs.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import time
|
|
13
|
+
from collections import defaultdict
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
# Security limits
|
|
17
|
+
MAX_TEXT_LENGTH = 100_000 # 100KB max input
|
|
18
|
+
MAX_CONTEXT_LENGTH = 1_000 # 1KB max context
|
|
19
|
+
RATE_LIMIT_RPM = 60 # 60 requests per minute per client
|
|
20
|
+
|
|
21
|
+
# These imports will fail if MCP is not installed
|
|
22
|
+
# The CLI entry point checks for this before importing this module
|
|
23
|
+
from mcp.server import Server
|
|
24
|
+
from mcp.server.stdio import stdio_server
|
|
25
|
+
from mcp.types import (
|
|
26
|
+
CallToolResult,
|
|
27
|
+
GetPromptResult,
|
|
28
|
+
ListPromptsResult,
|
|
29
|
+
ListResourcesResult,
|
|
30
|
+
ListToolsResult,
|
|
31
|
+
Prompt,
|
|
32
|
+
PromptArgument,
|
|
33
|
+
PromptMessage,
|
|
34
|
+
Resource,
|
|
35
|
+
TextContent,
|
|
36
|
+
Tool,
|
|
37
|
+
)
|
|
38
|
+
from pydantic import AnyUrl
|
|
39
|
+
|
|
40
|
+
from raxe import __version__
|
|
41
|
+
from raxe.sdk.client import Raxe
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class RateLimiter:
|
|
45
|
+
"""Simple in-memory rate limiter for MCP requests."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, requests_per_minute: int = RATE_LIMIT_RPM) -> None:
|
|
48
|
+
self.requests_per_minute = requests_per_minute
|
|
49
|
+
self._request_times: dict[str, list[float]] = defaultdict(list)
|
|
50
|
+
|
|
51
|
+
def allow(self, client_id: str = "default") -> bool:
|
|
52
|
+
"""Check if request is allowed under rate limit.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
client_id: Client identifier for per-client limiting
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
True if request is allowed, False if rate limited
|
|
59
|
+
"""
|
|
60
|
+
now = time.time()
|
|
61
|
+
window_start = now - 60 # 1 minute window
|
|
62
|
+
|
|
63
|
+
# Clean old requests
|
|
64
|
+
self._request_times[client_id] = [
|
|
65
|
+
t for t in self._request_times[client_id] if t > window_start
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
# Check limit
|
|
69
|
+
if len(self._request_times[client_id]) >= self.requests_per_minute:
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
# Record this request
|
|
73
|
+
self._request_times[client_id].append(now)
|
|
74
|
+
return True
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class RaxeMCPServer:
|
|
78
|
+
"""
|
|
79
|
+
MCP Server for RAXE threat detection.
|
|
80
|
+
|
|
81
|
+
Exposes RAXE scanning capabilities as MCP tools that can be
|
|
82
|
+
called by AI assistants like Claude Desktop.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self, verbose: bool = False) -> None:
|
|
86
|
+
"""
|
|
87
|
+
Initialize the MCP server.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
verbose: Enable verbose logging
|
|
91
|
+
"""
|
|
92
|
+
self.verbose = verbose
|
|
93
|
+
self.raxe = Raxe()
|
|
94
|
+
self.server = Server("raxe-security")
|
|
95
|
+
self.rate_limiter = RateLimiter()
|
|
96
|
+
|
|
97
|
+
# Register handlers
|
|
98
|
+
self._register_tools()
|
|
99
|
+
self._register_resources()
|
|
100
|
+
self._register_prompts()
|
|
101
|
+
|
|
102
|
+
def _register_tools(self) -> None:
|
|
103
|
+
"""Register MCP tools for threat detection."""
|
|
104
|
+
|
|
105
|
+
@self.server.list_tools()
|
|
106
|
+
async def list_tools() -> ListToolsResult:
|
|
107
|
+
return ListToolsResult(
|
|
108
|
+
tools=[
|
|
109
|
+
Tool(
|
|
110
|
+
name="scan_prompt",
|
|
111
|
+
description=(
|
|
112
|
+
"Scan a prompt or text for security threats including "
|
|
113
|
+
"prompt injection, jailbreak attempts, and data exfiltration. "
|
|
114
|
+
"Returns threat detections with severity levels."
|
|
115
|
+
),
|
|
116
|
+
inputSchema={
|
|
117
|
+
"type": "object",
|
|
118
|
+
"properties": {
|
|
119
|
+
"text": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "The text/prompt to scan for threats",
|
|
122
|
+
},
|
|
123
|
+
"context": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Optional context about where this text came from",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
"required": ["text"],
|
|
129
|
+
},
|
|
130
|
+
),
|
|
131
|
+
Tool(
|
|
132
|
+
name="list_threat_families",
|
|
133
|
+
description="List all available threat detection families (e.g., PI for Prompt Injection)",
|
|
134
|
+
inputSchema={
|
|
135
|
+
"type": "object",
|
|
136
|
+
"properties": {},
|
|
137
|
+
},
|
|
138
|
+
),
|
|
139
|
+
Tool(
|
|
140
|
+
name="get_rule_info",
|
|
141
|
+
description="Get detailed information about a specific detection rule",
|
|
142
|
+
inputSchema={
|
|
143
|
+
"type": "object",
|
|
144
|
+
"properties": {
|
|
145
|
+
"rule_id": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"description": "The rule ID (e.g., 'pi-001', 'de-003')",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
"required": ["rule_id"],
|
|
151
|
+
},
|
|
152
|
+
),
|
|
153
|
+
]
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
@self.server.call_tool()
|
|
157
|
+
async def call_tool(name: str, arguments: dict[str, Any]) -> CallToolResult:
|
|
158
|
+
if name == "scan_prompt":
|
|
159
|
+
return await self._handle_scan(arguments)
|
|
160
|
+
elif name == "list_threat_families":
|
|
161
|
+
return await self._handle_list_families()
|
|
162
|
+
elif name == "get_rule_info":
|
|
163
|
+
return await self._handle_rule_info(arguments)
|
|
164
|
+
else:
|
|
165
|
+
return CallToolResult(
|
|
166
|
+
content=[TextContent(type="text", text=f"Unknown tool: {name}")]
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
async def _handle_scan(self, arguments: dict[str, Any]) -> CallToolResult:
|
|
170
|
+
"""Handle scan_prompt tool call."""
|
|
171
|
+
text = arguments.get("text", "")
|
|
172
|
+
context = arguments.get("context", "")
|
|
173
|
+
|
|
174
|
+
# Rate limiting
|
|
175
|
+
if not self.rate_limiter.allow():
|
|
176
|
+
return CallToolResult(
|
|
177
|
+
content=[TextContent(type="text", text="Error: Rate limit exceeded. Please try again later.")]
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Input validation
|
|
181
|
+
if not text:
|
|
182
|
+
return CallToolResult(
|
|
183
|
+
content=[TextContent(type="text", text="Error: 'text' is required")]
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
if len(text) > MAX_TEXT_LENGTH:
|
|
187
|
+
return CallToolResult(
|
|
188
|
+
content=[TextContent(
|
|
189
|
+
type="text",
|
|
190
|
+
text=f"Error: Input too large. Maximum {MAX_TEXT_LENGTH:,} characters allowed."
|
|
191
|
+
)]
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
if context and len(context) > MAX_CONTEXT_LENGTH:
|
|
195
|
+
return CallToolResult(
|
|
196
|
+
content=[TextContent(
|
|
197
|
+
type="text",
|
|
198
|
+
text=f"Error: Context too large. Maximum {MAX_CONTEXT_LENGTH:,} characters allowed."
|
|
199
|
+
)]
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
result = self.raxe.scan(text)
|
|
204
|
+
|
|
205
|
+
if result.is_safe:
|
|
206
|
+
response = f"SAFE: No threats detected in the provided text."
|
|
207
|
+
else:
|
|
208
|
+
threats = []
|
|
209
|
+
for detection in result.detections:
|
|
210
|
+
threats.append(
|
|
211
|
+
f"- [{detection.severity}] {detection.rule_id}: {detection.description}"
|
|
212
|
+
)
|
|
213
|
+
threat_list = "\n".join(threats)
|
|
214
|
+
response = f"THREATS DETECTED ({len(result.detections)}):\n{threat_list}"
|
|
215
|
+
|
|
216
|
+
if context:
|
|
217
|
+
response = f"Context: {context}\n\n{response}"
|
|
218
|
+
|
|
219
|
+
return CallToolResult(
|
|
220
|
+
content=[TextContent(type="text", text=response)]
|
|
221
|
+
)
|
|
222
|
+
except Exception as e:
|
|
223
|
+
return CallToolResult(
|
|
224
|
+
content=[TextContent(type="text", text=f"Scan error: {e}")]
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
async def _handle_list_families(self) -> CallToolResult:
|
|
228
|
+
"""Handle list_threat_families tool call."""
|
|
229
|
+
families = {
|
|
230
|
+
"PI": "Prompt Injection - Attempts to override or manipulate AI instructions",
|
|
231
|
+
"JB": "Jailbreak - Attempts to bypass AI safety constraints",
|
|
232
|
+
"DE": "Data Exfiltration - Attempts to extract sensitive information",
|
|
233
|
+
"RP": "Role Play - Manipulation through persona adoption",
|
|
234
|
+
"CS": "Context Switching - Attempts to change conversation context",
|
|
235
|
+
"SE": "Social Engineering - Psychological manipulation techniques",
|
|
236
|
+
"TA": "Token Abuse - Exploitation of tokenization behaviors",
|
|
237
|
+
"CI": "Code Injection - Attempts to inject malicious code",
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
lines = ["Available Threat Families:\n"]
|
|
241
|
+
for code, desc in families.items():
|
|
242
|
+
lines.append(f"- {code}: {desc}")
|
|
243
|
+
|
|
244
|
+
return CallToolResult(
|
|
245
|
+
content=[TextContent(type="text", text="\n".join(lines))]
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
async def _handle_rule_info(self, arguments: dict[str, Any]) -> CallToolResult:
|
|
249
|
+
"""Handle get_rule_info tool call."""
|
|
250
|
+
rule_id = arguments.get("rule_id", "")
|
|
251
|
+
|
|
252
|
+
if not rule_id:
|
|
253
|
+
return CallToolResult(
|
|
254
|
+
content=[TextContent(type="text", text="Error: 'rule_id' is required")]
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# Get rule info from RAXE
|
|
258
|
+
try:
|
|
259
|
+
from raxe.infrastructure.rules.loader import RuleLoader
|
|
260
|
+
|
|
261
|
+
loader = RuleLoader()
|
|
262
|
+
rules = loader.load_rules()
|
|
263
|
+
|
|
264
|
+
for rule in rules:
|
|
265
|
+
if rule.rule_id.lower() == rule_id.lower():
|
|
266
|
+
info = [
|
|
267
|
+
f"Rule: {rule.rule_id}",
|
|
268
|
+
f"Family: {rule.family}",
|
|
269
|
+
f"Severity: {rule.severity}",
|
|
270
|
+
f"Description: {rule.description}",
|
|
271
|
+
]
|
|
272
|
+
return CallToolResult(
|
|
273
|
+
content=[TextContent(type="text", text="\n".join(info))]
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
return CallToolResult(
|
|
277
|
+
content=[TextContent(type="text", text=f"Rule not found: {rule_id}")]
|
|
278
|
+
)
|
|
279
|
+
except Exception as e:
|
|
280
|
+
return CallToolResult(
|
|
281
|
+
content=[TextContent(type="text", text=f"Error: {e}")]
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
def _register_resources(self) -> None:
|
|
285
|
+
"""Register MCP resources for RAXE data."""
|
|
286
|
+
|
|
287
|
+
@self.server.list_resources()
|
|
288
|
+
async def list_resources() -> ListResourcesResult:
|
|
289
|
+
return ListResourcesResult(
|
|
290
|
+
resources=[
|
|
291
|
+
Resource(
|
|
292
|
+
uri=AnyUrl("raxe://version"),
|
|
293
|
+
name="RAXE Version",
|
|
294
|
+
description="Current RAXE version information",
|
|
295
|
+
mimeType="text/plain",
|
|
296
|
+
),
|
|
297
|
+
Resource(
|
|
298
|
+
uri=AnyUrl("raxe://rules/summary"),
|
|
299
|
+
name="Rules Summary",
|
|
300
|
+
description="Summary of available detection rules",
|
|
301
|
+
mimeType="text/plain",
|
|
302
|
+
),
|
|
303
|
+
]
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
def _register_prompts(self) -> None:
|
|
307
|
+
"""Register MCP prompts for common security tasks."""
|
|
308
|
+
|
|
309
|
+
@self.server.list_prompts()
|
|
310
|
+
async def list_prompts() -> ListPromptsResult:
|
|
311
|
+
return ListPromptsResult(
|
|
312
|
+
prompts=[
|
|
313
|
+
Prompt(
|
|
314
|
+
name="security_review",
|
|
315
|
+
description="Review text for security concerns before processing",
|
|
316
|
+
arguments=[
|
|
317
|
+
PromptArgument(
|
|
318
|
+
name="text",
|
|
319
|
+
description="The text to review",
|
|
320
|
+
required=True,
|
|
321
|
+
),
|
|
322
|
+
],
|
|
323
|
+
),
|
|
324
|
+
]
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
@self.server.get_prompt()
|
|
328
|
+
async def get_prompt(name: str, arguments: dict[str, str] | None) -> GetPromptResult:
|
|
329
|
+
if name == "security_review":
|
|
330
|
+
text = (arguments or {}).get("text", "")
|
|
331
|
+
return GetPromptResult(
|
|
332
|
+
description="Security review prompt",
|
|
333
|
+
messages=[
|
|
334
|
+
PromptMessage(
|
|
335
|
+
role="user",
|
|
336
|
+
content=TextContent(
|
|
337
|
+
type="text",
|
|
338
|
+
text=f"Please use the scan_prompt tool to check this text for security threats before processing:\n\n{text}",
|
|
339
|
+
),
|
|
340
|
+
),
|
|
341
|
+
],
|
|
342
|
+
)
|
|
343
|
+
return GetPromptResult(description="Unknown prompt", messages=[])
|
|
344
|
+
|
|
345
|
+
async def run_async(self) -> None:
|
|
346
|
+
"""Run the server with stdio transport (async)."""
|
|
347
|
+
async with stdio_server() as (read_stream, write_stream):
|
|
348
|
+
await self.server.run(
|
|
349
|
+
read_stream,
|
|
350
|
+
write_stream,
|
|
351
|
+
self.server.create_initialization_options(),
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def create_server(verbose: bool = False) -> RaxeMCPServer:
|
|
356
|
+
"""
|
|
357
|
+
Create a new RAXE MCP server instance.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
verbose: Enable verbose logging
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
Configured RaxeMCPServer instance
|
|
364
|
+
"""
|
|
365
|
+
return RaxeMCPServer(verbose=verbose)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def run_server(
|
|
369
|
+
transport: str = "stdio",
|
|
370
|
+
host: str = "127.0.0.1",
|
|
371
|
+
port: int = 8765,
|
|
372
|
+
verbose: bool = False,
|
|
373
|
+
) -> int:
|
|
374
|
+
"""
|
|
375
|
+
Run the RAXE MCP server.
|
|
376
|
+
|
|
377
|
+
Args:
|
|
378
|
+
transport: Transport protocol ("stdio" or "sse")
|
|
379
|
+
host: Host to bind for SSE transport
|
|
380
|
+
port: Port to bind for SSE transport
|
|
381
|
+
verbose: Enable verbose logging
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Exit code (0 for success)
|
|
385
|
+
"""
|
|
386
|
+
import asyncio
|
|
387
|
+
|
|
388
|
+
server = create_server(verbose=verbose)
|
|
389
|
+
|
|
390
|
+
if transport == "stdio":
|
|
391
|
+
if verbose:
|
|
392
|
+
print(f"Starting RAXE MCP server v{__version__} (stdio transport)", file=sys.stderr)
|
|
393
|
+
asyncio.run(server.run_async())
|
|
394
|
+
elif transport == "sse":
|
|
395
|
+
# SSE transport requires additional setup
|
|
396
|
+
if verbose:
|
|
397
|
+
print(
|
|
398
|
+
f"Starting RAXE MCP server v{__version__} on {host}:{port} (SSE transport)",
|
|
399
|
+
file=sys.stderr,
|
|
400
|
+
)
|
|
401
|
+
# For SSE, we would use starlette/uvicorn
|
|
402
|
+
# This is a placeholder - full SSE implementation would go here
|
|
403
|
+
print("SSE transport not yet implemented. Use stdio transport.", file=sys.stderr)
|
|
404
|
+
return 1
|
|
405
|
+
else:
|
|
406
|
+
print(f"Unknown transport: {transport}", file=sys.stderr)
|
|
407
|
+
return 1
|
|
408
|
+
|
|
409
|
+
return 0
|