raxe 0.4.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- raxe/__init__.py +101 -0
- raxe/application/__init__.py +48 -0
- raxe/application/ab_testing.py +170 -0
- raxe/application/analytics/__init__.py +30 -0
- raxe/application/analytics/achievement_service.py +444 -0
- raxe/application/analytics/repositories.py +172 -0
- raxe/application/analytics/retention_service.py +267 -0
- raxe/application/analytics/statistics_service.py +419 -0
- raxe/application/analytics/streak_service.py +283 -0
- raxe/application/apply_policy.py +291 -0
- raxe/application/eager_l2.py +503 -0
- raxe/application/preloader.py +353 -0
- raxe/application/scan_merger.py +321 -0
- raxe/application/scan_pipeline.py +1059 -0
- raxe/application/scan_pipeline_async.py +403 -0
- raxe/application/session_tracker.py +458 -0
- raxe/application/telemetry_manager.py +357 -0
- raxe/application/telemetry_orchestrator.py +1210 -0
- raxe/async_sdk/__init__.py +34 -0
- raxe/async_sdk/cache.py +286 -0
- raxe/async_sdk/client.py +556 -0
- raxe/async_sdk/wrappers/__init__.py +23 -0
- raxe/async_sdk/wrappers/openai.py +238 -0
- raxe/cli/__init__.py +21 -0
- raxe/cli/auth.py +1047 -0
- raxe/cli/branding.py +235 -0
- raxe/cli/config.py +334 -0
- raxe/cli/custom_rules.py +458 -0
- raxe/cli/doctor.py +686 -0
- raxe/cli/error_handler.py +665 -0
- raxe/cli/event.py +648 -0
- raxe/cli/exit_codes.py +57 -0
- raxe/cli/expiry_warning.py +302 -0
- raxe/cli/export.py +183 -0
- raxe/cli/history.py +247 -0
- raxe/cli/l2_formatter.py +872 -0
- raxe/cli/main.py +1137 -0
- raxe/cli/models.py +590 -0
- raxe/cli/output.py +403 -0
- raxe/cli/privacy.py +84 -0
- raxe/cli/profiler.py +262 -0
- raxe/cli/progress.py +379 -0
- raxe/cli/progress_context.py +101 -0
- raxe/cli/repl.py +394 -0
- raxe/cli/rules.py +542 -0
- raxe/cli/setup_wizard.py +721 -0
- raxe/cli/stats.py +292 -0
- raxe/cli/suppress.py +501 -0
- raxe/cli/telemetry.py +1384 -0
- raxe/cli/test.py +130 -0
- raxe/cli/tune.py +315 -0
- raxe/cli/validate.py +218 -0
- raxe/domain/__init__.py +30 -0
- raxe/domain/analytics/__init__.py +97 -0
- raxe/domain/analytics/achievements.py +306 -0
- raxe/domain/analytics/models.py +120 -0
- raxe/domain/analytics/retention.py +168 -0
- raxe/domain/analytics/statistics.py +207 -0
- raxe/domain/analytics/streaks.py +173 -0
- raxe/domain/engine/__init__.py +15 -0
- raxe/domain/engine/executor.py +396 -0
- raxe/domain/engine/matcher.py +212 -0
- raxe/domain/inline_suppression.py +176 -0
- raxe/domain/ml/__init__.py +133 -0
- raxe/domain/ml/embedding_cache.py +309 -0
- raxe/domain/ml/gemma_detector.py +921 -0
- raxe/domain/ml/gemma_models.py +346 -0
- raxe/domain/ml/l2_config.py +428 -0
- raxe/domain/ml/l2_output_schema.py +443 -0
- raxe/domain/ml/manifest_loader.py +309 -0
- raxe/domain/ml/manifest_schema.py +345 -0
- raxe/domain/ml/model_metadata.py +263 -0
- raxe/domain/ml/model_registry.py +786 -0
- raxe/domain/ml/protocol.py +282 -0
- raxe/domain/ml/scoring_models.py +419 -0
- raxe/domain/ml/stub_detector.py +397 -0
- raxe/domain/ml/threat_scorer.py +757 -0
- raxe/domain/ml/tokenizer_registry.py +372 -0
- raxe/domain/ml/voting/__init__.py +89 -0
- raxe/domain/ml/voting/config.py +595 -0
- raxe/domain/ml/voting/engine.py +465 -0
- raxe/domain/ml/voting/head_voters.py +378 -0
- raxe/domain/ml/voting/models.py +222 -0
- raxe/domain/models.py +82 -0
- raxe/domain/packs/__init__.py +17 -0
- raxe/domain/packs/models.py +304 -0
- raxe/domain/policies/__init__.py +20 -0
- raxe/domain/policies/evaluator.py +212 -0
- raxe/domain/policies/models.py +223 -0
- raxe/domain/rules/__init__.py +32 -0
- raxe/domain/rules/custom.py +286 -0
- raxe/domain/rules/models.py +273 -0
- raxe/domain/rules/schema.py +166 -0
- raxe/domain/rules/validator.py +556 -0
- raxe/domain/suppression.py +801 -0
- raxe/domain/suppression_factory.py +174 -0
- raxe/domain/telemetry/__init__.py +116 -0
- raxe/domain/telemetry/backpressure.py +424 -0
- raxe/domain/telemetry/event_creator.py +362 -0
- raxe/domain/telemetry/events.py +1282 -0
- raxe/domain/telemetry/priority.py +263 -0
- raxe/domain/telemetry/scan_telemetry_builder.py +670 -0
- raxe/infrastructure/__init__.py +25 -0
- raxe/infrastructure/analytics/__init__.py +18 -0
- raxe/infrastructure/analytics/aggregator.py +484 -0
- raxe/infrastructure/analytics/aggregator_optimized.py +184 -0
- raxe/infrastructure/analytics/engine.py +748 -0
- raxe/infrastructure/analytics/repository.py +409 -0
- raxe/infrastructure/analytics/streaks.py +467 -0
- raxe/infrastructure/analytics/views.py +178 -0
- raxe/infrastructure/cloud/__init__.py +9 -0
- raxe/infrastructure/config/__init__.py +56 -0
- raxe/infrastructure/config/endpoints.py +641 -0
- raxe/infrastructure/config/scan_config.py +352 -0
- raxe/infrastructure/config/yaml_config.py +459 -0
- raxe/infrastructure/database/__init__.py +10 -0
- raxe/infrastructure/database/connection.py +200 -0
- raxe/infrastructure/database/models.py +325 -0
- raxe/infrastructure/database/scan_history.py +764 -0
- raxe/infrastructure/ml/__init__.py +0 -0
- raxe/infrastructure/ml/download_progress.py +438 -0
- raxe/infrastructure/ml/model_downloader.py +457 -0
- raxe/infrastructure/models/__init__.py +16 -0
- raxe/infrastructure/models/discovery.py +461 -0
- raxe/infrastructure/packs/__init__.py +13 -0
- raxe/infrastructure/packs/loader.py +407 -0
- raxe/infrastructure/packs/registry.py +381 -0
- raxe/infrastructure/policies/__init__.py +16 -0
- raxe/infrastructure/policies/api_client.py +256 -0
- raxe/infrastructure/policies/validator.py +227 -0
- raxe/infrastructure/policies/yaml_loader.py +250 -0
- raxe/infrastructure/rules/__init__.py +18 -0
- raxe/infrastructure/rules/custom_loader.py +224 -0
- raxe/infrastructure/rules/versioning.py +222 -0
- raxe/infrastructure/rules/yaml_loader.py +286 -0
- raxe/infrastructure/security/__init__.py +31 -0
- raxe/infrastructure/security/auth.py +145 -0
- raxe/infrastructure/security/policy_validator.py +124 -0
- raxe/infrastructure/security/signatures.py +171 -0
- raxe/infrastructure/suppression/__init__.py +36 -0
- raxe/infrastructure/suppression/composite_repository.py +154 -0
- raxe/infrastructure/suppression/sqlite_repository.py +231 -0
- raxe/infrastructure/suppression/yaml_composite_repository.py +156 -0
- raxe/infrastructure/suppression/yaml_repository.py +510 -0
- raxe/infrastructure/telemetry/__init__.py +79 -0
- raxe/infrastructure/telemetry/acquisition.py +179 -0
- raxe/infrastructure/telemetry/config.py +254 -0
- raxe/infrastructure/telemetry/credential_store.py +947 -0
- raxe/infrastructure/telemetry/dual_queue.py +1123 -0
- raxe/infrastructure/telemetry/flush_helper.py +343 -0
- raxe/infrastructure/telemetry/flush_scheduler.py +776 -0
- raxe/infrastructure/telemetry/health_client.py +394 -0
- raxe/infrastructure/telemetry/hook.py +347 -0
- raxe/infrastructure/telemetry/queue.py +520 -0
- raxe/infrastructure/telemetry/sender.py +476 -0
- raxe/infrastructure/tracking/__init__.py +13 -0
- raxe/infrastructure/tracking/usage.py +389 -0
- raxe/integrations/__init__.py +55 -0
- raxe/integrations/availability.py +143 -0
- raxe/integrations/registry.py +122 -0
- raxe/integrations/utils.py +135 -0
- raxe/mcp/__init__.py +62 -0
- raxe/mcp/cli.py +97 -0
- raxe/mcp/server.py +409 -0
- raxe/monitoring/__init__.py +51 -0
- raxe/monitoring/metrics.py +372 -0
- raxe/monitoring/profiler.py +388 -0
- raxe/monitoring/server.py +136 -0
- raxe/packs/core/v1.0.0/pack.yaml +1394 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-001@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-006@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-014@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-017@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-022@1.0.0.yaml +67 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-023@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-024@1.0.0.yaml +80 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-025@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-026@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-027@1.0.0.yaml +77 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-028@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-029@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-030@1.0.0.yaml +55 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-033@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-035@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-046@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-047@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-048@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-049@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-050@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-068@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-078@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2001@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-2004@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-201@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-202@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-203@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3007@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3016@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3027@1.0.0.yaml +64 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3028@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3029@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3030@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3031@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3032@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3033@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-3034@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/PI/pi-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-007@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-015@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-017@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-022@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-023@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-025@1.0.0.yaml +93 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-026@1.0.0.yaml +81 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-027@1.0.0.yaml +82 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-028@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-033@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-036@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-037@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-052@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-054@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-056@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-065@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-075@1.0.0.yaml +45 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-079@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1080@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1090@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1104@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1105@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-1112@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-201@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-202@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-203@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-204@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-205@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-206@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-207@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-208@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-209@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-210@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-211@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-212@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-213@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-214@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-215@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-216@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-217@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-218@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-219@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-220@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-221@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-222@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-223@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-224@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-225@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-226@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-227@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-228@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-229@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-230@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-231@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-232@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-233@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-234@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-235@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-236@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-237@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/cmd/cmd-238@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-013@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-019@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-024@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-029@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-038@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-044@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-067@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-069@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-100@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-101@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-102@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-103@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-104@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-105@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-106@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-107@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-108@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-109@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-110@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-111@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-201@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-203@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3004@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3006@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-3011@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-5016@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6001@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-6002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-70@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-71@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-72@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-73@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-74@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-75@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-76@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-77@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-78@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-79@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-80@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-81@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-82@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-83@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-84@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-85@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-86@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-87@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-88@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-89@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-90@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-91@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-92@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-93@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-94@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-95@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-96@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-97@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-98@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/enc/enc-99@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-001@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-002@1.0.0.yaml +71 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-003@1.0.0.yaml +65 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-004@1.0.0.yaml +73 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-101@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-102@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-104@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-105@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-106@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-107@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-108@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-109@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-111@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-112@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-113@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-114@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-115@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-116@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-117@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-118@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-119@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-120@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-121@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-122@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-123@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-124@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-125@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-126@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-127@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-128@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-129@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-130@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-131@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-132@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-133@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-134@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-135@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-136@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-137@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-138@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-139@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-140@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-141@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-142@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-143@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-144@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-145@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-146@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-147@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-148@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-149@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-150@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-151@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-152@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-153@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-154@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-155@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-156@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-157@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-158@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-159@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-160@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/hc/hc-161@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-001@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-009@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-020@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-021@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-028@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-033@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-034@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-039@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-066@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-076@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-098@1.0.0.yaml +46 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-103@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-104@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-105@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-110@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-111@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-112@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-113@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-114@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-115@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-116@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-117@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-118@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-119@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-120@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-121@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-122@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-123@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-124@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-125@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-126@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-127@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-128@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-129@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-130@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-131@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-132@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-133@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-134@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-135@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-136@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-137@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-138@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-139@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-140@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-141@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-142@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-143@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-144@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-145@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-146@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-147@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-148@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-149@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-150@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-151@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-152@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-153@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-154@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-155@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-156@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-157@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-158@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-159@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-160@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-161@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-162@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-201@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-203@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-204@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-205@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-206@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/jb/jb-207@1.0.0.yaml +49 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-001@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-009@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-012@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-017@1.0.0.yaml +48 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-022@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-025@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-027@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-034@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-037@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-040@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-041@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-050@1.0.0.yaml +57 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-051@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-052@1.0.0.yaml +52 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-053@1.0.0.yaml +56 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-054@1.0.0.yaml +53 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-055@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-056@1.0.0.yaml +51 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-058@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2015@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2025@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2026@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2035@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2037@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-2042@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3001@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3002@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3003@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3004@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3005@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3006@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3007@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3008@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3009@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3010@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3011@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3012@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3013@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3014@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3015@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3016@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3017@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3018@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3019@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3020@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3021@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3022@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3023@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3024@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3025@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3026@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3027@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3028@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3029@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3030@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3031@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3032@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3033@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3034@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3035@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3036@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3037@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3038@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3039@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3040@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3041@1.0.0.yaml +39 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3042@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3043@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3044@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3045@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3046@1.0.0.yaml +37 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3047@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3048@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3049@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3050@1.0.0.yaml +44 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3051@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3052@1.0.0.yaml +36 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3053@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3054@1.0.0.yaml +35 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3055@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3056@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3057@1.0.0.yaml +40 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3058@1.0.0.yaml +43 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3059@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3060@1.0.0.yaml +42 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3061@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3062@1.0.0.yaml +50 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3063@1.0.0.yaml +54 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3064@1.0.0.yaml +78 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3065@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3066@1.0.0.yaml +84 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3067@1.0.0.yaml +88 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3068@1.0.0.yaml +94 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3069@1.0.0.yaml +90 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3070@1.0.0.yaml +99 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3071@1.0.0.yaml +91 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3072@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3073@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3074@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3075@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3076@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3077@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3078@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3079@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3080@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3081@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3082@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3083@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3084@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/pii/pii-3085@1.0.0.yaml +38 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-016@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-028@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-042@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-044@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-045@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-050@1.0.0.yaml +47 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-201@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-202@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3001@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3006@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3009@1.0.0.yaml +41 -0
- raxe/packs/core/v1.0.0/rules/rag/rag-3012@1.0.0.yaml +41 -0
- raxe/plugins/__init__.py +98 -0
- raxe/plugins/custom_rules.py +380 -0
- raxe/plugins/loader.py +389 -0
- raxe/plugins/manager.py +538 -0
- raxe/plugins/protocol.py +428 -0
- raxe/py.typed +0 -0
- raxe/sdk/__init__.py +77 -0
- raxe/sdk/agent_scanner.py +1918 -0
- raxe/sdk/client.py +1603 -0
- raxe/sdk/decorator.py +175 -0
- raxe/sdk/exceptions.py +859 -0
- raxe/sdk/integrations/__init__.py +277 -0
- raxe/sdk/integrations/agent_scanner.py +71 -0
- raxe/sdk/integrations/autogen.py +872 -0
- raxe/sdk/integrations/crewai.py +1368 -0
- raxe/sdk/integrations/dspy.py +845 -0
- raxe/sdk/integrations/extractors.py +363 -0
- raxe/sdk/integrations/huggingface.py +395 -0
- raxe/sdk/integrations/langchain.py +948 -0
- raxe/sdk/integrations/litellm.py +484 -0
- raxe/sdk/integrations/llamaindex.py +1049 -0
- raxe/sdk/integrations/portkey.py +831 -0
- raxe/sdk/suppression_context.py +215 -0
- raxe/sdk/wrappers/__init__.py +163 -0
- raxe/sdk/wrappers/anthropic.py +310 -0
- raxe/sdk/wrappers/openai.py +221 -0
- raxe/sdk/wrappers/vertexai.py +484 -0
- raxe/utils/__init__.py +12 -0
- raxe/utils/error_sanitizer.py +135 -0
- raxe/utils/logging.py +241 -0
- raxe/utils/performance.py +414 -0
- raxe/utils/profiler.py +339 -0
- raxe/utils/validators.py +170 -0
- raxe-0.4.6.dist-info/METADATA +471 -0
- raxe-0.4.6.dist-info/RECORD +668 -0
- raxe-0.4.6.dist-info/WHEEL +5 -0
- raxe-0.4.6.dist-info/entry_points.txt +2 -0
- raxe-0.4.6.dist-info/licenses/LICENSE +56 -0
- raxe-0.4.6.dist-info/top_level.txt +1 -0
raxe/cli/event.py
ADDED
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
"""CLI commands for event lookup from the RAXE portal.
|
|
2
|
+
|
|
3
|
+
Provides commands to look up scan events by ID and display detailed information
|
|
4
|
+
with rich formatting. Events are retrieved from the RAXE console API.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import re
|
|
10
|
+
import urllib.error
|
|
11
|
+
import urllib.request
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from datetime import datetime, timezone
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
import click
|
|
17
|
+
from rich.panel import Panel
|
|
18
|
+
from rich.table import Table
|
|
19
|
+
from rich.text import Text
|
|
20
|
+
|
|
21
|
+
from raxe.cli.output import console, display_error, display_warning
|
|
22
|
+
from raxe.infrastructure.config.endpoints import get_console_url
|
|
23
|
+
from raxe.infrastructure.database.scan_history import ScanHistoryDB
|
|
24
|
+
from raxe.infrastructure.telemetry.credential_store import CredentialStore
|
|
25
|
+
from raxe.utils.logging import get_logger
|
|
26
|
+
|
|
27
|
+
logger = get_logger(__name__)
|
|
28
|
+
|
|
29
|
+
# Event ID validation pattern: evt_{16 hex chars}
|
|
30
|
+
EVENT_ID_PATTERN = re.compile(r"^evt_[a-f0-9]{16}$")
|
|
31
|
+
|
|
32
|
+
# Severity color mapping for consistent display
|
|
33
|
+
SEVERITY_COLORS = {
|
|
34
|
+
"critical": "red bold",
|
|
35
|
+
"high": "red",
|
|
36
|
+
"medium": "yellow",
|
|
37
|
+
"low": "blue",
|
|
38
|
+
"none": "green",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
SEVERITY_ICONS = {
|
|
42
|
+
"critical": "[red bold]!!![/red bold]",
|
|
43
|
+
"high": "[red]!![/red]",
|
|
44
|
+
"medium": "[yellow]![/yellow]",
|
|
45
|
+
"low": "[blue]o[/blue]",
|
|
46
|
+
"none": "[green]*[/green]",
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass
|
|
51
|
+
class EventData:
|
|
52
|
+
"""Parsed event data from the portal API.
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
event_id: Unique event identifier (evt_xxx format)
|
|
56
|
+
timestamp: ISO 8601 timestamp when scan occurred
|
|
57
|
+
severity: Highest severity level detected
|
|
58
|
+
detections: List of detection details
|
|
59
|
+
prompt_hash: SHA256 hash of the scanned prompt
|
|
60
|
+
prompt_length: Length of the original prompt in characters
|
|
61
|
+
scan_duration_ms: Scan duration in milliseconds
|
|
62
|
+
prompt_text: Optional full prompt text (only if --show-prompt)
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
event_id: str
|
|
66
|
+
timestamp: str
|
|
67
|
+
severity: str
|
|
68
|
+
detections: list[dict[str, Any]]
|
|
69
|
+
prompt_hash: str
|
|
70
|
+
prompt_length: int | None = None
|
|
71
|
+
scan_duration_ms: float | None = None
|
|
72
|
+
prompt_text: str | None = None
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def from_api_response(cls, data: dict[str, Any]) -> "EventData":
|
|
76
|
+
"""Create EventData from API response.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
data: API response dictionary
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
EventData instance
|
|
83
|
+
"""
|
|
84
|
+
return cls(
|
|
85
|
+
event_id=data.get("event_id", ""),
|
|
86
|
+
timestamp=data.get("timestamp", ""),
|
|
87
|
+
severity=data.get("severity", data.get("highest_severity", "none")),
|
|
88
|
+
detections=data.get("detections", []),
|
|
89
|
+
prompt_hash=data.get("prompt_hash", ""),
|
|
90
|
+
prompt_length=data.get("prompt_length"),
|
|
91
|
+
scan_duration_ms=data.get("scan_duration_ms"),
|
|
92
|
+
prompt_text=data.get("prompt_text"),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def validate_event_id(event_id: str) -> bool:
|
|
97
|
+
"""Validate event ID format.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
event_id: Event ID to validate
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
True if valid, False otherwise
|
|
104
|
+
"""
|
|
105
|
+
return EVENT_ID_PATTERN.match(event_id) is not None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def format_relative_time(iso_timestamp: str) -> str:
|
|
109
|
+
"""Format ISO timestamp as relative time.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
iso_timestamp: ISO 8601 timestamp string
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Human-readable relative time string (e.g., "2 hours ago")
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
# Parse the timestamp
|
|
119
|
+
timestamp_str = iso_timestamp.replace("Z", "+00:00")
|
|
120
|
+
event_time = datetime.fromisoformat(timestamp_str)
|
|
121
|
+
now = datetime.now(timezone.utc)
|
|
122
|
+
|
|
123
|
+
delta = now - event_time
|
|
124
|
+
seconds = int(delta.total_seconds())
|
|
125
|
+
|
|
126
|
+
if seconds < 0:
|
|
127
|
+
return "in the future"
|
|
128
|
+
elif seconds < 60:
|
|
129
|
+
return f"{seconds} second{'s' if seconds != 1 else ''} ago"
|
|
130
|
+
elif seconds < 3600:
|
|
131
|
+
minutes = seconds // 60
|
|
132
|
+
return f"{minutes} minute{'s' if minutes != 1 else ''} ago"
|
|
133
|
+
elif seconds < 86400:
|
|
134
|
+
hours = seconds // 3600
|
|
135
|
+
return f"{hours} hour{'s' if hours != 1 else ''} ago"
|
|
136
|
+
elif seconds < 604800:
|
|
137
|
+
days = seconds // 86400
|
|
138
|
+
return f"{days} day{'s' if days != 1 else ''} ago"
|
|
139
|
+
elif seconds < 2592000:
|
|
140
|
+
weeks = seconds // 604800
|
|
141
|
+
return f"{weeks} week{'s' if weeks != 1 else ''} ago"
|
|
142
|
+
else:
|
|
143
|
+
months = seconds // 2592000
|
|
144
|
+
return f"{months} month{'s' if months != 1 else ''} ago"
|
|
145
|
+
except (ValueError, TypeError):
|
|
146
|
+
return ""
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def fetch_event_from_local(event_id: str) -> EventData | None:
|
|
150
|
+
"""Fetch event data from local scan history database.
|
|
151
|
+
|
|
152
|
+
This is the preferred lookup method as it contains full prompt text
|
|
153
|
+
stored locally for privacy.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
event_id: Event ID to look up
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
EventData if found, None otherwise
|
|
160
|
+
"""
|
|
161
|
+
try:
|
|
162
|
+
db = ScanHistoryDB()
|
|
163
|
+
scan = db.get_by_event_id(event_id)
|
|
164
|
+
|
|
165
|
+
if scan is None:
|
|
166
|
+
logger.debug("Event not found in local history: %s", event_id)
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
# Get detections for this scan
|
|
170
|
+
detections = db.get_detections(scan.id) if scan.id else []
|
|
171
|
+
|
|
172
|
+
# Prompt text is now stored directly on the scan record
|
|
173
|
+
prompt_text = scan.prompt_text
|
|
174
|
+
|
|
175
|
+
return EventData(
|
|
176
|
+
event_id=event_id,
|
|
177
|
+
timestamp=scan.timestamp.isoformat() if scan.timestamp else "",
|
|
178
|
+
severity=scan.highest_severity or "none",
|
|
179
|
+
detections=[
|
|
180
|
+
{
|
|
181
|
+
"rule_id": d.rule_id,
|
|
182
|
+
"severity": d.severity,
|
|
183
|
+
"confidence": d.confidence,
|
|
184
|
+
"description": d.description or f"{d.category or 'Detection'}: {d.rule_id}",
|
|
185
|
+
"layer": d.detection_layer,
|
|
186
|
+
}
|
|
187
|
+
for d in detections
|
|
188
|
+
],
|
|
189
|
+
prompt_hash=scan.prompt_hash or "",
|
|
190
|
+
prompt_length=len(prompt_text) if prompt_text else None,
|
|
191
|
+
scan_duration_ms=scan.total_duration_ms,
|
|
192
|
+
prompt_text=prompt_text,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
except Exception as e:
|
|
196
|
+
logger.debug("Failed to fetch from local history: %s", e)
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def fetch_event_from_portal(event_id: str, show_prompt: bool = False) -> EventData | None:
|
|
201
|
+
"""Fetch event data from the RAXE portal API.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
event_id: Event ID to look up
|
|
205
|
+
show_prompt: Whether to request full prompt text
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
EventData if found, None otherwise
|
|
209
|
+
|
|
210
|
+
Raises:
|
|
211
|
+
Exception: If API request fails
|
|
212
|
+
"""
|
|
213
|
+
# Get credentials for authentication
|
|
214
|
+
store = CredentialStore()
|
|
215
|
+
credentials = store.load()
|
|
216
|
+
|
|
217
|
+
if credentials is None:
|
|
218
|
+
logger.debug("No credentials found, cannot fetch event")
|
|
219
|
+
return None
|
|
220
|
+
|
|
221
|
+
# Build API URL
|
|
222
|
+
console_base = get_console_url()
|
|
223
|
+
api_url = f"{console_base}/api/events/{event_id}"
|
|
224
|
+
|
|
225
|
+
if show_prompt:
|
|
226
|
+
api_url += "?include_prompt=true"
|
|
227
|
+
|
|
228
|
+
logger.debug("Fetching event from: %s", api_url)
|
|
229
|
+
|
|
230
|
+
# Make API request
|
|
231
|
+
try:
|
|
232
|
+
req = urllib.request.Request(api_url, method="GET")
|
|
233
|
+
req.add_header("Authorization", f"Bearer {credentials.api_key}")
|
|
234
|
+
req.add_header("Content-Type", "application/json")
|
|
235
|
+
req.add_header("User-Agent", "raxe-cli/event-lookup")
|
|
236
|
+
|
|
237
|
+
with urllib.request.urlopen(req, timeout=10) as response:
|
|
238
|
+
data = json.loads(response.read().decode("utf-8"))
|
|
239
|
+
return EventData.from_api_response(data)
|
|
240
|
+
|
|
241
|
+
except urllib.error.HTTPError as e:
|
|
242
|
+
if e.code == 404:
|
|
243
|
+
logger.debug("Event not found: %s", event_id)
|
|
244
|
+
return None
|
|
245
|
+
elif e.code == 401:
|
|
246
|
+
logger.warning("Authentication failed for event lookup")
|
|
247
|
+
raise Exception("Authentication failed. Try running: raxe auth login") from e
|
|
248
|
+
elif e.code == 403:
|
|
249
|
+
logger.warning("Access denied for event lookup")
|
|
250
|
+
raise Exception("Access denied. You may not have permission to view this event.") from e
|
|
251
|
+
else:
|
|
252
|
+
raise Exception(f"API request failed with status {e.code}: {e.reason}") from e
|
|
253
|
+
except urllib.error.URLError as e:
|
|
254
|
+
raise Exception(f"Network error: {e.reason}") from e
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def display_event_rich(event: EventData, show_prompt: bool = False) -> None:
|
|
258
|
+
"""Display event details with rich formatting.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
event: Event data to display
|
|
262
|
+
show_prompt: Whether to show full prompt text
|
|
263
|
+
"""
|
|
264
|
+
severity_lower = event.severity.lower()
|
|
265
|
+
severity_color = SEVERITY_COLORS.get(severity_lower, "white")
|
|
266
|
+
severity_icon = SEVERITY_ICONS.get(severity_lower, "")
|
|
267
|
+
|
|
268
|
+
# Calculate relative time
|
|
269
|
+
relative_time = format_relative_time(event.timestamp)
|
|
270
|
+
timestamp_display = event.timestamp
|
|
271
|
+
if relative_time:
|
|
272
|
+
timestamp_display = f"{event.timestamp} ({relative_time})"
|
|
273
|
+
|
|
274
|
+
# Build header
|
|
275
|
+
header_text = Text()
|
|
276
|
+
header_text.append(" EVENT DETAILS", style="bold cyan")
|
|
277
|
+
header_text.append(" " * 20) # Spacer
|
|
278
|
+
header_text.append(f"{event.event_id}", style="cyan dim")
|
|
279
|
+
|
|
280
|
+
console.print(Panel(header_text, border_style="cyan", padding=(0, 1)))
|
|
281
|
+
console.print()
|
|
282
|
+
|
|
283
|
+
# Event metadata section
|
|
284
|
+
console.print("[bold] Timestamp:[/bold] ", end="")
|
|
285
|
+
console.print(f"[white]{timestamp_display}[/white]")
|
|
286
|
+
|
|
287
|
+
console.print("[bold] Severity:[/bold] ", end="")
|
|
288
|
+
console.print(f"[{severity_color}]{event.severity.upper()}[/{severity_color}] {severity_icon}")
|
|
289
|
+
|
|
290
|
+
detection_count = len(event.detections)
|
|
291
|
+
if detection_count == 0:
|
|
292
|
+
console.print("[bold] Detections:[/bold] [green]No threats found[/green]")
|
|
293
|
+
else:
|
|
294
|
+
console.print(f"[bold] Detections:[/bold] [yellow]{detection_count} threat{'s' if detection_count != 1 else ''} found[/yellow]")
|
|
295
|
+
|
|
296
|
+
if event.scan_duration_ms is not None:
|
|
297
|
+
console.print(f"[bold] Scan Time:[/bold] [white]{event.scan_duration_ms:.1f}ms[/white]")
|
|
298
|
+
|
|
299
|
+
console.print()
|
|
300
|
+
|
|
301
|
+
# Separate L1 and L2 detections
|
|
302
|
+
l1_detections = [d for d in event.detections if d.get("layer", "L1") == "L1"]
|
|
303
|
+
l2_detections = [d for d in event.detections if d.get("layer", "L1") == "L2"]
|
|
304
|
+
|
|
305
|
+
# L1 Detections table
|
|
306
|
+
if l1_detections:
|
|
307
|
+
console.print(f"[bold blue] L1 RULE-BASED DETECTIONS[/bold blue] [dim]({len(l1_detections)} rules matched)[/dim]")
|
|
308
|
+
console.print(" " + "-" * 70)
|
|
309
|
+
|
|
310
|
+
table = Table(
|
|
311
|
+
show_header=True,
|
|
312
|
+
header_style="bold cyan",
|
|
313
|
+
box=None,
|
|
314
|
+
padding=(0, 1),
|
|
315
|
+
)
|
|
316
|
+
table.add_column("Rule", style="cyan", no_wrap=True, width=10)
|
|
317
|
+
table.add_column("Severity", style="bold", width=10)
|
|
318
|
+
table.add_column("Confidence", justify="right", width=12)
|
|
319
|
+
table.add_column("Description", style="white")
|
|
320
|
+
|
|
321
|
+
for detection in l1_detections:
|
|
322
|
+
det_severity = detection.get("severity", "unknown").lower()
|
|
323
|
+
det_color = SEVERITY_COLORS.get(det_severity, "white")
|
|
324
|
+
severity_text = Text(det_severity.upper(), style=det_color)
|
|
325
|
+
|
|
326
|
+
confidence = detection.get("confidence", 0)
|
|
327
|
+
confidence_str = f"{confidence * 100:.1f}%" if isinstance(confidence, float) else str(confidence)
|
|
328
|
+
|
|
329
|
+
description = detection.get("description", detection.get("message", "-"))
|
|
330
|
+
if len(description) > 60:
|
|
331
|
+
description = description[:57] + "..."
|
|
332
|
+
|
|
333
|
+
rule_id = detection.get("rule_id", "-")
|
|
334
|
+
|
|
335
|
+
table.add_row(
|
|
336
|
+
rule_id,
|
|
337
|
+
severity_text,
|
|
338
|
+
confidence_str,
|
|
339
|
+
description,
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
console.print(table)
|
|
343
|
+
console.print()
|
|
344
|
+
|
|
345
|
+
# L2 ML Classification block
|
|
346
|
+
if l2_detections:
|
|
347
|
+
console.print("[bold magenta] L2 ML CLASSIFICATION[/bold magenta]")
|
|
348
|
+
console.print()
|
|
349
|
+
|
|
350
|
+
for detection in l2_detections:
|
|
351
|
+
det_severity = detection.get("severity", "unknown").lower()
|
|
352
|
+
det_color = SEVERITY_COLORS.get(det_severity, "white")
|
|
353
|
+
|
|
354
|
+
confidence = detection.get("confidence", 0)
|
|
355
|
+
confidence_pct = f"{confidence * 100:.0f}%" if isinstance(confidence, float) else str(confidence)
|
|
356
|
+
|
|
357
|
+
# Extract threat type from rule_id (e.g., "L2-context_manipulation" -> "Context Manipulation")
|
|
358
|
+
rule_id = detection.get("rule_id", "-")
|
|
359
|
+
threat_type = rule_id.replace("L2-", "").replace("_", " ").title()
|
|
360
|
+
|
|
361
|
+
# Get the classification/family from description
|
|
362
|
+
description = detection.get("description", "")
|
|
363
|
+
# Parse description like "L2 ML Detection: pi_instruction_override"
|
|
364
|
+
family = ""
|
|
365
|
+
if ":" in description:
|
|
366
|
+
family = description.split(":")[-1].strip()
|
|
367
|
+
|
|
368
|
+
# Build the L2 block content using Text with proper styling
|
|
369
|
+
l2_content = Text()
|
|
370
|
+
|
|
371
|
+
# Severity icon based on level
|
|
372
|
+
if det_severity == "critical":
|
|
373
|
+
l2_content.append(" 🔴 ", style="red bold")
|
|
374
|
+
elif det_severity == "high":
|
|
375
|
+
l2_content.append(" 🟠 ", style="red")
|
|
376
|
+
elif det_severity == "medium":
|
|
377
|
+
l2_content.append(" 🟡 ", style="yellow")
|
|
378
|
+
else:
|
|
379
|
+
l2_content.append(" 🔵 ", style="blue")
|
|
380
|
+
|
|
381
|
+
l2_content.append(f"{threat_type}", style=f"{det_color} bold")
|
|
382
|
+
if family:
|
|
383
|
+
l2_content.append(f" ({family})", style="dim")
|
|
384
|
+
l2_content.append("\n")
|
|
385
|
+
l2_content.append(f" Risk Score: ", style="white")
|
|
386
|
+
l2_content.append(f"{confidence_pct}", style=det_color)
|
|
387
|
+
l2_content.append(f" • Severity: ", style="white")
|
|
388
|
+
l2_content.append(f"{det_severity.upper()}", style=det_color)
|
|
389
|
+
|
|
390
|
+
console.print(Panel(
|
|
391
|
+
l2_content,
|
|
392
|
+
border_style="magenta",
|
|
393
|
+
padding=(0, 2),
|
|
394
|
+
))
|
|
395
|
+
console.print()
|
|
396
|
+
|
|
397
|
+
# Handle case with no detections
|
|
398
|
+
if not event.detections:
|
|
399
|
+
console.print("[bold cyan] DETECTIONS[/bold cyan]")
|
|
400
|
+
console.print(" " + "-" * 70)
|
|
401
|
+
console.print(" [green]No threats detected[/green]")
|
|
402
|
+
console.print()
|
|
403
|
+
|
|
404
|
+
# Prompt section
|
|
405
|
+
console.print("[bold cyan] PROMPT[/bold cyan]")
|
|
406
|
+
console.print(" " + "-" * 70)
|
|
407
|
+
|
|
408
|
+
# Show prompt length if available
|
|
409
|
+
length_info = f"Length: {event.prompt_length} chars" if event.prompt_length else "Length: unknown"
|
|
410
|
+
hash_info = f"Hash: {event.prompt_hash[:20]}..." if len(event.prompt_hash) > 20 else f"Hash: {event.prompt_hash}"
|
|
411
|
+
|
|
412
|
+
console.print(f" [dim]{length_info} | {hash_info}[/dim]")
|
|
413
|
+
|
|
414
|
+
if show_prompt and event.prompt_text:
|
|
415
|
+
console.print()
|
|
416
|
+
console.print("[yellow] WARNING: Displaying sensitive prompt content[/yellow]")
|
|
417
|
+
console.print()
|
|
418
|
+
# Display prompt in a box for clarity
|
|
419
|
+
console.print(Panel(
|
|
420
|
+
event.prompt_text,
|
|
421
|
+
border_style="yellow",
|
|
422
|
+
title="[yellow]Prompt Content[/yellow]",
|
|
423
|
+
padding=(1, 2),
|
|
424
|
+
))
|
|
425
|
+
elif show_prompt and not event.prompt_text:
|
|
426
|
+
console.print(" [yellow]Prompt text not available (may not be stored for privacy)[/yellow]")
|
|
427
|
+
else:
|
|
428
|
+
console.print(" [dim]Use --show-prompt to reveal (contains sensitive content)[/dim]")
|
|
429
|
+
|
|
430
|
+
console.print()
|
|
431
|
+
|
|
432
|
+
# Actions section
|
|
433
|
+
console.print("[bold cyan] ACTIONS[/bold cyan]")
|
|
434
|
+
console.print(" " + "-" * 70)
|
|
435
|
+
|
|
436
|
+
portal_url = f"{get_console_url()}/portal/events/{event.event_id}"
|
|
437
|
+
console.print(f" [bold]Portal:[/bold] [blue underline]{portal_url}[/blue underline]")
|
|
438
|
+
|
|
439
|
+
# Show suppress command suggestion for detected threats
|
|
440
|
+
if event.detections:
|
|
441
|
+
first_rule_id = event.detections[0].get("rule_id", "RULE_ID")
|
|
442
|
+
console.print(f' [bold]Suppress:[/bold] [cyan]raxe suppress add {first_rule_id} --reason "..."[/cyan]')
|
|
443
|
+
|
|
444
|
+
console.print()
|
|
445
|
+
|
|
446
|
+
# What to do next section for threats
|
|
447
|
+
if detection_count > 0:
|
|
448
|
+
next_steps = Text()
|
|
449
|
+
next_steps.append("\n")
|
|
450
|
+
next_steps.append("What to do next:\n\n", style="bold yellow")
|
|
451
|
+
next_steps.append(" 1. ", style="white")
|
|
452
|
+
next_steps.append("Review the detection details above\n", style="dim")
|
|
453
|
+
next_steps.append(" 2. ", style="white")
|
|
454
|
+
next_steps.append("Visit the portal link for full analysis\n", style="dim")
|
|
455
|
+
next_steps.append(" 3. ", style="white")
|
|
456
|
+
next_steps.append("If false positive, add a suppression rule\n", style="dim")
|
|
457
|
+
next_steps.append(" 4. ", style="white")
|
|
458
|
+
next_steps.append("If legitimate threat, investigate the source\n", style="dim")
|
|
459
|
+
|
|
460
|
+
console.print(Panel(
|
|
461
|
+
next_steps,
|
|
462
|
+
border_style="yellow",
|
|
463
|
+
padding=(0, 2),
|
|
464
|
+
))
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def display_event_json(event: EventData) -> None:
|
|
468
|
+
"""Display event details as JSON.
|
|
469
|
+
|
|
470
|
+
Args:
|
|
471
|
+
event: Event data to display
|
|
472
|
+
"""
|
|
473
|
+
output = {
|
|
474
|
+
"event_id": event.event_id,
|
|
475
|
+
"timestamp": event.timestamp,
|
|
476
|
+
"severity": event.severity,
|
|
477
|
+
"detections": event.detections,
|
|
478
|
+
"prompt_hash": event.prompt_hash,
|
|
479
|
+
"prompt_length": event.prompt_length,
|
|
480
|
+
"scan_duration_ms": event.scan_duration_ms,
|
|
481
|
+
"portal_url": f"{get_console_url()}/portal/events/{event.event_id}",
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if event.prompt_text:
|
|
485
|
+
output["prompt_text"] = event.prompt_text
|
|
486
|
+
|
|
487
|
+
console.print(json.dumps(output, indent=2))
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
@click.group()
|
|
491
|
+
def event() -> None:
|
|
492
|
+
"""Look up scan events by ID from the portal.
|
|
493
|
+
|
|
494
|
+
Query the RAXE console for detailed event information including
|
|
495
|
+
threat detections, timing, and actionable next steps.
|
|
496
|
+
|
|
497
|
+
\b
|
|
498
|
+
Examples:
|
|
499
|
+
raxe event show evt_ae041c39a67744fd
|
|
500
|
+
raxe event show evt_ae041c39a67744fd --show-prompt
|
|
501
|
+
raxe event show evt_ae041c39a67744fd --format json
|
|
502
|
+
"""
|
|
503
|
+
pass
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
@event.command("show")
|
|
507
|
+
@click.argument("event_id")
|
|
508
|
+
@click.option(
|
|
509
|
+
"--show-prompt",
|
|
510
|
+
is_flag=True,
|
|
511
|
+
help="Reveal full prompt text (WARNING: contains sensitive content)",
|
|
512
|
+
)
|
|
513
|
+
@click.option(
|
|
514
|
+
"--format",
|
|
515
|
+
"output_format",
|
|
516
|
+
type=click.Choice(["rich", "json"]),
|
|
517
|
+
default="rich",
|
|
518
|
+
help="Output format (default: rich)",
|
|
519
|
+
)
|
|
520
|
+
def show_event(event_id: str, show_prompt: bool, output_format: str) -> None:
|
|
521
|
+
"""Show details for a specific scan event.
|
|
522
|
+
|
|
523
|
+
Look up an event by its ID (evt_xxx format) and display detailed
|
|
524
|
+
information including detections, timing, and next steps.
|
|
525
|
+
|
|
526
|
+
\b
|
|
527
|
+
Arguments:
|
|
528
|
+
EVENT_ID The event ID to look up (format: evt_{16 hex chars})
|
|
529
|
+
|
|
530
|
+
\b
|
|
531
|
+
Examples:
|
|
532
|
+
raxe event show evt_ae041c39a67744fd
|
|
533
|
+
raxe event show evt_ae041c39a67744fd --show-prompt
|
|
534
|
+
raxe event show evt_ae041c39a67744fd --format json
|
|
535
|
+
"""
|
|
536
|
+
# Validate event ID format
|
|
537
|
+
if not validate_event_id(event_id):
|
|
538
|
+
display_error(
|
|
539
|
+
"Invalid event ID format",
|
|
540
|
+
f"Expected format: evt_{{16 hex chars}}\n"
|
|
541
|
+
f"Example: evt_ae041c39a67744fd\n"
|
|
542
|
+
f"Received: {event_id}"
|
|
543
|
+
)
|
|
544
|
+
console.print()
|
|
545
|
+
console.print("[dim]Hint: Event IDs are shown in scan output and the portal.[/dim]")
|
|
546
|
+
raise click.Abort()
|
|
547
|
+
|
|
548
|
+
# Show warning for --show-prompt
|
|
549
|
+
if show_prompt:
|
|
550
|
+
display_warning(
|
|
551
|
+
"Prompt reveal requested",
|
|
552
|
+
"Full prompt content will be displayed. This may contain sensitive information."
|
|
553
|
+
)
|
|
554
|
+
console.print()
|
|
555
|
+
|
|
556
|
+
# Try local lookup first (contains full prompt text for privacy)
|
|
557
|
+
event_data = fetch_event_from_local(event_id)
|
|
558
|
+
source = "local"
|
|
559
|
+
|
|
560
|
+
if event_data is None:
|
|
561
|
+
# Fall back to portal lookup
|
|
562
|
+
try:
|
|
563
|
+
event_data = fetch_event_from_portal(event_id, show_prompt=show_prompt)
|
|
564
|
+
source = "portal"
|
|
565
|
+
except Exception as e:
|
|
566
|
+
# Check if this might be a network/auth issue
|
|
567
|
+
error_msg = str(e)
|
|
568
|
+
if "Authentication" in error_msg or "401" in error_msg:
|
|
569
|
+
display_error(
|
|
570
|
+
"Authentication required",
|
|
571
|
+
"You need to be logged in to view events.\n"
|
|
572
|
+
"Run: raxe auth login"
|
|
573
|
+
)
|
|
574
|
+
elif "network" in error_msg.lower() or "url" in error_msg.lower():
|
|
575
|
+
display_error(
|
|
576
|
+
"Network error",
|
|
577
|
+
f"Could not connect to the RAXE portal.\n{error_msg}"
|
|
578
|
+
)
|
|
579
|
+
else:
|
|
580
|
+
display_error("Failed to fetch event", error_msg)
|
|
581
|
+
|
|
582
|
+
raise click.Abort() from e
|
|
583
|
+
|
|
584
|
+
if event_data is None:
|
|
585
|
+
_display_event_not_found(event_id)
|
|
586
|
+
raise click.Abort()
|
|
587
|
+
|
|
588
|
+
# Display the event
|
|
589
|
+
if output_format == "json":
|
|
590
|
+
display_event_json(event_data)
|
|
591
|
+
else:
|
|
592
|
+
display_event_rich(event_data, show_prompt=show_prompt)
|
|
593
|
+
_display_privacy_footer(source)
|
|
594
|
+
|
|
595
|
+
logger.info("event_show_completed", event_id=event_id, source=source)
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _display_privacy_footer(source: str) -> None:
|
|
599
|
+
"""Display privacy footer explaining local-only prompt storage.
|
|
600
|
+
|
|
601
|
+
Args:
|
|
602
|
+
source: Where the event was retrieved from ("local" or "portal")
|
|
603
|
+
"""
|
|
604
|
+
console.print("[dim]" + "-" * 74 + "[/dim]")
|
|
605
|
+
if source == "local":
|
|
606
|
+
console.print(
|
|
607
|
+
"[dim] Privacy: Prompt text is stored locally on this device only.[/dim]"
|
|
608
|
+
)
|
|
609
|
+
console.print(
|
|
610
|
+
"[dim] Use [cyan]raxe event show <event_id> --show-prompt[/cyan] to view it.[/dim]"
|
|
611
|
+
)
|
|
612
|
+
else:
|
|
613
|
+
console.print(
|
|
614
|
+
"[dim] Privacy: Prompt text is not available - only metadata is sent to the cloud.[/dim]"
|
|
615
|
+
)
|
|
616
|
+
console.print(
|
|
617
|
+
"[dim] Run the scan locally to store prompts for later retrieval.[/dim]"
|
|
618
|
+
)
|
|
619
|
+
console.print()
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def _display_event_not_found(event_id: str) -> None:
|
|
623
|
+
"""Display helpful message when event is not found.
|
|
624
|
+
|
|
625
|
+
Args:
|
|
626
|
+
event_id: The event ID that was not found
|
|
627
|
+
"""
|
|
628
|
+
console.print()
|
|
629
|
+
display_error(
|
|
630
|
+
f"Event not found: {event_id}",
|
|
631
|
+
"The event could not be found. This may be because:"
|
|
632
|
+
)
|
|
633
|
+
console.print()
|
|
634
|
+
console.print(" [dim]1.[/dim] The event ID is incorrect")
|
|
635
|
+
console.print(" [dim]2.[/dim] The event has been deleted or expired")
|
|
636
|
+
console.print(" [dim]3.[/dim] You don't have permission to view this event")
|
|
637
|
+
console.print(" [dim]4.[/dim] The event was created with a different API key")
|
|
638
|
+
console.print()
|
|
639
|
+
console.print("[bold]Suggestions:[/bold]")
|
|
640
|
+
console.print(" - Check scan output for the correct event ID")
|
|
641
|
+
console.print(" - View recent events in the portal: ", end="")
|
|
642
|
+
console.print(f"[blue underline]{get_console_url()}/portal/events[/blue underline]")
|
|
643
|
+
console.print(" - Run a new scan: [cyan]raxe scan \"your text\"[/cyan]")
|
|
644
|
+
console.print()
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
if __name__ == "__main__":
|
|
648
|
+
event()
|
raxe/cli/exit_codes.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Exit codes for RAXE CLI.
|
|
3
|
+
|
|
4
|
+
Standardized exit codes for consistent scripting and CI/CD integration.
|
|
5
|
+
|
|
6
|
+
Exit Code Reference:
|
|
7
|
+
EXIT_SUCCESS (0) - Command completed successfully (no threats detected)
|
|
8
|
+
EXIT_THREAT_DETECTED (1) - Threat(s) detected during scan
|
|
9
|
+
EXIT_INVALID_INPUT (2) - Invalid command arguments or input
|
|
10
|
+
EXIT_CONFIG_ERROR (3) - Configuration problem (missing config, invalid settings)
|
|
11
|
+
EXIT_SCAN_ERROR (4) - Scan execution failed (internal error)
|
|
12
|
+
|
|
13
|
+
Usage in CI/CD:
|
|
14
|
+
# Check for threats
|
|
15
|
+
raxe scan "prompt" --quiet
|
|
16
|
+
if [ $? -eq 1 ]; then
|
|
17
|
+
echo "Threat detected!"
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Handle different error types
|
|
21
|
+
raxe scan "prompt" --quiet
|
|
22
|
+
case $? in
|
|
23
|
+
0) echo "Clean" ;;
|
|
24
|
+
1) echo "Threat detected" ;;
|
|
25
|
+
2) echo "Invalid input" ;;
|
|
26
|
+
3) echo "Config error" ;;
|
|
27
|
+
4) echo "Scan failed" ;;
|
|
28
|
+
esac
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# Success - no threats detected, command completed normally
|
|
32
|
+
EXIT_SUCCESS: int = 0
|
|
33
|
+
|
|
34
|
+
# Threat detected during scan (used with --quiet mode for CI/CD)
|
|
35
|
+
EXIT_THREAT_DETECTED: int = 1
|
|
36
|
+
|
|
37
|
+
# Invalid input - bad command usage, missing required arguments
|
|
38
|
+
EXIT_INVALID_INPUT: int = 2
|
|
39
|
+
|
|
40
|
+
# Configuration error - missing config file, invalid settings
|
|
41
|
+
EXIT_CONFIG_ERROR: int = 3
|
|
42
|
+
|
|
43
|
+
# Scan execution error - internal failure during scan
|
|
44
|
+
EXIT_SCAN_ERROR: int = 4
|
|
45
|
+
|
|
46
|
+
# Authentication/credential error - expired or invalid API key
|
|
47
|
+
EXIT_AUTH_ERROR: int = 5
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
__all__ = [
|
|
51
|
+
"EXIT_AUTH_ERROR",
|
|
52
|
+
"EXIT_CONFIG_ERROR",
|
|
53
|
+
"EXIT_INVALID_INPUT",
|
|
54
|
+
"EXIT_SCAN_ERROR",
|
|
55
|
+
"EXIT_SUCCESS",
|
|
56
|
+
"EXIT_THREAT_DETECTED",
|
|
57
|
+
]
|