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,723 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Wiring Module - Registers concrete handlers with the handler registry.
|
|
4
|
+
|
|
5
|
+
This module provides functions to wire up concrete handler implementations
|
|
6
|
+
with the RegistryProtocolBinding and RegistryEventBusBinding. It serves as
|
|
7
|
+
the bridge between handler implementations and the registry system.
|
|
8
|
+
|
|
9
|
+
The wiring module is responsible for:
|
|
10
|
+
- Registering default handlers from contract.yaml files
|
|
11
|
+
- Registering handlers based on contract configuration
|
|
12
|
+
- Validating that requested handler types are known and supported
|
|
13
|
+
- Providing a summary of registered handlers for debugging
|
|
14
|
+
|
|
15
|
+
Contract-Driven Handler Loading:
|
|
16
|
+
Handler classes are discovered and loaded from contract.yaml files located
|
|
17
|
+
in nodes/handlers/<handler_type>/contract.yaml. Each contract specifies:
|
|
18
|
+
- handler.module: The Python module path
|
|
19
|
+
- handler.name: The class name to load
|
|
20
|
+
|
|
21
|
+
This replaces the old hardcoded _KNOWN_HANDLERS dict with dynamic,
|
|
22
|
+
contract-based discovery.
|
|
23
|
+
|
|
24
|
+
Event Bus Support:
|
|
25
|
+
This module registers EventBusInmemory as the default event bus. For production
|
|
26
|
+
deployments requiring EventBusKafka, the event bus is selected at kernel bootstrap
|
|
27
|
+
time based on:
|
|
28
|
+
- KAFKA_BOOTSTRAP_SERVERS environment variable (if set, uses EventBusKafka)
|
|
29
|
+
- config.event_bus.type field in runtime_config.yaml
|
|
30
|
+
|
|
31
|
+
See kernel.py for event bus selection logic during runtime bootstrap.
|
|
32
|
+
|
|
33
|
+
Design Principles:
|
|
34
|
+
- Contract-driven: Handler configurations live in contract.yaml, not Python code
|
|
35
|
+
- Explicit wiring: All handler registrations are explicit, not auto-discovered
|
|
36
|
+
- Validation: Unknown handler types raise clear errors
|
|
37
|
+
- Fail-fast: Missing contracts raise FileNotFoundError immediately
|
|
38
|
+
- Idempotent: Re-wiring the same handler is safe (overwrites previous)
|
|
39
|
+
- Security: Namespace allowlisting is recommended for production deployments
|
|
40
|
+
(see docs/patterns/handler_plugin_loader.md#optional-security-controls)
|
|
41
|
+
|
|
42
|
+
Adding New Handlers:
|
|
43
|
+
To add a new handler to the system, follow these steps:
|
|
44
|
+
|
|
45
|
+
1. Create a handler class implementing the ProtocolHandler protocol:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from omnibase_spi.protocols.handlers.protocol_handler import ProtocolHandler
|
|
49
|
+
|
|
50
|
+
class MyCustomHandler:
|
|
51
|
+
'''Handler for custom protocol operations.'''
|
|
52
|
+
|
|
53
|
+
async def initialize(self, config: dict[str, object]) -> None:
|
|
54
|
+
'''Initialize handler with configuration.'''
|
|
55
|
+
self._config = config
|
|
56
|
+
|
|
57
|
+
async def execute(self, envelope: dict[str, object]) -> dict[str, object]:
|
|
58
|
+
'''Execute operation from envelope and return response.'''
|
|
59
|
+
# Handle the envelope and return response dict
|
|
60
|
+
return {"success": True, "data": ...}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
2. Create a contract.yaml in nodes/handlers/<type>/contract.yaml:
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
name: "handler_custom"
|
|
67
|
+
node_type: "EFFECT_GENERIC"
|
|
68
|
+
description: "Custom protocol handler"
|
|
69
|
+
handler_routing:
|
|
70
|
+
routing_strategy: "operation_match"
|
|
71
|
+
handlers:
|
|
72
|
+
- handler_type: "custom"
|
|
73
|
+
handler:
|
|
74
|
+
name: "MyCustomHandler"
|
|
75
|
+
module: "mypackage.handlers.handler_custom"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
3. Add the contract path to _HANDLER_CONTRACT_PATHS in this module.
|
|
79
|
+
|
|
80
|
+
4. For runtime registration without contracts, use wire_custom_handler():
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
from omnibase_infra.runtime.util_wiring import wire_custom_handler
|
|
84
|
+
|
|
85
|
+
wire_custom_handler("custom", MyCustomHandler)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Integration with RuntimeHostProcess:
|
|
89
|
+
The wiring module and RuntimeHostProcess work together in a two-phase
|
|
90
|
+
registration and instantiation flow:
|
|
91
|
+
|
|
92
|
+
Phase 1 - Class Registration (wiring module):
|
|
93
|
+
When wire_default_handlers() is called, handler CLASSES are registered
|
|
94
|
+
with the singleton RegistryProtocolBinding. At this point, no handler
|
|
95
|
+
instances exist - only the class types are stored in the registry.
|
|
96
|
+
|
|
97
|
+
Phase 2 - Instance Creation (RuntimeHostProcess):
|
|
98
|
+
After wiring, RuntimeHostProcess._populate_handlers_from_registry():
|
|
99
|
+
1. Gets each handler CLASS from the singleton registry
|
|
100
|
+
2. Instantiates the handler class: handler_instance = handler_cls()
|
|
101
|
+
3. Calls initialize(config) on the instance with runtime configuration
|
|
102
|
+
4. Stores the instance in self._handlers for envelope routing
|
|
103
|
+
|
|
104
|
+
This two-phase approach allows:
|
|
105
|
+
- Centralized handler class registration via wiring
|
|
106
|
+
- Lazy instantiation controlled by RuntimeHostProcess
|
|
107
|
+
- Per-process configuration passed to handler.initialize()
|
|
108
|
+
- Test injection of mock handlers before start() is called
|
|
109
|
+
|
|
110
|
+
Example Usage:
|
|
111
|
+
```python
|
|
112
|
+
from omnibase_infra.runtime.util_wiring import (
|
|
113
|
+
wire_default_handlers,
|
|
114
|
+
wire_handlers_from_contract,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# Wire all default handlers from contracts
|
|
118
|
+
summary = wire_default_handlers()
|
|
119
|
+
print(f"Registered handlers: {summary['handlers']}")
|
|
120
|
+
print(f"Registered event buses: {summary['event_buses']}")
|
|
121
|
+
|
|
122
|
+
# Wire handlers from contract config
|
|
123
|
+
contract_config = {
|
|
124
|
+
"handlers": [
|
|
125
|
+
{"type": "http", "enabled": True},
|
|
126
|
+
{"type": "db", "enabled": True},
|
|
127
|
+
],
|
|
128
|
+
"event_bus": {"kind": "inmemory"},
|
|
129
|
+
}
|
|
130
|
+
wire_handlers_from_contract(contract_config)
|
|
131
|
+
```
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
from __future__ import annotations
|
|
135
|
+
|
|
136
|
+
import importlib
|
|
137
|
+
import logging
|
|
138
|
+
from pathlib import Path
|
|
139
|
+
from typing import TYPE_CHECKING
|
|
140
|
+
|
|
141
|
+
import yaml
|
|
142
|
+
|
|
143
|
+
from omnibase_core.types import JsonType
|
|
144
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
145
|
+
from omnibase_infra.event_bus.event_bus_inmemory import EventBusInmemory
|
|
146
|
+
from omnibase_infra.runtime.handler_registry import (
|
|
147
|
+
EVENT_BUS_INMEMORY,
|
|
148
|
+
HANDLER_TYPE_CONSUL,
|
|
149
|
+
HANDLER_TYPE_DATABASE,
|
|
150
|
+
HANDLER_TYPE_GRAPH,
|
|
151
|
+
HANDLER_TYPE_HTTP,
|
|
152
|
+
HANDLER_TYPE_INTENT,
|
|
153
|
+
HANDLER_TYPE_MCP,
|
|
154
|
+
HANDLER_TYPE_VAULT,
|
|
155
|
+
RegistryEventBusBinding,
|
|
156
|
+
RegistryProtocolBinding,
|
|
157
|
+
get_event_bus_registry,
|
|
158
|
+
get_handler_registry,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
if TYPE_CHECKING:
|
|
162
|
+
from omnibase_core.protocol.protocol_event_bus import ProtocolEventBus
|
|
163
|
+
from omnibase_infra.protocols import ProtocolContainerAware
|
|
164
|
+
|
|
165
|
+
logger = logging.getLogger(__name__)
|
|
166
|
+
|
|
167
|
+
# Handler contract directory path.
|
|
168
|
+
# Handler configurations are loaded from contract.yaml files in this directory.
|
|
169
|
+
_HANDLERS_BASE = Path(__file__).parent.parent / "nodes" / "handlers"
|
|
170
|
+
|
|
171
|
+
# Mapping of handler types to their contract paths.
|
|
172
|
+
# Each entry maps a handler type constant to the path of its contract.yaml file.
|
|
173
|
+
_HANDLER_CONTRACT_PATHS: dict[str, Path] = {
|
|
174
|
+
HANDLER_TYPE_CONSUL: _HANDLERS_BASE / "consul" / "contract.yaml",
|
|
175
|
+
HANDLER_TYPE_DATABASE: _HANDLERS_BASE / "db" / "contract.yaml",
|
|
176
|
+
HANDLER_TYPE_GRAPH: _HANDLERS_BASE / "graph" / "contract.yaml",
|
|
177
|
+
HANDLER_TYPE_HTTP: _HANDLERS_BASE / "http" / "contract.yaml",
|
|
178
|
+
HANDLER_TYPE_INTENT: _HANDLERS_BASE / "intent" / "contract.yaml",
|
|
179
|
+
HANDLER_TYPE_MCP: _HANDLERS_BASE / "mcp" / "contract.yaml",
|
|
180
|
+
HANDLER_TYPE_VAULT: _HANDLERS_BASE / "vault" / "contract.yaml",
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# Known event bus kinds that can be wired via this module.
|
|
184
|
+
# Maps bus kind constant to (bus_class, description)
|
|
185
|
+
#
|
|
186
|
+
# Note: EventBusKafka is NOT in this registry. It is selected at kernel bootstrap
|
|
187
|
+
# time via environment variable (KAFKA_BOOTSTRAP_SERVERS) or runtime config
|
|
188
|
+
# (event_bus.type = "kafka"). This registry handles only contract-based wiring
|
|
189
|
+
# while production event bus selection is handled by kernel.py.
|
|
190
|
+
_KNOWN_EVENT_BUSES: dict[str, tuple[type[ProtocolEventBus], str]] = {
|
|
191
|
+
EVENT_BUS_INMEMORY: (EventBusInmemory, "In-memory event bus for local/testing"),
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _load_handler_from_contract(
|
|
196
|
+
handler_type: str, contract_path: Path
|
|
197
|
+
) -> tuple[type[ProtocolContainerAware], str]:
|
|
198
|
+
"""Load handler class from a contract.yaml file.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
handler_type: The handler type identifier (e.g., "consul", "db").
|
|
202
|
+
contract_path: Path to the contract.yaml file.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Tuple of (handler_class, description).
|
|
206
|
+
|
|
207
|
+
Raises:
|
|
208
|
+
FileNotFoundError: If contract file does not exist.
|
|
209
|
+
ProtocolConfigurationError: If contract is malformed or handler cannot be loaded.
|
|
210
|
+
|
|
211
|
+
Security Note:
|
|
212
|
+
This function uses ``importlib.import_module()`` to dynamically load handler
|
|
213
|
+
modules specified in contracts. This means contract files are effectively
|
|
214
|
+
executable code - a compromised contract pointing to a malicious module
|
|
215
|
+
will execute that module's code during import.
|
|
216
|
+
|
|
217
|
+
**Production Security Recommendations:**
|
|
218
|
+
|
|
219
|
+
1. **Namespace Allowlisting**: For dynamic handler discovery scenarios,
|
|
220
|
+
use ``HandlerPluginLoader`` with the ``allowed_namespaces`` parameter
|
|
221
|
+
to restrict which module namespaces can be loaded::
|
|
222
|
+
|
|
223
|
+
from omnibase_infra.runtime.handler_plugin_loader import HandlerPluginLoader
|
|
224
|
+
|
|
225
|
+
loader = HandlerPluginLoader(
|
|
226
|
+
allowed_namespaces=["omnibase_infra.", "omnibase_core.", "myapp.handlers."]
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
This prevents loading handlers from untrusted namespaces even if a
|
|
230
|
+
contract is compromised.
|
|
231
|
+
|
|
232
|
+
2. **Write Protection**: Contract directories should be read-only at runtime.
|
|
233
|
+
Mount contract directories as read-only volumes in containerized deployments.
|
|
234
|
+
|
|
235
|
+
3. **Source Validation**: Contracts in ``_HANDLER_CONTRACT_PATHS`` come from
|
|
236
|
+
the omnibase_infra package. Ensure these are from trusted, version-controlled
|
|
237
|
+
sources with code review.
|
|
238
|
+
|
|
239
|
+
See Also:
|
|
240
|
+
- ``docs/patterns/handler_plugin_loader.md#optional-security-controls``
|
|
241
|
+
- ``docs/patterns/security_patterns.md``
|
|
242
|
+
- ``docs/decisions/adr-handler-plugin-loader-security.md``
|
|
243
|
+
"""
|
|
244
|
+
if not contract_path.exists():
|
|
245
|
+
raise FileNotFoundError(
|
|
246
|
+
f"Handler contract not found: {contract_path}. "
|
|
247
|
+
f"All handlers must have contract.yaml files."
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
with contract_path.open("r") as f:
|
|
251
|
+
contract = yaml.safe_load(f)
|
|
252
|
+
|
|
253
|
+
if contract is None:
|
|
254
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
255
|
+
operation="load_handler_contract",
|
|
256
|
+
target_name=str(contract_path),
|
|
257
|
+
)
|
|
258
|
+
raise ProtocolConfigurationError(
|
|
259
|
+
f"Empty contract file: {contract_path}",
|
|
260
|
+
context=context,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
handler_routing = contract.get("handler_routing", {})
|
|
264
|
+
handlers = handler_routing.get("handlers", [])
|
|
265
|
+
|
|
266
|
+
if not handlers:
|
|
267
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
268
|
+
operation="load_handler_contract",
|
|
269
|
+
target_name=str(contract_path),
|
|
270
|
+
)
|
|
271
|
+
raise ProtocolConfigurationError(
|
|
272
|
+
f"No handlers defined in contract: {contract_path}",
|
|
273
|
+
context=context,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
handler_def = handlers[0]
|
|
277
|
+
handler_info = handler_def.get("handler", {})
|
|
278
|
+
handler_module = handler_info.get("module")
|
|
279
|
+
handler_class_name = handler_info.get("name")
|
|
280
|
+
|
|
281
|
+
if not handler_module or not handler_class_name:
|
|
282
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
283
|
+
operation="load_handler_contract",
|
|
284
|
+
target_name=str(contract_path),
|
|
285
|
+
)
|
|
286
|
+
raise ProtocolConfigurationError(
|
|
287
|
+
f"Missing handler module or name in contract: {contract_path}. "
|
|
288
|
+
f"Expected handler.module and handler.name fields.",
|
|
289
|
+
context=context,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
module = importlib.import_module(handler_module)
|
|
294
|
+
except ImportError as e:
|
|
295
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
296
|
+
operation="import_handler_module",
|
|
297
|
+
target_name=handler_module,
|
|
298
|
+
)
|
|
299
|
+
raise ProtocolConfigurationError(
|
|
300
|
+
f"Failed to import handler module '{handler_module}': {e}",
|
|
301
|
+
context=context,
|
|
302
|
+
) from e
|
|
303
|
+
|
|
304
|
+
try:
|
|
305
|
+
handler_class = getattr(module, handler_class_name)
|
|
306
|
+
except AttributeError as e:
|
|
307
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
308
|
+
operation="load_handler_class",
|
|
309
|
+
target_name=f"{handler_module}.{handler_class_name}",
|
|
310
|
+
)
|
|
311
|
+
raise ProtocolConfigurationError(
|
|
312
|
+
f"Handler class '{handler_class_name}' not found in module '{handler_module}'",
|
|
313
|
+
context=context,
|
|
314
|
+
) from e
|
|
315
|
+
|
|
316
|
+
description = contract.get("description", f"{handler_type} handler")
|
|
317
|
+
|
|
318
|
+
logger.debug(
|
|
319
|
+
"Loaded handler from contract",
|
|
320
|
+
extra={
|
|
321
|
+
"handler_type": handler_type,
|
|
322
|
+
"handler_class": handler_class_name,
|
|
323
|
+
"handler_module": handler_module,
|
|
324
|
+
"contract_path": str(contract_path),
|
|
325
|
+
},
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
return handler_class, description
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def wire_default_handlers() -> dict[str, list[str]]:
|
|
332
|
+
"""Register all default handlers and event buses with singleton registries.
|
|
333
|
+
|
|
334
|
+
This function registers the standard set of handlers and event buses
|
|
335
|
+
that are available for use by the RuntimeHostProcess. It is the primary
|
|
336
|
+
way to initialize the handler ecosystem.
|
|
337
|
+
|
|
338
|
+
Registered Handlers:
|
|
339
|
+
- CONSUL: HandlerConsul for HashiCorp Consul service discovery
|
|
340
|
+
- DB: HandlerDb for PostgreSQL database operations
|
|
341
|
+
- GRAPH: HandlerGraph for graph database (Memgraph/Neo4j) operations
|
|
342
|
+
- HTTP: HandlerHttpRest for HTTP/REST protocol operations
|
|
343
|
+
- INTENT: HandlerIntent for intent storage and query (demo)
|
|
344
|
+
- MCP: HandlerMCP for Model Context Protocol AI agent integration
|
|
345
|
+
- VAULT: HandlerVault for HashiCorp Vault secret management
|
|
346
|
+
|
|
347
|
+
Registered Event Buses:
|
|
348
|
+
- INMEMORY: EventBusInmemory for local/testing deployments
|
|
349
|
+
|
|
350
|
+
Event Bus Selection Note:
|
|
351
|
+
This function only registers EventBusInmemory in the event bus registry.
|
|
352
|
+
For production deployments with EventBusKafka:
|
|
353
|
+
- Set KAFKA_BOOTSTRAP_SERVERS environment variable, OR
|
|
354
|
+
- Configure event_bus.type = "kafka" in runtime_config.yaml
|
|
355
|
+
|
|
356
|
+
EventBusKafka selection happens at kernel bootstrap time (see kernel.py),
|
|
357
|
+
not through this registry-based wiring mechanism.
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
Summary dict with keys:
|
|
361
|
+
- handlers: List of registered handler type names
|
|
362
|
+
- event_buses: List of registered event bus kind names
|
|
363
|
+
|
|
364
|
+
Example:
|
|
365
|
+
>>> summary = wire_default_handlers()
|
|
366
|
+
>>> print(summary)
|
|
367
|
+
{'handlers': ['consul', 'db', 'http', 'mcp', 'vault'], 'event_buses': ['inmemory']}
|
|
368
|
+
|
|
369
|
+
Note:
|
|
370
|
+
This function uses the singleton registries returned by
|
|
371
|
+
get_handler_registry() and get_event_bus_registry().
|
|
372
|
+
Multiple calls are safe (handlers are overwritten).
|
|
373
|
+
"""
|
|
374
|
+
handler_registry = get_handler_registry()
|
|
375
|
+
event_bus_registry = get_event_bus_registry()
|
|
376
|
+
|
|
377
|
+
# Register all handlers from contracts
|
|
378
|
+
for handler_type, contract_path in _HANDLER_CONTRACT_PATHS.items():
|
|
379
|
+
handler_cls, description = _load_handler_from_contract(
|
|
380
|
+
handler_type, contract_path
|
|
381
|
+
)
|
|
382
|
+
# NOTE: Handlers implement ProtocolHandler structurally but don't inherit from it.
|
|
383
|
+
# Mypy cannot verify structural subtyping for registration argument.
|
|
384
|
+
handler_registry.register(handler_type, handler_cls) # type: ignore[arg-type] # NOTE: structural subtyping
|
|
385
|
+
logger.debug(
|
|
386
|
+
"Registered handler from contract",
|
|
387
|
+
extra={
|
|
388
|
+
"handler_type": handler_type,
|
|
389
|
+
"handler_class": handler_cls.__name__,
|
|
390
|
+
"description": description,
|
|
391
|
+
"contract_path": str(contract_path),
|
|
392
|
+
},
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
# Register all known event buses
|
|
396
|
+
# Note: RegistryEventBusBinding raises if already registered,
|
|
397
|
+
# so we check first to make this idempotent
|
|
398
|
+
for bus_kind, (bus_cls, description) in _KNOWN_EVENT_BUSES.items():
|
|
399
|
+
if not event_bus_registry.is_registered(bus_kind):
|
|
400
|
+
event_bus_registry.register(bus_kind, bus_cls)
|
|
401
|
+
logger.debug(
|
|
402
|
+
"Registered event bus",
|
|
403
|
+
extra={
|
|
404
|
+
"bus_kind": bus_kind,
|
|
405
|
+
"bus_class": bus_cls.__name__,
|
|
406
|
+
"description": description,
|
|
407
|
+
},
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
registered_handlers = handler_registry.list_protocols()
|
|
411
|
+
registered_buses = event_bus_registry.list_bus_kinds()
|
|
412
|
+
|
|
413
|
+
logger.info(
|
|
414
|
+
"Default handlers wired",
|
|
415
|
+
extra={
|
|
416
|
+
"handler_count": len(registered_handlers),
|
|
417
|
+
"handlers": registered_handlers,
|
|
418
|
+
"event_bus_count": len(registered_buses),
|
|
419
|
+
"event_buses": registered_buses,
|
|
420
|
+
},
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
return {
|
|
424
|
+
"handlers": registered_handlers,
|
|
425
|
+
"event_buses": registered_buses,
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
def wire_handlers_from_contract(
|
|
430
|
+
contract_config: dict[str, JsonType],
|
|
431
|
+
) -> dict[str, list[str]]:
|
|
432
|
+
"""Register handlers and event buses based on contract configuration.
|
|
433
|
+
|
|
434
|
+
This function selectively registers handlers based on the configuration
|
|
435
|
+
provided in a contract. It validates that all requested handler types
|
|
436
|
+
are known and supported.
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
contract_config: Contract configuration dict containing:
|
|
440
|
+
- handlers: Optional list of handler configs, each with:
|
|
441
|
+
- type: Handler type string (e.g., "http", "db")
|
|
442
|
+
- enabled: Optional bool, defaults to True
|
|
443
|
+
- event_bus: Optional event bus config with:
|
|
444
|
+
- kind: Event bus kind string (e.g., "inmemory")
|
|
445
|
+
- enabled: Optional bool, defaults to True
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
Summary dict with keys:
|
|
449
|
+
- handlers: List of registered handler type names
|
|
450
|
+
- event_buses: List of registered event bus kind names
|
|
451
|
+
|
|
452
|
+
Raises:
|
|
453
|
+
ProtocolConfigurationError: If an unknown handler type or event bus
|
|
454
|
+
kind is specified in the configuration.
|
|
455
|
+
|
|
456
|
+
Example:
|
|
457
|
+
>>> config = {
|
|
458
|
+
... "handlers": [
|
|
459
|
+
... {"type": "http", "enabled": True},
|
|
460
|
+
... {"type": "db", "enabled": False}, # Skipped
|
|
461
|
+
... ],
|
|
462
|
+
... "event_bus": {"kind": "inmemory"},
|
|
463
|
+
... }
|
|
464
|
+
>>> summary = wire_handlers_from_contract(config)
|
|
465
|
+
>>> print(summary)
|
|
466
|
+
{'handlers': ['http'], 'event_buses': ['inmemory']}
|
|
467
|
+
|
|
468
|
+
Note:
|
|
469
|
+
Disabled handlers (enabled=False) are skipped during registration.
|
|
470
|
+
Unknown handler types raise ProtocolConfigurationError immediately.
|
|
471
|
+
"""
|
|
472
|
+
handler_registry = get_handler_registry()
|
|
473
|
+
event_bus_registry = get_event_bus_registry()
|
|
474
|
+
|
|
475
|
+
registered_handlers: list[str] = []
|
|
476
|
+
registered_buses: list[str] = []
|
|
477
|
+
|
|
478
|
+
# Create error context for configuration errors
|
|
479
|
+
def _make_error_context(
|
|
480
|
+
operation: str, target_name: str = "wiring"
|
|
481
|
+
) -> ModelInfraErrorContext:
|
|
482
|
+
"""Create standardized error context for configuration errors."""
|
|
483
|
+
return ModelInfraErrorContext.with_correlation(
|
|
484
|
+
operation=operation,
|
|
485
|
+
target_name=target_name,
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
# Process handler configurations
|
|
489
|
+
handlers_config = contract_config.get("handlers")
|
|
490
|
+
if handlers_config is not None:
|
|
491
|
+
if not isinstance(handlers_config, list):
|
|
492
|
+
raise ProtocolConfigurationError(
|
|
493
|
+
"Contract 'handlers' must be a list of handler configurations",
|
|
494
|
+
context=_make_error_context("validate_handlers_config"),
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
for handler_config in handlers_config:
|
|
498
|
+
if not isinstance(handler_config, dict):
|
|
499
|
+
raise ProtocolConfigurationError(
|
|
500
|
+
"Each handler configuration must be a dict",
|
|
501
|
+
context=_make_error_context("validate_handler_entry"),
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
handler_type = handler_config.get("type")
|
|
505
|
+
if not isinstance(handler_type, str):
|
|
506
|
+
raise ProtocolConfigurationError(
|
|
507
|
+
"Handler configuration missing required 'type' field",
|
|
508
|
+
context=_make_error_context("validate_handler_type"),
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
# Check if handler is enabled (default True)
|
|
512
|
+
enabled = handler_config.get("enabled", True)
|
|
513
|
+
if not enabled:
|
|
514
|
+
logger.debug(
|
|
515
|
+
"Skipping disabled handler",
|
|
516
|
+
extra={"handler_type": handler_type},
|
|
517
|
+
)
|
|
518
|
+
continue
|
|
519
|
+
|
|
520
|
+
# Validate handler type is known (has a contract)
|
|
521
|
+
if handler_type not in _HANDLER_CONTRACT_PATHS:
|
|
522
|
+
known_types = sorted(_HANDLER_CONTRACT_PATHS.keys())
|
|
523
|
+
raise ProtocolConfigurationError(
|
|
524
|
+
f"Unknown handler type: {handler_type!r}. "
|
|
525
|
+
f"Known types: {known_types}",
|
|
526
|
+
context=_make_error_context("validate_handler_type", handler_type),
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
# Load and register the handler from contract
|
|
530
|
+
contract_path = _HANDLER_CONTRACT_PATHS[handler_type]
|
|
531
|
+
handler_cls, description = _load_handler_from_contract(
|
|
532
|
+
handler_type, contract_path
|
|
533
|
+
)
|
|
534
|
+
# NOTE: Handlers implement ProtocolHandler structurally but don't inherit from it.
|
|
535
|
+
# Mypy cannot verify structural subtyping for registration argument.
|
|
536
|
+
handler_registry.register(handler_type, handler_cls) # type: ignore[arg-type] # NOTE: structural subtyping
|
|
537
|
+
registered_handlers.append(handler_type)
|
|
538
|
+
|
|
539
|
+
logger.debug(
|
|
540
|
+
"Registered handler from contract config",
|
|
541
|
+
extra={
|
|
542
|
+
"handler_type": handler_type,
|
|
543
|
+
"handler_class": handler_cls.__name__,
|
|
544
|
+
"description": description,
|
|
545
|
+
"contract_path": str(contract_path),
|
|
546
|
+
},
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
# Process event bus configuration
|
|
550
|
+
event_bus_config = contract_config.get("event_bus")
|
|
551
|
+
if event_bus_config is not None:
|
|
552
|
+
if not isinstance(event_bus_config, dict):
|
|
553
|
+
raise ProtocolConfigurationError(
|
|
554
|
+
"Contract 'event_bus' must be a configuration dict",
|
|
555
|
+
context=_make_error_context("validate_event_bus_config"),
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
bus_kind = event_bus_config.get("kind")
|
|
559
|
+
if not isinstance(bus_kind, str):
|
|
560
|
+
raise ProtocolConfigurationError(
|
|
561
|
+
"Event bus configuration missing required 'kind' field",
|
|
562
|
+
context=_make_error_context("validate_event_bus_kind"),
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
# Check if event bus is enabled (default True)
|
|
566
|
+
enabled = event_bus_config.get("enabled", True)
|
|
567
|
+
if not enabled:
|
|
568
|
+
logger.debug(
|
|
569
|
+
"Skipping disabled event bus",
|
|
570
|
+
extra={"bus_kind": bus_kind},
|
|
571
|
+
)
|
|
572
|
+
else:
|
|
573
|
+
# Validate bus kind is known
|
|
574
|
+
if bus_kind not in _KNOWN_EVENT_BUSES:
|
|
575
|
+
known_kinds = sorted(_KNOWN_EVENT_BUSES.keys())
|
|
576
|
+
raise ProtocolConfigurationError(
|
|
577
|
+
f"Unknown event bus kind: {bus_kind!r}. Known kinds: {known_kinds}",
|
|
578
|
+
context=_make_error_context("validate_event_bus_kind", bus_kind),
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
# Register the event bus (check if already registered first)
|
|
582
|
+
bus_cls, description = _KNOWN_EVENT_BUSES[bus_kind]
|
|
583
|
+
if not event_bus_registry.is_registered(bus_kind):
|
|
584
|
+
event_bus_registry.register(bus_kind, bus_cls)
|
|
585
|
+
|
|
586
|
+
registered_buses.append(bus_kind)
|
|
587
|
+
|
|
588
|
+
logger.debug(
|
|
589
|
+
"Registered event bus from contract",
|
|
590
|
+
extra={
|
|
591
|
+
"bus_kind": bus_kind,
|
|
592
|
+
"bus_class": bus_cls.__name__,
|
|
593
|
+
"description": description,
|
|
594
|
+
},
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
logger.info(
|
|
598
|
+
"Handlers wired from contract",
|
|
599
|
+
extra={
|
|
600
|
+
"handler_count": len(registered_handlers),
|
|
601
|
+
"handlers": sorted(registered_handlers),
|
|
602
|
+
"event_bus_count": len(registered_buses),
|
|
603
|
+
"event_buses": sorted(registered_buses),
|
|
604
|
+
},
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
return {
|
|
608
|
+
"handlers": sorted(registered_handlers),
|
|
609
|
+
"event_buses": sorted(registered_buses),
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
def get_known_handler_types() -> list[str]:
|
|
614
|
+
"""Get list of known handler types that can be wired.
|
|
615
|
+
|
|
616
|
+
Handler types are discovered from contract.yaml files in nodes/handlers/.
|
|
617
|
+
|
|
618
|
+
Returns:
|
|
619
|
+
Sorted list of handler type strings.
|
|
620
|
+
|
|
621
|
+
Example:
|
|
622
|
+
>>> get_known_handler_types()
|
|
623
|
+
['consul', 'db', 'graph', 'http', 'intent', 'mcp', 'vault']
|
|
624
|
+
"""
|
|
625
|
+
return sorted(_HANDLER_CONTRACT_PATHS.keys())
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
def get_known_event_bus_kinds() -> list[str]:
|
|
629
|
+
"""Get list of known event bus kinds that can be wired.
|
|
630
|
+
|
|
631
|
+
Returns:
|
|
632
|
+
Sorted list of event bus kind strings.
|
|
633
|
+
|
|
634
|
+
Example:
|
|
635
|
+
>>> get_known_event_bus_kinds()
|
|
636
|
+
['inmemory']
|
|
637
|
+
"""
|
|
638
|
+
return sorted(_KNOWN_EVENT_BUSES.keys())
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
def wire_custom_handler(
|
|
642
|
+
handler_type: str,
|
|
643
|
+
handler_cls: type[ProtocolContainerAware],
|
|
644
|
+
registry: RegistryProtocolBinding | None = None,
|
|
645
|
+
) -> None:
|
|
646
|
+
"""Register a custom handler class with the registry.
|
|
647
|
+
|
|
648
|
+
This function allows registration of custom handler implementations
|
|
649
|
+
that are not part of the default handler set. Useful for testing
|
|
650
|
+
and extending the handler ecosystem.
|
|
651
|
+
|
|
652
|
+
Args:
|
|
653
|
+
handler_type: Protocol type identifier for the handler.
|
|
654
|
+
handler_cls: Handler class implementing ProtocolHandler protocol.
|
|
655
|
+
registry: Optional registry to use. Defaults to singleton registry.
|
|
656
|
+
|
|
657
|
+
Example:
|
|
658
|
+
>>> class CustomHandler:
|
|
659
|
+
... async def initialize(self, config): pass
|
|
660
|
+
... async def execute(self, envelope): pass
|
|
661
|
+
...
|
|
662
|
+
>>> wire_custom_handler("custom", CustomHandler)
|
|
663
|
+
"""
|
|
664
|
+
target_registry = registry if registry is not None else get_handler_registry()
|
|
665
|
+
target_registry.register(handler_type, handler_cls)
|
|
666
|
+
logger.debug(
|
|
667
|
+
"Registered custom handler",
|
|
668
|
+
extra={
|
|
669
|
+
"handler_type": handler_type,
|
|
670
|
+
"handler_class": handler_cls.__name__,
|
|
671
|
+
},
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
def wire_custom_event_bus(
|
|
676
|
+
bus_kind: str,
|
|
677
|
+
bus_cls: type[ProtocolEventBus],
|
|
678
|
+
registry: RegistryEventBusBinding | None = None,
|
|
679
|
+
) -> None:
|
|
680
|
+
"""Register a custom event bus class with the registry.
|
|
681
|
+
|
|
682
|
+
This function allows registration of custom event bus implementations
|
|
683
|
+
that are not part of the default set. Useful for testing and
|
|
684
|
+
extending the event bus ecosystem.
|
|
685
|
+
|
|
686
|
+
Args:
|
|
687
|
+
bus_kind: Unique identifier for the bus type.
|
|
688
|
+
bus_cls: Event bus class implementing ProtocolEventBus protocol.
|
|
689
|
+
registry: Optional registry to use. Defaults to singleton registry.
|
|
690
|
+
|
|
691
|
+
Raises:
|
|
692
|
+
RuntimeHostError: If bus_kind is already registered in the registry.
|
|
693
|
+
|
|
694
|
+
Example:
|
|
695
|
+
>>> class CustomEventBus:
|
|
696
|
+
... async def start(self): pass
|
|
697
|
+
... async def publish(self, topic, key, value): pass
|
|
698
|
+
...
|
|
699
|
+
>>> wire_custom_event_bus("custom", CustomEventBus)
|
|
700
|
+
"""
|
|
701
|
+
target_registry = registry if registry is not None else get_event_bus_registry()
|
|
702
|
+
# Note: RegistryEventBusBinding.register() raises if already registered
|
|
703
|
+
target_registry.register(bus_kind, bus_cls)
|
|
704
|
+
logger.debug(
|
|
705
|
+
"Registered custom event bus",
|
|
706
|
+
extra={
|
|
707
|
+
"bus_kind": bus_kind,
|
|
708
|
+
"bus_class": bus_cls.__name__,
|
|
709
|
+
},
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
__all__: list[str] = [
|
|
714
|
+
"get_known_event_bus_kinds",
|
|
715
|
+
# Introspection functions
|
|
716
|
+
"get_known_handler_types",
|
|
717
|
+
"wire_custom_event_bus",
|
|
718
|
+
# Custom registration functions
|
|
719
|
+
"wire_custom_handler",
|
|
720
|
+
# Primary wiring functions
|
|
721
|
+
"wire_default_handlers",
|
|
722
|
+
"wire_handlers_from_contract",
|
|
723
|
+
]
|