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,389 @@
|
|
|
1
|
+
"""Installation and usage tracking for RAXE CE.
|
|
2
|
+
|
|
3
|
+
Tracks privacy-preserving metrics:
|
|
4
|
+
- Installation metadata (when, Python version, OS)
|
|
5
|
+
- Time to first scan (critical activation metric)
|
|
6
|
+
- Usage patterns (DAU/WAU/MAU)
|
|
7
|
+
- Feature adoption (CLI commands used)
|
|
8
|
+
|
|
9
|
+
All tracking is local-only, opt-in telemetry to cloud.
|
|
10
|
+
"""
|
|
11
|
+
import json
|
|
12
|
+
import platform
|
|
13
|
+
import sys
|
|
14
|
+
import uuid
|
|
15
|
+
from dataclasses import asdict, dataclass, field
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class InstallationInfo:
|
|
23
|
+
"""Installation metadata.
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
installation_id: Unique installation UUID
|
|
27
|
+
installed_at: When RAXE was installed (ISO 8601)
|
|
28
|
+
python_version: Python version string
|
|
29
|
+
os: Operating system (darwin, linux, windows)
|
|
30
|
+
install_source: Where installed from (pypi, git, source)
|
|
31
|
+
raxe_version: RAXE version installed
|
|
32
|
+
"""
|
|
33
|
+
installation_id: str
|
|
34
|
+
installed_at: str
|
|
35
|
+
python_version: str
|
|
36
|
+
os: str
|
|
37
|
+
install_source: str = "pypi"
|
|
38
|
+
raxe_version: str = "0.0.1"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
class UsageStats:
|
|
43
|
+
"""Usage statistics.
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
first_scan_at: When first scan occurred (ISO 8601)
|
|
47
|
+
time_to_first_scan_seconds: Time from install to first scan
|
|
48
|
+
total_scans: Total number of scans performed
|
|
49
|
+
scans_with_threats: Scans that found threats
|
|
50
|
+
last_scan_at: When last scan occurred
|
|
51
|
+
days_active: List of day offsets when scans occurred (for DAU/WAU/MAU)
|
|
52
|
+
commands_used: Set of CLI commands used
|
|
53
|
+
features_enabled: Set of features enabled (L2, telemetry, etc.)
|
|
54
|
+
"""
|
|
55
|
+
first_scan_at: str | None = None
|
|
56
|
+
time_to_first_scan_seconds: int | None = None
|
|
57
|
+
total_scans: int = 0
|
|
58
|
+
scans_with_threats: int = 0
|
|
59
|
+
last_scan_at: str | None = None
|
|
60
|
+
days_active: list[int] = field(default_factory=list)
|
|
61
|
+
commands_used: list[str] = field(default_factory=list)
|
|
62
|
+
features_enabled: list[str] = field(default_factory=list)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class UsageTracker:
|
|
66
|
+
"""Tracks installation and usage metrics locally.
|
|
67
|
+
|
|
68
|
+
Files:
|
|
69
|
+
~/.raxe/install.json - Installation metadata
|
|
70
|
+
~/.raxe/usage.json - Usage statistics
|
|
71
|
+
|
|
72
|
+
Privacy:
|
|
73
|
+
- All tracking is local-only
|
|
74
|
+
- No PII stored (prompts, responses, API keys)
|
|
75
|
+
- Only aggregated metrics sent to cloud (if telemetry enabled)
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, data_dir: Path | None = None):
|
|
79
|
+
"""Initialize usage tracker.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
data_dir: Directory for tracking files (default: ~/.raxe)
|
|
83
|
+
"""
|
|
84
|
+
if data_dir is None:
|
|
85
|
+
data_dir = Path.home() / ".raxe"
|
|
86
|
+
|
|
87
|
+
self.data_dir = Path(data_dir)
|
|
88
|
+
self.data_dir.mkdir(parents=True, exist_ok=True)
|
|
89
|
+
|
|
90
|
+
self.install_file = self.data_dir / "install.json"
|
|
91
|
+
self.usage_file = self.data_dir / "usage.json"
|
|
92
|
+
|
|
93
|
+
# Load or create installation info
|
|
94
|
+
self._install_info = self._load_or_create_install_info()
|
|
95
|
+
|
|
96
|
+
# Load or create usage stats
|
|
97
|
+
self._usage_stats = self._load_or_create_usage_stats()
|
|
98
|
+
|
|
99
|
+
def _load_or_create_install_info(self) -> InstallationInfo:
|
|
100
|
+
"""Load or create installation info.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
InstallationInfo instance
|
|
104
|
+
"""
|
|
105
|
+
if self.install_file.exists():
|
|
106
|
+
with open(self.install_file) as f:
|
|
107
|
+
data = json.load(f)
|
|
108
|
+
return InstallationInfo(**data)
|
|
109
|
+
|
|
110
|
+
# Create new installation record
|
|
111
|
+
from raxe import __version__
|
|
112
|
+
|
|
113
|
+
install_info = InstallationInfo(
|
|
114
|
+
installation_id=str(uuid.uuid4()),
|
|
115
|
+
installed_at=datetime.now(timezone.utc).isoformat(),
|
|
116
|
+
python_version=platform.python_version(),
|
|
117
|
+
os=sys.platform,
|
|
118
|
+
install_source=self._detect_install_source(),
|
|
119
|
+
raxe_version=__version__,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Save
|
|
123
|
+
with open(self.install_file, "w") as f:
|
|
124
|
+
json.dump(asdict(install_info), f, indent=2)
|
|
125
|
+
|
|
126
|
+
return install_info
|
|
127
|
+
|
|
128
|
+
def _detect_install_source(self) -> str:
|
|
129
|
+
"""Detect how RAXE was installed.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Install source (pypi, git, source)
|
|
133
|
+
"""
|
|
134
|
+
# Check if running from git repository
|
|
135
|
+
try:
|
|
136
|
+
import raxe
|
|
137
|
+
raxe_path = Path(raxe.__file__).parent
|
|
138
|
+
if (raxe_path.parent.parent / ".git").exists():
|
|
139
|
+
return "git"
|
|
140
|
+
except Exception:
|
|
141
|
+
pass
|
|
142
|
+
|
|
143
|
+
# Check if installed via pip
|
|
144
|
+
try:
|
|
145
|
+
import importlib.metadata
|
|
146
|
+
dist = importlib.metadata.distribution("raxe")
|
|
147
|
+
if dist:
|
|
148
|
+
return "pypi"
|
|
149
|
+
except Exception:
|
|
150
|
+
pass
|
|
151
|
+
|
|
152
|
+
return "source"
|
|
153
|
+
|
|
154
|
+
def _load_or_create_usage_stats(self) -> UsageStats:
|
|
155
|
+
"""Load or create usage statistics.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
UsageStats instance
|
|
159
|
+
"""
|
|
160
|
+
if self.usage_file.exists():
|
|
161
|
+
with open(self.usage_file) as f:
|
|
162
|
+
data = json.load(f)
|
|
163
|
+
return UsageStats(**data)
|
|
164
|
+
|
|
165
|
+
# Create new usage stats
|
|
166
|
+
return UsageStats()
|
|
167
|
+
|
|
168
|
+
def _save_usage_stats(self) -> None:
|
|
169
|
+
"""Save usage statistics to disk."""
|
|
170
|
+
with open(self.usage_file, "w") as f:
|
|
171
|
+
json.dump(asdict(self._usage_stats), f, indent=2)
|
|
172
|
+
|
|
173
|
+
def record_first_scan(self) -> None:
|
|
174
|
+
"""Record the first scan (critical activation metric)."""
|
|
175
|
+
if self._usage_stats.first_scan_at is not None:
|
|
176
|
+
# Already recorded
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
now = datetime.now(timezone.utc)
|
|
180
|
+
self._usage_stats.first_scan_at = now.isoformat()
|
|
181
|
+
|
|
182
|
+
# Calculate time to first scan
|
|
183
|
+
# Parse install time with timezone awareness
|
|
184
|
+
install_time = datetime.fromisoformat(self._install_info.installed_at)
|
|
185
|
+
# Ensure timezone awareness for both datetimes
|
|
186
|
+
if install_time.tzinfo is None:
|
|
187
|
+
install_time = install_time.replace(tzinfo=timezone.utc)
|
|
188
|
+
|
|
189
|
+
time_to_first_scan = (now - install_time).total_seconds()
|
|
190
|
+
self._usage_stats.time_to_first_scan_seconds = int(time_to_first_scan)
|
|
191
|
+
|
|
192
|
+
self._save_usage_stats()
|
|
193
|
+
|
|
194
|
+
def record_scan(self, found_threats: bool = False) -> None:
|
|
195
|
+
"""Record a scan event.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
found_threats: Whether threats were found
|
|
199
|
+
"""
|
|
200
|
+
# Ensure first scan is recorded
|
|
201
|
+
if self._usage_stats.first_scan_at is None:
|
|
202
|
+
self.record_first_scan()
|
|
203
|
+
|
|
204
|
+
# Update counters
|
|
205
|
+
self._usage_stats.total_scans += 1
|
|
206
|
+
if found_threats:
|
|
207
|
+
self._usage_stats.scans_with_threats += 1
|
|
208
|
+
|
|
209
|
+
# Update last scan time
|
|
210
|
+
now = datetime.now(timezone.utc)
|
|
211
|
+
self._usage_stats.last_scan_at = now.isoformat()
|
|
212
|
+
|
|
213
|
+
# Track active day (day offset from installation)
|
|
214
|
+
install_date = datetime.fromisoformat(self._install_info.installed_at).date()
|
|
215
|
+
today = now.date()
|
|
216
|
+
day_offset = (today - install_date).days
|
|
217
|
+
|
|
218
|
+
if day_offset not in self._usage_stats.days_active:
|
|
219
|
+
self._usage_stats.days_active.append(day_offset)
|
|
220
|
+
|
|
221
|
+
self._save_usage_stats()
|
|
222
|
+
|
|
223
|
+
def record_command(self, command: str) -> None:
|
|
224
|
+
"""Record CLI command usage.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
command: Command name (e.g., "scan", "init", "config")
|
|
228
|
+
"""
|
|
229
|
+
if command not in self._usage_stats.commands_used:
|
|
230
|
+
self._usage_stats.commands_used.append(command)
|
|
231
|
+
self._save_usage_stats()
|
|
232
|
+
|
|
233
|
+
def record_feature(self, feature: str) -> None:
|
|
234
|
+
"""Record feature enablement.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
feature: Feature name (e.g., "l2_detection", "telemetry")
|
|
238
|
+
"""
|
|
239
|
+
if feature not in self._usage_stats.features_enabled:
|
|
240
|
+
self._usage_stats.features_enabled.append(feature)
|
|
241
|
+
self._save_usage_stats()
|
|
242
|
+
|
|
243
|
+
def get_install_info(self) -> InstallationInfo:
|
|
244
|
+
"""Get installation information.
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
InstallationInfo instance
|
|
248
|
+
"""
|
|
249
|
+
return self._install_info
|
|
250
|
+
|
|
251
|
+
def get_usage_stats(self) -> UsageStats:
|
|
252
|
+
"""Get usage statistics.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
UsageStats instance
|
|
256
|
+
"""
|
|
257
|
+
return self._usage_stats
|
|
258
|
+
|
|
259
|
+
def get_dau(self) -> bool:
|
|
260
|
+
"""Check if user is a Daily Active User (scanned today).
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
True if scanned today
|
|
264
|
+
"""
|
|
265
|
+
if not self._usage_stats.last_scan_at:
|
|
266
|
+
return False
|
|
267
|
+
|
|
268
|
+
last_scan = datetime.fromisoformat(self._usage_stats.last_scan_at).date()
|
|
269
|
+
today = datetime.now(timezone.utc).date()
|
|
270
|
+
|
|
271
|
+
return last_scan == today
|
|
272
|
+
|
|
273
|
+
def get_wau(self) -> bool:
|
|
274
|
+
"""Check if user is a Weekly Active User (scanned in last 7 days).
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
True if scanned in last 7 days
|
|
278
|
+
"""
|
|
279
|
+
if not self._usage_stats.last_scan_at:
|
|
280
|
+
return False
|
|
281
|
+
|
|
282
|
+
last_scan = datetime.fromisoformat(self._usage_stats.last_scan_at).date()
|
|
283
|
+
today = datetime.now(timezone.utc).date()
|
|
284
|
+
|
|
285
|
+
return (today - last_scan).days <= 7
|
|
286
|
+
|
|
287
|
+
def get_mau(self) -> bool:
|
|
288
|
+
"""Check if user is a Monthly Active User (scanned in last 30 days).
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
True if scanned in last 30 days
|
|
292
|
+
"""
|
|
293
|
+
if not self._usage_stats.last_scan_at:
|
|
294
|
+
return False
|
|
295
|
+
|
|
296
|
+
last_scan = datetime.fromisoformat(self._usage_stats.last_scan_at).date()
|
|
297
|
+
today = datetime.now(timezone.utc).date()
|
|
298
|
+
|
|
299
|
+
return (today - last_scan).days <= 30
|
|
300
|
+
|
|
301
|
+
def get_retention_metrics(self) -> dict[str, Any]:
|
|
302
|
+
"""Get retention metrics (7-day, 30-day).
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
Dictionary with retention metrics
|
|
306
|
+
"""
|
|
307
|
+
install_date = datetime.fromisoformat(self._install_info.installed_at).date()
|
|
308
|
+
today = datetime.now(timezone.utc).date()
|
|
309
|
+
days_since_install = (today - install_date).days
|
|
310
|
+
|
|
311
|
+
# 7-day retention: Did they come back within 7 days?
|
|
312
|
+
retention_7d = False
|
|
313
|
+
if days_since_install >= 7:
|
|
314
|
+
retention_7d = any(1 <= day <= 7 for day in self._usage_stats.days_active)
|
|
315
|
+
|
|
316
|
+
# 30-day retention: Did they come back within 30 days?
|
|
317
|
+
retention_30d = False
|
|
318
|
+
if days_since_install >= 30:
|
|
319
|
+
retention_30d = any(1 <= day <= 30 for day in self._usage_stats.days_active)
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
"days_since_install": days_since_install,
|
|
323
|
+
"retention_7d": retention_7d,
|
|
324
|
+
"retention_30d": retention_30d,
|
|
325
|
+
"total_active_days": len(self._usage_stats.days_active),
|
|
326
|
+
"dau": self.get_dau(),
|
|
327
|
+
"wau": self.get_wau(),
|
|
328
|
+
"mau": self.get_mau(),
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
def get_activation_metrics(self) -> dict[str, Any]:
|
|
332
|
+
"""Get activation metrics (time to first scan, engagement).
|
|
333
|
+
|
|
334
|
+
Returns:
|
|
335
|
+
Dictionary with activation metrics
|
|
336
|
+
"""
|
|
337
|
+
return {
|
|
338
|
+
"installed_at": self._install_info.installed_at,
|
|
339
|
+
"first_scan_at": self._usage_stats.first_scan_at,
|
|
340
|
+
"time_to_first_scan_seconds": self._usage_stats.time_to_first_scan_seconds,
|
|
341
|
+
"time_to_first_scan_minutes": (
|
|
342
|
+
self._usage_stats.time_to_first_scan_seconds / 60
|
|
343
|
+
if self._usage_stats.time_to_first_scan_seconds
|
|
344
|
+
else None
|
|
345
|
+
),
|
|
346
|
+
"total_scans": self._usage_stats.total_scans,
|
|
347
|
+
"scans_with_threats": self._usage_stats.scans_with_threats,
|
|
348
|
+
"threat_detection_rate": (
|
|
349
|
+
self._usage_stats.scans_with_threats / self._usage_stats.total_scans
|
|
350
|
+
if self._usage_stats.total_scans > 0
|
|
351
|
+
else 0
|
|
352
|
+
),
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
def export_for_telemetry(self) -> dict[str, Any]:
|
|
356
|
+
"""Export privacy-safe metrics for telemetry.
|
|
357
|
+
|
|
358
|
+
Only includes aggregated, non-PII metrics.
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Dictionary safe for telemetry transmission
|
|
362
|
+
"""
|
|
363
|
+
return {
|
|
364
|
+
"installation_id": self._install_info.installation_id,
|
|
365
|
+
"python_version": self._install_info.python_version,
|
|
366
|
+
"os": self._install_info.os,
|
|
367
|
+
"raxe_version": self._install_info.raxe_version,
|
|
368
|
+
"install_source": self._install_info.install_source,
|
|
369
|
+
"activation": self.get_activation_metrics(),
|
|
370
|
+
"retention": self.get_retention_metrics(),
|
|
371
|
+
"commands_used": self._usage_stats.commands_used,
|
|
372
|
+
"features_enabled": self._usage_stats.features_enabled,
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
# Global singleton instance
|
|
377
|
+
_tracker: UsageTracker | None = None
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def get_tracker() -> UsageTracker:
|
|
381
|
+
"""Get global usage tracker instance.
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
UsageTracker singleton
|
|
385
|
+
"""
|
|
386
|
+
global _tracker
|
|
387
|
+
if _tracker is None:
|
|
388
|
+
_tracker = UsageTracker()
|
|
389
|
+
return _tracker
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RAXE Framework Integrations.
|
|
3
|
+
|
|
4
|
+
This module provides integrations with various AI agent frameworks.
|
|
5
|
+
Each integration requires optional dependencies to be installed.
|
|
6
|
+
|
|
7
|
+
Available integrations:
|
|
8
|
+
- mcp: Model Context Protocol server (pip install raxe[mcp])
|
|
9
|
+
- langchain: LangChain callback handlers (pip install raxe[langchain])
|
|
10
|
+
- crewai: CrewAI security tools (pip install raxe[crewai])
|
|
11
|
+
- autogen: AutoGen agent security (pip install raxe[autogen])
|
|
12
|
+
- llamaindex: LlamaIndex query security (pip install raxe[llamaindex])
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
from raxe.integrations.availability import get_available_integrations
|
|
16
|
+
available = get_available_integrations()
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from raxe.integrations.availability import (
|
|
21
|
+
ANTHROPIC_AVAILABLE,
|
|
22
|
+
AUTOGEN_AVAILABLE,
|
|
23
|
+
CREWAI_AVAILABLE,
|
|
24
|
+
LANGCHAIN_AVAILABLE,
|
|
25
|
+
LLAMAINDEX_AVAILABLE,
|
|
26
|
+
MCP_AVAILABLE,
|
|
27
|
+
OPENAI_AVAILABLE,
|
|
28
|
+
get_available_integrations,
|
|
29
|
+
is_available,
|
|
30
|
+
require_integration,
|
|
31
|
+
)
|
|
32
|
+
from raxe.integrations.registry import (
|
|
33
|
+
INTEGRATION_REGISTRY,
|
|
34
|
+
IntegrationInfo,
|
|
35
|
+
list_integrations,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
__all__ = [
|
|
39
|
+
# Availability checks
|
|
40
|
+
"is_available",
|
|
41
|
+
"require_integration",
|
|
42
|
+
"get_available_integrations",
|
|
43
|
+
# Pre-computed flags
|
|
44
|
+
"MCP_AVAILABLE",
|
|
45
|
+
"LANGCHAIN_AVAILABLE",
|
|
46
|
+
"CREWAI_AVAILABLE",
|
|
47
|
+
"AUTOGEN_AVAILABLE",
|
|
48
|
+
"LLAMAINDEX_AVAILABLE",
|
|
49
|
+
"OPENAI_AVAILABLE",
|
|
50
|
+
"ANTHROPIC_AVAILABLE",
|
|
51
|
+
# Registry
|
|
52
|
+
"INTEGRATION_REGISTRY",
|
|
53
|
+
"IntegrationInfo",
|
|
54
|
+
"list_integrations",
|
|
55
|
+
]
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Feature availability detection for optional dependencies.
|
|
3
|
+
|
|
4
|
+
This module provides a centralized way to check if optional
|
|
5
|
+
dependencies are installed without importing them.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
from raxe.integrations.availability import MCP_AVAILABLE, require_integration
|
|
9
|
+
|
|
10
|
+
if MCP_AVAILABLE:
|
|
11
|
+
from raxe.mcp import server
|
|
12
|
+
else:
|
|
13
|
+
print("MCP not installed: pip install raxe[mcp]")
|
|
14
|
+
|
|
15
|
+
# Or raise helpful error:
|
|
16
|
+
require_integration("mcp") # Raises ImportError with install hint
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import importlib.util
|
|
21
|
+
from functools import lru_cache
|
|
22
|
+
from typing import Literal
|
|
23
|
+
|
|
24
|
+
# Type alias for integration names
|
|
25
|
+
IntegrationName = Literal[
|
|
26
|
+
"mcp", "langchain", "crewai", "autogen", "llamaindex", "openai", "anthropic",
|
|
27
|
+
"litellm", "dspy"
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@lru_cache(maxsize=16)
|
|
32
|
+
def is_available(package: str) -> bool:
|
|
33
|
+
"""
|
|
34
|
+
Check if a package is available for import.
|
|
35
|
+
|
|
36
|
+
Uses importlib.util.find_spec for fast detection without
|
|
37
|
+
actually importing the package.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
package: The package name to check
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
True if the package is installed and importable
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
return importlib.util.find_spec(package) is not None
|
|
47
|
+
except (ModuleNotFoundError, ValueError):
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Pre-computed availability checks for common integrations
|
|
52
|
+
# These are evaluated once at import time for fast access
|
|
53
|
+
MCP_AVAILABLE: bool = is_available("mcp")
|
|
54
|
+
LANGCHAIN_AVAILABLE: bool = is_available("langchain")
|
|
55
|
+
CREWAI_AVAILABLE: bool = is_available("crewai")
|
|
56
|
+
AUTOGEN_AVAILABLE: bool = is_available("pyautogen")
|
|
57
|
+
LLAMAINDEX_AVAILABLE: bool = is_available("llama_index")
|
|
58
|
+
OPENAI_AVAILABLE: bool = is_available("openai")
|
|
59
|
+
ANTHROPIC_AVAILABLE: bool = is_available("anthropic")
|
|
60
|
+
LITELLM_AVAILABLE: bool = is_available("litellm")
|
|
61
|
+
DSPY_AVAILABLE: bool = is_available("dspy")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def get_available_integrations() -> list[IntegrationName]:
|
|
65
|
+
"""
|
|
66
|
+
Get list of all available integrations.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List of integration names that are installed
|
|
70
|
+
"""
|
|
71
|
+
available: list[IntegrationName] = []
|
|
72
|
+
|
|
73
|
+
if MCP_AVAILABLE:
|
|
74
|
+
available.append("mcp")
|
|
75
|
+
if LANGCHAIN_AVAILABLE:
|
|
76
|
+
available.append("langchain")
|
|
77
|
+
if CREWAI_AVAILABLE:
|
|
78
|
+
available.append("crewai")
|
|
79
|
+
if AUTOGEN_AVAILABLE:
|
|
80
|
+
available.append("autogen")
|
|
81
|
+
if LLAMAINDEX_AVAILABLE:
|
|
82
|
+
available.append("llamaindex")
|
|
83
|
+
if OPENAI_AVAILABLE:
|
|
84
|
+
available.append("openai")
|
|
85
|
+
if ANTHROPIC_AVAILABLE:
|
|
86
|
+
available.append("anthropic")
|
|
87
|
+
if LITELLM_AVAILABLE:
|
|
88
|
+
available.append("litellm")
|
|
89
|
+
if DSPY_AVAILABLE:
|
|
90
|
+
available.append("dspy")
|
|
91
|
+
|
|
92
|
+
return available
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def require_integration(name: IntegrationName) -> None:
|
|
96
|
+
"""
|
|
97
|
+
Raise ImportError with helpful message if integration is not available.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
name: The integration name
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
ImportError: If the integration is not installed
|
|
104
|
+
"""
|
|
105
|
+
packages: dict[IntegrationName, tuple[str, str]] = {
|
|
106
|
+
"mcp": ("mcp", "raxe[mcp]"),
|
|
107
|
+
"langchain": ("langchain", "raxe[langchain]"),
|
|
108
|
+
"crewai": ("crewai", "raxe[crewai]"),
|
|
109
|
+
"autogen": ("pyautogen", "raxe[autogen]"),
|
|
110
|
+
"llamaindex": ("llama_index", "raxe[llamaindex]"),
|
|
111
|
+
"openai": ("openai", "raxe[openai-agents]"),
|
|
112
|
+
"anthropic": ("anthropic", "raxe[anthropic]"),
|
|
113
|
+
"litellm": ("litellm", "raxe[litellm]"),
|
|
114
|
+
"dspy": ("dspy", "raxe[dspy]"),
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
package_name, install_extra = packages[name]
|
|
118
|
+
|
|
119
|
+
if not is_available(package_name):
|
|
120
|
+
raise ImportError(
|
|
121
|
+
f"{name.title()} integration requires additional dependencies.\n"
|
|
122
|
+
f"Install with: pip install {install_extra}"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def check_all_integrations() -> dict[IntegrationName, bool]:
|
|
127
|
+
"""
|
|
128
|
+
Check availability of all integrations.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Dictionary mapping integration names to their availability status
|
|
132
|
+
"""
|
|
133
|
+
return {
|
|
134
|
+
"mcp": MCP_AVAILABLE,
|
|
135
|
+
"langchain": LANGCHAIN_AVAILABLE,
|
|
136
|
+
"crewai": CREWAI_AVAILABLE,
|
|
137
|
+
"autogen": AUTOGEN_AVAILABLE,
|
|
138
|
+
"llamaindex": LLAMAINDEX_AVAILABLE,
|
|
139
|
+
"openai": OPENAI_AVAILABLE,
|
|
140
|
+
"anthropic": ANTHROPIC_AVAILABLE,
|
|
141
|
+
"litellm": LITELLM_AVAILABLE,
|
|
142
|
+
"dspy": DSPY_AVAILABLE,
|
|
143
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Integration registry for runtime discovery and configuration.
|
|
3
|
+
|
|
4
|
+
This module provides metadata about available integrations
|
|
5
|
+
and utilities for listing/discovering them.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
|
|
11
|
+
from raxe.integrations.availability import (
|
|
12
|
+
IntegrationName,
|
|
13
|
+
get_available_integrations,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class IntegrationInfo:
|
|
19
|
+
"""Metadata about an integration."""
|
|
20
|
+
|
|
21
|
+
name: IntegrationName
|
|
22
|
+
display_name: str
|
|
23
|
+
install_command: str
|
|
24
|
+
description: str
|
|
25
|
+
documentation_url: str | None = None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
INTEGRATION_REGISTRY: dict[IntegrationName, IntegrationInfo] = {
|
|
29
|
+
"mcp": IntegrationInfo(
|
|
30
|
+
name="mcp",
|
|
31
|
+
display_name="MCP Server",
|
|
32
|
+
install_command="pip install raxe[mcp]",
|
|
33
|
+
description="Model Context Protocol server for AI assistants",
|
|
34
|
+
documentation_url="https://docs.raxe.ai/integrations/mcp",
|
|
35
|
+
),
|
|
36
|
+
"langchain": IntegrationInfo(
|
|
37
|
+
name="langchain",
|
|
38
|
+
display_name="LangChain",
|
|
39
|
+
install_command="pip install raxe[langchain]",
|
|
40
|
+
description="Callback handlers and guardrails for LangChain",
|
|
41
|
+
documentation_url="https://docs.raxe.ai/integrations/langchain",
|
|
42
|
+
),
|
|
43
|
+
"crewai": IntegrationInfo(
|
|
44
|
+
name="crewai",
|
|
45
|
+
display_name="CrewAI",
|
|
46
|
+
install_command="pip install raxe[crewai]",
|
|
47
|
+
description="Security tools for CrewAI agents",
|
|
48
|
+
documentation_url="https://docs.raxe.ai/integrations/crewai",
|
|
49
|
+
),
|
|
50
|
+
"autogen": IntegrationInfo(
|
|
51
|
+
name="autogen",
|
|
52
|
+
display_name="AutoGen",
|
|
53
|
+
install_command="pip install raxe[autogen]",
|
|
54
|
+
description="Agent security for Microsoft AutoGen",
|
|
55
|
+
documentation_url="https://docs.raxe.ai/integrations/autogen",
|
|
56
|
+
),
|
|
57
|
+
"llamaindex": IntegrationInfo(
|
|
58
|
+
name="llamaindex",
|
|
59
|
+
display_name="LlamaIndex",
|
|
60
|
+
install_command="pip install raxe[llamaindex]",
|
|
61
|
+
description="Query engine security for LlamaIndex",
|
|
62
|
+
documentation_url="https://docs.raxe.ai/integrations/llamaindex",
|
|
63
|
+
),
|
|
64
|
+
"openai": IntegrationInfo(
|
|
65
|
+
name="openai",
|
|
66
|
+
display_name="OpenAI Agents",
|
|
67
|
+
install_command="pip install raxe[openai-agents]",
|
|
68
|
+
description="Function call security for OpenAI Swarm-style agents",
|
|
69
|
+
documentation_url="https://docs.raxe.ai/integrations/openai",
|
|
70
|
+
),
|
|
71
|
+
"anthropic": IntegrationInfo(
|
|
72
|
+
name="anthropic",
|
|
73
|
+
display_name="Anthropic Claude",
|
|
74
|
+
install_command="pip install raxe[anthropic]",
|
|
75
|
+
description="Tool use security for Claude",
|
|
76
|
+
documentation_url="https://docs.raxe.ai/integrations/anthropic",
|
|
77
|
+
),
|
|
78
|
+
"litellm": IntegrationInfo(
|
|
79
|
+
name="litellm",
|
|
80
|
+
display_name="LiteLLM",
|
|
81
|
+
install_command="pip install raxe[litellm]",
|
|
82
|
+
description="Security scanning for LiteLLM's unified LLM API",
|
|
83
|
+
documentation_url="https://docs.raxe.ai/integrations/litellm",
|
|
84
|
+
),
|
|
85
|
+
"dspy": IntegrationInfo(
|
|
86
|
+
name="dspy",
|
|
87
|
+
display_name="DSPy",
|
|
88
|
+
install_command="pip install raxe[dspy]",
|
|
89
|
+
description="Security callbacks and guards for DSPy modules",
|
|
90
|
+
documentation_url="https://docs.raxe.ai/integrations/dspy",
|
|
91
|
+
),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def list_integrations(installed_only: bool = False) -> list[IntegrationInfo]:
|
|
96
|
+
"""
|
|
97
|
+
List all available integrations.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
installed_only: If True, only return installed integrations
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
List of IntegrationInfo objects
|
|
104
|
+
"""
|
|
105
|
+
if installed_only:
|
|
106
|
+
available = get_available_integrations()
|
|
107
|
+
return [info for name, info in INTEGRATION_REGISTRY.items() if name in available]
|
|
108
|
+
|
|
109
|
+
return list(INTEGRATION_REGISTRY.values())
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def get_integration_info(name: IntegrationName) -> IntegrationInfo | None:
|
|
113
|
+
"""
|
|
114
|
+
Get info for a specific integration.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
name: The integration name
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
IntegrationInfo or None if not found
|
|
121
|
+
"""
|
|
122
|
+
return INTEGRATION_REGISTRY.get(name)
|