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,329 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# ruff: noqa: PLW0603
|
|
4
|
+
# PLW0603 disabled: Global statement is intentional for singleton pattern with thread-safe initialization
|
|
5
|
+
"""Handler Registry - Constants and singleton accessors for handler registration.
|
|
6
|
+
|
|
7
|
+
This module provides constants and singleton accessor functions for the
|
|
8
|
+
RegistryProtocolBinding and RegistryEventBusBinding classes. The actual
|
|
9
|
+
registry implementations are in the runtime/registry/ directory.
|
|
10
|
+
|
|
11
|
+
Registry Classes (imported from runtime/registry/):
|
|
12
|
+
- RegistryProtocolBinding: Handler registration and resolution
|
|
13
|
+
- RegistryError: Error raised when registry operations fail
|
|
14
|
+
- RegistryEventBusBinding: Event bus implementation registration
|
|
15
|
+
|
|
16
|
+
Handler Type Constants:
|
|
17
|
+
- HANDLER_TYPE_HTTP, HANDLER_TYPE_DATABASE, etc.
|
|
18
|
+
|
|
19
|
+
Event Bus Kind Constants:
|
|
20
|
+
- EVENT_BUS_INMEMORY, EVENT_BUS_KAFKA
|
|
21
|
+
|
|
22
|
+
Singleton Accessors:
|
|
23
|
+
- get_handler_registry(): Returns singleton RegistryProtocolBinding
|
|
24
|
+
- get_event_bus_registry(): Returns singleton RegistryEventBusBinding
|
|
25
|
+
|
|
26
|
+
Example Usage:
|
|
27
|
+
```python
|
|
28
|
+
from omnibase_infra.runtime.handler_registry import (
|
|
29
|
+
RegistryProtocolBinding,
|
|
30
|
+
HANDLER_TYPE_HTTP,
|
|
31
|
+
HANDLER_TYPE_DATABASE,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
registry = RegistryProtocolBinding()
|
|
35
|
+
|
|
36
|
+
# Register handlers
|
|
37
|
+
registry.register(HANDLER_TYPE_HTTP, HttpHandler)
|
|
38
|
+
registry.register(HANDLER_TYPE_DATABASE, PostgresHandler)
|
|
39
|
+
|
|
40
|
+
# Resolve handlers
|
|
41
|
+
handler_cls = registry.get(HANDLER_TYPE_HTTP)
|
|
42
|
+
handler = handler_cls()
|
|
43
|
+
|
|
44
|
+
# Check registration
|
|
45
|
+
if registry.is_registered(HANDLER_TYPE_KAFKA):
|
|
46
|
+
kafka_handler = registry.get(HANDLER_TYPE_KAFKA)
|
|
47
|
+
|
|
48
|
+
# List all registered protocols
|
|
49
|
+
protocols = registry.list_protocols()
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Integration Points:
|
|
53
|
+
- RuntimeHostProcess uses this registry to discover and instantiate handlers
|
|
54
|
+
- Handlers are loaded based on contract definitions
|
|
55
|
+
- Supports hot-reload patterns for development
|
|
56
|
+
- Event bus registry enables runtime bus selection
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
from __future__ import annotations
|
|
60
|
+
|
|
61
|
+
import threading
|
|
62
|
+
from typing import TYPE_CHECKING
|
|
63
|
+
|
|
64
|
+
from omnibase_infra.runtime.models import ModelProtocolRegistrationConfig
|
|
65
|
+
|
|
66
|
+
# Import registry classes from their canonical locations
|
|
67
|
+
from omnibase_infra.runtime.registry.registry_event_bus_binding import (
|
|
68
|
+
RegistryEventBusBinding,
|
|
69
|
+
)
|
|
70
|
+
from omnibase_infra.runtime.registry.registry_protocol_binding import (
|
|
71
|
+
RegistryError,
|
|
72
|
+
RegistryProtocolBinding,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if TYPE_CHECKING:
|
|
76
|
+
from omnibase_core.protocol.protocol_event_bus import ProtocolEventBus
|
|
77
|
+
from omnibase_infra.protocols import ProtocolContainerAware
|
|
78
|
+
|
|
79
|
+
# =============================================================================
|
|
80
|
+
# Handler Type Constants
|
|
81
|
+
# =============================================================================
|
|
82
|
+
# These string literals serve as protocol type identifiers for handler registration.
|
|
83
|
+
# Will be replaced with EnumHandlerType after omnibase_core merge.
|
|
84
|
+
|
|
85
|
+
HANDLER_TYPE_HTTP: str = "http"
|
|
86
|
+
"""HTTP/REST API protocol handler type."""
|
|
87
|
+
|
|
88
|
+
HANDLER_TYPE_DATABASE: str = "db"
|
|
89
|
+
"""Database (PostgreSQL, etc.) protocol handler type.
|
|
90
|
+
|
|
91
|
+
Note: Value is "db" to match operation prefixes (db.query, db.execute).
|
|
92
|
+
Operations are routed by extracting the prefix before the first dot."""
|
|
93
|
+
|
|
94
|
+
HANDLER_TYPE_KAFKA: str = "kafka"
|
|
95
|
+
"""Kafka message broker protocol handler type."""
|
|
96
|
+
|
|
97
|
+
HANDLER_TYPE_VAULT: str = "vault"
|
|
98
|
+
"""HashiCorp Vault secret management protocol handler type."""
|
|
99
|
+
|
|
100
|
+
HANDLER_TYPE_CONSUL: str = "consul"
|
|
101
|
+
"""HashiCorp Consul service discovery protocol handler type."""
|
|
102
|
+
|
|
103
|
+
HANDLER_TYPE_VALKEY: str = "valkey"
|
|
104
|
+
"""Valkey (Redis-compatible) cache/message protocol handler type.
|
|
105
|
+
|
|
106
|
+
Note: Value is "valkey" to match operation prefixes (valkey.get, valkey.set).
|
|
107
|
+
Valkey is a Redis-compatible fork; we use valkey-py (redis-py compatible)."""
|
|
108
|
+
|
|
109
|
+
HANDLER_TYPE_GRPC: str = "grpc"
|
|
110
|
+
"""gRPC protocol handler type."""
|
|
111
|
+
|
|
112
|
+
HANDLER_TYPE_MCP: str = "mcp"
|
|
113
|
+
"""MCP (Model Context Protocol) handler type for AI agent tool integration.
|
|
114
|
+
|
|
115
|
+
The MCP handler exposes ONEX nodes as tools for AI agents via streamable HTTP.
|
|
116
|
+
Supports tools/list and tools/call operations per the MCP specification."""
|
|
117
|
+
|
|
118
|
+
HANDLER_TYPE_GRAPH: str = "graph"
|
|
119
|
+
"""Graph database (Memgraph/Neo4j) protocol handler type."""
|
|
120
|
+
|
|
121
|
+
HANDLER_TYPE_INTENT: str = "intent" # DEMO (OMN-1515)
|
|
122
|
+
"""Intent storage and query handler type for demo wiring."""
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# =============================================================================
|
|
126
|
+
# Event Bus Kind Constants
|
|
127
|
+
# =============================================================================
|
|
128
|
+
|
|
129
|
+
EVENT_BUS_INMEMORY: str = "inmemory"
|
|
130
|
+
"""In-memory event bus for local/testing deployments."""
|
|
131
|
+
|
|
132
|
+
EVENT_BUS_KAFKA: str = "kafka"
|
|
133
|
+
"""Kafka-based distributed event bus (Beta)."""
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# =============================================================================
|
|
137
|
+
# Module-Level Singleton Registries
|
|
138
|
+
# =============================================================================
|
|
139
|
+
|
|
140
|
+
# Module-level singleton instances (lazy initialized)
|
|
141
|
+
_handler_registry: RegistryProtocolBinding | None = None
|
|
142
|
+
_event_bus_registry: RegistryEventBusBinding | None = None
|
|
143
|
+
_singleton_lock: threading.Lock = threading.Lock()
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def get_handler_registry() -> RegistryProtocolBinding:
|
|
147
|
+
"""Get the singleton handler registry instance.
|
|
148
|
+
|
|
149
|
+
Returns a module-level singleton instance of RegistryProtocolBinding.
|
|
150
|
+
Creates the instance on first call (lazy initialization).
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
RegistryProtocolBinding: The singleton handler registry instance.
|
|
154
|
+
|
|
155
|
+
Example:
|
|
156
|
+
>>> registry = get_handler_registry()
|
|
157
|
+
>>> registry.register(HANDLER_TYPE_HTTP, HttpHandler)
|
|
158
|
+
>>> same_registry = get_handler_registry()
|
|
159
|
+
>>> same_registry is registry
|
|
160
|
+
True
|
|
161
|
+
"""
|
|
162
|
+
global _handler_registry
|
|
163
|
+
if _handler_registry is None:
|
|
164
|
+
with _singleton_lock:
|
|
165
|
+
# Double-check locking pattern
|
|
166
|
+
if _handler_registry is None:
|
|
167
|
+
_handler_registry = RegistryProtocolBinding()
|
|
168
|
+
return _handler_registry
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def get_event_bus_registry() -> RegistryEventBusBinding:
|
|
172
|
+
"""Get the singleton event bus registry instance.
|
|
173
|
+
|
|
174
|
+
Returns a module-level singleton instance of RegistryEventBusBinding.
|
|
175
|
+
Creates the instance on first call (lazy initialization).
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
RegistryEventBusBinding: The singleton event bus registry instance.
|
|
179
|
+
|
|
180
|
+
Example:
|
|
181
|
+
>>> registry = get_event_bus_registry()
|
|
182
|
+
>>> registry.register(EVENT_BUS_INMEMORY, EventBusInmemory)
|
|
183
|
+
>>> same_registry = get_event_bus_registry()
|
|
184
|
+
>>> same_registry is registry
|
|
185
|
+
True
|
|
186
|
+
"""
|
|
187
|
+
global _event_bus_registry
|
|
188
|
+
if _event_bus_registry is None:
|
|
189
|
+
with _singleton_lock:
|
|
190
|
+
# Double-check locking pattern
|
|
191
|
+
if _event_bus_registry is None:
|
|
192
|
+
_event_bus_registry = RegistryEventBusBinding()
|
|
193
|
+
return _event_bus_registry
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# =============================================================================
|
|
197
|
+
# Convenience Functions
|
|
198
|
+
# =============================================================================
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def get_handler_class(handler_type: str) -> type[ProtocolContainerAware]:
|
|
202
|
+
"""Get handler class for the given type from the singleton registry.
|
|
203
|
+
|
|
204
|
+
Convenience function that wraps get_handler_registry().get().
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
handler_type: Protocol type identifier (e.g., HANDLER_TYPE_HTTP).
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Handler class registered for the protocol type.
|
|
211
|
+
|
|
212
|
+
Raises:
|
|
213
|
+
RegistryError: If handler_type is not registered.
|
|
214
|
+
|
|
215
|
+
Example:
|
|
216
|
+
>>> from omnibase_infra.runtime.handler_registry import (
|
|
217
|
+
... get_handler_class,
|
|
218
|
+
... HANDLER_TYPE_HTTP,
|
|
219
|
+
... )
|
|
220
|
+
>>> handler_cls = get_handler_class(HANDLER_TYPE_HTTP)
|
|
221
|
+
>>> handler = handler_cls()
|
|
222
|
+
"""
|
|
223
|
+
return get_handler_registry().get(handler_type)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def get_event_bus_class(bus_kind: str) -> type[ProtocolEventBus]:
|
|
227
|
+
"""Get event bus class for the given kind from the singleton registry.
|
|
228
|
+
|
|
229
|
+
Convenience function that wraps get_event_bus_registry().get().
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
bus_kind: Bus kind identifier (e.g., EVENT_BUS_INMEMORY).
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
Event bus class registered for the bus kind.
|
|
236
|
+
|
|
237
|
+
Raises:
|
|
238
|
+
RuntimeHostError: If bus_kind is not registered.
|
|
239
|
+
|
|
240
|
+
Example:
|
|
241
|
+
>>> from omnibase_infra.runtime.handler_registry import (
|
|
242
|
+
... get_event_bus_class,
|
|
243
|
+
... EVENT_BUS_INMEMORY,
|
|
244
|
+
... )
|
|
245
|
+
>>> bus_cls = get_event_bus_class(EVENT_BUS_INMEMORY)
|
|
246
|
+
>>> bus = bus_cls()
|
|
247
|
+
"""
|
|
248
|
+
return get_event_bus_registry().get(bus_kind)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def register_handlers_from_config(
|
|
252
|
+
runtime: object, # Will be BaseRuntimeHostProcess
|
|
253
|
+
protocol_configs: list[ModelProtocolRegistrationConfig],
|
|
254
|
+
) -> None:
|
|
255
|
+
"""Register protocol handlers from configuration.
|
|
256
|
+
|
|
257
|
+
Called by BaseRuntimeHostProcess to wire up handlers based on contract config.
|
|
258
|
+
This function validates and processes protocol registration configurations,
|
|
259
|
+
registering the appropriate handlers with the runtime.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
runtime: The runtime host process instance (BaseRuntimeHostProcess).
|
|
263
|
+
Typed as object temporarily until BaseRuntimeHostProcess is implemented.
|
|
264
|
+
protocol_configs: List of ModelProtocolRegistrationConfig instances from contract.
|
|
265
|
+
Each config specifies type, protocol_class, enabled flag, and options.
|
|
266
|
+
|
|
267
|
+
Example:
|
|
268
|
+
>>> from omnibase_infra.runtime.models import ModelProtocolRegistrationConfig
|
|
269
|
+
>>> protocol_configs = [
|
|
270
|
+
... ModelProtocolRegistrationConfig(
|
|
271
|
+
... type="http", protocol_class="HttpHandler", enabled=True
|
|
272
|
+
... ),
|
|
273
|
+
... ModelProtocolRegistrationConfig(
|
|
274
|
+
... type="db", protocol_class="PostgresHandler", enabled=True
|
|
275
|
+
... ),
|
|
276
|
+
... ]
|
|
277
|
+
>>> register_handlers_from_config(runtime, protocol_configs)
|
|
278
|
+
|
|
279
|
+
Note:
|
|
280
|
+
**Placeholder implementation** - only validates config structure.
|
|
281
|
+
|
|
282
|
+
TODO(OMN-41): Implement full handler resolution:
|
|
283
|
+
1. Use importlib to resolve protocol_class string to actual class
|
|
284
|
+
2. Validate class implements ProtocolContainerAware protocol
|
|
285
|
+
3. Register handler with runtime via get_handler_registry()
|
|
286
|
+
4. Support handler instantiation options from config.options
|
|
287
|
+
"""
|
|
288
|
+
# Placeholder: validate config structure only, defer registration to OMN-41
|
|
289
|
+
for config in protocol_configs:
|
|
290
|
+
if not config.enabled:
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
if config.type and config.protocol_class:
|
|
294
|
+
# Config structure is valid - actual resolution deferred to OMN-41
|
|
295
|
+
_ = config # Explicit acknowledgment that config is intentionally unused
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
# =============================================================================
|
|
299
|
+
# Module Exports
|
|
300
|
+
# =============================================================================
|
|
301
|
+
|
|
302
|
+
__all__: list[str] = [
|
|
303
|
+
# Event bus kind constants
|
|
304
|
+
"EVENT_BUS_INMEMORY",
|
|
305
|
+
"EVENT_BUS_KAFKA",
|
|
306
|
+
"HANDLER_TYPE_CONSUL",
|
|
307
|
+
"HANDLER_TYPE_DATABASE",
|
|
308
|
+
"HANDLER_TYPE_GRPC",
|
|
309
|
+
"HANDLER_TYPE_GRAPH",
|
|
310
|
+
# Handler type constants
|
|
311
|
+
"HANDLER_TYPE_HTTP",
|
|
312
|
+
"HANDLER_TYPE_INTENT",
|
|
313
|
+
"HANDLER_TYPE_KAFKA",
|
|
314
|
+
"HANDLER_TYPE_MCP",
|
|
315
|
+
"HANDLER_TYPE_VALKEY",
|
|
316
|
+
"HANDLER_TYPE_VAULT",
|
|
317
|
+
# Error class
|
|
318
|
+
"RegistryError",
|
|
319
|
+
# Registry classes
|
|
320
|
+
"RegistryEventBusBinding",
|
|
321
|
+
"RegistryProtocolBinding",
|
|
322
|
+
"get_event_bus_class",
|
|
323
|
+
"get_event_bus_registry",
|
|
324
|
+
# Convenience functions
|
|
325
|
+
"get_handler_class",
|
|
326
|
+
# Singleton accessors
|
|
327
|
+
"get_handler_registry",
|
|
328
|
+
"register_handlers_from_config",
|
|
329
|
+
]
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Source Resolver for Multi-Source Handler Discovery.
|
|
4
|
+
|
|
5
|
+
This module provides the HandlerSourceResolver class, which resolves handlers
|
|
6
|
+
from multiple sources (bootstrap, contract, Kafka events) based on the configured mode.
|
|
7
|
+
|
|
8
|
+
Part of OMN-1095: Handler Source Mode Hybrid Resolution.
|
|
9
|
+
|
|
10
|
+
Resolution Modes:
|
|
11
|
+
- BOOTSTRAP: Only use hardcoded bootstrap handlers.
|
|
12
|
+
- CONTRACT: Only use YAML contract-discovered handlers.
|
|
13
|
+
- HYBRID: Per-handler resolution with configurable precedence.
|
|
14
|
+
- KAFKA_EVENTS: Use Kafka-based contract source for cache-based discovery.
|
|
15
|
+
|
|
16
|
+
In HYBRID mode, the resolver performs per-handler identity resolution:
|
|
17
|
+
1. Discovers handlers from both bootstrap and contract sources
|
|
18
|
+
2. Builds a handler map keyed by handler_id
|
|
19
|
+
3. Resolves conflicts based on allow_bootstrap_override:
|
|
20
|
+
- False (default): Contract handlers override bootstrap handlers
|
|
21
|
+
- True: Bootstrap handlers override contract handlers
|
|
22
|
+
4. Non-conflicting handlers are included from both sources
|
|
23
|
+
|
|
24
|
+
In KAFKA_EVENTS mode, the resolver delegates to a KafkaContractSource instance
|
|
25
|
+
that returns cached descriptors from contract registration events. This is a
|
|
26
|
+
beta cache-only implementation where discovered contracts take effect on the
|
|
27
|
+
next runtime restart.
|
|
28
|
+
|
|
29
|
+
See Also:
|
|
30
|
+
- EnumHandlerSourceMode: Defines the resolution modes
|
|
31
|
+
- HandlerBootstrapSource: Provides bootstrap handlers
|
|
32
|
+
- HandlerContractSource: Provides contract-discovered handlers
|
|
33
|
+
- KafkaContractSource: Provides Kafka cache-based handler discovery
|
|
34
|
+
- ProtocolContractSource: Protocol for handler sources
|
|
35
|
+
|
|
36
|
+
.. versionadded:: 0.7.0
|
|
37
|
+
Created as part of OMN-1095 handler source mode hybrid resolution.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
import logging
|
|
43
|
+
from typing import TYPE_CHECKING
|
|
44
|
+
|
|
45
|
+
from omnibase_infra.enums.enum_handler_source_mode import EnumHandlerSourceMode
|
|
46
|
+
|
|
47
|
+
if TYPE_CHECKING:
|
|
48
|
+
from omnibase_infra.runtime.protocol_contract_source import ProtocolContractSource
|
|
49
|
+
|
|
50
|
+
# Import models after TYPE_CHECKING to avoid circular imports
|
|
51
|
+
from omnibase_infra.models.errors import ModelHandlerValidationError
|
|
52
|
+
from omnibase_infra.models.handlers import (
|
|
53
|
+
ModelContractDiscoveryResult,
|
|
54
|
+
ModelHandlerDescriptor,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Forward Reference Resolution:
|
|
58
|
+
# ModelContractDiscoveryResult uses a forward reference to ModelHandlerValidationError.
|
|
59
|
+
# Since we import ModelHandlerValidationError above, we can call model_rebuild() here
|
|
60
|
+
# to resolve the forward reference. This call is idempotent - multiple calls are harmless.
|
|
61
|
+
ModelContractDiscoveryResult.model_rebuild()
|
|
62
|
+
|
|
63
|
+
logger = logging.getLogger(__name__)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class HandlerSourceResolver:
|
|
67
|
+
"""Resolver for multi-source handler discovery with configurable modes.
|
|
68
|
+
|
|
69
|
+
This class resolves handlers from bootstrap and contract sources based on
|
|
70
|
+
the configured mode. It supports four resolution strategies:
|
|
71
|
+
|
|
72
|
+
- BOOTSTRAP: Use only bootstrap handlers, ignore contracts.
|
|
73
|
+
- CONTRACT: Use only contract handlers, ignore bootstrap.
|
|
74
|
+
- HYBRID: Per-handler resolution with configurable precedence:
|
|
75
|
+
- allow_bootstrap_override=False (default): Contract handlers take
|
|
76
|
+
precedence over bootstrap handlers with the same handler_id.
|
|
77
|
+
- allow_bootstrap_override=True: Bootstrap handlers take precedence
|
|
78
|
+
over contract handlers with the same handler_id.
|
|
79
|
+
In both cases, handlers without conflicts are included from both sources.
|
|
80
|
+
- KAFKA_EVENTS: Use Kafka-based contract source for cache-based discovery.
|
|
81
|
+
Delegates to a KafkaContractSource that returns cached descriptors from
|
|
82
|
+
contract registration events. This is a beta cache-only implementation.
|
|
83
|
+
|
|
84
|
+
Attributes:
|
|
85
|
+
mode: The configured resolution mode.
|
|
86
|
+
allow_bootstrap_override: If True, bootstrap handlers take precedence
|
|
87
|
+
in HYBRID mode. Default is False (contract precedence).
|
|
88
|
+
|
|
89
|
+
Example:
|
|
90
|
+
>>> resolver = HandlerSourceResolver(
|
|
91
|
+
... bootstrap_source=bootstrap_source,
|
|
92
|
+
... contract_source=contract_source,
|
|
93
|
+
... mode=EnumHandlerSourceMode.HYBRID,
|
|
94
|
+
... )
|
|
95
|
+
>>> result = await resolver.resolve_handlers()
|
|
96
|
+
>>> print(f"Discovered {len(result.descriptors)} handlers")
|
|
97
|
+
|
|
98
|
+
.. versionadded:: 0.7.0
|
|
99
|
+
Created as part of OMN-1095 handler source mode hybrid resolution.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
bootstrap_source: ProtocolContractSource,
|
|
105
|
+
contract_source: ProtocolContractSource,
|
|
106
|
+
mode: EnumHandlerSourceMode,
|
|
107
|
+
*,
|
|
108
|
+
allow_bootstrap_override: bool = False,
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Initialize the handler source resolver.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
bootstrap_source: Source for bootstrap handlers. Must implement
|
|
114
|
+
ProtocolContractSource with discover_handlers() method.
|
|
115
|
+
contract_source: Source for contract-discovered handlers. Must
|
|
116
|
+
implement ProtocolContractSource with discover_handlers() method.
|
|
117
|
+
mode: Resolution mode determining which sources are used and how
|
|
118
|
+
handlers are merged.
|
|
119
|
+
allow_bootstrap_override: If True, bootstrap handlers override
|
|
120
|
+
contract handlers with the same handler_id in HYBRID mode.
|
|
121
|
+
Default is False (contract handlers take precedence).
|
|
122
|
+
Has no effect in BOOTSTRAP or CONTRACT modes.
|
|
123
|
+
"""
|
|
124
|
+
self._bootstrap_source = bootstrap_source
|
|
125
|
+
self._contract_source = contract_source
|
|
126
|
+
self._mode = mode
|
|
127
|
+
self._allow_bootstrap_override = allow_bootstrap_override
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def mode(self) -> EnumHandlerSourceMode:
|
|
131
|
+
"""Get the configured resolution mode.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
EnumHandlerSourceMode: The mode used for handler resolution.
|
|
135
|
+
"""
|
|
136
|
+
return self._mode
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def allow_bootstrap_override(self) -> bool:
|
|
140
|
+
"""Get the bootstrap override configuration.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
bool: True if bootstrap handlers take precedence in HYBRID mode,
|
|
144
|
+
False if contract handlers take precedence (default).
|
|
145
|
+
"""
|
|
146
|
+
return self._allow_bootstrap_override
|
|
147
|
+
|
|
148
|
+
async def resolve_handlers(self) -> ModelContractDiscoveryResult:
|
|
149
|
+
"""Resolve handlers based on the configured mode.
|
|
150
|
+
|
|
151
|
+
Discovers handlers from the appropriate source(s) based on mode:
|
|
152
|
+
- BOOTSTRAP: Only queries bootstrap source
|
|
153
|
+
- CONTRACT: Only queries contract source
|
|
154
|
+
- HYBRID: Queries both sources and merges with contract precedence
|
|
155
|
+
- KAFKA_EVENTS: Queries Kafka-based contract cache
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
ModelContractDiscoveryResult: Container with discovered descriptors
|
|
159
|
+
and any validation errors from the queried source(s).
|
|
160
|
+
"""
|
|
161
|
+
if self._mode == EnumHandlerSourceMode.BOOTSTRAP:
|
|
162
|
+
return await self._resolve_bootstrap()
|
|
163
|
+
elif self._mode == EnumHandlerSourceMode.CONTRACT:
|
|
164
|
+
return await self._resolve_contract()
|
|
165
|
+
elif self._mode == EnumHandlerSourceMode.KAFKA_EVENTS:
|
|
166
|
+
return await self._resolve_kafka_events()
|
|
167
|
+
else:
|
|
168
|
+
# HYBRID mode
|
|
169
|
+
return await self._resolve_hybrid()
|
|
170
|
+
|
|
171
|
+
async def _resolve_bootstrap(self) -> ModelContractDiscoveryResult:
|
|
172
|
+
"""Resolve handlers using only the bootstrap source.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
ModelContractDiscoveryResult: Handlers from bootstrap source only.
|
|
176
|
+
"""
|
|
177
|
+
result = await self._bootstrap_source.discover_handlers()
|
|
178
|
+
|
|
179
|
+
logger.info(
|
|
180
|
+
"Handler resolution completed (BOOTSTRAP mode)",
|
|
181
|
+
extra={
|
|
182
|
+
"mode": self._mode.value,
|
|
183
|
+
"bootstrap_handler_count": len(result.descriptors),
|
|
184
|
+
"resolved_handler_count": len(result.descriptors),
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return result
|
|
189
|
+
|
|
190
|
+
async def _resolve_contract(self) -> ModelContractDiscoveryResult:
|
|
191
|
+
"""Resolve handlers using only the contract source.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
ModelContractDiscoveryResult: Handlers from contract source only.
|
|
195
|
+
"""
|
|
196
|
+
result = await self._contract_source.discover_handlers()
|
|
197
|
+
|
|
198
|
+
logger.info(
|
|
199
|
+
"Handler resolution completed (CONTRACT mode)",
|
|
200
|
+
extra={
|
|
201
|
+
"mode": self._mode.value,
|
|
202
|
+
"contract_handler_count": len(result.descriptors),
|
|
203
|
+
"resolved_handler_count": len(result.descriptors),
|
|
204
|
+
},
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
return result
|
|
208
|
+
|
|
209
|
+
async def _resolve_kafka_events(self) -> ModelContractDiscoveryResult:
|
|
210
|
+
"""Resolve handlers using Kafka-based contract source.
|
|
211
|
+
|
|
212
|
+
For KAFKA_EVENTS mode, the contract_source is expected to be a
|
|
213
|
+
KafkaContractSource instance that returns cached descriptors from
|
|
214
|
+
contract registration events.
|
|
215
|
+
|
|
216
|
+
Note:
|
|
217
|
+
This is a beta cache-only implementation. Discovered contracts
|
|
218
|
+
take effect on the next runtime restart.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
ModelContractDiscoveryResult: Discovery result from the Kafka
|
|
222
|
+
contract cache.
|
|
223
|
+
"""
|
|
224
|
+
result = await self._contract_source.discover_handlers()
|
|
225
|
+
|
|
226
|
+
logger.info(
|
|
227
|
+
"Handler resolution completed (KAFKA_EVENTS mode)",
|
|
228
|
+
extra={
|
|
229
|
+
"mode": self._mode.value,
|
|
230
|
+
"kafka_handler_count": len(result.descriptors),
|
|
231
|
+
"resolved_handler_count": len(result.descriptors),
|
|
232
|
+
},
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
return result
|
|
236
|
+
|
|
237
|
+
async def _resolve_hybrid(self) -> ModelContractDiscoveryResult:
|
|
238
|
+
"""Resolve handlers using both sources with configurable precedence.
|
|
239
|
+
|
|
240
|
+
In HYBRID mode:
|
|
241
|
+
1. Discover handlers from both bootstrap and contract sources
|
|
242
|
+
2. Build a handler map keyed by handler_id
|
|
243
|
+
3. Resolve conflicts based on allow_bootstrap_override:
|
|
244
|
+
- False (default): Contract handlers override bootstrap handlers
|
|
245
|
+
- True: Bootstrap handlers override contract handlers
|
|
246
|
+
4. Non-conflicting handlers are included from both sources
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
ModelContractDiscoveryResult: Merged handlers with configured
|
|
250
|
+
precedence and combined validation errors from both sources.
|
|
251
|
+
"""
|
|
252
|
+
# Get handlers from both sources
|
|
253
|
+
bootstrap_result = await self._bootstrap_source.discover_handlers()
|
|
254
|
+
contract_result = await self._contract_source.discover_handlers()
|
|
255
|
+
|
|
256
|
+
# Build lookup maps for both sources
|
|
257
|
+
bootstrap_by_id: dict[str, ModelHandlerDescriptor] = {
|
|
258
|
+
d.handler_id: d for d in bootstrap_result.descriptors
|
|
259
|
+
}
|
|
260
|
+
contract_by_id: dict[str, ModelHandlerDescriptor] = {
|
|
261
|
+
d.handler_id: d for d in contract_result.descriptors
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
# Determine which source takes precedence
|
|
265
|
+
if self._allow_bootstrap_override:
|
|
266
|
+
# Bootstrap wins conflicts: add bootstrap first, then contract fallbacks
|
|
267
|
+
primary_source = bootstrap_result.descriptors
|
|
268
|
+
primary_by_id = bootstrap_by_id
|
|
269
|
+
secondary_source = contract_result.descriptors
|
|
270
|
+
secondary_by_id = contract_by_id
|
|
271
|
+
primary_name = "bootstrap"
|
|
272
|
+
secondary_name = "contract"
|
|
273
|
+
else:
|
|
274
|
+
# Contract wins conflicts (default): add contract first, then bootstrap fallbacks
|
|
275
|
+
primary_source = contract_result.descriptors
|
|
276
|
+
primary_by_id = contract_by_id
|
|
277
|
+
secondary_source = bootstrap_result.descriptors
|
|
278
|
+
secondary_by_id = bootstrap_by_id
|
|
279
|
+
primary_name = "contract"
|
|
280
|
+
secondary_name = "bootstrap"
|
|
281
|
+
|
|
282
|
+
# Build handler map - primary source handlers first (they take precedence)
|
|
283
|
+
handlers_by_id: dict[str, ModelHandlerDescriptor] = {}
|
|
284
|
+
|
|
285
|
+
# Add primary handlers (they win conflicts)
|
|
286
|
+
for descriptor in primary_source:
|
|
287
|
+
handlers_by_id[descriptor.handler_id] = descriptor
|
|
288
|
+
|
|
289
|
+
# Log primary-only handlers (no secondary equivalent)
|
|
290
|
+
if descriptor.handler_id not in secondary_by_id:
|
|
291
|
+
logger.debug(
|
|
292
|
+
f"Adding {primary_name}-only handler (no {secondary_name} equivalent)",
|
|
293
|
+
extra={
|
|
294
|
+
"handler_id": descriptor.handler_id,
|
|
295
|
+
"handler_name": descriptor.name,
|
|
296
|
+
"source": primary_name,
|
|
297
|
+
},
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Add secondary handlers only if not already present (fallback)
|
|
301
|
+
fallback_count = 0
|
|
302
|
+
override_count = 0
|
|
303
|
+
for descriptor in secondary_source:
|
|
304
|
+
if descriptor.handler_id in handlers_by_id:
|
|
305
|
+
# Primary handler wins - this is an override
|
|
306
|
+
override_count += 1
|
|
307
|
+
primary_handler = handlers_by_id[descriptor.handler_id]
|
|
308
|
+
logger.debug(
|
|
309
|
+
f"{primary_name.capitalize()} handler overrides {secondary_name} handler",
|
|
310
|
+
extra={
|
|
311
|
+
"handler_id": descriptor.handler_id,
|
|
312
|
+
"primary_name": primary_handler.name,
|
|
313
|
+
"secondary_name": descriptor.name,
|
|
314
|
+
"primary_source": primary_name,
|
|
315
|
+
"secondary_source": secondary_name,
|
|
316
|
+
"contract_path": (
|
|
317
|
+
primary_handler.contract_path
|
|
318
|
+
if primary_name == "contract"
|
|
319
|
+
else descriptor.contract_path
|
|
320
|
+
),
|
|
321
|
+
},
|
|
322
|
+
)
|
|
323
|
+
else:
|
|
324
|
+
# No primary handler with this ID - use secondary as fallback
|
|
325
|
+
handlers_by_id[descriptor.handler_id] = descriptor
|
|
326
|
+
fallback_count += 1
|
|
327
|
+
logger.debug(
|
|
328
|
+
f"Using {secondary_name} handler as fallback (no {primary_name} match)",
|
|
329
|
+
extra={
|
|
330
|
+
"handler_id": descriptor.handler_id,
|
|
331
|
+
"handler_name": descriptor.name,
|
|
332
|
+
"source": secondary_name,
|
|
333
|
+
},
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
# NOTE: Validation errors from bootstrap and contract sources are intentionally
|
|
337
|
+
# combined WITHOUT deduplication. During migration, the same error appearing from
|
|
338
|
+
# BOTH sources helps distinguish handler-level issues (error in both) from
|
|
339
|
+
# source-specific configuration problems (error in only one). This preserves
|
|
340
|
+
# diagnostic signal that would be lost if we deduplicated.
|
|
341
|
+
all_errors: list[ModelHandlerValidationError] = list(
|
|
342
|
+
bootstrap_result.validation_errors
|
|
343
|
+
) + list(contract_result.validation_errors)
|
|
344
|
+
|
|
345
|
+
# Log structured counts for observability
|
|
346
|
+
logger.info(
|
|
347
|
+
"Handler resolution completed (HYBRID mode)",
|
|
348
|
+
extra={
|
|
349
|
+
"mode": self._mode.value,
|
|
350
|
+
"allow_bootstrap_override": self._allow_bootstrap_override,
|
|
351
|
+
"precedence": primary_name,
|
|
352
|
+
"contract_handler_count": len(contract_result.descriptors),
|
|
353
|
+
"bootstrap_handler_count": len(bootstrap_result.descriptors),
|
|
354
|
+
"fallback_handler_count": fallback_count,
|
|
355
|
+
"override_count": override_count,
|
|
356
|
+
"resolved_handler_count": len(handlers_by_id),
|
|
357
|
+
"validation_error_count": len(all_errors),
|
|
358
|
+
},
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
return ModelContractDiscoveryResult(
|
|
362
|
+
descriptors=list(handlers_by_id.values()),
|
|
363
|
+
validation_errors=all_errors,
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
__all__ = ["HandlerSourceResolver"]
|