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,693 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Kafka Event Bus configuration model.
|
|
4
|
+
|
|
5
|
+
Provides a Pydantic configuration model for EventBusKafka with support for
|
|
6
|
+
environment variable overrides, YAML configuration loading, and sensible
|
|
7
|
+
defaults for production deployment.
|
|
8
|
+
|
|
9
|
+
Features:
|
|
10
|
+
- Strong typing with comprehensive validation
|
|
11
|
+
- Environment variable override support with type conversion
|
|
12
|
+
- YAML configuration file loading
|
|
13
|
+
- Sensible defaults for production resilience patterns
|
|
14
|
+
- Circuit breaker and retry configuration
|
|
15
|
+
- Warning logs for invalid environment variable values
|
|
16
|
+
|
|
17
|
+
Environment Variables:
|
|
18
|
+
All environment variables are optional and fall back to defaults if not set
|
|
19
|
+
or if parsing fails. Invalid values log warnings and use defaults.
|
|
20
|
+
|
|
21
|
+
Connection Settings:
|
|
22
|
+
KAFKA_BOOTSTRAP_SERVERS: Kafka broker addresses (comma-separated)
|
|
23
|
+
Default: "localhost:9092"
|
|
24
|
+
Example: "kafka1:9092,kafka2:9092"
|
|
25
|
+
|
|
26
|
+
KAFKA_ENVIRONMENT: Environment identifier for message routing
|
|
27
|
+
Default: "local"
|
|
28
|
+
Example: "dev", "staging", "prod"
|
|
29
|
+
|
|
30
|
+
Timeout and Retry Settings (with validation):
|
|
31
|
+
KAFKA_TIMEOUT_SECONDS: Timeout for operations (integer, 1-300)
|
|
32
|
+
Default: 30
|
|
33
|
+
Example: "60"
|
|
34
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
35
|
+
|
|
36
|
+
KAFKA_MAX_RETRY_ATTEMPTS: Maximum retry attempts (integer, 0-10)
|
|
37
|
+
Default: 3
|
|
38
|
+
Example: "5"
|
|
39
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
40
|
+
|
|
41
|
+
KAFKA_RETRY_BACKOFF_BASE: Base exponential backoff delay (float, 0.1-60.0)
|
|
42
|
+
Default: 1.0
|
|
43
|
+
Example: "2.0"
|
|
44
|
+
Warning: Logs warning if not a valid float, uses default
|
|
45
|
+
|
|
46
|
+
Circuit Breaker Settings (with validation):
|
|
47
|
+
KAFKA_CIRCUIT_BREAKER_THRESHOLD: Failures before circuit opens (integer, 1-100)
|
|
48
|
+
Default: 5
|
|
49
|
+
Example: "10"
|
|
50
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
51
|
+
|
|
52
|
+
KAFKA_CIRCUIT_BREAKER_RESET_TIMEOUT: Reset timeout in seconds (float, 1.0-3600.0)
|
|
53
|
+
Default: 30.0
|
|
54
|
+
Example: "60.0"
|
|
55
|
+
Warning: Logs warning if not a valid float, uses default
|
|
56
|
+
|
|
57
|
+
Consumer Settings:
|
|
58
|
+
KAFKA_CONSUMER_SLEEP_INTERVAL: Poll interval in seconds (float, 0.01-10.0)
|
|
59
|
+
Default: 0.1
|
|
60
|
+
Example: "0.2"
|
|
61
|
+
Warning: Logs warning if not a valid float, uses default
|
|
62
|
+
|
|
63
|
+
KAFKA_AUTO_OFFSET_RESET: Offset reset policy
|
|
64
|
+
Default: "latest"
|
|
65
|
+
Options: "earliest", "latest"
|
|
66
|
+
|
|
67
|
+
KAFKA_ENABLE_AUTO_COMMIT: Auto-commit consumer offsets (boolean)
|
|
68
|
+
Default: true
|
|
69
|
+
True values: "true", "1", "yes", "on" (case-insensitive)
|
|
70
|
+
False values: "false", "0", "no", "off" (case-insensitive)
|
|
71
|
+
Warning: Logs warning if unexpected value, treats as False
|
|
72
|
+
|
|
73
|
+
Producer Settings:
|
|
74
|
+
KAFKA_ACKS: Producer acknowledgment policy
|
|
75
|
+
Default: "all"
|
|
76
|
+
Options: "all", "1", "0"
|
|
77
|
+
|
|
78
|
+
KAFKA_ENABLE_IDEMPOTENCE: Enable idempotent producer (boolean)
|
|
79
|
+
Default: true
|
|
80
|
+
True values: "true", "1", "yes", "on" (case-insensitive)
|
|
81
|
+
False values: "false", "0", "no", "off" (case-insensitive)
|
|
82
|
+
Warning: Logs warning if unexpected value, treats as False
|
|
83
|
+
|
|
84
|
+
Dead Letter Queue Settings:
|
|
85
|
+
KAFKA_DEAD_LETTER_TOPIC: Topic name for failed messages (optional)
|
|
86
|
+
Default: None (DLQ disabled)
|
|
87
|
+
Example: "dlq-events"
|
|
88
|
+
|
|
89
|
+
Parsing Behavior:
|
|
90
|
+
- Integer/Float fields: Logs warning and uses default if parsing fails
|
|
91
|
+
- Boolean fields: Logs warning if value not in expected set, treats as False
|
|
92
|
+
- String fields: No validation, accepts any string value
|
|
93
|
+
- All warnings include the environment variable name, invalid value, and
|
|
94
|
+
the field name that will use the default value
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
from __future__ import annotations
|
|
98
|
+
|
|
99
|
+
import logging
|
|
100
|
+
import os
|
|
101
|
+
from pathlib import Path
|
|
102
|
+
from uuid import uuid4
|
|
103
|
+
|
|
104
|
+
import yaml
|
|
105
|
+
from pydantic import BaseModel, ConfigDict, Field, computed_field, field_validator
|
|
106
|
+
|
|
107
|
+
from omnibase_infra.enums import EnumInfraTransportType, EnumKafkaAcks
|
|
108
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
109
|
+
|
|
110
|
+
logger = logging.getLogger(__name__)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class ModelKafkaEventBusConfig(BaseModel):
|
|
114
|
+
"""Configuration model for EventBusKafka.
|
|
115
|
+
|
|
116
|
+
Defines all required configuration options for EventBusKafka including
|
|
117
|
+
connection settings, resilience patterns (circuit breaker, retry),
|
|
118
|
+
and Kafka producer/consumer options.
|
|
119
|
+
|
|
120
|
+
Attributes:
|
|
121
|
+
bootstrap_servers: Kafka bootstrap servers (host:port format)
|
|
122
|
+
environment: Environment identifier for message routing
|
|
123
|
+
timeout_seconds: Timeout for Kafka operations in seconds
|
|
124
|
+
max_retry_attempts: Maximum retry attempts for publish operations
|
|
125
|
+
retry_backoff_base: Base delay in seconds for exponential backoff
|
|
126
|
+
circuit_breaker_threshold: Number of consecutive failures before circuit opens
|
|
127
|
+
circuit_breaker_reset_timeout: Seconds before circuit breaker resets to half-open
|
|
128
|
+
consumer_sleep_interval: Sleep interval in seconds for consumer loop polling
|
|
129
|
+
acks: Producer acknowledgment policy (EnumKafkaAcks.ALL, LEADER, NONE, ALL_REPLICAS)
|
|
130
|
+
enable_idempotence: Enable producer idempotence for exactly-once semantics
|
|
131
|
+
auto_offset_reset: Consumer offset reset policy ("earliest", "latest")
|
|
132
|
+
enable_auto_commit: Enable auto-commit for consumer offsets
|
|
133
|
+
dead_letter_topic: Dead letter queue topic for failed messages (optional)
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
```python
|
|
137
|
+
# Using defaults with environment overrides
|
|
138
|
+
config = ModelKafkaEventBusConfig.default()
|
|
139
|
+
|
|
140
|
+
# From YAML file
|
|
141
|
+
config = ModelKafkaEventBusConfig.from_yaml(Path("kafka_config.yaml"))
|
|
142
|
+
|
|
143
|
+
# Manual construction
|
|
144
|
+
config = ModelKafkaEventBusConfig(
|
|
145
|
+
bootstrap_servers="kafka:9092",
|
|
146
|
+
environment="prod",
|
|
147
|
+
timeout_seconds=60,
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
153
|
+
|
|
154
|
+
# Connection settings
|
|
155
|
+
bootstrap_servers: str = Field(
|
|
156
|
+
default="localhost:9092",
|
|
157
|
+
description="Kafka bootstrap servers (host:port format, comma-separated for multiple)",
|
|
158
|
+
min_length=1,
|
|
159
|
+
)
|
|
160
|
+
environment: str = Field(
|
|
161
|
+
default="local",
|
|
162
|
+
description="Environment identifier for message routing (e.g., 'local', 'dev', 'prod')",
|
|
163
|
+
min_length=1,
|
|
164
|
+
)
|
|
165
|
+
timeout_seconds: int = Field(
|
|
166
|
+
default=30,
|
|
167
|
+
description="Timeout for Kafka operations in seconds",
|
|
168
|
+
ge=1,
|
|
169
|
+
le=300,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# Retry configuration
|
|
173
|
+
max_retry_attempts: int = Field(
|
|
174
|
+
default=3,
|
|
175
|
+
description="Maximum retry attempts for publish operations",
|
|
176
|
+
ge=0,
|
|
177
|
+
le=10,
|
|
178
|
+
)
|
|
179
|
+
retry_backoff_base: float = Field(
|
|
180
|
+
default=1.0,
|
|
181
|
+
description="Base delay in seconds for exponential backoff",
|
|
182
|
+
ge=0.001, # Allow very short backoffs for testing (minimum 1ms)
|
|
183
|
+
le=60.0,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
# Circuit breaker configuration
|
|
187
|
+
circuit_breaker_threshold: int = Field(
|
|
188
|
+
default=5,
|
|
189
|
+
description="Number of consecutive failures before circuit opens",
|
|
190
|
+
ge=1,
|
|
191
|
+
le=100,
|
|
192
|
+
)
|
|
193
|
+
circuit_breaker_reset_timeout: float = Field(
|
|
194
|
+
default=30.0,
|
|
195
|
+
description="Seconds before circuit breaker resets to half-open state",
|
|
196
|
+
ge=0.01, # Allow short timeouts for testing (minimum 10ms)
|
|
197
|
+
le=3600.0,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Consumer configuration
|
|
201
|
+
consumer_sleep_interval: float = Field(
|
|
202
|
+
default=0.1,
|
|
203
|
+
description="Sleep interval in seconds for consumer loop polling",
|
|
204
|
+
ge=0.01,
|
|
205
|
+
le=10.0,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Kafka producer settings
|
|
209
|
+
acks: EnumKafkaAcks = Field(
|
|
210
|
+
default=EnumKafkaAcks.ALL,
|
|
211
|
+
description="Producer acknowledgment policy (ALL, LEADER, NONE, ALL_REPLICAS)",
|
|
212
|
+
)
|
|
213
|
+
enable_idempotence: bool = Field(
|
|
214
|
+
default=True,
|
|
215
|
+
description="Enable producer idempotence for exactly-once semantics",
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Kafka consumer settings
|
|
219
|
+
auto_offset_reset: str = Field(
|
|
220
|
+
default="latest",
|
|
221
|
+
description="Consumer offset reset policy ('earliest', 'latest')",
|
|
222
|
+
pattern=r"^(earliest|latest)$",
|
|
223
|
+
)
|
|
224
|
+
enable_auto_commit: bool = Field(
|
|
225
|
+
default=True,
|
|
226
|
+
description="Enable auto-commit for consumer offsets",
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Dead letter queue configuration
|
|
230
|
+
dead_letter_topic: str | None = Field(
|
|
231
|
+
default=None,
|
|
232
|
+
description=(
|
|
233
|
+
"Dead letter queue topic for failed messages (optional). "
|
|
234
|
+
"If not set, use get_dlq_topic() to build a topic name following "
|
|
235
|
+
"ONEX conventions: <env>.dlq.<category>.v1 "
|
|
236
|
+
"(e.g., 'dev.dlq.intents.v1', 'prod.dlq.events.v1')"
|
|
237
|
+
),
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# NOTE: mypy reports "prop-decorator" error because it doesn't understand that
|
|
241
|
+
# Pydantic's @computed_field transforms the @property into a computed field.
|
|
242
|
+
# This is a known mypy/Pydantic v2 interaction - the code works correctly at runtime.
|
|
243
|
+
@computed_field # type: ignore[prop-decorator]
|
|
244
|
+
@property
|
|
245
|
+
def acks_aiokafka(self) -> int | str:
|
|
246
|
+
"""Get acks value in aiokafka-compatible format.
|
|
247
|
+
|
|
248
|
+
aiokafka's AIOKafkaProducer expects:
|
|
249
|
+
- The string "all" for all-replica acknowledgment
|
|
250
|
+
- Integer values (0, 1, -1) for numeric ack levels
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
The acks value converted to the format expected by aiokafka:
|
|
254
|
+
- "all" (str) for EnumKafkaAcks.ALL
|
|
255
|
+
- 0 (int) for EnumKafkaAcks.NONE
|
|
256
|
+
- 1 (int) for EnumKafkaAcks.LEADER
|
|
257
|
+
- -1 (int) for EnumKafkaAcks.ALL_REPLICAS
|
|
258
|
+
|
|
259
|
+
Example:
|
|
260
|
+
>>> config = ModelKafkaEventBusConfig(acks=EnumKafkaAcks.LEADER)
|
|
261
|
+
>>> config.acks_aiokafka
|
|
262
|
+
1
|
|
263
|
+
"""
|
|
264
|
+
return self.acks.to_aiokafka()
|
|
265
|
+
|
|
266
|
+
@field_validator("bootstrap_servers", mode="before")
|
|
267
|
+
@classmethod
|
|
268
|
+
def validate_bootstrap_servers(cls, v: object) -> str:
|
|
269
|
+
"""Validate bootstrap servers format.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
v: Bootstrap servers value (any type before Pydantic conversion)
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Validated bootstrap servers string
|
|
276
|
+
|
|
277
|
+
Raises:
|
|
278
|
+
ProtocolConfigurationError: If bootstrap servers format is invalid
|
|
279
|
+
"""
|
|
280
|
+
context = ModelInfraErrorContext(
|
|
281
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
282
|
+
operation="validate_config",
|
|
283
|
+
target_name="kafka_config",
|
|
284
|
+
correlation_id=uuid4(),
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
if v is None:
|
|
288
|
+
raise ProtocolConfigurationError(
|
|
289
|
+
"bootstrap_servers cannot be None",
|
|
290
|
+
context=context,
|
|
291
|
+
parameter="bootstrap_servers",
|
|
292
|
+
value=None,
|
|
293
|
+
)
|
|
294
|
+
if not isinstance(v, str):
|
|
295
|
+
raise ProtocolConfigurationError(
|
|
296
|
+
f"bootstrap_servers must be a string, got {type(v).__name__}",
|
|
297
|
+
context=context,
|
|
298
|
+
parameter="bootstrap_servers",
|
|
299
|
+
value=type(v).__name__,
|
|
300
|
+
)
|
|
301
|
+
if not v.strip():
|
|
302
|
+
raise ProtocolConfigurationError(
|
|
303
|
+
"bootstrap_servers cannot be empty",
|
|
304
|
+
context=context,
|
|
305
|
+
parameter="bootstrap_servers",
|
|
306
|
+
value=v,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Validate host:port format for each server
|
|
310
|
+
servers = v.strip().split(",")
|
|
311
|
+
for server in servers:
|
|
312
|
+
server = server.strip()
|
|
313
|
+
if not server:
|
|
314
|
+
raise ProtocolConfigurationError(
|
|
315
|
+
"bootstrap_servers cannot contain empty entries",
|
|
316
|
+
context=context,
|
|
317
|
+
parameter="bootstrap_servers",
|
|
318
|
+
value=v,
|
|
319
|
+
)
|
|
320
|
+
if ":" not in server:
|
|
321
|
+
raise ProtocolConfigurationError(
|
|
322
|
+
f"Invalid bootstrap server format '{server}'. "
|
|
323
|
+
"Expected 'host:port' (e.g., 'localhost:9092')",
|
|
324
|
+
context=context,
|
|
325
|
+
parameter="bootstrap_servers",
|
|
326
|
+
value=server,
|
|
327
|
+
)
|
|
328
|
+
host, port_str = server.rsplit(":", 1)
|
|
329
|
+
if not host:
|
|
330
|
+
raise ProtocolConfigurationError(
|
|
331
|
+
f"Invalid bootstrap server format '{server}'. Host cannot be empty",
|
|
332
|
+
context=context,
|
|
333
|
+
parameter="bootstrap_servers",
|
|
334
|
+
value=server,
|
|
335
|
+
)
|
|
336
|
+
try:
|
|
337
|
+
port = int(port_str)
|
|
338
|
+
if port < 1 or port > 65535:
|
|
339
|
+
raise ProtocolConfigurationError(
|
|
340
|
+
f"Invalid port {port} in '{server}'. Port must be between 1 and 65535",
|
|
341
|
+
context=context,
|
|
342
|
+
parameter="bootstrap_servers",
|
|
343
|
+
value=server,
|
|
344
|
+
)
|
|
345
|
+
except ValueError as e:
|
|
346
|
+
raise ProtocolConfigurationError(
|
|
347
|
+
f"Invalid port '{port_str}' in '{server}'. Port must be a valid integer",
|
|
348
|
+
context=context,
|
|
349
|
+
parameter="bootstrap_servers",
|
|
350
|
+
value=server,
|
|
351
|
+
) from e
|
|
352
|
+
except ProtocolConfigurationError:
|
|
353
|
+
raise
|
|
354
|
+
|
|
355
|
+
return v.strip()
|
|
356
|
+
|
|
357
|
+
@field_validator("environment", mode="before")
|
|
358
|
+
@classmethod
|
|
359
|
+
def validate_environment(cls, v: object) -> str:
|
|
360
|
+
"""Validate environment identifier.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
v: Environment value (any type before Pydantic conversion)
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
Validated environment string
|
|
367
|
+
|
|
368
|
+
Raises:
|
|
369
|
+
ProtocolConfigurationError: If environment is empty or invalid type
|
|
370
|
+
"""
|
|
371
|
+
context = ModelInfraErrorContext(
|
|
372
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
373
|
+
operation="validate_config",
|
|
374
|
+
target_name="kafka_config",
|
|
375
|
+
correlation_id=uuid4(),
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
if v is None:
|
|
379
|
+
raise ProtocolConfigurationError(
|
|
380
|
+
"environment cannot be None",
|
|
381
|
+
context=context,
|
|
382
|
+
parameter="environment",
|
|
383
|
+
value=None,
|
|
384
|
+
)
|
|
385
|
+
if not isinstance(v, str):
|
|
386
|
+
raise ProtocolConfigurationError(
|
|
387
|
+
f"environment must be a string, got {type(v).__name__}",
|
|
388
|
+
context=context,
|
|
389
|
+
parameter="environment",
|
|
390
|
+
value=type(v).__name__,
|
|
391
|
+
)
|
|
392
|
+
if not v.strip():
|
|
393
|
+
raise ProtocolConfigurationError(
|
|
394
|
+
"environment cannot be empty",
|
|
395
|
+
context=context,
|
|
396
|
+
parameter="environment",
|
|
397
|
+
value=v,
|
|
398
|
+
)
|
|
399
|
+
return v.strip()
|
|
400
|
+
|
|
401
|
+
def apply_environment_overrides(self) -> ModelKafkaEventBusConfig:
|
|
402
|
+
"""Apply environment variable overrides to configuration.
|
|
403
|
+
|
|
404
|
+
Environment variables are mapped as follows:
|
|
405
|
+
- KAFKA_BOOTSTRAP_SERVERS -> bootstrap_servers
|
|
406
|
+
- KAFKA_TIMEOUT_SECONDS -> timeout_seconds
|
|
407
|
+
- KAFKA_ENVIRONMENT -> environment
|
|
408
|
+
- KAFKA_MAX_RETRY_ATTEMPTS -> max_retry_attempts
|
|
409
|
+
- KAFKA_CIRCUIT_BREAKER_THRESHOLD -> circuit_breaker_threshold
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
New configuration instance with environment overrides applied
|
|
413
|
+
"""
|
|
414
|
+
overrides: dict[str, object] = {}
|
|
415
|
+
|
|
416
|
+
env_mappings: dict[str, str] = {
|
|
417
|
+
"KAFKA_BOOTSTRAP_SERVERS": "bootstrap_servers",
|
|
418
|
+
"KAFKA_TIMEOUT_SECONDS": "timeout_seconds",
|
|
419
|
+
"KAFKA_ENVIRONMENT": "environment",
|
|
420
|
+
"KAFKA_MAX_RETRY_ATTEMPTS": "max_retry_attempts",
|
|
421
|
+
"KAFKA_CIRCUIT_BREAKER_THRESHOLD": "circuit_breaker_threshold",
|
|
422
|
+
"KAFKA_CIRCUIT_BREAKER_RESET_TIMEOUT": "circuit_breaker_reset_timeout",
|
|
423
|
+
"KAFKA_RETRY_BACKOFF_BASE": "retry_backoff_base",
|
|
424
|
+
"KAFKA_CONSUMER_SLEEP_INTERVAL": "consumer_sleep_interval",
|
|
425
|
+
"KAFKA_ACKS": "acks",
|
|
426
|
+
"KAFKA_ENABLE_IDEMPOTENCE": "enable_idempotence",
|
|
427
|
+
"KAFKA_AUTO_OFFSET_RESET": "auto_offset_reset",
|
|
428
|
+
"KAFKA_ENABLE_AUTO_COMMIT": "enable_auto_commit",
|
|
429
|
+
"KAFKA_DEAD_LETTER_TOPIC": "dead_letter_topic",
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
# Integer fields for type conversion
|
|
433
|
+
int_fields = {
|
|
434
|
+
"timeout_seconds",
|
|
435
|
+
"max_retry_attempts",
|
|
436
|
+
"circuit_breaker_threshold",
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
# Float fields for type conversion
|
|
440
|
+
float_fields = {
|
|
441
|
+
"circuit_breaker_reset_timeout",
|
|
442
|
+
"retry_backoff_base",
|
|
443
|
+
"consumer_sleep_interval",
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
# Boolean fields for type conversion
|
|
447
|
+
bool_fields = {
|
|
448
|
+
"enable_idempotence",
|
|
449
|
+
"enable_auto_commit",
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
# Enum fields with their valid values mapping
|
|
453
|
+
# Maps field_name -> (enum_class, value_to_enum_mapping)
|
|
454
|
+
acks_mapping = {
|
|
455
|
+
"all": EnumKafkaAcks.ALL,
|
|
456
|
+
"0": EnumKafkaAcks.NONE,
|
|
457
|
+
"1": EnumKafkaAcks.LEADER,
|
|
458
|
+
"-1": EnumKafkaAcks.ALL_REPLICAS,
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
for env_var, field_name in env_mappings.items():
|
|
462
|
+
env_value = os.environ.get(env_var)
|
|
463
|
+
if env_value is not None:
|
|
464
|
+
if field_name == "acks":
|
|
465
|
+
# Special handling for acks enum - fail-fast on invalid values
|
|
466
|
+
if env_value in acks_mapping:
|
|
467
|
+
overrides[field_name] = acks_mapping[env_value]
|
|
468
|
+
else:
|
|
469
|
+
valid_values = ", ".join(acks_mapping.keys())
|
|
470
|
+
raise ProtocolConfigurationError(
|
|
471
|
+
f"Invalid value for environment variable {env_var}='{env_value}'. "
|
|
472
|
+
f"Valid values are: {valid_values}",
|
|
473
|
+
context=ModelInfraErrorContext.with_correlation(
|
|
474
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
475
|
+
operation="apply_environment_overrides",
|
|
476
|
+
),
|
|
477
|
+
)
|
|
478
|
+
elif field_name in int_fields:
|
|
479
|
+
try:
|
|
480
|
+
overrides[field_name] = int(env_value)
|
|
481
|
+
except ValueError:
|
|
482
|
+
logger.warning(
|
|
483
|
+
"Failed to parse integer environment variable %s='%s', "
|
|
484
|
+
"using default value for %s",
|
|
485
|
+
env_var,
|
|
486
|
+
env_value,
|
|
487
|
+
field_name,
|
|
488
|
+
)
|
|
489
|
+
continue
|
|
490
|
+
elif field_name in float_fields:
|
|
491
|
+
try:
|
|
492
|
+
overrides[field_name] = float(env_value)
|
|
493
|
+
except ValueError:
|
|
494
|
+
logger.warning(
|
|
495
|
+
"Failed to parse float environment variable %s='%s', "
|
|
496
|
+
"using default value for %s",
|
|
497
|
+
env_var,
|
|
498
|
+
env_value,
|
|
499
|
+
field_name,
|
|
500
|
+
)
|
|
501
|
+
continue
|
|
502
|
+
elif field_name in bool_fields:
|
|
503
|
+
# Boolean conversion with explicit falsy value handling
|
|
504
|
+
# True values: "true", "1", "yes", "on" (case-insensitive)
|
|
505
|
+
# False values: All other values (including "false", "0", "no", "off")
|
|
506
|
+
parsed_value = env_value.lower() in ("true", "1", "yes", "on")
|
|
507
|
+
if env_value.lower() not in (
|
|
508
|
+
"true",
|
|
509
|
+
"1",
|
|
510
|
+
"yes",
|
|
511
|
+
"on",
|
|
512
|
+
"false",
|
|
513
|
+
"0",
|
|
514
|
+
"no",
|
|
515
|
+
"off",
|
|
516
|
+
):
|
|
517
|
+
logger.warning(
|
|
518
|
+
"Boolean environment variable %s='%s' has unexpected value. "
|
|
519
|
+
"Valid values are: true/1/yes/on (True) or false/0/no/off (False). "
|
|
520
|
+
"Treating as False.",
|
|
521
|
+
env_var,
|
|
522
|
+
env_value,
|
|
523
|
+
)
|
|
524
|
+
overrides[field_name] = parsed_value
|
|
525
|
+
else:
|
|
526
|
+
overrides[field_name] = env_value
|
|
527
|
+
|
|
528
|
+
if overrides:
|
|
529
|
+
# Exclude computed field to avoid validation error
|
|
530
|
+
current_data = self.model_dump(exclude={"acks_aiokafka"})
|
|
531
|
+
current_data.update(overrides)
|
|
532
|
+
return ModelKafkaEventBusConfig(**current_data)
|
|
533
|
+
|
|
534
|
+
return self
|
|
535
|
+
|
|
536
|
+
@classmethod
|
|
537
|
+
def default(cls) -> ModelKafkaEventBusConfig:
|
|
538
|
+
"""Create default configuration with environment overrides.
|
|
539
|
+
|
|
540
|
+
Returns a canonical default configuration for development, testing,
|
|
541
|
+
and CLI fallback use, with environment variable overrides applied.
|
|
542
|
+
|
|
543
|
+
Returns:
|
|
544
|
+
Default configuration instance with environment overrides
|
|
545
|
+
"""
|
|
546
|
+
base_config = cls(
|
|
547
|
+
bootstrap_servers="localhost:9092",
|
|
548
|
+
environment="local",
|
|
549
|
+
timeout_seconds=30,
|
|
550
|
+
max_retry_attempts=3,
|
|
551
|
+
retry_backoff_base=1.0,
|
|
552
|
+
circuit_breaker_threshold=5,
|
|
553
|
+
circuit_breaker_reset_timeout=30.0,
|
|
554
|
+
consumer_sleep_interval=0.1,
|
|
555
|
+
acks=EnumKafkaAcks.ALL,
|
|
556
|
+
enable_idempotence=True,
|
|
557
|
+
auto_offset_reset="latest",
|
|
558
|
+
enable_auto_commit=True,
|
|
559
|
+
dead_letter_topic=None,
|
|
560
|
+
)
|
|
561
|
+
return base_config.apply_environment_overrides()
|
|
562
|
+
|
|
563
|
+
@classmethod
|
|
564
|
+
def from_yaml(cls, path: Path) -> ModelKafkaEventBusConfig:
|
|
565
|
+
"""Load configuration from YAML file.
|
|
566
|
+
|
|
567
|
+
Loads configuration from a YAML file and applies environment
|
|
568
|
+
variable overrides on top.
|
|
569
|
+
|
|
570
|
+
Args:
|
|
571
|
+
path: Path to YAML configuration file
|
|
572
|
+
|
|
573
|
+
Returns:
|
|
574
|
+
Configuration instance loaded from YAML with env overrides
|
|
575
|
+
|
|
576
|
+
Raises:
|
|
577
|
+
ProtocolConfigurationError: If the file does not exist, cannot be read,
|
|
578
|
+
contains invalid YAML, or has invalid content structure. Error includes
|
|
579
|
+
correlation_id for tracing and detailed context for debugging.
|
|
580
|
+
|
|
581
|
+
Example YAML:
|
|
582
|
+
```yaml
|
|
583
|
+
bootstrap_servers: "kafka:9092"
|
|
584
|
+
environment: "prod"
|
|
585
|
+
timeout_seconds: 60
|
|
586
|
+
max_retry_attempts: 5
|
|
587
|
+
circuit_breaker_threshold: 10
|
|
588
|
+
```
|
|
589
|
+
"""
|
|
590
|
+
correlation_id = uuid4()
|
|
591
|
+
context = ModelInfraErrorContext(
|
|
592
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
593
|
+
operation="load_yaml_config",
|
|
594
|
+
target_name=str(path),
|
|
595
|
+
correlation_id=correlation_id,
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
try:
|
|
599
|
+
with path.open("r", encoding="utf-8") as f:
|
|
600
|
+
data = yaml.safe_load(f)
|
|
601
|
+
except FileNotFoundError as e:
|
|
602
|
+
raise ProtocolConfigurationError(
|
|
603
|
+
f"Configuration file not found: {path}",
|
|
604
|
+
context=context,
|
|
605
|
+
config_path=str(path),
|
|
606
|
+
) from e
|
|
607
|
+
except yaml.YAMLError as e:
|
|
608
|
+
raise ProtocolConfigurationError(
|
|
609
|
+
f"Failed to parse YAML from {path}: {e}",
|
|
610
|
+
context=context,
|
|
611
|
+
config_path=str(path),
|
|
612
|
+
error_details=str(e),
|
|
613
|
+
) from e
|
|
614
|
+
except UnicodeDecodeError as e:
|
|
615
|
+
raise ProtocolConfigurationError(
|
|
616
|
+
f"Configuration file contains binary or non-UTF-8 content: {path}",
|
|
617
|
+
context=context,
|
|
618
|
+
config_path=str(path),
|
|
619
|
+
error_details=f"Encoding error at position {e.start}-{e.end}: {e.reason}",
|
|
620
|
+
) from e
|
|
621
|
+
except OSError as e:
|
|
622
|
+
raise ProtocolConfigurationError(
|
|
623
|
+
f"Failed to read configuration file: {path}: {e}",
|
|
624
|
+
context=context,
|
|
625
|
+
config_path=str(path),
|
|
626
|
+
error_details=str(e),
|
|
627
|
+
) from e
|
|
628
|
+
|
|
629
|
+
if data is None:
|
|
630
|
+
data = {}
|
|
631
|
+
|
|
632
|
+
if not isinstance(data, dict):
|
|
633
|
+
raise ProtocolConfigurationError(
|
|
634
|
+
f"YAML content must be a dictionary, got {type(data)}",
|
|
635
|
+
context=context,
|
|
636
|
+
config_path=str(path),
|
|
637
|
+
parameter="yaml_content",
|
|
638
|
+
value=type(data).__name__,
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
config = cls(**data)
|
|
642
|
+
return config.apply_environment_overrides()
|
|
643
|
+
|
|
644
|
+
def get_dlq_topic(self, category: str = "intents") -> str:
|
|
645
|
+
"""Get the DLQ topic for this configuration.
|
|
646
|
+
|
|
647
|
+
If dead_letter_topic is explicitly set, returns that value.
|
|
648
|
+
Otherwise, builds a DLQ topic name following ONEX conventions
|
|
649
|
+
using the configuration's environment.
|
|
650
|
+
|
|
651
|
+
DLQ Topic Naming Convention:
|
|
652
|
+
Format: <env>.dlq.<category>.v1
|
|
653
|
+
Examples:
|
|
654
|
+
- dev.dlq.intents.v1 (for permanently failed intents)
|
|
655
|
+
- prod.dlq.events.v1 (for permanently failed events)
|
|
656
|
+
- staging.dlq.commands.v1 (for permanently failed commands)
|
|
657
|
+
|
|
658
|
+
Args:
|
|
659
|
+
category: Message category for DLQ routing. Valid values:
|
|
660
|
+
- 'intent' or 'intents' (default)
|
|
661
|
+
- 'event' or 'events'
|
|
662
|
+
- 'command' or 'commands'
|
|
663
|
+
|
|
664
|
+
Returns:
|
|
665
|
+
The DLQ topic name (either explicit or generated).
|
|
666
|
+
|
|
667
|
+
Raises:
|
|
668
|
+
ValueError: If category is not a valid message category.
|
|
669
|
+
|
|
670
|
+
Example:
|
|
671
|
+
>>> config = ModelKafkaEventBusConfig(environment="prod")
|
|
672
|
+
>>> config.get_dlq_topic()
|
|
673
|
+
'prod.dlq.intents.v1'
|
|
674
|
+
>>> config.get_dlq_topic("events")
|
|
675
|
+
'prod.dlq.events.v1'
|
|
676
|
+
>>> # Explicit topic takes precedence
|
|
677
|
+
>>> config = ModelKafkaEventBusConfig(
|
|
678
|
+
... environment="prod",
|
|
679
|
+
... dead_letter_topic="custom-dlq"
|
|
680
|
+
... )
|
|
681
|
+
>>> config.get_dlq_topic()
|
|
682
|
+
'custom-dlq'
|
|
683
|
+
"""
|
|
684
|
+
if self.dead_letter_topic:
|
|
685
|
+
return self.dead_letter_topic
|
|
686
|
+
|
|
687
|
+
# Import here to avoid circular imports
|
|
688
|
+
from omnibase_infra.event_bus.topic_constants import build_dlq_topic
|
|
689
|
+
|
|
690
|
+
return build_dlq_topic(self.environment, category)
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
__all__: list[str] = ["ModelKafkaEventBusConfig"]
|