omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -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 +132 -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_consumer_group_purpose.py +92 -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 +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -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_kafka_acks.py +99 -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 +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -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 +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -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 +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -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 +693 -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/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -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 +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -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 +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -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 +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -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 +922 -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 +1051 -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 +109 -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/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -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 +2670 -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 +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -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 +330 -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 +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -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_materialized_dispatch.py +141 -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 +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -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/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -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 +591 -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 +68 -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_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -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 +49 -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 +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -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 +57 -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 +203 -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 +106 -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/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -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/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -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 +482 -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 +694 -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 +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -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 +220 -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 +112 -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 +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -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 +417 -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 +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -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 +1138 -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 +449 -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 +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -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 +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -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/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -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_contract_load_result.py +224 -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 +229 -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_notification_config.py +171 -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_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -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_security_config.py +109 -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/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -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 +1330 -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 +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -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 +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -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/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -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 +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -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 +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -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_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -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 +1514 -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 +2033 -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 +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Message Type Query Mixin.
|
|
5
|
+
|
|
6
|
+
Provides query methods for the RegistryMessageType class.
|
|
7
|
+
These methods are thread-safe and require the registry to be frozen.
|
|
8
|
+
|
|
9
|
+
Design Principles:
|
|
10
|
+
- All query methods require frozen state
|
|
11
|
+
- Thread-safe concurrent access
|
|
12
|
+
- O(1) handler lookup performance
|
|
13
|
+
|
|
14
|
+
Related:
|
|
15
|
+
- OMN-937: Central Message Type Registry implementation
|
|
16
|
+
- RegistryMessageType: Main class that uses this mixin
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.6.0
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import logging
|
|
24
|
+
|
|
25
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
26
|
+
from omnibase_core.models.errors import ModelOnexError
|
|
27
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
28
|
+
from omnibase_infra.errors import MessageTypeRegistryError
|
|
29
|
+
from omnibase_infra.models.errors import ModelMessageTypeRegistryErrorContext
|
|
30
|
+
from omnibase_infra.models.registry.model_message_type_entry import (
|
|
31
|
+
ModelMessageTypeEntry,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"MixinMessageTypeQuery",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class MixinMessageTypeQuery:
|
|
42
|
+
"""
|
|
43
|
+
Mixin providing query methods for message type registry.
|
|
44
|
+
|
|
45
|
+
This mixin implements:
|
|
46
|
+
- Handler lookup with constraint validation
|
|
47
|
+
- Unchecked handler lookup for introspection
|
|
48
|
+
- Entry retrieval and existence checking
|
|
49
|
+
- List methods for message types, domains, and handlers
|
|
50
|
+
|
|
51
|
+
Requires the following attributes to be defined by the host class:
|
|
52
|
+
- _entries: dict[str, ModelMessageTypeEntry]
|
|
53
|
+
- _domains: set[str]
|
|
54
|
+
- _handler_references: set[str]
|
|
55
|
+
- _category_index: dict[EnumMessageCategory, list[str]]
|
|
56
|
+
- _domain_index: dict[str, list[str]]
|
|
57
|
+
- _frozen: bool
|
|
58
|
+
- _logger: logging.Logger
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.6.0
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
# Type hints for mixin attributes (defined by host class)
|
|
64
|
+
_entries: dict[str, ModelMessageTypeEntry]
|
|
65
|
+
_domains: set[str]
|
|
66
|
+
_handler_references: set[str]
|
|
67
|
+
_category_index: dict[EnumMessageCategory, list[str]]
|
|
68
|
+
_domain_index: dict[str, list[str]]
|
|
69
|
+
_frozen: bool
|
|
70
|
+
_logger: logging.Logger
|
|
71
|
+
|
|
72
|
+
def _require_frozen(self, method_name: str) -> None:
|
|
73
|
+
"""Raise error if registry is not frozen."""
|
|
74
|
+
if not self._frozen:
|
|
75
|
+
raise ModelOnexError(
|
|
76
|
+
message=f"{method_name}() called before freeze(). "
|
|
77
|
+
f"Registration MUST complete and freeze() MUST be called "
|
|
78
|
+
f"before queries. This is required for thread safety.",
|
|
79
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
def get_handlers(
|
|
83
|
+
self,
|
|
84
|
+
message_type: str,
|
|
85
|
+
topic_category: EnumMessageCategory,
|
|
86
|
+
topic_domain: str,
|
|
87
|
+
) -> list[str]:
|
|
88
|
+
"""
|
|
89
|
+
Get handler IDs for a message type with constraint validation.
|
|
90
|
+
|
|
91
|
+
Validates that:
|
|
92
|
+
1. The message type is registered
|
|
93
|
+
2. The topic category is allowed for this message type
|
|
94
|
+
3. The topic domain matches domain constraints
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
message_type: The message type to look up.
|
|
98
|
+
topic_category: The category inferred from the topic.
|
|
99
|
+
topic_domain: The domain extracted from the topic.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
List of handler IDs that can process this message type.
|
|
103
|
+
|
|
104
|
+
Raises:
|
|
105
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
106
|
+
MessageTypeRegistryError: If message type not registered
|
|
107
|
+
MessageTypeRegistryError: If category constraint violated
|
|
108
|
+
MessageTypeRegistryError: If domain constraint violated
|
|
109
|
+
|
|
110
|
+
Example:
|
|
111
|
+
>>> handlers = registry.get_handlers(
|
|
112
|
+
... message_type="UserCreated",
|
|
113
|
+
... topic_category=EnumMessageCategory.EVENT,
|
|
114
|
+
... topic_domain="user",
|
|
115
|
+
... )
|
|
116
|
+
>>> # Returns ["user-handler", "audit-handler"] etc.
|
|
117
|
+
|
|
118
|
+
.. versionadded:: 0.5.0
|
|
119
|
+
"""
|
|
120
|
+
self._require_frozen("get_handlers")
|
|
121
|
+
|
|
122
|
+
# Look up entry
|
|
123
|
+
entry = self._entries.get(message_type)
|
|
124
|
+
if entry is None:
|
|
125
|
+
registered = sorted(self._entries.keys())[:10]
|
|
126
|
+
suffix = "..." if len(self._entries) > 10 else ""
|
|
127
|
+
raise MessageTypeRegistryError(
|
|
128
|
+
f"No handler mapping for message type '{message_type}'. "
|
|
129
|
+
f"Registered types: {registered}{suffix}",
|
|
130
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
131
|
+
message_type=message_type,
|
|
132
|
+
),
|
|
133
|
+
registered_types=registered,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Check if entry is enabled
|
|
137
|
+
if not entry.enabled:
|
|
138
|
+
raise MessageTypeRegistryError(
|
|
139
|
+
f"Message type '{message_type}' is registered but disabled.",
|
|
140
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
141
|
+
message_type=message_type,
|
|
142
|
+
),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Validate category constraint
|
|
146
|
+
category_outcome = entry.validate_category(topic_category)
|
|
147
|
+
if not category_outcome:
|
|
148
|
+
raise MessageTypeRegistryError(
|
|
149
|
+
category_outcome.error_message
|
|
150
|
+
or f"Category validation failed for '{message_type}'",
|
|
151
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
152
|
+
message_type=message_type,
|
|
153
|
+
category=topic_category,
|
|
154
|
+
),
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Validate domain constraint
|
|
158
|
+
domain_outcome = entry.domain_constraint.validate_consumption(
|
|
159
|
+
topic_domain,
|
|
160
|
+
message_type,
|
|
161
|
+
)
|
|
162
|
+
if not domain_outcome:
|
|
163
|
+
raise MessageTypeRegistryError(
|
|
164
|
+
domain_outcome.error_message
|
|
165
|
+
or f"Domain validation failed for '{message_type}'",
|
|
166
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
167
|
+
message_type=message_type,
|
|
168
|
+
domain=topic_domain,
|
|
169
|
+
),
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
return list(entry.handler_ids)
|
|
173
|
+
|
|
174
|
+
def get_handlers_unchecked(
|
|
175
|
+
self,
|
|
176
|
+
message_type: str,
|
|
177
|
+
) -> list[str] | None:
|
|
178
|
+
"""
|
|
179
|
+
Get handler IDs for a message type without constraint validation.
|
|
180
|
+
|
|
181
|
+
Use this method when you need to look up handlers without
|
|
182
|
+
performing category or domain validation (e.g., for introspection).
|
|
183
|
+
|
|
184
|
+
Note:
|
|
185
|
+
This method returns None for disabled entries as well as
|
|
186
|
+
unregistered message types. Use get_entry() if you need to
|
|
187
|
+
distinguish between these cases.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
message_type: The message type to look up.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
List of handler IDs if registered and enabled, None if not found
|
|
194
|
+
or if the entry is disabled.
|
|
195
|
+
|
|
196
|
+
Raises:
|
|
197
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
198
|
+
|
|
199
|
+
.. versionadded:: 0.5.0
|
|
200
|
+
"""
|
|
201
|
+
self._require_frozen("get_handlers_unchecked")
|
|
202
|
+
|
|
203
|
+
entry = self._entries.get(message_type)
|
|
204
|
+
if entry is None or not entry.enabled:
|
|
205
|
+
return None
|
|
206
|
+
return list(entry.handler_ids)
|
|
207
|
+
|
|
208
|
+
def get_entry(self, message_type: str) -> ModelMessageTypeEntry | None:
|
|
209
|
+
"""
|
|
210
|
+
Get the registry entry for a message type.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
message_type: The message type to look up.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
The registry entry if found, None otherwise.
|
|
217
|
+
|
|
218
|
+
Note:
|
|
219
|
+
Unlike get_handlers_unchecked(), this method returns entries
|
|
220
|
+
regardless of their enabled status. Check entry.enabled if you
|
|
221
|
+
need to distinguish between enabled and disabled entries.
|
|
222
|
+
|
|
223
|
+
Raises:
|
|
224
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
225
|
+
|
|
226
|
+
.. versionadded:: 0.5.0
|
|
227
|
+
"""
|
|
228
|
+
self._require_frozen("get_entry")
|
|
229
|
+
return self._entries.get(message_type)
|
|
230
|
+
|
|
231
|
+
def has_message_type(self, message_type: str) -> bool:
|
|
232
|
+
"""
|
|
233
|
+
Check if a message type is registered.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
message_type: The message type to check.
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
True if registered and enabled, False otherwise.
|
|
240
|
+
|
|
241
|
+
Raises:
|
|
242
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
243
|
+
|
|
244
|
+
.. versionadded:: 0.5.0
|
|
245
|
+
"""
|
|
246
|
+
self._require_frozen("has_message_type")
|
|
247
|
+
entry = self._entries.get(message_type)
|
|
248
|
+
return entry is not None and entry.enabled
|
|
249
|
+
|
|
250
|
+
def list_message_types(
|
|
251
|
+
self,
|
|
252
|
+
category: EnumMessageCategory | None = None,
|
|
253
|
+
domain: str | None = None,
|
|
254
|
+
) -> list[str]:
|
|
255
|
+
"""
|
|
256
|
+
List registered message types with optional filtering.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
category: Optional filter by allowed category.
|
|
260
|
+
domain: Optional filter by owning domain.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
List of message type names matching the filters, sorted.
|
|
264
|
+
|
|
265
|
+
Raises:
|
|
266
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
267
|
+
|
|
268
|
+
Example:
|
|
269
|
+
>>> # List all event message types
|
|
270
|
+
>>> registry.list_message_types(category=EnumMessageCategory.EVENT)
|
|
271
|
+
['OrderCreated', 'UserCreated', 'UserUpdated']
|
|
272
|
+
>>> # List all message types in user domain
|
|
273
|
+
>>> registry.list_message_types(domain="user")
|
|
274
|
+
['UserCreated', 'UserUpdated']
|
|
275
|
+
|
|
276
|
+
.. versionadded:: 0.5.0
|
|
277
|
+
"""
|
|
278
|
+
self._require_frozen("list_message_types")
|
|
279
|
+
|
|
280
|
+
# Apply filters
|
|
281
|
+
if category is not None and domain is not None:
|
|
282
|
+
# Both filters: intersection of category and domain indexes
|
|
283
|
+
cat_types = set(self._category_index.get(category, []))
|
|
284
|
+
dom_types = set(self._domain_index.get(domain, []))
|
|
285
|
+
result = cat_types & dom_types
|
|
286
|
+
elif category is not None:
|
|
287
|
+
result = set(self._category_index.get(category, []))
|
|
288
|
+
elif domain is not None:
|
|
289
|
+
result = set(self._domain_index.get(domain, []))
|
|
290
|
+
else:
|
|
291
|
+
result = set(self._entries.keys())
|
|
292
|
+
|
|
293
|
+
# Filter to enabled entries only
|
|
294
|
+
enabled_result = [mt for mt in result if self._entries[mt].enabled]
|
|
295
|
+
|
|
296
|
+
return sorted(enabled_result)
|
|
297
|
+
|
|
298
|
+
def list_domains(self) -> list[str]:
|
|
299
|
+
"""
|
|
300
|
+
List all domains that have registered message types.
|
|
301
|
+
|
|
302
|
+
Returns:
|
|
303
|
+
List of unique domain names, sorted alphabetically.
|
|
304
|
+
|
|
305
|
+
Raises:
|
|
306
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
307
|
+
|
|
308
|
+
.. versionadded:: 0.5.0
|
|
309
|
+
"""
|
|
310
|
+
self._require_frozen("list_domains")
|
|
311
|
+
return sorted(self._domains)
|
|
312
|
+
|
|
313
|
+
def list_handlers(self) -> list[str]:
|
|
314
|
+
"""
|
|
315
|
+
List all handler IDs referenced in the registry.
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
List of unique handler IDs, sorted alphabetically.
|
|
319
|
+
|
|
320
|
+
Raises:
|
|
321
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE)
|
|
322
|
+
|
|
323
|
+
.. versionadded:: 0.5.0
|
|
324
|
+
"""
|
|
325
|
+
self._require_frozen("list_handlers")
|
|
326
|
+
return sorted(self._handler_references)
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Message Type Registration Mixin.
|
|
5
|
+
|
|
6
|
+
Provides registration methods for the RegistryMessageType class.
|
|
7
|
+
This mixin implements the freeze-after-init pattern for thread-safe
|
|
8
|
+
concurrent access.
|
|
9
|
+
|
|
10
|
+
Design Principles:
|
|
11
|
+
- Single-threaded registration phase
|
|
12
|
+
- Freeze to lock and validate
|
|
13
|
+
- Thread-safe queries after freeze
|
|
14
|
+
|
|
15
|
+
Related:
|
|
16
|
+
- OMN-937: Central Message Type Registry implementation
|
|
17
|
+
- RegistryMessageType: Main class that uses this mixin
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.6.0
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import logging
|
|
25
|
+
import threading
|
|
26
|
+
from collections import defaultdict
|
|
27
|
+
from datetime import UTC, datetime
|
|
28
|
+
|
|
29
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
30
|
+
from omnibase_core.models.errors import ModelOnexError
|
|
31
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
32
|
+
from omnibase_infra.errors import MessageTypeRegistryError
|
|
33
|
+
from omnibase_infra.models.errors import ModelMessageTypeRegistryErrorContext
|
|
34
|
+
from omnibase_infra.models.registry.model_domain_constraint import (
|
|
35
|
+
ModelDomainConstraint,
|
|
36
|
+
)
|
|
37
|
+
from omnibase_infra.models.registry.model_message_type_entry import (
|
|
38
|
+
ModelMessageTypeEntry,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
"MixinMessageTypeRegistration",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
logger = logging.getLogger(__name__)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class MixinMessageTypeRegistration:
|
|
49
|
+
"""
|
|
50
|
+
Mixin providing registration methods for message type registry.
|
|
51
|
+
|
|
52
|
+
This mixin implements:
|
|
53
|
+
- Message type registration with handler mappings
|
|
54
|
+
- Simplified registration convenience method
|
|
55
|
+
- Freeze mechanism for thread-safe access
|
|
56
|
+
|
|
57
|
+
Requires the following attributes to be defined by the host class:
|
|
58
|
+
- _entries: dict[str, ModelMessageTypeEntry]
|
|
59
|
+
- _domains: set[str]
|
|
60
|
+
- _handler_references: set[str]
|
|
61
|
+
- _category_index: dict[EnumMessageCategory, list[str]]
|
|
62
|
+
- _domain_index: dict[str, list[str]]
|
|
63
|
+
- _frozen: bool
|
|
64
|
+
- _lock: threading.Lock
|
|
65
|
+
- _logger: logging.Logger
|
|
66
|
+
|
|
67
|
+
.. versionadded:: 0.6.0
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
# Type hints for mixin attributes (defined by host class)
|
|
71
|
+
_entries: dict[str, ModelMessageTypeEntry]
|
|
72
|
+
_domains: set[str]
|
|
73
|
+
_handler_references: set[str]
|
|
74
|
+
_category_index: dict[EnumMessageCategory, list[str]]
|
|
75
|
+
_domain_index: dict[str, list[str]]
|
|
76
|
+
_frozen: bool
|
|
77
|
+
_lock: threading.Lock
|
|
78
|
+
_logger: logging.Logger
|
|
79
|
+
|
|
80
|
+
def _init_registration_state(
|
|
81
|
+
self,
|
|
82
|
+
logger_instance: logging.Logger | None = None,
|
|
83
|
+
) -> None:
|
|
84
|
+
"""
|
|
85
|
+
Initialize registration state for the mixin.
|
|
86
|
+
|
|
87
|
+
Should be called from the host class __init__.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
logger_instance: Optional custom logger for structured logging.
|
|
91
|
+
If not provided, uses module-level logger.
|
|
92
|
+
"""
|
|
93
|
+
self._logger = logger_instance if logger_instance is not None else logger
|
|
94
|
+
|
|
95
|
+
# Primary storage: message_type -> entry
|
|
96
|
+
self._entries = {}
|
|
97
|
+
|
|
98
|
+
# Domain tracking
|
|
99
|
+
self._domains = set()
|
|
100
|
+
|
|
101
|
+
# Handler reference tracking (for validation)
|
|
102
|
+
self._handler_references = set()
|
|
103
|
+
|
|
104
|
+
# Indexes for efficient queries
|
|
105
|
+
self._category_index = defaultdict(list)
|
|
106
|
+
self._domain_index = defaultdict(list)
|
|
107
|
+
|
|
108
|
+
# Freeze state
|
|
109
|
+
self._frozen = False
|
|
110
|
+
self._lock = threading.Lock()
|
|
111
|
+
|
|
112
|
+
def register_message_type(
|
|
113
|
+
self,
|
|
114
|
+
entry: ModelMessageTypeEntry,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""
|
|
117
|
+
Register a message type with its handler mappings.
|
|
118
|
+
|
|
119
|
+
Associates a message type with handler(s) and defines constraints.
|
|
120
|
+
If the message type is already registered, handlers are merged
|
|
121
|
+
(fan-out pattern).
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
entry: The message type entry containing handler mappings.
|
|
125
|
+
|
|
126
|
+
Raises:
|
|
127
|
+
ModelOnexError: If registry is frozen (INVALID_STATE)
|
|
128
|
+
ModelOnexError: If entry is None (INVALID_PARAMETER)
|
|
129
|
+
MessageTypeRegistryError: If entry validation fails
|
|
130
|
+
|
|
131
|
+
Example:
|
|
132
|
+
>>> registry.register_message_type(ModelMessageTypeEntry(
|
|
133
|
+
... message_type="OrderCreated",
|
|
134
|
+
... handler_ids=("order-handler",),
|
|
135
|
+
... allowed_categories=frozenset([EnumMessageCategory.EVENT]),
|
|
136
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="order"),
|
|
137
|
+
... ))
|
|
138
|
+
|
|
139
|
+
.. versionadded:: 0.5.0
|
|
140
|
+
"""
|
|
141
|
+
if entry is None:
|
|
142
|
+
raise ModelOnexError(
|
|
143
|
+
message="Cannot register None entry. ModelMessageTypeEntry is required.",
|
|
144
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
with self._lock:
|
|
148
|
+
if self._frozen:
|
|
149
|
+
raise ModelOnexError(
|
|
150
|
+
message="Cannot register message type: RegistryMessageType is frozen. "
|
|
151
|
+
"Registration is not allowed after freeze() has been called.",
|
|
152
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
message_type = entry.message_type
|
|
156
|
+
|
|
157
|
+
# If already registered, merge handlers (fan-out support)
|
|
158
|
+
if message_type in self._entries:
|
|
159
|
+
existing = self._entries[message_type]
|
|
160
|
+
# Validate constraints match
|
|
161
|
+
if existing.allowed_categories != entry.allowed_categories:
|
|
162
|
+
raise MessageTypeRegistryError(
|
|
163
|
+
f"Category constraint mismatch for message type "
|
|
164
|
+
f"'{message_type}': existing={existing.allowed_categories}, "
|
|
165
|
+
f"new={entry.allowed_categories}. "
|
|
166
|
+
f"All registrations for a message type must have the same "
|
|
167
|
+
f"allowed categories.",
|
|
168
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
169
|
+
message_type=message_type,
|
|
170
|
+
),
|
|
171
|
+
)
|
|
172
|
+
if existing.domain_constraint != entry.domain_constraint:
|
|
173
|
+
# Build detailed mismatch description
|
|
174
|
+
differences: list[str] = []
|
|
175
|
+
if (
|
|
176
|
+
existing.domain_constraint.owning_domain
|
|
177
|
+
!= entry.domain_constraint.owning_domain
|
|
178
|
+
):
|
|
179
|
+
differences.append(
|
|
180
|
+
f"owning_domain: existing="
|
|
181
|
+
f"'{existing.domain_constraint.owning_domain}', "
|
|
182
|
+
f"new='{entry.domain_constraint.owning_domain}'"
|
|
183
|
+
)
|
|
184
|
+
if (
|
|
185
|
+
existing.domain_constraint.allowed_cross_domains
|
|
186
|
+
!= entry.domain_constraint.allowed_cross_domains
|
|
187
|
+
):
|
|
188
|
+
differences.append(
|
|
189
|
+
f"allowed_cross_domains: existing="
|
|
190
|
+
f"{set(existing.domain_constraint.allowed_cross_domains)}, "
|
|
191
|
+
f"new={set(entry.domain_constraint.allowed_cross_domains)}"
|
|
192
|
+
)
|
|
193
|
+
if (
|
|
194
|
+
existing.domain_constraint.allow_all_domains
|
|
195
|
+
!= entry.domain_constraint.allow_all_domains
|
|
196
|
+
):
|
|
197
|
+
differences.append(
|
|
198
|
+
f"allow_all_domains: existing="
|
|
199
|
+
f"{existing.domain_constraint.allow_all_domains}, "
|
|
200
|
+
f"new={entry.domain_constraint.allow_all_domains}"
|
|
201
|
+
)
|
|
202
|
+
if (
|
|
203
|
+
existing.domain_constraint.require_explicit_opt_in
|
|
204
|
+
!= entry.domain_constraint.require_explicit_opt_in
|
|
205
|
+
):
|
|
206
|
+
differences.append(
|
|
207
|
+
f"require_explicit_opt_in: existing="
|
|
208
|
+
f"{existing.domain_constraint.require_explicit_opt_in}, "
|
|
209
|
+
f"new={entry.domain_constraint.require_explicit_opt_in}"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
raise MessageTypeRegistryError(
|
|
213
|
+
f"Domain constraint mismatch for message type "
|
|
214
|
+
f"'{message_type}': {'; '.join(differences)}. "
|
|
215
|
+
f"All registrations for a message type must have the same "
|
|
216
|
+
f"domain constraint configuration.",
|
|
217
|
+
registry_context=ModelMessageTypeRegistryErrorContext(
|
|
218
|
+
message_type=message_type,
|
|
219
|
+
domain=entry.domain_constraint.owning_domain,
|
|
220
|
+
),
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
# Merge handlers
|
|
224
|
+
for handler_id in entry.handler_ids:
|
|
225
|
+
if handler_id not in existing.handler_ids:
|
|
226
|
+
self._entries[message_type] = existing.with_additional_handler(
|
|
227
|
+
handler_id
|
|
228
|
+
)
|
|
229
|
+
self._handler_references.add(handler_id)
|
|
230
|
+
existing = self._entries[message_type]
|
|
231
|
+
|
|
232
|
+
self._logger.debug(
|
|
233
|
+
"Merged handlers for message type '%s': %s",
|
|
234
|
+
message_type,
|
|
235
|
+
self._entries[message_type].handler_ids,
|
|
236
|
+
)
|
|
237
|
+
else:
|
|
238
|
+
# New registration
|
|
239
|
+
self._entries[message_type] = entry
|
|
240
|
+
|
|
241
|
+
# Track domain - validate full domain constraint, not just owning_domain
|
|
242
|
+
domain = entry.domain_constraint.owning_domain
|
|
243
|
+
self._domains.add(domain)
|
|
244
|
+
|
|
245
|
+
# Also track allowed_cross_domains for comprehensive domain awareness
|
|
246
|
+
# This enables domain coverage reporting and validation
|
|
247
|
+
for cross_domain in entry.domain_constraint.allowed_cross_domains:
|
|
248
|
+
if cross_domain: # Validate non-empty cross-domain names
|
|
249
|
+
self._domains.add(cross_domain)
|
|
250
|
+
|
|
251
|
+
# Track handler references
|
|
252
|
+
for handler_id in entry.handler_ids:
|
|
253
|
+
self._handler_references.add(handler_id)
|
|
254
|
+
|
|
255
|
+
# Update indexes
|
|
256
|
+
for category in entry.allowed_categories:
|
|
257
|
+
self._category_index[category].append(message_type)
|
|
258
|
+
self._domain_index[domain].append(message_type)
|
|
259
|
+
|
|
260
|
+
self._logger.debug(
|
|
261
|
+
"Registered message type '%s' with handlers %s "
|
|
262
|
+
"(domain=%s, categories=%s)",
|
|
263
|
+
message_type,
|
|
264
|
+
entry.handler_ids,
|
|
265
|
+
domain,
|
|
266
|
+
[c.value for c in entry.allowed_categories],
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
def register_simple(
|
|
270
|
+
self,
|
|
271
|
+
message_type: str,
|
|
272
|
+
handler_id: str,
|
|
273
|
+
category: EnumMessageCategory,
|
|
274
|
+
domain: str,
|
|
275
|
+
*,
|
|
276
|
+
description: str | None = None,
|
|
277
|
+
allow_cross_domains: frozenset[str] | None = None,
|
|
278
|
+
) -> None:
|
|
279
|
+
"""
|
|
280
|
+
Convenience method to register a message type with minimal parameters.
|
|
281
|
+
|
|
282
|
+
Creates a ModelMessageTypeEntry internally with sensible defaults.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
message_type: The message type name (e.g., "UserCreated").
|
|
286
|
+
handler_id: The handler ID to process this type.
|
|
287
|
+
category: The allowed message category.
|
|
288
|
+
domain: The owning domain.
|
|
289
|
+
description: Optional description of the message type.
|
|
290
|
+
allow_cross_domains: Optional set of additional domains to allow.
|
|
291
|
+
|
|
292
|
+
Raises:
|
|
293
|
+
ModelOnexError: If registry is frozen (INVALID_STATE)
|
|
294
|
+
MessageTypeRegistryError: If validation fails
|
|
295
|
+
|
|
296
|
+
Example:
|
|
297
|
+
>>> registry.register_simple(
|
|
298
|
+
... message_type="UserCreated",
|
|
299
|
+
... handler_id="user-handler",
|
|
300
|
+
... category=EnumMessageCategory.EVENT,
|
|
301
|
+
... domain="user",
|
|
302
|
+
... description="User creation event",
|
|
303
|
+
... )
|
|
304
|
+
|
|
305
|
+
.. versionadded:: 0.5.0
|
|
306
|
+
"""
|
|
307
|
+
constraint = ModelDomainConstraint(
|
|
308
|
+
owning_domain=domain,
|
|
309
|
+
allowed_cross_domains=allow_cross_domains or frozenset(),
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
entry = ModelMessageTypeEntry(
|
|
313
|
+
message_type=message_type,
|
|
314
|
+
handler_ids=(handler_id,),
|
|
315
|
+
allowed_categories=frozenset([category]),
|
|
316
|
+
domain_constraint=constraint,
|
|
317
|
+
description=description,
|
|
318
|
+
registered_at=datetime.now(UTC),
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
self.register_message_type(entry)
|
|
322
|
+
|
|
323
|
+
def freeze(self) -> None:
|
|
324
|
+
"""
|
|
325
|
+
Freeze the registry to prevent further modifications.
|
|
326
|
+
|
|
327
|
+
Once frozen, registration methods will raise ModelOnexError with
|
|
328
|
+
INVALID_STATE. This enables thread-safe concurrent access during
|
|
329
|
+
the query phase.
|
|
330
|
+
|
|
331
|
+
Idempotent: Calling freeze() multiple times has no additional effect.
|
|
332
|
+
|
|
333
|
+
Example:
|
|
334
|
+
>>> registry.register_message_type(entry)
|
|
335
|
+
>>> registry.freeze()
|
|
336
|
+
>>> assert registry.is_frozen
|
|
337
|
+
|
|
338
|
+
Note:
|
|
339
|
+
This is a one-way operation. There is no unfreeze() method
|
|
340
|
+
by design, as unfreezing would defeat thread-safety guarantees.
|
|
341
|
+
|
|
342
|
+
.. versionadded:: 0.5.0
|
|
343
|
+
"""
|
|
344
|
+
with self._lock:
|
|
345
|
+
if self._frozen:
|
|
346
|
+
# Idempotent - already frozen
|
|
347
|
+
return
|
|
348
|
+
|
|
349
|
+
self._frozen = True
|
|
350
|
+
self._logger.info(
|
|
351
|
+
"RegistryMessageType frozen with %d message types across %d domains",
|
|
352
|
+
len(self._entries),
|
|
353
|
+
len(self._domains),
|
|
354
|
+
)
|