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,872 @@
|
|
|
1
|
+
"""AutoGen integration for RAXE scanning.
|
|
2
|
+
|
|
3
|
+
Provides RaxeConversationGuard for automatic security scanning of
|
|
4
|
+
multi-agent conversations in AutoGen applications.
|
|
5
|
+
|
|
6
|
+
This integration works with:
|
|
7
|
+
- ConversableAgent and its subclasses
|
|
8
|
+
- AssistantAgent, UserProxyAgent
|
|
9
|
+
- GroupChat conversations
|
|
10
|
+
- Function/tool calls
|
|
11
|
+
- Agent-to-agent message flows
|
|
12
|
+
|
|
13
|
+
Key Features:
|
|
14
|
+
- Hook-based message interception (no code changes to agents)
|
|
15
|
+
- Configurable blocking modes (log-only, block-on-threat, etc.)
|
|
16
|
+
- Multi-agent conversation awareness
|
|
17
|
+
- Function call scanning
|
|
18
|
+
- Privacy-preserving logging
|
|
19
|
+
|
|
20
|
+
Supported Versions:
|
|
21
|
+
- pyautogen 0.2.x / autogen-agentchat 0.2.x (hook-based API)
|
|
22
|
+
- autogen-agentchat 0.4.x+ (async message-based API)
|
|
23
|
+
- AG2 (fork): Compatible with 0.2.x API
|
|
24
|
+
|
|
25
|
+
Usage (v0.2.x - hook-based):
|
|
26
|
+
from autogen import AssistantAgent, UserProxyAgent
|
|
27
|
+
from raxe import Raxe
|
|
28
|
+
from raxe.sdk.integrations import RaxeConversationGuard
|
|
29
|
+
|
|
30
|
+
# Create agents
|
|
31
|
+
assistant = AssistantAgent("assistant", llm_config=llm_config)
|
|
32
|
+
user = UserProxyAgent("user")
|
|
33
|
+
|
|
34
|
+
# Create RAXE guard
|
|
35
|
+
raxe = Raxe()
|
|
36
|
+
guard = RaxeConversationGuard(raxe)
|
|
37
|
+
|
|
38
|
+
# Register with agents (one-liner per agent)
|
|
39
|
+
guard.register(assistant)
|
|
40
|
+
guard.register(user)
|
|
41
|
+
|
|
42
|
+
# Conversations are now automatically scanned
|
|
43
|
+
user.initiate_chat(assistant, message="Hello!")
|
|
44
|
+
|
|
45
|
+
Usage (v0.4.x+ - wrapper-based):
|
|
46
|
+
from autogen_agentchat.agents import AssistantAgent
|
|
47
|
+
from raxe import Raxe
|
|
48
|
+
from raxe.sdk.integrations import RaxeConversationGuard
|
|
49
|
+
|
|
50
|
+
# Create RAXE guard
|
|
51
|
+
raxe = Raxe()
|
|
52
|
+
guard = RaxeConversationGuard(raxe)
|
|
53
|
+
|
|
54
|
+
# Create agent with RAXE wrapper
|
|
55
|
+
assistant = AssistantAgent("assistant", model_client=client)
|
|
56
|
+
protected_assistant = guard.wrap_agent(assistant)
|
|
57
|
+
|
|
58
|
+
# Use protected agent in your workflow
|
|
59
|
+
"""
|
|
60
|
+
from __future__ import annotations
|
|
61
|
+
|
|
62
|
+
import logging
|
|
63
|
+
from typing import TYPE_CHECKING, Any
|
|
64
|
+
|
|
65
|
+
from raxe.sdk.agent_scanner import (
|
|
66
|
+
AgentScannerConfig,
|
|
67
|
+
AgentScanResult,
|
|
68
|
+
MessageType,
|
|
69
|
+
ScanContext,
|
|
70
|
+
create_agent_scanner,
|
|
71
|
+
)
|
|
72
|
+
from raxe.sdk.exceptions import SecurityException
|
|
73
|
+
from raxe.sdk.integrations.extractors import (
|
|
74
|
+
extract_function_call_text,
|
|
75
|
+
extract_text_from_message,
|
|
76
|
+
is_function_call,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
if TYPE_CHECKING:
|
|
80
|
+
from raxe.sdk.client import Raxe
|
|
81
|
+
|
|
82
|
+
logger = logging.getLogger(__name__)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# Type alias for AutoGen message format
|
|
86
|
+
AutoGenMessage = dict[str, Any]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# ============================================================================
|
|
90
|
+
# AutoGen Version Detection
|
|
91
|
+
# ============================================================================
|
|
92
|
+
|
|
93
|
+
def _detect_autogen_version() -> tuple[int, int, int]:
|
|
94
|
+
"""Detect installed AutoGen version.
|
|
95
|
+
|
|
96
|
+
Checks for autogen-agentchat (new package) first, then pyautogen.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Tuple of (major, minor, patch) version numbers.
|
|
100
|
+
Returns (0, 0, 0) if AutoGen is not installed.
|
|
101
|
+
"""
|
|
102
|
+
# Try new package name first (v0.4+)
|
|
103
|
+
try:
|
|
104
|
+
import autogen_agentchat
|
|
105
|
+
version_str = getattr(autogen_agentchat, "__version__", "0.0.0")
|
|
106
|
+
parts = version_str.split(".")
|
|
107
|
+
major = int(parts[0]) if len(parts) > 0 else 0
|
|
108
|
+
minor = int(parts[1]) if len(parts) > 1 else 0
|
|
109
|
+
patch = int(parts[2].split("-")[0].split("a")[0].split("b")[0]) if len(parts) > 2 else 0
|
|
110
|
+
return (major, minor, patch)
|
|
111
|
+
except ImportError:
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
# Try legacy package name (v0.2.x)
|
|
115
|
+
try:
|
|
116
|
+
import autogen
|
|
117
|
+
version_str = getattr(autogen, "__version__", "0.0.0")
|
|
118
|
+
parts = version_str.split(".")
|
|
119
|
+
major = int(parts[0]) if len(parts) > 0 else 0
|
|
120
|
+
minor = int(parts[1]) if len(parts) > 1 else 0
|
|
121
|
+
patch = int(parts[2].split("-")[0].split("a")[0].split("b")[0]) if len(parts) > 2 else 0
|
|
122
|
+
return (major, minor, patch)
|
|
123
|
+
except ImportError:
|
|
124
|
+
pass
|
|
125
|
+
|
|
126
|
+
# Try pyautogen (alternative package name)
|
|
127
|
+
try:
|
|
128
|
+
import pyautogen
|
|
129
|
+
version_str = getattr(pyautogen, "__version__", "0.0.0")
|
|
130
|
+
parts = version_str.split(".")
|
|
131
|
+
major = int(parts[0]) if len(parts) > 0 else 0
|
|
132
|
+
minor = int(parts[1]) if len(parts) > 1 else 0
|
|
133
|
+
patch = int(parts[2].split("-")[0].split("a")[0].split("b")[0]) if len(parts) > 2 else 0
|
|
134
|
+
return (major, minor, patch)
|
|
135
|
+
except ImportError:
|
|
136
|
+
pass
|
|
137
|
+
|
|
138
|
+
return (0, 0, 0)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _is_v04_or_later() -> bool:
|
|
142
|
+
"""Check if AutoGen v0.4+ (new async API) is installed.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
True if using v0.4+ with async message API.
|
|
146
|
+
"""
|
|
147
|
+
version = _detect_autogen_version()
|
|
148
|
+
return version >= (0, 4, 0)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _has_register_hook(agent: Any) -> bool:
|
|
152
|
+
"""Check if agent has register_hook method (v0.2.x API).
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
agent: AutoGen agent to check
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
True if agent supports hook-based registration
|
|
159
|
+
"""
|
|
160
|
+
return hasattr(agent, "register_hook") and callable(agent.register_hook)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _is_async_agent(agent: Any) -> bool:
|
|
164
|
+
"""Check if agent uses async message API (v0.4+ API).
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
agent: AutoGen agent to check
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
True if agent supports async message API
|
|
171
|
+
"""
|
|
172
|
+
return hasattr(agent, "on_messages") or hasattr(agent, "on_messages_stream")
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class RaxeConversationGuard:
|
|
176
|
+
"""RAXE security guard for AutoGen multi-agent conversations.
|
|
177
|
+
|
|
178
|
+
Registers hooks with AutoGen agents to intercept and scan messages
|
|
179
|
+
for security threats. Supports multiple agents and conversation flows.
|
|
180
|
+
|
|
181
|
+
The guard uses AutoGen's hook system to intercept messages at key points:
|
|
182
|
+
- process_message_before_send: Scan outgoing messages before sending
|
|
183
|
+
- process_all_messages_before_reply: Scan conversation history before reply
|
|
184
|
+
- process_last_received_message: Scan incoming messages
|
|
185
|
+
|
|
186
|
+
Attributes:
|
|
187
|
+
raxe: Raxe client instance for scanning
|
|
188
|
+
config: Scanner configuration
|
|
189
|
+
registered_agents: Set of registered agent names
|
|
190
|
+
|
|
191
|
+
Example:
|
|
192
|
+
# Basic usage with default config (log-only mode)
|
|
193
|
+
from autogen import AssistantAgent, UserProxyAgent
|
|
194
|
+
from raxe import Raxe
|
|
195
|
+
from raxe.sdk.integrations.autogen import RaxeConversationGuard
|
|
196
|
+
|
|
197
|
+
raxe = Raxe()
|
|
198
|
+
guard = RaxeConversationGuard(raxe)
|
|
199
|
+
|
|
200
|
+
assistant = AssistantAgent("assistant", llm_config=config)
|
|
201
|
+
user = UserProxyAgent("user")
|
|
202
|
+
|
|
203
|
+
guard.register(assistant)
|
|
204
|
+
guard.register(user)
|
|
205
|
+
|
|
206
|
+
# All messages are now scanned
|
|
207
|
+
user.initiate_chat(assistant, message="Hello!")
|
|
208
|
+
|
|
209
|
+
Example with blocking:
|
|
210
|
+
# Block on HIGH or CRITICAL threats
|
|
211
|
+
from raxe.sdk.integrations.autogen import RaxeConversationGuard
|
|
212
|
+
from raxe.sdk.agent_scanner import AgentScannerConfig
|
|
213
|
+
|
|
214
|
+
config = AgentScannerConfig(
|
|
215
|
+
on_threat="block",
|
|
216
|
+
block_severity_threshold="HIGH",
|
|
217
|
+
)
|
|
218
|
+
guard = RaxeConversationGuard(raxe, config=config)
|
|
219
|
+
|
|
220
|
+
# Messages with HIGH/CRITICAL threats will be blocked
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
def __init__(
|
|
224
|
+
self,
|
|
225
|
+
raxe: Raxe,
|
|
226
|
+
config: AgentScannerConfig | None = None,
|
|
227
|
+
) -> None:
|
|
228
|
+
"""Initialize the conversation guard.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
raxe: Raxe client instance for scanning
|
|
232
|
+
config: Optional scanner configuration. Defaults to log-only mode.
|
|
233
|
+
|
|
234
|
+
Example:
|
|
235
|
+
# Default (log-only)
|
|
236
|
+
guard = RaxeConversationGuard(raxe)
|
|
237
|
+
|
|
238
|
+
# Blocking mode for high severity threats
|
|
239
|
+
config = AgentScannerConfig(
|
|
240
|
+
on_threat="block",
|
|
241
|
+
block_severity_threshold="HIGH",
|
|
242
|
+
scan_tool_calls=True,
|
|
243
|
+
)
|
|
244
|
+
guard = RaxeConversationGuard(raxe, config=config)
|
|
245
|
+
"""
|
|
246
|
+
# Default to log-only mode for safety
|
|
247
|
+
if config is None:
|
|
248
|
+
config = AgentScannerConfig(on_threat="log")
|
|
249
|
+
|
|
250
|
+
self._config = config # Store for property access
|
|
251
|
+
self._scanner = create_agent_scanner(raxe, config, integration_type="autogen")
|
|
252
|
+
self._registered_agents: set[str] = set()
|
|
253
|
+
|
|
254
|
+
logger.info(
|
|
255
|
+
"RaxeConversationGuard initialized",
|
|
256
|
+
extra={
|
|
257
|
+
"on_threat": config.on_threat,
|
|
258
|
+
"scan_prompts": config.scan_prompts,
|
|
259
|
+
"scan_tool_calls": config.scan_tool_calls,
|
|
260
|
+
},
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
@property
|
|
264
|
+
def config(self) -> AgentScannerConfig:
|
|
265
|
+
"""Get the scanner configuration."""
|
|
266
|
+
return self._config
|
|
267
|
+
|
|
268
|
+
@property
|
|
269
|
+
def registered_agents(self) -> set[str]:
|
|
270
|
+
"""Get set of registered agent names."""
|
|
271
|
+
return self._registered_agents.copy()
|
|
272
|
+
|
|
273
|
+
def register(self, agent: Any) -> None:
|
|
274
|
+
"""Register RAXE scanning hooks with an AutoGen agent (v0.2.x).
|
|
275
|
+
|
|
276
|
+
This method registers message processing hooks with the agent
|
|
277
|
+
to enable automatic scanning of all messages.
|
|
278
|
+
|
|
279
|
+
For AutoGen v0.4+, use wrap_agent() instead.
|
|
280
|
+
|
|
281
|
+
Hooks registered:
|
|
282
|
+
- process_message_before_send: Scan outgoing messages
|
|
283
|
+
- process_last_received_message: Scan incoming messages
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
agent: AutoGen ConversableAgent or subclass (v0.2.x)
|
|
287
|
+
|
|
288
|
+
Raises:
|
|
289
|
+
TypeError: If agent is not a v0.2.x ConversableAgent
|
|
290
|
+
ValueError: If agent has no name attribute
|
|
291
|
+
|
|
292
|
+
Example:
|
|
293
|
+
assistant = AssistantAgent("assistant", llm_config=config)
|
|
294
|
+
guard.register(assistant)
|
|
295
|
+
"""
|
|
296
|
+
# Check if this is a v0.4+ async agent
|
|
297
|
+
if _is_async_agent(agent):
|
|
298
|
+
raise TypeError(
|
|
299
|
+
f"Agent {type(agent).__name__} uses AutoGen v0.4+ API. "
|
|
300
|
+
"Use guard.wrap_agent(agent) instead of guard.register(agent)."
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
# Validate agent type for v0.2.x
|
|
304
|
+
if not self._is_conversable_agent(agent):
|
|
305
|
+
raise TypeError(
|
|
306
|
+
f"Expected ConversableAgent with register_hook method, got {type(agent).__name__}. "
|
|
307
|
+
"For v0.2.x: use autogen.ConversableAgent or subclass. "
|
|
308
|
+
"For v0.4+: use guard.wrap_agent(agent) instead."
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# Get agent name
|
|
312
|
+
agent_name = getattr(agent, "name", None)
|
|
313
|
+
if agent_name is None:
|
|
314
|
+
raise ValueError("Agent must have a 'name' attribute")
|
|
315
|
+
|
|
316
|
+
# Skip if already registered
|
|
317
|
+
if agent_name in self._registered_agents:
|
|
318
|
+
logger.debug(
|
|
319
|
+
"Agent already registered",
|
|
320
|
+
extra={"agent": agent_name},
|
|
321
|
+
)
|
|
322
|
+
return
|
|
323
|
+
|
|
324
|
+
# Register hooks
|
|
325
|
+
self._register_hooks(agent)
|
|
326
|
+
|
|
327
|
+
# Track registration
|
|
328
|
+
self._registered_agents.add(agent_name)
|
|
329
|
+
|
|
330
|
+
logger.info(
|
|
331
|
+
"Agent registered with RAXE guard",
|
|
332
|
+
extra={"agent": agent_name},
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
def register_all(self, *agents: Any) -> None:
|
|
336
|
+
"""Register multiple agents at once.
|
|
337
|
+
|
|
338
|
+
Convenience method for registering several agents.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
*agents: AutoGen agents to register
|
|
342
|
+
|
|
343
|
+
Example:
|
|
344
|
+
assistant = AssistantAgent("assistant", llm_config=config)
|
|
345
|
+
user = UserProxyAgent("user")
|
|
346
|
+
critic = AssistantAgent("critic", llm_config=config)
|
|
347
|
+
|
|
348
|
+
guard.register_all(assistant, user, critic)
|
|
349
|
+
"""
|
|
350
|
+
for agent in agents:
|
|
351
|
+
self.register(agent)
|
|
352
|
+
|
|
353
|
+
def unregister(self, agent: Any) -> None:
|
|
354
|
+
"""Unregister an agent from RAXE scanning.
|
|
355
|
+
|
|
356
|
+
Note: This only removes tracking. AutoGen doesn't provide
|
|
357
|
+
a way to unregister hooks, so the hooks will remain active
|
|
358
|
+
but won't affect operation.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
agent: Agent to unregister
|
|
362
|
+
"""
|
|
363
|
+
agent_name = getattr(agent, "name", None)
|
|
364
|
+
if agent_name and agent_name in self._registered_agents:
|
|
365
|
+
self._registered_agents.discard(agent_name)
|
|
366
|
+
logger.info(
|
|
367
|
+
"Agent unregistered from RAXE guard",
|
|
368
|
+
extra={"agent": agent_name},
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
def _is_conversable_agent(self, agent: Any) -> bool:
|
|
372
|
+
"""Check if object is an AutoGen ConversableAgent (v0.2.x).
|
|
373
|
+
|
|
374
|
+
We check by duck typing to avoid hard dependency on autogen.
|
|
375
|
+
|
|
376
|
+
Args:
|
|
377
|
+
agent: Object to check
|
|
378
|
+
|
|
379
|
+
Returns:
|
|
380
|
+
True if agent appears to be a v0.2.x ConversableAgent
|
|
381
|
+
"""
|
|
382
|
+
# Check for required v0.2.x ConversableAgent methods
|
|
383
|
+
return _has_register_hook(agent) and hasattr(agent, "name")
|
|
384
|
+
|
|
385
|
+
def _register_hooks(self, agent: Any) -> None:
|
|
386
|
+
"""Register RAXE scanning hooks with an agent.
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
agent: AutoGen agent to register hooks with
|
|
390
|
+
"""
|
|
391
|
+
agent_name = getattr(agent, "name", "unknown")
|
|
392
|
+
|
|
393
|
+
# Create hook closures that capture agent context
|
|
394
|
+
def process_message_before_send_hook(
|
|
395
|
+
sender: Any,
|
|
396
|
+
message: AutoGenMessage | str,
|
|
397
|
+
recipient: Any,
|
|
398
|
+
silent: bool,
|
|
399
|
+
) -> AutoGenMessage | str:
|
|
400
|
+
"""Hook to scan messages before sending."""
|
|
401
|
+
return self._scan_outgoing_message(
|
|
402
|
+
message=message,
|
|
403
|
+
sender_name=agent_name,
|
|
404
|
+
recipient_name=getattr(recipient, "name", None),
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
def process_last_received_message_hook(
|
|
408
|
+
messages: list[AutoGenMessage],
|
|
409
|
+
) -> list[AutoGenMessage]:
|
|
410
|
+
"""Hook to scan the last received message."""
|
|
411
|
+
return self._scan_last_received(
|
|
412
|
+
messages=messages,
|
|
413
|
+
receiver_name=agent_name,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
# Register the hooks
|
|
417
|
+
try:
|
|
418
|
+
agent.register_hook(
|
|
419
|
+
"process_message_before_send",
|
|
420
|
+
process_message_before_send_hook,
|
|
421
|
+
)
|
|
422
|
+
logger.debug(
|
|
423
|
+
"Registered process_message_before_send hook",
|
|
424
|
+
extra={"agent": agent_name},
|
|
425
|
+
)
|
|
426
|
+
except Exception as e:
|
|
427
|
+
logger.warning(
|
|
428
|
+
"Failed to register process_message_before_send hook",
|
|
429
|
+
extra={"agent": agent_name, "error": str(e)},
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
try:
|
|
433
|
+
agent.register_hook(
|
|
434
|
+
"process_last_received_message",
|
|
435
|
+
process_last_received_message_hook,
|
|
436
|
+
)
|
|
437
|
+
logger.debug(
|
|
438
|
+
"Registered process_last_received_message hook",
|
|
439
|
+
extra={"agent": agent_name},
|
|
440
|
+
)
|
|
441
|
+
except Exception as e:
|
|
442
|
+
logger.warning(
|
|
443
|
+
"Failed to register process_last_received_message hook",
|
|
444
|
+
extra={"agent": agent_name, "error": str(e)},
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
def _raise_security_exception(self, result: AgentScanResult) -> None:
|
|
448
|
+
"""Raise SecurityException from an AgentScanResult.
|
|
449
|
+
|
|
450
|
+
Handles both cases where pipeline_result is available or not.
|
|
451
|
+
|
|
452
|
+
Args:
|
|
453
|
+
result: AgentScanResult with threat details
|
|
454
|
+
|
|
455
|
+
Raises:
|
|
456
|
+
SecurityException: Always raises with appropriate error info
|
|
457
|
+
"""
|
|
458
|
+
from raxe.sdk.exceptions import security_threat_detected_error
|
|
459
|
+
|
|
460
|
+
if result.pipeline_result is not None:
|
|
461
|
+
raise SecurityException(result.pipeline_result)
|
|
462
|
+
|
|
463
|
+
# Create exception from AgentScanResult data
|
|
464
|
+
error = security_threat_detected_error(
|
|
465
|
+
severity=str(result.severity or "UNKNOWN"),
|
|
466
|
+
detection_count=result.detection_count,
|
|
467
|
+
)
|
|
468
|
+
# Create a simple exception with the error info
|
|
469
|
+
message = (
|
|
470
|
+
f"Security threat detected: {result.severity} "
|
|
471
|
+
f"({result.detection_count} detection(s))"
|
|
472
|
+
)
|
|
473
|
+
exc = SecurityException.__new__(SecurityException)
|
|
474
|
+
exc.result = None # No pipeline result available
|
|
475
|
+
exc.error = error
|
|
476
|
+
Exception.__init__(exc, message)
|
|
477
|
+
raise exc
|
|
478
|
+
|
|
479
|
+
def _scan_outgoing_message(
|
|
480
|
+
self,
|
|
481
|
+
message: AutoGenMessage | str,
|
|
482
|
+
sender_name: str,
|
|
483
|
+
recipient_name: str | None,
|
|
484
|
+
) -> AutoGenMessage | str:
|
|
485
|
+
"""Scan an outgoing message before it's sent.
|
|
486
|
+
|
|
487
|
+
Args:
|
|
488
|
+
message: Message to scan (string or dict)
|
|
489
|
+
sender_name: Name of sending agent
|
|
490
|
+
recipient_name: Name of receiving agent
|
|
491
|
+
|
|
492
|
+
Returns:
|
|
493
|
+
Original message if allowed, raises SecurityException if blocked
|
|
494
|
+
"""
|
|
495
|
+
# Extract text content from message
|
|
496
|
+
text = self._extract_message_text(message)
|
|
497
|
+
if not text:
|
|
498
|
+
return message
|
|
499
|
+
|
|
500
|
+
# Determine message type
|
|
501
|
+
if self._is_function_call(message):
|
|
502
|
+
message_type = MessageType.FUNCTION_CALL
|
|
503
|
+
elif recipient_name is None:
|
|
504
|
+
message_type = MessageType.AGENT_RESPONSE
|
|
505
|
+
else:
|
|
506
|
+
message_type = MessageType.AGENT_TO_AGENT
|
|
507
|
+
|
|
508
|
+
# Create context
|
|
509
|
+
context = ScanContext(
|
|
510
|
+
message_type=message_type,
|
|
511
|
+
sender_name=sender_name,
|
|
512
|
+
receiver_name=recipient_name,
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
# Scan the message
|
|
516
|
+
result = self._scanner.scan_message(text, context=context)
|
|
517
|
+
|
|
518
|
+
# Handle blocking
|
|
519
|
+
if result.should_block:
|
|
520
|
+
self._raise_security_exception(result)
|
|
521
|
+
|
|
522
|
+
return message
|
|
523
|
+
|
|
524
|
+
def _scan_last_received(
|
|
525
|
+
self,
|
|
526
|
+
messages: list[AutoGenMessage],
|
|
527
|
+
receiver_name: str,
|
|
528
|
+
) -> list[AutoGenMessage]:
|
|
529
|
+
"""Scan the last received message in conversation.
|
|
530
|
+
|
|
531
|
+
This hook is called before generating a reply.
|
|
532
|
+
|
|
533
|
+
Args:
|
|
534
|
+
messages: List of messages in conversation
|
|
535
|
+
receiver_name: Name of agent receiving messages
|
|
536
|
+
|
|
537
|
+
Returns:
|
|
538
|
+
Original messages if allowed, raises SecurityException if blocked
|
|
539
|
+
"""
|
|
540
|
+
if not messages:
|
|
541
|
+
return messages
|
|
542
|
+
|
|
543
|
+
# Get the last message
|
|
544
|
+
last_message = messages[-1]
|
|
545
|
+
text = self._extract_message_text(last_message)
|
|
546
|
+
|
|
547
|
+
if not text:
|
|
548
|
+
return messages
|
|
549
|
+
|
|
550
|
+
# Determine sender and message type
|
|
551
|
+
sender_name = last_message.get("name") if isinstance(last_message, dict) else None
|
|
552
|
+
role = last_message.get("role") if isinstance(last_message, dict) else None
|
|
553
|
+
|
|
554
|
+
if role == "user":
|
|
555
|
+
message_type = MessageType.HUMAN_INPUT
|
|
556
|
+
elif role == "function":
|
|
557
|
+
message_type = MessageType.FUNCTION_RESULT
|
|
558
|
+
else:
|
|
559
|
+
message_type = MessageType.AGENT_TO_AGENT
|
|
560
|
+
|
|
561
|
+
# Create context
|
|
562
|
+
context = ScanContext(
|
|
563
|
+
message_type=message_type,
|
|
564
|
+
sender_name=sender_name,
|
|
565
|
+
receiver_name=receiver_name,
|
|
566
|
+
message_index=len(messages) - 1,
|
|
567
|
+
)
|
|
568
|
+
|
|
569
|
+
# Scan the message
|
|
570
|
+
result = self._scanner.scan_message(text, context=context)
|
|
571
|
+
|
|
572
|
+
# Handle blocking
|
|
573
|
+
if result.should_block:
|
|
574
|
+
self._raise_security_exception(result)
|
|
575
|
+
|
|
576
|
+
return messages
|
|
577
|
+
|
|
578
|
+
def _extract_message_text(self, message: AutoGenMessage | str) -> str | None:
|
|
579
|
+
"""Extract text content from an AutoGen message.
|
|
580
|
+
|
|
581
|
+
Uses unified extractor from raxe.sdk.integrations.extractors.
|
|
582
|
+
Falls back to function call extraction if no content found.
|
|
583
|
+
|
|
584
|
+
Args:
|
|
585
|
+
message: AutoGen message in any format
|
|
586
|
+
|
|
587
|
+
Returns:
|
|
588
|
+
Extracted text content, or None if no text found
|
|
589
|
+
"""
|
|
590
|
+
# First try standard message extraction
|
|
591
|
+
text = extract_text_from_message(message)
|
|
592
|
+
if text:
|
|
593
|
+
return text
|
|
594
|
+
|
|
595
|
+
# For function calls, extract the call details
|
|
596
|
+
if is_function_call(message):
|
|
597
|
+
return extract_function_call_text(message)
|
|
598
|
+
|
|
599
|
+
return None
|
|
600
|
+
|
|
601
|
+
def _is_function_call(self, message: AutoGenMessage | str) -> bool:
|
|
602
|
+
"""Check if message is a function/tool call.
|
|
603
|
+
|
|
604
|
+
Uses unified extractor from raxe.sdk.integrations.extractors.
|
|
605
|
+
|
|
606
|
+
Args:
|
|
607
|
+
message: Message to check
|
|
608
|
+
|
|
609
|
+
Returns:
|
|
610
|
+
True if message contains function/tool call
|
|
611
|
+
"""
|
|
612
|
+
return is_function_call(message)
|
|
613
|
+
|
|
614
|
+
def scan_manual(
|
|
615
|
+
self,
|
|
616
|
+
text: str,
|
|
617
|
+
*,
|
|
618
|
+
message_type: MessageType = MessageType.AGENT_TO_AGENT,
|
|
619
|
+
sender_name: str | None = None,
|
|
620
|
+
receiver_name: str | None = None,
|
|
621
|
+
) -> AgentScanResult:
|
|
622
|
+
"""Manually scan text outside of hook flow.
|
|
623
|
+
|
|
624
|
+
Use this for scanning text that isn't captured by hooks,
|
|
625
|
+
such as user input before passing to agents.
|
|
626
|
+
|
|
627
|
+
Args:
|
|
628
|
+
text: Text to scan
|
|
629
|
+
message_type: Type of message
|
|
630
|
+
sender_name: Optional sender name
|
|
631
|
+
receiver_name: Optional receiver name
|
|
632
|
+
|
|
633
|
+
Returns:
|
|
634
|
+
AgentScanResult with scan details
|
|
635
|
+
|
|
636
|
+
Example:
|
|
637
|
+
# Scan user input before starting chat
|
|
638
|
+
result = guard.scan_manual(
|
|
639
|
+
user_input,
|
|
640
|
+
message_type=MessageType.HUMAN_INPUT,
|
|
641
|
+
sender_name="human"
|
|
642
|
+
)
|
|
643
|
+
if result.should_block:
|
|
644
|
+
print("Cannot proceed - security threat detected")
|
|
645
|
+
"""
|
|
646
|
+
context = ScanContext(
|
|
647
|
+
message_type=message_type,
|
|
648
|
+
sender_name=sender_name,
|
|
649
|
+
receiver_name=receiver_name,
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
return self._scanner.scan_message(text, context=context)
|
|
653
|
+
|
|
654
|
+
# =========================================================================
|
|
655
|
+
# AutoGen v0.4+ Support (Wrapper-based)
|
|
656
|
+
# =========================================================================
|
|
657
|
+
|
|
658
|
+
def wrap_agent(self, agent: Any) -> Any:
|
|
659
|
+
"""Wrap an AutoGen v0.4+ agent with RAXE scanning.
|
|
660
|
+
|
|
661
|
+
This method creates a wrapper around an AutoGen v0.4+ agent that
|
|
662
|
+
scans all messages before they are processed by the agent.
|
|
663
|
+
|
|
664
|
+
For AutoGen v0.2.x, use register() instead.
|
|
665
|
+
|
|
666
|
+
Args:
|
|
667
|
+
agent: AutoGen v0.4+ agent (must have on_messages method)
|
|
668
|
+
|
|
669
|
+
Returns:
|
|
670
|
+
Wrapped agent with RAXE scanning enabled
|
|
671
|
+
|
|
672
|
+
Raises:
|
|
673
|
+
TypeError: If agent doesn't support v0.4+ API
|
|
674
|
+
|
|
675
|
+
Example:
|
|
676
|
+
from autogen_agentchat.agents import AssistantAgent
|
|
677
|
+
from raxe import Raxe
|
|
678
|
+
from raxe.sdk.integrations import RaxeConversationGuard
|
|
679
|
+
|
|
680
|
+
guard = RaxeConversationGuard(Raxe())
|
|
681
|
+
assistant = AssistantAgent("assistant", model_client=client)
|
|
682
|
+
protected = guard.wrap_agent(assistant)
|
|
683
|
+
|
|
684
|
+
# Use protected agent - messages will be scanned
|
|
685
|
+
"""
|
|
686
|
+
# Check if this is a v0.2.x agent
|
|
687
|
+
if self._is_conversable_agent(agent):
|
|
688
|
+
raise TypeError(
|
|
689
|
+
f"Agent {type(agent).__name__} uses AutoGen v0.2.x API. "
|
|
690
|
+
"Use guard.register(agent) instead of guard.wrap_agent(agent)."
|
|
691
|
+
)
|
|
692
|
+
|
|
693
|
+
# Check if agent has v0.4+ API
|
|
694
|
+
if not _is_async_agent(agent):
|
|
695
|
+
raise TypeError(
|
|
696
|
+
f"Agent {type(agent).__name__} doesn't have on_messages method. "
|
|
697
|
+
"Ensure you're using AutoGen v0.4+ agents."
|
|
698
|
+
)
|
|
699
|
+
|
|
700
|
+
# Get agent name for tracking
|
|
701
|
+
agent_name = getattr(agent, "name", type(agent).__name__)
|
|
702
|
+
|
|
703
|
+
# Track registration
|
|
704
|
+
self._registered_agents.add(agent_name)
|
|
705
|
+
|
|
706
|
+
logger.info(
|
|
707
|
+
"Agent wrapped with RAXE guard (v0.4+ API)",
|
|
708
|
+
extra={"agent": agent_name},
|
|
709
|
+
)
|
|
710
|
+
|
|
711
|
+
# Return a wrapper that scans messages
|
|
712
|
+
return _RaxeAgentWrapper(agent, self, agent_name)
|
|
713
|
+
|
|
714
|
+
def __repr__(self) -> str:
|
|
715
|
+
"""String representation of guard."""
|
|
716
|
+
return (
|
|
717
|
+
f"RaxeConversationGuard("
|
|
718
|
+
f"on_threat={self.config.on_threat!r}, "
|
|
719
|
+
f"agents={len(self._registered_agents)})"
|
|
720
|
+
)
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
# ============================================================================
|
|
724
|
+
# AutoGen v0.4+ Agent Wrapper
|
|
725
|
+
# ============================================================================
|
|
726
|
+
|
|
727
|
+
class _RaxeAgentWrapper:
|
|
728
|
+
"""Wrapper for AutoGen v0.4+ agents that adds RAXE scanning.
|
|
729
|
+
|
|
730
|
+
This wrapper intercepts the on_messages and on_messages_stream methods
|
|
731
|
+
to scan all incoming messages before they are processed by the agent.
|
|
732
|
+
|
|
733
|
+
The wrapper uses composition to delegate all other attributes and methods
|
|
734
|
+
to the wrapped agent.
|
|
735
|
+
"""
|
|
736
|
+
|
|
737
|
+
def __init__(
|
|
738
|
+
self,
|
|
739
|
+
agent: Any,
|
|
740
|
+
guard: RaxeConversationGuard,
|
|
741
|
+
agent_name: str,
|
|
742
|
+
) -> None:
|
|
743
|
+
"""Initialize agent wrapper.
|
|
744
|
+
|
|
745
|
+
Args:
|
|
746
|
+
agent: The AutoGen v0.4+ agent to wrap
|
|
747
|
+
guard: The RaxeConversationGuard instance
|
|
748
|
+
agent_name: Name of the agent for logging
|
|
749
|
+
"""
|
|
750
|
+
self._agent = agent
|
|
751
|
+
self._guard = guard
|
|
752
|
+
self._agent_name = agent_name
|
|
753
|
+
|
|
754
|
+
def __getattr__(self, name: str) -> Any:
|
|
755
|
+
"""Delegate attribute access to wrapped agent."""
|
|
756
|
+
return getattr(self._agent, name)
|
|
757
|
+
|
|
758
|
+
async def on_messages(
|
|
759
|
+
self,
|
|
760
|
+
messages: list[Any],
|
|
761
|
+
cancellation_token: Any = None,
|
|
762
|
+
) -> Any:
|
|
763
|
+
"""Process messages with RAXE scanning (v0.4+ API).
|
|
764
|
+
|
|
765
|
+
Scans all messages before passing to the wrapped agent.
|
|
766
|
+
|
|
767
|
+
Args:
|
|
768
|
+
messages: List of ChatMessage objects
|
|
769
|
+
cancellation_token: Optional cancellation token
|
|
770
|
+
|
|
771
|
+
Returns:
|
|
772
|
+
Response from the wrapped agent
|
|
773
|
+
"""
|
|
774
|
+
# Scan each message
|
|
775
|
+
for msg in messages:
|
|
776
|
+
self._scan_message(msg)
|
|
777
|
+
|
|
778
|
+
# Delegate to wrapped agent
|
|
779
|
+
return await self._agent.on_messages(messages, cancellation_token)
|
|
780
|
+
|
|
781
|
+
async def on_messages_stream(
|
|
782
|
+
self,
|
|
783
|
+
messages: list[Any],
|
|
784
|
+
cancellation_token: Any = None,
|
|
785
|
+
) -> Any:
|
|
786
|
+
"""Process messages with streaming and RAXE scanning (v0.4+ API).
|
|
787
|
+
|
|
788
|
+
Scans all messages before passing to the wrapped agent.
|
|
789
|
+
|
|
790
|
+
Args:
|
|
791
|
+
messages: List of ChatMessage objects
|
|
792
|
+
cancellation_token: Optional cancellation token
|
|
793
|
+
|
|
794
|
+
Yields:
|
|
795
|
+
Streaming responses from the wrapped agent
|
|
796
|
+
"""
|
|
797
|
+
# Scan each message
|
|
798
|
+
for msg in messages:
|
|
799
|
+
self._scan_message(msg)
|
|
800
|
+
|
|
801
|
+
# Delegate to wrapped agent
|
|
802
|
+
async for response in self._agent.on_messages_stream(messages, cancellation_token):
|
|
803
|
+
yield response
|
|
804
|
+
|
|
805
|
+
def _scan_message(self, message: Any) -> None:
|
|
806
|
+
"""Scan a single message for threats.
|
|
807
|
+
|
|
808
|
+
Args:
|
|
809
|
+
message: ChatMessage object or dict
|
|
810
|
+
|
|
811
|
+
Raises:
|
|
812
|
+
SecurityException: If threat detected and blocking is enabled
|
|
813
|
+
"""
|
|
814
|
+
# Extract text from message
|
|
815
|
+
text = self._extract_message_text(message)
|
|
816
|
+
if not text:
|
|
817
|
+
return
|
|
818
|
+
|
|
819
|
+
# Determine message type
|
|
820
|
+
source = getattr(message, "source", None)
|
|
821
|
+
if source == "user":
|
|
822
|
+
message_type = MessageType.HUMAN_INPUT
|
|
823
|
+
else:
|
|
824
|
+
message_type = MessageType.AGENT_TO_AGENT
|
|
825
|
+
|
|
826
|
+
# Create context
|
|
827
|
+
context = ScanContext(
|
|
828
|
+
message_type=message_type,
|
|
829
|
+
sender_name=source,
|
|
830
|
+
receiver_name=self._agent_name,
|
|
831
|
+
)
|
|
832
|
+
|
|
833
|
+
# Perform scan
|
|
834
|
+
result = self._guard._scanner.scan_message(text, context=context)
|
|
835
|
+
|
|
836
|
+
# Handle blocking
|
|
837
|
+
if result.should_block:
|
|
838
|
+
logger.warning(
|
|
839
|
+
"Message blocked by RAXE guard (v0.4+)",
|
|
840
|
+
extra={
|
|
841
|
+
"agent": self._agent_name,
|
|
842
|
+
"severity": result.severity,
|
|
843
|
+
"prompt_hash": result.prompt_hash,
|
|
844
|
+
},
|
|
845
|
+
)
|
|
846
|
+
self._guard._raise_security_exception(result)
|
|
847
|
+
|
|
848
|
+
def _extract_message_text(self, message: Any) -> str | None:
|
|
849
|
+
"""Extract text from a v0.4+ ChatMessage.
|
|
850
|
+
|
|
851
|
+
Uses unified extractor from raxe.sdk.integrations.extractors.
|
|
852
|
+
|
|
853
|
+
Args:
|
|
854
|
+
message: ChatMessage object or dict
|
|
855
|
+
|
|
856
|
+
Returns:
|
|
857
|
+
Extracted text or None
|
|
858
|
+
"""
|
|
859
|
+
return extract_text_from_message(message)
|
|
860
|
+
|
|
861
|
+
def __repr__(self) -> str:
|
|
862
|
+
"""String representation."""
|
|
863
|
+
return f"RaxeAgentWrapper({self._agent_name})"
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
# Re-export for convenience
|
|
867
|
+
__all__ = [
|
|
868
|
+
"AgentScannerConfig",
|
|
869
|
+
"MessageType",
|
|
870
|
+
"RaxeConversationGuard",
|
|
871
|
+
"ScanContext",
|
|
872
|
+
]
|