omnibase_infra 0.2.1__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.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Policy Validation Mixin.
|
|
4
|
+
|
|
5
|
+
This module provides validation functionality for policy registration,
|
|
6
|
+
extracted from RegistryPolicy to reduce class method count.
|
|
7
|
+
|
|
8
|
+
The mixin provides:
|
|
9
|
+
- Protocol implementation validation
|
|
10
|
+
- Sync enforcement validation
|
|
11
|
+
- Policy type normalization
|
|
12
|
+
- Version string normalization
|
|
13
|
+
|
|
14
|
+
This mixin is designed to be used with RegistryPolicy and follows the
|
|
15
|
+
ONEX naming convention: mixin_<name>.py -> Mixin<Name>.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import asyncio
|
|
21
|
+
from typing import TYPE_CHECKING, Literal, overload
|
|
22
|
+
|
|
23
|
+
from omnibase_infra.enums import EnumPolicyType
|
|
24
|
+
from omnibase_infra.errors import PolicyRegistryError, ProtocolConfigurationError
|
|
25
|
+
from omnibase_infra.runtime.util_version import normalize_version
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from omnibase_infra.runtime.protocol_policy import ProtocolPolicy
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class MixinPolicyValidation:
|
|
32
|
+
"""Mixin providing policy validation functionality.
|
|
33
|
+
|
|
34
|
+
This mixin extracts validation methods from RegistryPolicy to reduce
|
|
35
|
+
the class method count and provide better separation of concerns.
|
|
36
|
+
|
|
37
|
+
Methods:
|
|
38
|
+
_validate_policy_id_param: Validate policy_id parameter (shared helper)
|
|
39
|
+
_validate_policy_type_param: Validate policy_type parameter (shared helper)
|
|
40
|
+
_validate_protocol_implementation: Validate policy implements ProtocolPolicy
|
|
41
|
+
_validate_sync_enforcement: Validate sync/async policy methods
|
|
42
|
+
_normalize_policy_type: Normalize and validate policy type
|
|
43
|
+
_normalize_version: Normalize version string format
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# Methods to check for async validation (class attribute shared with RegistryPolicy)
|
|
47
|
+
_ASYNC_CHECK_METHODS: tuple[str, ...] = ("reduce", "decide", "evaluate")
|
|
48
|
+
|
|
49
|
+
@staticmethod
|
|
50
|
+
def _validate_policy_id_param(
|
|
51
|
+
policy_id: str | None,
|
|
52
|
+
policy_class: type | None = None,
|
|
53
|
+
policy_type: str | None = None,
|
|
54
|
+
) -> None:
|
|
55
|
+
"""Validate policy_id parameter individually.
|
|
56
|
+
|
|
57
|
+
This shared helper validates that policy_id is a non-empty string.
|
|
58
|
+
It is used by both _validate_protocol_implementation and
|
|
59
|
+
_validate_sync_enforcement to ensure consistent validation.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
policy_id: The policy_id parameter to validate.
|
|
63
|
+
policy_class: Optional policy class for error context.
|
|
64
|
+
policy_type: Optional policy type for error context.
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
PolicyRegistryError: If policy_id is None, not a string, or empty.
|
|
68
|
+
"""
|
|
69
|
+
if policy_id is None:
|
|
70
|
+
raise PolicyRegistryError(
|
|
71
|
+
"policy_id is required and cannot be None",
|
|
72
|
+
policy_id=None,
|
|
73
|
+
policy_class=policy_class.__name__ if policy_class else None,
|
|
74
|
+
policy_type=policy_type,
|
|
75
|
+
)
|
|
76
|
+
if not isinstance(policy_id, str):
|
|
77
|
+
raise PolicyRegistryError(
|
|
78
|
+
f"policy_id must be a string, got {type(policy_id).__name__}",
|
|
79
|
+
policy_id=str(policy_id),
|
|
80
|
+
policy_class=policy_class.__name__ if policy_class else None,
|
|
81
|
+
policy_type=policy_type,
|
|
82
|
+
)
|
|
83
|
+
if not policy_id.strip():
|
|
84
|
+
raise PolicyRegistryError(
|
|
85
|
+
"policy_id is required and cannot be empty",
|
|
86
|
+
policy_id=policy_id,
|
|
87
|
+
policy_class=policy_class.__name__ if policy_class else None,
|
|
88
|
+
policy_type=policy_type,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
@overload
|
|
92
|
+
@staticmethod
|
|
93
|
+
def _validate_policy_type_param(
|
|
94
|
+
policy_type: str | EnumPolicyType | None,
|
|
95
|
+
policy_id: str | None = None,
|
|
96
|
+
allow_none: Literal[True] = True,
|
|
97
|
+
) -> str | None: ...
|
|
98
|
+
|
|
99
|
+
@overload
|
|
100
|
+
@staticmethod
|
|
101
|
+
def _validate_policy_type_param(
|
|
102
|
+
policy_type: str | EnumPolicyType | None,
|
|
103
|
+
policy_id: str | None = None,
|
|
104
|
+
*,
|
|
105
|
+
allow_none: Literal[False],
|
|
106
|
+
) -> str: ...
|
|
107
|
+
|
|
108
|
+
@staticmethod
|
|
109
|
+
def _validate_policy_type_param(
|
|
110
|
+
policy_type: str | EnumPolicyType | None,
|
|
111
|
+
policy_id: str | None = None,
|
|
112
|
+
allow_none: bool = True,
|
|
113
|
+
) -> str | None:
|
|
114
|
+
"""Validate policy_type parameter individually.
|
|
115
|
+
|
|
116
|
+
This shared helper validates that policy_type is a valid string or
|
|
117
|
+
EnumPolicyType. It is used by _validate_sync_enforcement and
|
|
118
|
+
_normalize_policy_type to ensure consistent validation.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
policy_type: The policy_type parameter to validate.
|
|
122
|
+
policy_id: Optional policy_id for error context.
|
|
123
|
+
allow_none: If True, None is a valid value. If False, None raises error.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Normalized string value if policy_type is provided, None otherwise.
|
|
127
|
+
|
|
128
|
+
Raises:
|
|
129
|
+
PolicyRegistryError: If policy_type is invalid (wrong type, empty string,
|
|
130
|
+
or None when allow_none=False).
|
|
131
|
+
"""
|
|
132
|
+
if policy_type is None:
|
|
133
|
+
if not allow_none:
|
|
134
|
+
raise PolicyRegistryError(
|
|
135
|
+
"policy_type is required and cannot be None",
|
|
136
|
+
policy_id=policy_id,
|
|
137
|
+
policy_type=None,
|
|
138
|
+
)
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
if isinstance(policy_type, EnumPolicyType):
|
|
142
|
+
return policy_type.value
|
|
143
|
+
|
|
144
|
+
if not isinstance(policy_type, str):
|
|
145
|
+
raise PolicyRegistryError(
|
|
146
|
+
f"policy_type must be a string or EnumPolicyType, "
|
|
147
|
+
f"got {type(policy_type).__name__}",
|
|
148
|
+
policy_id=policy_id,
|
|
149
|
+
policy_type=str(policy_type),
|
|
150
|
+
)
|
|
151
|
+
if not policy_type.strip():
|
|
152
|
+
raise PolicyRegistryError(
|
|
153
|
+
"policy_type cannot be empty when provided",
|
|
154
|
+
policy_id=policy_id,
|
|
155
|
+
policy_type=policy_type,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return policy_type
|
|
159
|
+
|
|
160
|
+
def _validate_protocol_implementation(
|
|
161
|
+
self,
|
|
162
|
+
policy_id: str,
|
|
163
|
+
policy_class: type[ProtocolPolicy],
|
|
164
|
+
policy_type: str | EnumPolicyType | None = None,
|
|
165
|
+
) -> None:
|
|
166
|
+
"""Validate that policy class implements ProtocolPolicy protocol.
|
|
167
|
+
|
|
168
|
+
Performs runtime type validation using duck typing to ensure the policy
|
|
169
|
+
class has the required methods and properties before registration.
|
|
170
|
+
|
|
171
|
+
Validation Order:
|
|
172
|
+
Validations are performed in fail-fast order with cheap checks first:
|
|
173
|
+
|
|
174
|
+
1. **Parameter validation**: Validate policy_id and policy_type
|
|
175
|
+
parameters individually using shared helpers.
|
|
176
|
+
|
|
177
|
+
2. **Comprehensive check**: If class is missing all required attributes
|
|
178
|
+
(policy_id, policy_type, evaluate), raise a comprehensive error
|
|
179
|
+
listing all missing requirements.
|
|
180
|
+
|
|
181
|
+
3. **evaluate() existence** (O(1) hasattr check):
|
|
182
|
+
Verifies policy_class has evaluate() method.
|
|
183
|
+
|
|
184
|
+
4. **evaluate() callability** (O(1) callable check):
|
|
185
|
+
Verifies evaluate is actually callable.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
policy_id: Unique identifier for the policy being validated
|
|
189
|
+
policy_class: The policy class to validate
|
|
190
|
+
policy_type: Optional policy type for error context and validation
|
|
191
|
+
|
|
192
|
+
Raises:
|
|
193
|
+
PolicyRegistryError: If policy_class does not implement ProtocolPolicy:
|
|
194
|
+
- policy_id is None or empty
|
|
195
|
+
- policy_type is invalid (when provided)
|
|
196
|
+
- Missing all required attributes (comprehensive error)
|
|
197
|
+
- Missing evaluate() method
|
|
198
|
+
- evaluate is not callable
|
|
199
|
+
"""
|
|
200
|
+
# Validate policy_type first to get normalized value for error context
|
|
201
|
+
normalized_policy_type = self._validate_policy_type_param(
|
|
202
|
+
policy_type, policy_id=policy_id, allow_none=True
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# Validate policy_id parameter individually using shared helper
|
|
206
|
+
self._validate_policy_id_param(
|
|
207
|
+
policy_id, policy_class=policy_class, policy_type=normalized_policy_type
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Check for required attributes
|
|
211
|
+
has_policy_id = hasattr(policy_class, "policy_id")
|
|
212
|
+
has_policy_type = hasattr(policy_class, "policy_type")
|
|
213
|
+
has_evaluate = hasattr(policy_class, "evaluate")
|
|
214
|
+
|
|
215
|
+
# If all required attributes are missing, provide comprehensive error
|
|
216
|
+
if not has_policy_id and not has_policy_type and not has_evaluate:
|
|
217
|
+
raise PolicyRegistryError(
|
|
218
|
+
f"Policy class {policy_class.__name__!r} does not implement "
|
|
219
|
+
f"ProtocolPolicy protocol. Missing: policy_id property, "
|
|
220
|
+
f"policy_type property, evaluate() method",
|
|
221
|
+
policy_id=policy_id,
|
|
222
|
+
policy_class=policy_class.__name__,
|
|
223
|
+
policy_type=normalized_policy_type,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Validate policy_id attribute exists on the class (individual check)
|
|
227
|
+
if not has_policy_id:
|
|
228
|
+
raise PolicyRegistryError(
|
|
229
|
+
f"Policy class {policy_class.__name__!r} is missing policy_id "
|
|
230
|
+
f"property from ProtocolPolicy protocol",
|
|
231
|
+
policy_id=policy_id,
|
|
232
|
+
policy_class=policy_class.__name__,
|
|
233
|
+
policy_type=normalized_policy_type,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
# Validate policy_type attribute exists on the class (individual check)
|
|
237
|
+
if not has_policy_type:
|
|
238
|
+
raise PolicyRegistryError(
|
|
239
|
+
f"Policy class {policy_class.__name__!r} is missing policy_type "
|
|
240
|
+
f"property from ProtocolPolicy protocol",
|
|
241
|
+
policy_id=policy_id,
|
|
242
|
+
policy_class=policy_class.__name__,
|
|
243
|
+
policy_type=normalized_policy_type,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
# Validate policy_id attribute value on the class (not just existence)
|
|
247
|
+
# Note: If policy_id is a property, we can't validate the value at class level
|
|
248
|
+
# (it's only available on instances). Properties are valid as they follow the
|
|
249
|
+
# protocol pattern. We only validate if it's a direct class attribute.
|
|
250
|
+
class_policy_id_attr = getattr(policy_class, "policy_id", None)
|
|
251
|
+
is_policy_id_property = isinstance(
|
|
252
|
+
getattr(type(policy_class), "policy_id", None), property
|
|
253
|
+
) or isinstance(class_policy_id_attr, property)
|
|
254
|
+
|
|
255
|
+
if not is_policy_id_property:
|
|
256
|
+
# Direct class attribute - validate the value
|
|
257
|
+
if class_policy_id_attr is None:
|
|
258
|
+
raise PolicyRegistryError(
|
|
259
|
+
f"Policy class {policy_class.__name__!r} has policy_id attribute "
|
|
260
|
+
f"but its value is None - must be a non-empty string",
|
|
261
|
+
policy_id=policy_id,
|
|
262
|
+
policy_class=policy_class.__name__,
|
|
263
|
+
policy_type=normalized_policy_type,
|
|
264
|
+
)
|
|
265
|
+
if not isinstance(class_policy_id_attr, str):
|
|
266
|
+
raise PolicyRegistryError(
|
|
267
|
+
f"Policy class {policy_class.__name__!r} has policy_id attribute "
|
|
268
|
+
f"but its value must be a string, got {type(class_policy_id_attr).__name__}",
|
|
269
|
+
policy_id=policy_id,
|
|
270
|
+
policy_class=policy_class.__name__,
|
|
271
|
+
policy_type=normalized_policy_type,
|
|
272
|
+
)
|
|
273
|
+
if not class_policy_id_attr.strip():
|
|
274
|
+
raise PolicyRegistryError(
|
|
275
|
+
f"Policy class {policy_class.__name__!r} has policy_id attribute "
|
|
276
|
+
f"but its value is empty - must be a non-empty string",
|
|
277
|
+
policy_id=policy_id,
|
|
278
|
+
policy_class=policy_class.__name__,
|
|
279
|
+
policy_type=normalized_policy_type,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
# Validate policy_type attribute value on the class (not just existence)
|
|
283
|
+
# Note: If policy_type is a property, we can't validate the value at class level
|
|
284
|
+
# (it's only available on instances). Properties are valid as they follow the
|
|
285
|
+
# protocol pattern. We only validate if it's a direct class attribute.
|
|
286
|
+
class_policy_type_attr = getattr(policy_class, "policy_type", None)
|
|
287
|
+
is_policy_type_property = isinstance(
|
|
288
|
+
getattr(type(policy_class), "policy_type", None), property
|
|
289
|
+
) or isinstance(class_policy_type_attr, property)
|
|
290
|
+
|
|
291
|
+
if not is_policy_type_property:
|
|
292
|
+
# Direct class attribute - validate the value
|
|
293
|
+
if class_policy_type_attr is None:
|
|
294
|
+
raise PolicyRegistryError(
|
|
295
|
+
f"Policy class {policy_class.__name__!r} has policy_type attribute "
|
|
296
|
+
f"but its value is None - must be a valid EnumPolicyType",
|
|
297
|
+
policy_id=policy_id,
|
|
298
|
+
policy_class=policy_class.__name__,
|
|
299
|
+
policy_type=normalized_policy_type,
|
|
300
|
+
)
|
|
301
|
+
# Accept both EnumPolicyType enum and string values
|
|
302
|
+
if isinstance(class_policy_type_attr, EnumPolicyType):
|
|
303
|
+
pass # Valid enum type
|
|
304
|
+
elif isinstance(class_policy_type_attr, str):
|
|
305
|
+
# Validate string against enum values
|
|
306
|
+
valid_types = {e.value for e in EnumPolicyType}
|
|
307
|
+
if class_policy_type_attr not in valid_types:
|
|
308
|
+
raise PolicyRegistryError(
|
|
309
|
+
f"Policy class {policy_class.__name__!r} has invalid policy_type "
|
|
310
|
+
f"value: {class_policy_type_attr!r}. Must be one of: {sorted(valid_types)}",
|
|
311
|
+
policy_id=policy_id,
|
|
312
|
+
policy_class=policy_class.__name__,
|
|
313
|
+
policy_type=normalized_policy_type,
|
|
314
|
+
)
|
|
315
|
+
else:
|
|
316
|
+
raise PolicyRegistryError(
|
|
317
|
+
f"Policy class {policy_class.__name__!r} has policy_type attribute "
|
|
318
|
+
f"but its value must be EnumPolicyType or string, "
|
|
319
|
+
f"got {type(class_policy_type_attr).__name__}",
|
|
320
|
+
policy_id=policy_id,
|
|
321
|
+
policy_class=policy_class.__name__,
|
|
322
|
+
policy_type=normalized_policy_type,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
# Check evaluate() method exists
|
|
326
|
+
if not has_evaluate:
|
|
327
|
+
raise PolicyRegistryError(
|
|
328
|
+
f"Policy class {policy_class.__name__!r} is missing evaluate() "
|
|
329
|
+
f"method from ProtocolPolicy protocol",
|
|
330
|
+
policy_id=policy_id,
|
|
331
|
+
policy_class=policy_class.__name__,
|
|
332
|
+
policy_type=normalized_policy_type,
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
# Check evaluate is callable
|
|
336
|
+
evaluate_attr = getattr(policy_class, "evaluate", None)
|
|
337
|
+
if not callable(evaluate_attr):
|
|
338
|
+
raise PolicyRegistryError(
|
|
339
|
+
f"Policy class {policy_class.__name__!r} has evaluate() method "
|
|
340
|
+
f"(not callable) - must be a callable method",
|
|
341
|
+
policy_id=policy_id,
|
|
342
|
+
policy_class=policy_class.__name__,
|
|
343
|
+
policy_type=normalized_policy_type,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
def _validate_sync_enforcement(
|
|
347
|
+
self,
|
|
348
|
+
policy_id: str,
|
|
349
|
+
policy_class: type[ProtocolPolicy],
|
|
350
|
+
allow_async: bool,
|
|
351
|
+
policy_type: str | EnumPolicyType | None = None,
|
|
352
|
+
) -> None:
|
|
353
|
+
"""Validate that policy methods are synchronous unless explicitly async.
|
|
354
|
+
|
|
355
|
+
This validation enforces the synchronous-by-default policy execution model.
|
|
356
|
+
Policy plugins are expected to be pure decision logic without I/O or async
|
|
357
|
+
operations. If a policy needs async methods (e.g., for deterministic async
|
|
358
|
+
computation), it must be explicitly flagged with allow_async=True
|
|
359
|
+
during registration.
|
|
360
|
+
|
|
361
|
+
Validation Process:
|
|
362
|
+
1. Validate policy_id and policy_type parameters individually
|
|
363
|
+
2. Inspect policy class for methods: reduce(), decide(), evaluate()
|
|
364
|
+
3. Check if any of these methods are async (coroutine functions)
|
|
365
|
+
4. If async methods found and allow_async=False, raise error
|
|
366
|
+
5. If async methods found and allow_async=True, allow registration
|
|
367
|
+
|
|
368
|
+
This validation helps prevent accidental async policy registration and ensures
|
|
369
|
+
that async policies are consciously marked as such for proper runtime handling.
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
policy_id: Unique identifier for the policy being validated
|
|
373
|
+
policy_class: The policy class to validate for async methods
|
|
374
|
+
allow_async: If True, allows async interface; if False, enforces sync
|
|
375
|
+
policy_type: Optional policy type for error context (orchestrator or reducer)
|
|
376
|
+
|
|
377
|
+
Raises:
|
|
378
|
+
PolicyRegistryError: If policy has async methods (reduce, decide, evaluate)
|
|
379
|
+
and allow_async=False. Error includes the policy_id,
|
|
380
|
+
policy_type, and the name of the async method that
|
|
381
|
+
caused validation failure.
|
|
382
|
+
|
|
383
|
+
Example:
|
|
384
|
+
>>> # This will fail - async policy without explicit flag
|
|
385
|
+
>>> class AsyncPolicy:
|
|
386
|
+
... async def evaluate(self, context):
|
|
387
|
+
... return True
|
|
388
|
+
>>> mixin._validate_sync_enforcement("async_pol", AsyncPolicy, False)
|
|
389
|
+
PolicyRegistryError: Policy 'async_pol' has async evaluate() but
|
|
390
|
+
allow_async=True not specified.
|
|
391
|
+
|
|
392
|
+
>>> # This will succeed - async explicitly flagged
|
|
393
|
+
>>> mixin._validate_sync_enforcement("async_pol", AsyncPolicy, True)
|
|
394
|
+
"""
|
|
395
|
+
# Validate policy_type first to get normalized value for error context
|
|
396
|
+
normalized_policy_type = self._validate_policy_type_param(
|
|
397
|
+
policy_type, policy_id=policy_id, allow_none=True
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Validate policy_id individually using shared helper
|
|
401
|
+
self._validate_policy_id_param(policy_id, policy_type=normalized_policy_type)
|
|
402
|
+
|
|
403
|
+
for method_name in self._ASYNC_CHECK_METHODS:
|
|
404
|
+
if hasattr(policy_class, method_name):
|
|
405
|
+
method = getattr(policy_class, method_name)
|
|
406
|
+
if asyncio.iscoroutinefunction(method):
|
|
407
|
+
if not allow_async:
|
|
408
|
+
raise PolicyRegistryError(
|
|
409
|
+
f"Policy '{policy_id}' has async {method_name}() but "
|
|
410
|
+
f"allow_async=True not specified. "
|
|
411
|
+
f"Policy plugins must be synchronous by default.",
|
|
412
|
+
policy_id=policy_id,
|
|
413
|
+
policy_type=normalized_policy_type,
|
|
414
|
+
async_method=method_name,
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
def _normalize_policy_type(
|
|
418
|
+
self,
|
|
419
|
+
policy_type: str | EnumPolicyType,
|
|
420
|
+
) -> str:
|
|
421
|
+
"""Normalize policy type to string value and validate against EnumPolicyType.
|
|
422
|
+
|
|
423
|
+
This method provides centralized policy type validation logic used by all
|
|
424
|
+
registration and query methods. It accepts both EnumPolicyType enum values
|
|
425
|
+
and string literals, normalizing them to their string representation while
|
|
426
|
+
ensuring they match valid EnumPolicyType values.
|
|
427
|
+
|
|
428
|
+
Validation Process:
|
|
429
|
+
1. If policy_type is EnumPolicyType instance, extract .value
|
|
430
|
+
2. If policy_type is string, validate against EnumPolicyType values
|
|
431
|
+
3. Raise PolicyRegistryError if string doesn't match any enum value
|
|
432
|
+
4. Return normalized string value
|
|
433
|
+
|
|
434
|
+
This centralized validation ensures consistent policy type handling across
|
|
435
|
+
all registry operations (register, get, list_keys, is_registered, unregister).
|
|
436
|
+
|
|
437
|
+
Args:
|
|
438
|
+
policy_type: Policy type as EnumPolicyType enum or string literal.
|
|
439
|
+
Valid values: "orchestrator", "reducer"
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
Normalized string value for the policy type (e.g., "orchestrator", "reducer")
|
|
443
|
+
|
|
444
|
+
Raises:
|
|
445
|
+
PolicyRegistryError: If policy_type is a string that doesn't match any
|
|
446
|
+
EnumPolicyType value. Error includes the invalid value
|
|
447
|
+
and list of valid options.
|
|
448
|
+
|
|
449
|
+
Example:
|
|
450
|
+
>>> from omnibase_infra.enums import EnumPolicyType
|
|
451
|
+
>>> mixin = MixinPolicyValidation()
|
|
452
|
+
>>> # Enum to string
|
|
453
|
+
>>> mixin._normalize_policy_type(EnumPolicyType.ORCHESTRATOR)
|
|
454
|
+
'orchestrator'
|
|
455
|
+
>>> # Valid string passthrough
|
|
456
|
+
>>> mixin._normalize_policy_type("reducer")
|
|
457
|
+
'reducer'
|
|
458
|
+
>>> # Invalid string raises error
|
|
459
|
+
>>> mixin._normalize_policy_type("invalid")
|
|
460
|
+
PolicyRegistryError: Invalid policy_type: 'invalid'.
|
|
461
|
+
Must be one of: ['orchestrator', 'reducer']
|
|
462
|
+
"""
|
|
463
|
+
# Validate policy_type using shared helper (requires non-None)
|
|
464
|
+
# With allow_none=False, the overloaded return type is str (never None)
|
|
465
|
+
normalized = self._validate_policy_type_param(
|
|
466
|
+
policy_type, policy_id=None, allow_none=False
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# Validate string against enum values
|
|
470
|
+
valid_types = {e.value for e in EnumPolicyType}
|
|
471
|
+
if normalized not in valid_types:
|
|
472
|
+
raise PolicyRegistryError(
|
|
473
|
+
f"Invalid policy_type: {normalized!r}. "
|
|
474
|
+
f"Must be one of: {sorted(valid_types)}",
|
|
475
|
+
policy_id=None,
|
|
476
|
+
policy_type=normalized,
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
return normalized
|
|
480
|
+
|
|
481
|
+
@staticmethod
|
|
482
|
+
def _normalize_version(version: str) -> str:
|
|
483
|
+
"""Normalize version string for consistent lookups.
|
|
484
|
+
|
|
485
|
+
Delegates to the shared normalize_version utility which is the
|
|
486
|
+
SINGLE SOURCE OF TRUTH for version normalization in omnibase_infra.
|
|
487
|
+
|
|
488
|
+
This method wraps the shared utility to convert ValueError to
|
|
489
|
+
ProtocolConfigurationError for PolicyRegistry's error contract.
|
|
490
|
+
|
|
491
|
+
Normalization rules:
|
|
492
|
+
1. Strip leading/trailing whitespace
|
|
493
|
+
2. Strip leading 'v' or 'V' prefix
|
|
494
|
+
3. Expand partial versions (1 -> 1.0.0, 1.0 -> 1.0.0)
|
|
495
|
+
4. Parse with ModelSemVer.parse() for validation
|
|
496
|
+
5. Preserve prerelease suffix if present
|
|
497
|
+
|
|
498
|
+
Args:
|
|
499
|
+
version: The version string to normalize
|
|
500
|
+
|
|
501
|
+
Returns:
|
|
502
|
+
Normalized version string in "x.y.z" or "x.y.z-prerelease" format
|
|
503
|
+
|
|
504
|
+
Raises:
|
|
505
|
+
ProtocolConfigurationError: If the version format is invalid
|
|
506
|
+
|
|
507
|
+
Example:
|
|
508
|
+
>>> MixinPolicyValidation._normalize_version("1.0")
|
|
509
|
+
'1.0.0'
|
|
510
|
+
>>> MixinPolicyValidation._normalize_version("v2.1")
|
|
511
|
+
'2.1.0'
|
|
512
|
+
"""
|
|
513
|
+
try:
|
|
514
|
+
return normalize_version(version)
|
|
515
|
+
except ValueError as e:
|
|
516
|
+
raise ProtocolConfigurationError(
|
|
517
|
+
str(e),
|
|
518
|
+
version=version,
|
|
519
|
+
) from e
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
__all__: list[str] = ["MixinPolicyValidation"]
|