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,542 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Central Message Type Registry Implementation.
|
|
5
|
+
|
|
6
|
+
Provides the RegistryMessageType class that maps message types to handler
|
|
7
|
+
implementations and enforces topic category constraints and domain ownership.
|
|
8
|
+
|
|
9
|
+
Design Principles:
|
|
10
|
+
- Freeze-after-init pattern for thread-safe concurrent access
|
|
11
|
+
- Startup-time validation with fail-fast behavior
|
|
12
|
+
- Domain ownership enforcement derived from topic names
|
|
13
|
+
- Clear error messages for configuration issues
|
|
14
|
+
- Extensibility for new domains
|
|
15
|
+
|
|
16
|
+
Thread Safety:
|
|
17
|
+
RegistryMessageType follows the freeze-after-init pattern:
|
|
18
|
+
1. **Registration Phase** (single-threaded): Register message types
|
|
19
|
+
2. **Freeze**: Call freeze() to validate and lock the registry
|
|
20
|
+
3. **Query Phase** (multi-threaded safe): Thread-safe lookups
|
|
21
|
+
|
|
22
|
+
Performance Characteristics:
|
|
23
|
+
- Registration: O(1) per message type
|
|
24
|
+
- Handler lookup: O(1) dictionary access
|
|
25
|
+
- Domain validation: O(1) constraint check
|
|
26
|
+
- Startup validation: O(n) where n = number of entries
|
|
27
|
+
|
|
28
|
+
Related:
|
|
29
|
+
- OMN-937: Central Message Type Registry implementation
|
|
30
|
+
- OMN-934: Message Dispatch Engine (uses this registry)
|
|
31
|
+
- ProtocolMessageTypeRegistry: Interface definition
|
|
32
|
+
|
|
33
|
+
.. versionadded:: 0.5.0
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
__all__ = [
|
|
39
|
+
"RegistryMessageType",
|
|
40
|
+
"MessageTypeRegistryError",
|
|
41
|
+
"extract_domain_from_topic",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
import logging
|
|
45
|
+
import re
|
|
46
|
+
|
|
47
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
48
|
+
from omnibase_infra.errors import MessageTypeRegistryError
|
|
49
|
+
from omnibase_infra.models.validation import ModelValidationOutcome
|
|
50
|
+
from omnibase_infra.runtime.registry.mixin_message_type_query import (
|
|
51
|
+
MixinMessageTypeQuery,
|
|
52
|
+
)
|
|
53
|
+
from omnibase_infra.runtime.registry.mixin_message_type_registration import (
|
|
54
|
+
MixinMessageTypeRegistration,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
logger = logging.getLogger(__name__)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# =============================================================================
|
|
61
|
+
# Topic Domain Extraction
|
|
62
|
+
# =============================================================================
|
|
63
|
+
|
|
64
|
+
# Pattern for ONEX format: onex.<domain>.<type>
|
|
65
|
+
# Example: onex.registration.events -> domain = "registration"
|
|
66
|
+
_ONEX_TOPIC_PATTERN = re.compile(
|
|
67
|
+
r"^onex\.(?P<domain>[a-zA-Z0-9_-]+)\.",
|
|
68
|
+
re.IGNORECASE,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Pattern for environment-aware format: <env>.<domain>.<category>.<version>
|
|
72
|
+
# Example: dev.user.events.v1 -> domain = "user"
|
|
73
|
+
# Requires at least 3 segments (env.domain.rest) with trailing content
|
|
74
|
+
_ENV_TOPIC_PATTERN = re.compile(
|
|
75
|
+
r"^(?P<env>[a-zA-Z0-9_-]+)\.(?P<domain>[a-zA-Z0-9_-]+)\.",
|
|
76
|
+
re.IGNORECASE,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def extract_domain_from_topic(topic: str | None) -> str | None:
|
|
81
|
+
"""
|
|
82
|
+
Extract the domain from a topic string.
|
|
83
|
+
|
|
84
|
+
Domain extraction follows ONEX topic naming conventions:
|
|
85
|
+
- ONEX Kafka format: "onex.<domain>.<type>" -> domain
|
|
86
|
+
- Environment-aware format: "<env>.<domain>.<category>.<version>" -> domain
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
topic: The topic string to extract domain from. May be None, empty,
|
|
90
|
+
or whitespace-only.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
The extracted domain string, or None if:
|
|
94
|
+
- topic is None
|
|
95
|
+
- topic is empty string
|
|
96
|
+
- topic is whitespace-only
|
|
97
|
+
- topic format is not recognized (no domain extractable)
|
|
98
|
+
|
|
99
|
+
Examples:
|
|
100
|
+
>>> extract_domain_from_topic("onex.registration.events")
|
|
101
|
+
'registration'
|
|
102
|
+
>>> extract_domain_from_topic("dev.user.events.v1")
|
|
103
|
+
'user'
|
|
104
|
+
>>> extract_domain_from_topic("prod.order.commands.v2")
|
|
105
|
+
'order'
|
|
106
|
+
>>> extract_domain_from_topic("invalid")
|
|
107
|
+
None
|
|
108
|
+
>>> extract_domain_from_topic(None)
|
|
109
|
+
None
|
|
110
|
+
>>> extract_domain_from_topic("")
|
|
111
|
+
None
|
|
112
|
+
>>> extract_domain_from_topic(" ")
|
|
113
|
+
None
|
|
114
|
+
|
|
115
|
+
Design Note:
|
|
116
|
+
**Pattern Matching Order is Critical for Correctness**
|
|
117
|
+
|
|
118
|
+
The ONEX pattern MUST be checked BEFORE the environment-aware pattern.
|
|
119
|
+
This ordering is intentional and required to correctly handle topics
|
|
120
|
+
where "onex" appears as the first segment.
|
|
121
|
+
|
|
122
|
+
Consider the ambiguous topic ``onex.prod.events``:
|
|
123
|
+
|
|
124
|
+
- **If env pattern checked first (WRONG)**:
|
|
125
|
+
``<env>.<domain>.<rest>`` would match with env="onex", domain="prod"
|
|
126
|
+
This incorrectly interprets "onex" as an environment name.
|
|
127
|
+
|
|
128
|
+
- **With ONEX pattern first (CORRECT)**:
|
|
129
|
+
``onex.<domain>.<type>`` matches with domain="prod"
|
|
130
|
+
This correctly recognizes "onex" as the ONEX namespace prefix.
|
|
131
|
+
|
|
132
|
+
The ONEX pattern is more specific (requires literal "onex" prefix),
|
|
133
|
+
so it must take precedence over the generic environment pattern.
|
|
134
|
+
|
|
135
|
+
.. versionadded:: 0.5.0
|
|
136
|
+
"""
|
|
137
|
+
# Handle None, empty string, and whitespace-only inputs
|
|
138
|
+
if topic is None or not topic.strip():
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
# Strip whitespace for consistent matching
|
|
142
|
+
topic = topic.strip()
|
|
143
|
+
|
|
144
|
+
# -------------------------------------------------------------------------
|
|
145
|
+
# CRITICAL: Pattern matching order matters!
|
|
146
|
+
# -------------------------------------------------------------------------
|
|
147
|
+
# The ONEX pattern MUST be checked BEFORE the environment-aware pattern.
|
|
148
|
+
# Both patterns would match topics like "onex.prod.events", but with
|
|
149
|
+
# different (and conflicting) domain extraction:
|
|
150
|
+
#
|
|
151
|
+
# Topic: "onex.prod.events"
|
|
152
|
+
# - ONEX pattern: domain = "prod" (CORRECT - "onex" is namespace)
|
|
153
|
+
# - Env pattern: domain = "prod" (WRONG - "onex" treated as env)
|
|
154
|
+
#
|
|
155
|
+
# Wait, in this case both extract "prod"! The issue is with interpretation:
|
|
156
|
+
# The env pattern would set env="onex", which is semantically wrong.
|
|
157
|
+
# More critically, consider "onex.user.events" vs "prod.user.events":
|
|
158
|
+
# - "onex.user.events" -> ONEX format, domain="user"
|
|
159
|
+
# - "prod.user.events" -> Env format, env="prod", domain="user"
|
|
160
|
+
#
|
|
161
|
+
# If we checked env pattern first, "onex" would be misclassified as an
|
|
162
|
+
# environment, breaking any code that relies on detecting ONEX-namespaced
|
|
163
|
+
# topics. The ONEX pattern is more specific, so it takes precedence.
|
|
164
|
+
# -------------------------------------------------------------------------
|
|
165
|
+
|
|
166
|
+
# Step 1: Try ONEX format first: onex.<domain>.<type>
|
|
167
|
+
match = _ONEX_TOPIC_PATTERN.match(topic)
|
|
168
|
+
if match:
|
|
169
|
+
return match.group("domain")
|
|
170
|
+
|
|
171
|
+
# Step 2: Try environment-aware format: <env>.<domain>.<category>.<version>
|
|
172
|
+
# Only reached if ONEX pattern did not match (topic doesn't start with "onex.")
|
|
173
|
+
match = _ENV_TOPIC_PATTERN.match(topic)
|
|
174
|
+
if match:
|
|
175
|
+
return match.group("domain")
|
|
176
|
+
|
|
177
|
+
# Fallback: try simple split on dots and take second segment
|
|
178
|
+
# This handles edge cases like "a.b" (no trailing segment)
|
|
179
|
+
parts = topic.split(".")
|
|
180
|
+
if len(parts) >= 2:
|
|
181
|
+
return parts[1]
|
|
182
|
+
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# =============================================================================
|
|
187
|
+
# Message Type Registry
|
|
188
|
+
# =============================================================================
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class RegistryMessageType(MixinMessageTypeRegistration, MixinMessageTypeQuery):
|
|
192
|
+
"""
|
|
193
|
+
Central Message Type Registry for ONEX runtime dispatch.
|
|
194
|
+
|
|
195
|
+
Maps message types to handler implementations and enforces topic category
|
|
196
|
+
constraints and domain ownership rules. This registry is the single source
|
|
197
|
+
of truth for message type routing configuration.
|
|
198
|
+
|
|
199
|
+
Key Features:
|
|
200
|
+
- **Message Type Mapping**: Maps message types to handler ID(s)
|
|
201
|
+
- **Fan-out Support**: Multiple handlers can process the same message type
|
|
202
|
+
- **Category Constraints**: Validates message types against topic categories
|
|
203
|
+
- **Domain Ownership**: Enforces domain isolation with opt-in cross-domain
|
|
204
|
+
- **Startup Validation**: Fail-fast behavior before message processing
|
|
205
|
+
- **Extensibility**: Easy to add new domains and message types
|
|
206
|
+
|
|
207
|
+
Thread Safety:
|
|
208
|
+
Follows the freeze-after-init pattern:
|
|
209
|
+
1. **Registration Phase**: Single-threaded registration
|
|
210
|
+
2. **Freeze**: Validation and locking
|
|
211
|
+
3. **Query Phase**: Thread-safe concurrent lookups
|
|
212
|
+
|
|
213
|
+
Example:
|
|
214
|
+
>>> from omnibase_infra.runtime.registry import (
|
|
215
|
+
... RegistryMessageType,
|
|
216
|
+
... ModelMessageTypeEntry,
|
|
217
|
+
... ModelDomainConstraint,
|
|
218
|
+
... )
|
|
219
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
220
|
+
>>>
|
|
221
|
+
>>> # Create registry and register message types
|
|
222
|
+
>>> registry = RegistryMessageType()
|
|
223
|
+
>>> entry = ModelMessageTypeEntry(
|
|
224
|
+
... message_type="UserCreated",
|
|
225
|
+
... handler_ids=("user-handler",),
|
|
226
|
+
... allowed_categories=frozenset([EnumMessageCategory.EVENT]),
|
|
227
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="user"),
|
|
228
|
+
... )
|
|
229
|
+
>>> registry.register_message_type(entry)
|
|
230
|
+
>>>
|
|
231
|
+
>>> # Freeze and validate
|
|
232
|
+
>>> registry.freeze()
|
|
233
|
+
>>> errors = registry.validate_startup()
|
|
234
|
+
>>> if errors:
|
|
235
|
+
... from omnibase_infra.errors import ProtocolConfigurationError
|
|
236
|
+
... raise ProtocolConfigurationError(
|
|
237
|
+
... f"Validation failed: {errors}",
|
|
238
|
+
... code="REGISTRY_VALIDATION_FAILED",
|
|
239
|
+
... )
|
|
240
|
+
>>>
|
|
241
|
+
>>> # Query handlers (thread-safe after freeze)
|
|
242
|
+
>>> handlers = registry.get_handlers(
|
|
243
|
+
... message_type="UserCreated",
|
|
244
|
+
... topic_category=EnumMessageCategory.EVENT,
|
|
245
|
+
... topic_domain="user",
|
|
246
|
+
... )
|
|
247
|
+
|
|
248
|
+
See Also:
|
|
249
|
+
- :class:`ModelMessageTypeEntry`: Entry model definition
|
|
250
|
+
- :class:`ModelDomainConstraint`: Domain constraint model
|
|
251
|
+
- :class:`ProtocolMessageTypeRegistry`: Protocol interface
|
|
252
|
+
|
|
253
|
+
.. versionadded:: 0.5.0
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
def __init__(
|
|
257
|
+
self,
|
|
258
|
+
logger_instance: logging.Logger | None = None,
|
|
259
|
+
) -> None:
|
|
260
|
+
"""
|
|
261
|
+
Initialize RegistryMessageType with empty registries.
|
|
262
|
+
|
|
263
|
+
Creates empty message type registry. Register message types before
|
|
264
|
+
freeze(). Call validate_startup() after freeze() to ensure fail-fast
|
|
265
|
+
behavior.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
logger_instance: Optional custom logger for structured logging.
|
|
269
|
+
If not provided, uses module-level logger.
|
|
270
|
+
"""
|
|
271
|
+
self._init_registration_state(logger_instance)
|
|
272
|
+
|
|
273
|
+
# =========================================================================
|
|
274
|
+
# Validation Methods
|
|
275
|
+
# =========================================================================
|
|
276
|
+
|
|
277
|
+
def validate_startup(
|
|
278
|
+
self,
|
|
279
|
+
available_handler_ids: set[str] | None = None,
|
|
280
|
+
) -> list[str]:
|
|
281
|
+
"""
|
|
282
|
+
Perform startup-time validation and return any errors.
|
|
283
|
+
|
|
284
|
+
Validates registry consistency:
|
|
285
|
+
- All handler references point to available handlers (if provided)
|
|
286
|
+
- No duplicate message types with conflicting constraints
|
|
287
|
+
- Domain constraints are properly configured
|
|
288
|
+
|
|
289
|
+
This method should be called after freeze() to ensure fail-fast
|
|
290
|
+
behavior before consumers start processing messages.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
available_handler_ids: Optional set of handler IDs that are
|
|
294
|
+
actually registered with the dispatch engine. If provided,
|
|
295
|
+
validates that all referenced handlers exist.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
List of validation error messages. Empty list if valid.
|
|
299
|
+
|
|
300
|
+
Raises:
|
|
301
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
302
|
+
|
|
303
|
+
Example:
|
|
304
|
+
>>> registry.freeze()
|
|
305
|
+
>>> errors = registry.validate_startup(
|
|
306
|
+
... available_handler_ids={"user-handler", "order-handler"},
|
|
307
|
+
... )
|
|
308
|
+
>>> if errors:
|
|
309
|
+
... from omnibase_infra.errors import ProtocolConfigurationError
|
|
310
|
+
... for error in errors:
|
|
311
|
+
... print(f"Validation error: {error}")
|
|
312
|
+
... raise ProtocolConfigurationError(
|
|
313
|
+
... "Registry validation failed",
|
|
314
|
+
... code="REGISTRY_VALIDATION_FAILED",
|
|
315
|
+
... errors=errors,
|
|
316
|
+
... )
|
|
317
|
+
|
|
318
|
+
.. versionadded:: 0.5.0
|
|
319
|
+
"""
|
|
320
|
+
self._require_frozen("validate_startup")
|
|
321
|
+
|
|
322
|
+
errors: list[str] = []
|
|
323
|
+
|
|
324
|
+
# Validate handler references if available handlers provided
|
|
325
|
+
if available_handler_ids is not None:
|
|
326
|
+
missing_handlers = self._handler_references - available_handler_ids
|
|
327
|
+
if missing_handlers:
|
|
328
|
+
for handler_id in sorted(missing_handlers):
|
|
329
|
+
# Find which message types reference this handler
|
|
330
|
+
referencing_types = [
|
|
331
|
+
mt
|
|
332
|
+
for mt, entry in self._entries.items()
|
|
333
|
+
if handler_id in entry.handler_ids
|
|
334
|
+
]
|
|
335
|
+
errors.append(
|
|
336
|
+
f"Handler '{handler_id}' is referenced by message types "
|
|
337
|
+
f"{referencing_types} but is not registered with the "
|
|
338
|
+
f"dispatch engine."
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
# Validate that enabled entries have at least one handler
|
|
342
|
+
for message_type, entry in self._entries.items():
|
|
343
|
+
if entry.enabled and len(entry.handler_ids) == 0:
|
|
344
|
+
errors.append(
|
|
345
|
+
f"Invalid message type configuration for '{message_type}': "
|
|
346
|
+
f"expected at least one handler, got 0"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
# Validate domain constraints are internally consistent
|
|
350
|
+
for message_type, entry in self._entries.items():
|
|
351
|
+
domain = entry.domain_constraint.owning_domain
|
|
352
|
+
if not domain:
|
|
353
|
+
errors.append(f"Message type '{message_type}' has empty owning_domain.")
|
|
354
|
+
|
|
355
|
+
# Log validation result
|
|
356
|
+
if errors:
|
|
357
|
+
self._logger.warning(
|
|
358
|
+
"RegistryMessageType startup validation failed with %d errors",
|
|
359
|
+
len(errors),
|
|
360
|
+
)
|
|
361
|
+
else:
|
|
362
|
+
self._logger.info(
|
|
363
|
+
"RegistryMessageType startup validation passed"
|
|
364
|
+
"(%d message types, %d handlers, %d domains)",
|
|
365
|
+
len(self._entries),
|
|
366
|
+
len(self._handler_references),
|
|
367
|
+
len(self._domains),
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
return errors
|
|
371
|
+
|
|
372
|
+
def validate_topic_message_type(
|
|
373
|
+
self,
|
|
374
|
+
topic: str,
|
|
375
|
+
message_type: str,
|
|
376
|
+
) -> ModelValidationOutcome:
|
|
377
|
+
"""
|
|
378
|
+
Validate that a message type can appear on the given topic.
|
|
379
|
+
|
|
380
|
+
Extracts domain and category from the topic and validates against
|
|
381
|
+
the registered constraints for the message type.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
topic: The full topic string (e.g., "dev.user.events.v1").
|
|
385
|
+
message_type: The message type to validate.
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
ModelValidationOutcome with is_valid=True if valid,
|
|
389
|
+
or is_valid=False with error_message if invalid.
|
|
390
|
+
|
|
391
|
+
Raises:
|
|
392
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
393
|
+
|
|
394
|
+
Example:
|
|
395
|
+
>>> outcome = registry.validate_topic_message_type(
|
|
396
|
+
... topic="dev.user.events.v1",
|
|
397
|
+
... message_type="UserCreated",
|
|
398
|
+
... )
|
|
399
|
+
>>> if not outcome:
|
|
400
|
+
... print(f"Validation failed: {outcome.error_message}")
|
|
401
|
+
|
|
402
|
+
.. versionadded:: 0.5.0
|
|
403
|
+
.. versionchanged:: 0.6.0
|
|
404
|
+
Return type changed from tuple[bool, str | None] to ModelValidationOutcome.
|
|
405
|
+
"""
|
|
406
|
+
self._require_frozen("validate_topic_message_type")
|
|
407
|
+
|
|
408
|
+
# Extract category from topic
|
|
409
|
+
category = EnumMessageCategory.from_topic(topic)
|
|
410
|
+
if category is None:
|
|
411
|
+
return ModelValidationOutcome.failure(
|
|
412
|
+
f"Cannot infer message category from topic '{topic}'. "
|
|
413
|
+
f"Topic must contain .events, .commands, or .intents segment."
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
# Extract domain from topic
|
|
417
|
+
domain = extract_domain_from_topic(topic)
|
|
418
|
+
if domain is None:
|
|
419
|
+
return ModelValidationOutcome.failure(
|
|
420
|
+
f"Cannot extract domain from topic '{topic}'. "
|
|
421
|
+
f"Topic format not recognized."
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
# Look up entry
|
|
425
|
+
entry = self._entries.get(message_type)
|
|
426
|
+
if entry is None:
|
|
427
|
+
return ModelValidationOutcome.failure(
|
|
428
|
+
f"Message type '{message_type}' is not registered."
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
if not entry.enabled:
|
|
432
|
+
return ModelValidationOutcome.failure(
|
|
433
|
+
f"Message type '{message_type}' is registered but disabled."
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
# Validate category
|
|
437
|
+
category_outcome = entry.validate_category(category)
|
|
438
|
+
if not category_outcome:
|
|
439
|
+
return category_outcome
|
|
440
|
+
|
|
441
|
+
# Validate domain
|
|
442
|
+
domain_outcome = entry.domain_constraint.validate_consumption(
|
|
443
|
+
domain,
|
|
444
|
+
message_type,
|
|
445
|
+
)
|
|
446
|
+
if not domain_outcome:
|
|
447
|
+
return domain_outcome
|
|
448
|
+
|
|
449
|
+
return ModelValidationOutcome.success()
|
|
450
|
+
|
|
451
|
+
# =========================================================================
|
|
452
|
+
# Properties
|
|
453
|
+
# =========================================================================
|
|
454
|
+
|
|
455
|
+
@property
|
|
456
|
+
def is_frozen(self) -> bool:
|
|
457
|
+
"""
|
|
458
|
+
Check if the registry is frozen.
|
|
459
|
+
|
|
460
|
+
Returns:
|
|
461
|
+
True if frozen and registration is disabled.
|
|
462
|
+
|
|
463
|
+
.. versionadded:: 0.5.0
|
|
464
|
+
"""
|
|
465
|
+
return self._frozen
|
|
466
|
+
|
|
467
|
+
@property
|
|
468
|
+
def entry_count(self) -> int:
|
|
469
|
+
"""
|
|
470
|
+
Get the number of registered message type entries.
|
|
471
|
+
|
|
472
|
+
Returns:
|
|
473
|
+
Number of registered message types.
|
|
474
|
+
|
|
475
|
+
.. versionadded:: 0.5.0
|
|
476
|
+
"""
|
|
477
|
+
return len(self._entries)
|
|
478
|
+
|
|
479
|
+
@property
|
|
480
|
+
def handler_count(self) -> int:
|
|
481
|
+
"""
|
|
482
|
+
Get the number of unique handler IDs referenced.
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
Number of unique handlers.
|
|
486
|
+
|
|
487
|
+
.. versionadded:: 0.5.0
|
|
488
|
+
"""
|
|
489
|
+
return len(self._handler_references)
|
|
490
|
+
|
|
491
|
+
@property
|
|
492
|
+
def domain_count(self) -> int:
|
|
493
|
+
"""
|
|
494
|
+
Get the number of unique domains.
|
|
495
|
+
|
|
496
|
+
Returns:
|
|
497
|
+
Number of unique domains.
|
|
498
|
+
|
|
499
|
+
.. versionadded:: 0.5.0
|
|
500
|
+
"""
|
|
501
|
+
return len(self._domains)
|
|
502
|
+
|
|
503
|
+
# =========================================================================
|
|
504
|
+
# Dunder Methods
|
|
505
|
+
# =========================================================================
|
|
506
|
+
|
|
507
|
+
def __len__(self) -> int:
|
|
508
|
+
"""Return the number of registered message types."""
|
|
509
|
+
return len(self._entries)
|
|
510
|
+
|
|
511
|
+
def __contains__(self, message_type: str) -> bool:
|
|
512
|
+
"""Check if message type is registered using 'in' operator."""
|
|
513
|
+
if not self._frozen:
|
|
514
|
+
return message_type in self._entries
|
|
515
|
+
return self.has_message_type(message_type)
|
|
516
|
+
|
|
517
|
+
def __str__(self) -> str:
|
|
518
|
+
"""Human-readable string representation."""
|
|
519
|
+
return (
|
|
520
|
+
f"RegistryMessageType[entries={len(self._entries)}, "
|
|
521
|
+
f"domains={len(self._domains)}, frozen={self._frozen}]"
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
def __repr__(self) -> str:
|
|
525
|
+
"""Detailed representation for debugging."""
|
|
526
|
+
types = sorted(self._entries.keys())[:10]
|
|
527
|
+
type_repr = (
|
|
528
|
+
repr(types) if len(self._entries) <= 10 else f"<{len(self._entries)} types>"
|
|
529
|
+
)
|
|
530
|
+
domains = sorted(self._domains)[:5]
|
|
531
|
+
domain_repr = (
|
|
532
|
+
repr(domains)
|
|
533
|
+
if len(self._domains) <= 5
|
|
534
|
+
else f"<{len(self._domains)} domains>"
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
return (
|
|
538
|
+
f"RegistryMessageType("
|
|
539
|
+
f"entries={type_repr}, "
|
|
540
|
+
f"domains={domain_repr}, "
|
|
541
|
+
f"frozen={self._frozen})"
|
|
542
|
+
)
|