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,525 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry for NodeRegistrationOrchestrator handler wiring.
|
|
4
|
+
|
|
5
|
+
This registry provides a static factory method for creating handler instances
|
|
6
|
+
used by the NodeRegistrationOrchestrator. It follows the ONEX registry pattern
|
|
7
|
+
and provides a declarative mapping between event models and their handlers.
|
|
8
|
+
|
|
9
|
+
Handler Wiring (from contract.yaml):
|
|
10
|
+
- ModelNodeIntrospectionEvent -> HandlerNodeIntrospected
|
|
11
|
+
- ModelRuntimeTick -> HandlerRuntimeTick
|
|
12
|
+
- ModelNodeRegistrationAcked -> HandlerNodeRegistrationAcked
|
|
13
|
+
- ModelNodeHeartbeatEvent -> HandlerNodeHeartbeat
|
|
14
|
+
|
|
15
|
+
Handler Implementation:
|
|
16
|
+
All handlers implement ProtocolMessageHandler directly with:
|
|
17
|
+
- handler_id, category, message_types, node_kind properties
|
|
18
|
+
- handle(envelope) -> ModelHandlerOutput signature
|
|
19
|
+
|
|
20
|
+
Handlers are registered directly with ServiceHandlerRegistry without
|
|
21
|
+
adapter classes.
|
|
22
|
+
|
|
23
|
+
Handler Dependencies:
|
|
24
|
+
All handlers require ProjectionReaderRegistration for state queries.
|
|
25
|
+
Some handlers optionally accept:
|
|
26
|
+
- ProjectorShell: For projection persistence
|
|
27
|
+
- HandlerConsul: For Consul service registration (dual registration)
|
|
28
|
+
|
|
29
|
+
Handler Dependency Map - Design Trade-off:
|
|
30
|
+
The ``handler_dependencies`` dict in ``create_registry()`` requires manual
|
|
31
|
+
updates when adding handlers to contract.yaml. This is an INTENTIONAL design
|
|
32
|
+
trade-off that prioritizes type safety, testability, and security over
|
|
33
|
+
convenience.
|
|
34
|
+
|
|
35
|
+
**Why NOT Auto-Discovery:**
|
|
36
|
+
|
|
37
|
+
1. **Type Safety**: Explicit dependency declarations are validated at startup.
|
|
38
|
+
Auto-discovery via reflection (e.g., inspect.signature()) would defer
|
|
39
|
+
errors to runtime when handlers are instantiated.
|
|
40
|
+
|
|
41
|
+
2. **Testability**: Explicit dependencies can be easily mocked in tests.
|
|
42
|
+
The dependency map serves as documentation of what each handler needs,
|
|
43
|
+
making test setup straightforward.
|
|
44
|
+
|
|
45
|
+
3. **Security**: No reflection-based injection means no attack surface for
|
|
46
|
+
dependency injection exploits. We know exactly what gets passed to each
|
|
47
|
+
handler constructor.
|
|
48
|
+
|
|
49
|
+
4. **Clarity**: The dependency map is a clear, auditable record of handler
|
|
50
|
+
wiring. New developers can see at a glance what each handler receives.
|
|
51
|
+
|
|
52
|
+
**Maintenance Requirement:**
|
|
53
|
+
|
|
54
|
+
When adding a new handler to contract.yaml, you MUST also update the
|
|
55
|
+
``handler_dependencies`` dict with the handler's constructor arguments.
|
|
56
|
+
Failure to do so raises ProtocolConfigurationError at startup with a clear
|
|
57
|
+
message explaining how to fix it.
|
|
58
|
+
|
|
59
|
+
This fail-fast behavior catches configuration errors immediately rather than
|
|
60
|
+
at runtime when the handler is first invoked.
|
|
61
|
+
|
|
62
|
+
Usage:
|
|
63
|
+
```python
|
|
64
|
+
from omnibase_infra.nodes.node_registration_orchestrator.registry import (
|
|
65
|
+
RegistryInfraNodeRegistrationOrchestrator,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
registry = RegistryInfraNodeRegistrationOrchestrator.create_registry(
|
|
69
|
+
projection_reader=reader,
|
|
70
|
+
projector=projector,
|
|
71
|
+
consul_handler=consul_handler,
|
|
72
|
+
)
|
|
73
|
+
# registry is frozen and thread-safe
|
|
74
|
+
|
|
75
|
+
# Get handler by ID
|
|
76
|
+
handler = registry.get_handler_by_id("handler-node-introspected")
|
|
77
|
+
result = await handler.handle(envelope)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Related Tickets:
|
|
81
|
+
- OMN-1102: Make NodeRegistrationOrchestrator fully declarative
|
|
82
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
83
|
+
- OMN-1006: Node Heartbeat for Liveness Tracking
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
from __future__ import annotations
|
|
87
|
+
|
|
88
|
+
import importlib
|
|
89
|
+
import logging
|
|
90
|
+
from pathlib import Path
|
|
91
|
+
from typing import TYPE_CHECKING
|
|
92
|
+
|
|
93
|
+
from omnibase_core.services.service_handler_registry import ServiceHandlerRegistry
|
|
94
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
95
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
96
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
97
|
+
load_handler_class_info_from_contract,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
logger = logging.getLogger(__name__)
|
|
101
|
+
|
|
102
|
+
# Security: Namespace allowlist for dynamic handler imports
|
|
103
|
+
# Per CLAUDE.md Handler Plugin Loader security patterns, only trusted namespaces
|
|
104
|
+
# are allowed for dynamic imports to prevent arbitrary code execution.
|
|
105
|
+
# Error code: NAMESPACE_NOT_ALLOWED (HANDLER_LOADER_013)
|
|
106
|
+
ALLOWED_NAMESPACES: tuple[str, ...] = (
|
|
107
|
+
"omnibase_infra.",
|
|
108
|
+
"omnibase_core.",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _validate_handler_protocol(handler: object) -> tuple[bool, list[str]]:
|
|
113
|
+
"""Validate handler implements ProtocolMessageHandler via duck typing.
|
|
114
|
+
|
|
115
|
+
Uses duck typing to verify the handler has the required properties and
|
|
116
|
+
methods for ProtocolMessageHandler compliance. Per ONEX conventions,
|
|
117
|
+
protocol compliance is verified via structural typing rather than
|
|
118
|
+
isinstance checks.
|
|
119
|
+
|
|
120
|
+
Protocol Requirements (ProtocolMessageHandler):
|
|
121
|
+
- handler_id (property): Unique identifier string
|
|
122
|
+
- category (property): EnumMessageCategory value
|
|
123
|
+
- message_types (property): set[str] of message type names
|
|
124
|
+
- node_kind (property): EnumNodeKind value
|
|
125
|
+
- handle (method): async def handle(envelope) -> ModelHandlerOutput
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
handler: The handler instance to validate.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
A tuple of (is_valid, missing_members) where:
|
|
132
|
+
- is_valid: True if handler implements all required members
|
|
133
|
+
- missing_members: List of member names that are missing.
|
|
134
|
+
Empty list if all members are present.
|
|
135
|
+
"""
|
|
136
|
+
missing_members: list[str] = []
|
|
137
|
+
|
|
138
|
+
# Required properties
|
|
139
|
+
if not hasattr(handler, "handler_id"):
|
|
140
|
+
missing_members.append("handler_id")
|
|
141
|
+
if not hasattr(handler, "category"):
|
|
142
|
+
missing_members.append("category")
|
|
143
|
+
if not hasattr(handler, "message_types"):
|
|
144
|
+
missing_members.append("message_types")
|
|
145
|
+
if not hasattr(handler, "node_kind"):
|
|
146
|
+
missing_members.append("node_kind")
|
|
147
|
+
|
|
148
|
+
# Required method - handle()
|
|
149
|
+
if not callable(getattr(handler, "handle", None)):
|
|
150
|
+
missing_members.append("handle")
|
|
151
|
+
|
|
152
|
+
return (len(missing_members) == 0, missing_members)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _load_handler_class(class_name: str, module_path: str) -> type[object]:
|
|
156
|
+
"""Dynamically load a handler class from a module.
|
|
157
|
+
|
|
158
|
+
Security: This function validates the module_path against ALLOWED_NAMESPACES
|
|
159
|
+
before importing. Per CLAUDE.md Handler Plugin Loader security patterns,
|
|
160
|
+
dynamic imports are restricted to trusted namespaces to prevent arbitrary
|
|
161
|
+
code execution via malicious contract.yaml configurations.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
class_name: The name of the handler class to load.
|
|
165
|
+
module_path: The fully qualified module path.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
The handler class type.
|
|
169
|
+
|
|
170
|
+
Raises:
|
|
171
|
+
ProtocolConfigurationError: If the module namespace is not allowed
|
|
172
|
+
(NAMESPACE_NOT_ALLOWED / HANDLER_LOADER_013).
|
|
173
|
+
ProtocolConfigurationError: If the module or class cannot be loaded.
|
|
174
|
+
"""
|
|
175
|
+
# Security: Validate namespace before import
|
|
176
|
+
# Error code: NAMESPACE_NOT_ALLOWED (HANDLER_LOADER_013)
|
|
177
|
+
if not any(module_path.startswith(ns) for ns in ALLOWED_NAMESPACES):
|
|
178
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
179
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
180
|
+
operation="load_handler_class",
|
|
181
|
+
target_name=f"{module_path}.{class_name}",
|
|
182
|
+
)
|
|
183
|
+
raise ProtocolConfigurationError(
|
|
184
|
+
f"Handler module namespace not allowed: {module_path}. "
|
|
185
|
+
f"Allowed namespaces: {', '.join(ALLOWED_NAMESPACES)}. "
|
|
186
|
+
f"Use a handler module from an allowed namespace or update ALLOWED_NAMESPACES. "
|
|
187
|
+
f"Error code: NAMESPACE_NOT_ALLOWED (HANDLER_LOADER_013)",
|
|
188
|
+
context=ctx,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
module = importlib.import_module(module_path)
|
|
193
|
+
except ModuleNotFoundError as e:
|
|
194
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
195
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
196
|
+
operation="load_handler_class",
|
|
197
|
+
target_name=f"{module_path}.{class_name}",
|
|
198
|
+
)
|
|
199
|
+
raise ProtocolConfigurationError(
|
|
200
|
+
f"Handler module not found: {module_path}. "
|
|
201
|
+
f"Verify the module path is correct and the package is installed. "
|
|
202
|
+
f"Error code: MODULE_NOT_FOUND (HANDLER_LOADER_010)",
|
|
203
|
+
context=ctx,
|
|
204
|
+
) from e
|
|
205
|
+
except ImportError as e:
|
|
206
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
207
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
208
|
+
operation="load_handler_class",
|
|
209
|
+
target_name=f"{module_path}.{class_name}",
|
|
210
|
+
)
|
|
211
|
+
raise ProtocolConfigurationError(
|
|
212
|
+
f"Failed to import handler module: {module_path}. "
|
|
213
|
+
f"Check for syntax errors or missing dependencies. "
|
|
214
|
+
f"Error code: IMPORT_ERROR (HANDLER_LOADER_012)",
|
|
215
|
+
context=ctx,
|
|
216
|
+
) from e
|
|
217
|
+
|
|
218
|
+
if not hasattr(module, class_name):
|
|
219
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
220
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
221
|
+
operation="load_handler_class",
|
|
222
|
+
target_name=f"{module_path}.{class_name}",
|
|
223
|
+
)
|
|
224
|
+
raise ProtocolConfigurationError(
|
|
225
|
+
f"Handler class '{class_name}' not found in module '{module_path}'. "
|
|
226
|
+
f"Verify the class name matches the contract.yaml handler.name field. "
|
|
227
|
+
f"Error code: CLASS_NOT_FOUND (HANDLER_LOADER_011)",
|
|
228
|
+
context=ctx,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
handler_class: type[object] = getattr(module, class_name)
|
|
232
|
+
return handler_class
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
if TYPE_CHECKING:
|
|
236
|
+
from omnibase_infra.handlers import HandlerConsul
|
|
237
|
+
from omnibase_infra.projectors import ProjectionReaderRegistration
|
|
238
|
+
from omnibase_infra.runtime import ProjectorShell
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class RegistryInfraNodeRegistrationOrchestrator:
|
|
242
|
+
"""Handler registry for NodeRegistrationOrchestrator.
|
|
243
|
+
|
|
244
|
+
This registry provides a static factory method for creating handler registries
|
|
245
|
+
used by the NodeRegistrationOrchestrator. It follows the ONEX registry pattern
|
|
246
|
+
with the naming convention ``RegistryInfra<NodeName>``.
|
|
247
|
+
|
|
248
|
+
Why a class instead of a function?
|
|
249
|
+
ONEX registry pattern (CLAUDE.md) requires registry classes. This enables:
|
|
250
|
+
|
|
251
|
+
- **Centralized wiring**: All handler creation logic in one place
|
|
252
|
+
- **Contract alignment**: Maps event models to handlers per contract.yaml
|
|
253
|
+
- **Testability**: Mock dependencies for unit testing
|
|
254
|
+
- **Extensibility**: Subclassing for specialized registries
|
|
255
|
+
|
|
256
|
+
Usage:
|
|
257
|
+
```python
|
|
258
|
+
registry = RegistryInfraNodeRegistrationOrchestrator.create_registry(
|
|
259
|
+
projection_reader=reader,
|
|
260
|
+
projector=projector,
|
|
261
|
+
consul_handler=consul_handler,
|
|
262
|
+
)
|
|
263
|
+
handler = registry.get_handler_by_id("handler-node-introspected")
|
|
264
|
+
result = await handler.handle(envelope)
|
|
265
|
+
```
|
|
266
|
+
"""
|
|
267
|
+
|
|
268
|
+
@staticmethod
|
|
269
|
+
def create_registry(
|
|
270
|
+
projection_reader: ProjectionReaderRegistration,
|
|
271
|
+
projector: ProjectorShell | None = None,
|
|
272
|
+
consul_handler: HandlerConsul | None = None,
|
|
273
|
+
*,
|
|
274
|
+
require_heartbeat_handler: bool = True,
|
|
275
|
+
) -> ServiceHandlerRegistry:
|
|
276
|
+
"""Create a frozen ServiceHandlerRegistry with all handlers wired.
|
|
277
|
+
|
|
278
|
+
This is the preferred method for creating handler registries. It returns
|
|
279
|
+
a thread-safe, frozen registry that can be used by the orchestrator.
|
|
280
|
+
|
|
281
|
+
Contract-Driven Loading:
|
|
282
|
+
Handlers are loaded dynamically from contract.yaml using the Handler
|
|
283
|
+
Plugin Loader pattern. The contract.yaml handler_routing section defines
|
|
284
|
+
handler classes and modules that are imported at runtime.
|
|
285
|
+
|
|
286
|
+
Handler Registration:
|
|
287
|
+
The contract.yaml defines 4 handlers:
|
|
288
|
+
- ModelNodeIntrospectionEvent -> HandlerNodeIntrospected (always registered)
|
|
289
|
+
- ModelRuntimeTick -> HandlerRuntimeTick (always registered)
|
|
290
|
+
- ModelNodeRegistrationAcked -> HandlerNodeRegistrationAcked (always registered)
|
|
291
|
+
- ModelNodeHeartbeatEvent -> HandlerNodeHeartbeat (requires projector)
|
|
292
|
+
|
|
293
|
+
Fail-Fast Behavior:
|
|
294
|
+
By default (require_heartbeat_handler=True), this method raises
|
|
295
|
+
ProtocolConfigurationError if projector is None, because the contract
|
|
296
|
+
defines heartbeat routing which requires a projector for persistence.
|
|
297
|
+
|
|
298
|
+
This fail-fast approach prevents silent failures where heartbeat events
|
|
299
|
+
would be silently dropped at runtime due to missing handler registration.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
projection_reader: Projection reader for state queries.
|
|
303
|
+
projector: Projector for state persistence. Required for
|
|
304
|
+
HandlerNodeHeartbeat to persist heartbeat timestamps.
|
|
305
|
+
consul_handler: Optional Consul handler for service registration.
|
|
306
|
+
require_heartbeat_handler: If True (default), raises ProtocolConfigurationError
|
|
307
|
+
when projector is None. Set to False only for testing scenarios where
|
|
308
|
+
heartbeat functionality is intentionally disabled. This creates a
|
|
309
|
+
contract.yaml mismatch (4 handlers defined, only 3 registered).
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
Frozen ServiceHandlerRegistry with handlers registered:
|
|
313
|
+
- 4 handlers when projector is provided
|
|
314
|
+
- 3 handlers when projector is None and require_heartbeat_handler=False
|
|
315
|
+
|
|
316
|
+
Raises:
|
|
317
|
+
ProtocolConfigurationError: If projector is None and
|
|
318
|
+
require_heartbeat_handler is True (default).
|
|
319
|
+
ProtocolConfigurationError: If contract.yaml is missing or invalid.
|
|
320
|
+
ProtocolConfigurationError: If a handler class cannot be loaded.
|
|
321
|
+
|
|
322
|
+
Example:
|
|
323
|
+
```python
|
|
324
|
+
# Production usage - projector required
|
|
325
|
+
registry = RegistryInfraNodeRegistrationOrchestrator.create_registry(
|
|
326
|
+
projection_reader=reader,
|
|
327
|
+
projector=projector,
|
|
328
|
+
consul_handler=consul_handler,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
# Testing without heartbeat support (explicit opt-in)
|
|
332
|
+
registry = RegistryInfraNodeRegistrationOrchestrator.create_registry(
|
|
333
|
+
projection_reader=reader,
|
|
334
|
+
projector=None,
|
|
335
|
+
require_heartbeat_handler=False, # Explicitly disable
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
# Get handler by ID
|
|
339
|
+
handler = registry.get_handler_by_id("handler-node-introspected")
|
|
340
|
+
|
|
341
|
+
# Or iterate all handlers
|
|
342
|
+
for handler in registry.get_handlers():
|
|
343
|
+
print(f"{handler.handler_id}: {handler.message_types}")
|
|
344
|
+
```
|
|
345
|
+
"""
|
|
346
|
+
# Fail-fast: contract.yaml defines heartbeat routing which requires projector
|
|
347
|
+
if projector is None and require_heartbeat_handler:
|
|
348
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
349
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
350
|
+
operation="create_registry",
|
|
351
|
+
target_name="RegistryInfraNodeRegistrationOrchestrator",
|
|
352
|
+
)
|
|
353
|
+
raise ProtocolConfigurationError(
|
|
354
|
+
"Heartbeat handler requires projector but none was provided. "
|
|
355
|
+
"The contract.yaml defines ModelNodeHeartbeatEvent routing which "
|
|
356
|
+
"requires a ProjectorShell instance to persist heartbeat updates. "
|
|
357
|
+
"Either provide a projector or set require_heartbeat_handler=False "
|
|
358
|
+
"to explicitly disable heartbeat support (testing only). "
|
|
359
|
+
"Error code: PROJECTOR_REQUIRED (HANDLER_LOADER_060)",
|
|
360
|
+
context=ctx,
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# Load handler routing configuration from contract.yaml
|
|
364
|
+
# Uses shared loader from omnibase_infra.runtime.contract_loaders (OMN-1316)
|
|
365
|
+
contract_path = Path(__file__).parent.parent / "contract.yaml"
|
|
366
|
+
handler_configs = load_handler_class_info_from_contract(contract_path)
|
|
367
|
+
|
|
368
|
+
# =====================================================================
|
|
369
|
+
# HANDLER DEPENDENCY MAP - Explicit Wiring (Intentional Design)
|
|
370
|
+
# =====================================================================
|
|
371
|
+
#
|
|
372
|
+
# This map explicitly declares constructor arguments for each handler.
|
|
373
|
+
# This is an INTENTIONAL design trade-off over auto-discovery.
|
|
374
|
+
#
|
|
375
|
+
# WHY EXPLICIT OVER AUTO-DISCOVERY:
|
|
376
|
+
# - Type Safety: Validated at startup, not at runtime invocation
|
|
377
|
+
# - Testability: Dependencies are easily mocked without reflection
|
|
378
|
+
# - Security: No reflection-based injection attack surface
|
|
379
|
+
# - Auditability: Clear record of what each handler receives
|
|
380
|
+
#
|
|
381
|
+
# MAINTENANCE REQUIREMENT:
|
|
382
|
+
# When adding a handler to contract.yaml, add an entry here.
|
|
383
|
+
# Keys must match handler_routing.handlers[].handler.name in contract.yaml.
|
|
384
|
+
# Missing entries cause ProtocolConfigurationError at startup (fail-fast).
|
|
385
|
+
#
|
|
386
|
+
# See module docstring "Handler Dependency Map - Design Trade-off" for details.
|
|
387
|
+
# =====================================================================
|
|
388
|
+
handler_dependencies: dict[str, dict[str, object]] = {
|
|
389
|
+
"HandlerNodeIntrospected": {
|
|
390
|
+
"projection_reader": projection_reader,
|
|
391
|
+
"projector": projector,
|
|
392
|
+
"consul_handler": consul_handler,
|
|
393
|
+
},
|
|
394
|
+
"HandlerRuntimeTick": {
|
|
395
|
+
"projection_reader": projection_reader,
|
|
396
|
+
},
|
|
397
|
+
"HandlerNodeRegistrationAcked": {
|
|
398
|
+
"projection_reader": projection_reader,
|
|
399
|
+
},
|
|
400
|
+
"HandlerNodeHeartbeat": {
|
|
401
|
+
"projection_reader": projection_reader,
|
|
402
|
+
"projector": projector,
|
|
403
|
+
},
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
registry = ServiceHandlerRegistry()
|
|
407
|
+
|
|
408
|
+
# Load and instantiate handlers from contract configuration
|
|
409
|
+
for handler_config in handler_configs:
|
|
410
|
+
handler_class_name = handler_config["handler_class"]
|
|
411
|
+
handler_module = handler_config["handler_module"]
|
|
412
|
+
|
|
413
|
+
# Special handling for HandlerNodeHeartbeat - requires projector
|
|
414
|
+
if handler_class_name == "HandlerNodeHeartbeat":
|
|
415
|
+
if projector is None:
|
|
416
|
+
# Skip heartbeat handler if no projector (require_heartbeat_handler=False)
|
|
417
|
+
logger.warning(
|
|
418
|
+
"HandlerNodeHeartbeat NOT registered: require_heartbeat_handler=False. "
|
|
419
|
+
"This creates a contract.yaml mismatch (4 handlers defined, only 3 registered). "
|
|
420
|
+
"Heartbeat events (ModelNodeHeartbeatEvent) will NOT be handled. "
|
|
421
|
+
"This configuration is intended for testing only."
|
|
422
|
+
)
|
|
423
|
+
continue
|
|
424
|
+
|
|
425
|
+
# Load handler class dynamically
|
|
426
|
+
handler_cls = _load_handler_class(handler_class_name, handler_module)
|
|
427
|
+
|
|
428
|
+
# Get dependencies for this handler from the explicit dependency map.
|
|
429
|
+
# Missing entries indicate a contract.yaml/registry mismatch that must be fixed.
|
|
430
|
+
deps = handler_dependencies.get(handler_class_name, {})
|
|
431
|
+
if not deps:
|
|
432
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
433
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
434
|
+
operation="create_registry",
|
|
435
|
+
target_name="RegistryInfraNodeRegistrationOrchestrator",
|
|
436
|
+
)
|
|
437
|
+
raise ProtocolConfigurationError(
|
|
438
|
+
f"No dependency configuration found for handler '{handler_class_name}'. "
|
|
439
|
+
f"This handler is defined in contract.yaml but missing from the "
|
|
440
|
+
f"handler_dependencies map in create_registry(). "
|
|
441
|
+
f"\n\nTo fix: Add an entry to handler_dependencies:\n"
|
|
442
|
+
f" '{handler_class_name}': {{\n"
|
|
443
|
+
f" 'projection_reader': projection_reader,\n"
|
|
444
|
+
f" # Add other constructor args as needed\n"
|
|
445
|
+
f" }},\n\n"
|
|
446
|
+
f"This explicit wiring is intentional for type safety and testability. "
|
|
447
|
+
f"See module docstring 'Handler Dependency Map - Design Trade-off'. "
|
|
448
|
+
f"Error code: MISSING_DEPENDENCY_CONFIG (HANDLER_LOADER_061)",
|
|
449
|
+
context=ctx,
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
# Filter dependencies for handler instantiation.
|
|
453
|
+
#
|
|
454
|
+
# WHY projection_reader is ALWAYS included (even if None):
|
|
455
|
+
# - projection_reader is a REQUIRED dependency for all handlers
|
|
456
|
+
# - Even if the value is None, we pass it so handlers can perform
|
|
457
|
+
# their own validation and raise clear errors if missing
|
|
458
|
+
# - This is intentional: handlers should fail-fast with clear messages
|
|
459
|
+
# rather than silently receiving no projection_reader parameter
|
|
460
|
+
#
|
|
461
|
+
# WHY projector and consul_handler are only included when not None:
|
|
462
|
+
# - These are OPTIONAL dependencies used by specific handlers
|
|
463
|
+
# - projector: Only handlers that persist state changes need this
|
|
464
|
+
# (e.g., HandlerNodeHeartbeat for updating heartbeat timestamps)
|
|
465
|
+
# - consul_handler: Only handlers that interact with service discovery
|
|
466
|
+
# (e.g., HandlerNodeIntrospected for dual Consul registration)
|
|
467
|
+
# - Passing None would override handler defaults or cause TypeErrors
|
|
468
|
+
#
|
|
469
|
+
# Summary:
|
|
470
|
+
# projection_reader: Always pass (even if None) -> handlers validate and fail-fast
|
|
471
|
+
# projector: Optional -> pass only if provided
|
|
472
|
+
# consul_handler: Optional -> pass only if provided
|
|
473
|
+
filtered_deps = {
|
|
474
|
+
k: v
|
|
475
|
+
for k, v in deps.items()
|
|
476
|
+
if v is not None or k == "projection_reader"
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
# Instantiate handler with dependencies
|
|
480
|
+
try:
|
|
481
|
+
handler_instance = handler_cls(**filtered_deps)
|
|
482
|
+
except TypeError as e:
|
|
483
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
484
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
485
|
+
operation="create_registry",
|
|
486
|
+
target_name=handler_class_name,
|
|
487
|
+
)
|
|
488
|
+
raise ProtocolConfigurationError(
|
|
489
|
+
f"Failed to instantiate handler {handler_class_name}: {e}. "
|
|
490
|
+
f"Check that handler_dependencies map matches handler constructor. "
|
|
491
|
+
f"Error code: HANDLER_INSTANTIATION_FAILED (HANDLER_LOADER_062)",
|
|
492
|
+
context=ctx,
|
|
493
|
+
) from e
|
|
494
|
+
|
|
495
|
+
# Validate handler implements ProtocolMessageHandler
|
|
496
|
+
is_valid, missing = _validate_handler_protocol(handler_instance)
|
|
497
|
+
if not is_valid:
|
|
498
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
499
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
500
|
+
operation="create_registry",
|
|
501
|
+
target_name=handler_class_name,
|
|
502
|
+
)
|
|
503
|
+
raise ProtocolConfigurationError(
|
|
504
|
+
f"Handler '{handler_class_name}' does not implement ProtocolMessageHandler. "
|
|
505
|
+
f"Missing required members: {', '.join(missing)}. "
|
|
506
|
+
f"Handlers must have: handler_id, category, message_types, node_kind properties "
|
|
507
|
+
f"and handle(envelope) method. "
|
|
508
|
+
f"Error code: PROTOCOL_NOT_IMPLEMENTED (HANDLER_LOADER_006)",
|
|
509
|
+
context=ctx,
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
# Register handler
|
|
513
|
+
registry.register_handler(handler_instance)
|
|
514
|
+
logger.debug(
|
|
515
|
+
"Registered handler from contract: %s",
|
|
516
|
+
handler_class_name,
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
# Freeze registry to make it thread-safe
|
|
520
|
+
registry.freeze()
|
|
521
|
+
|
|
522
|
+
return registry
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
__all__ = ["RegistryInfraNodeRegistrationOrchestrator"]
|