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,585 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Consul Topic Index operations mixin.
|
|
4
|
+
|
|
5
|
+
This mixin provides topic index management for the ONEX node registry,
|
|
6
|
+
storing event bus configuration and maintaining a reverse index from
|
|
7
|
+
topics to subscriber node IDs.
|
|
8
|
+
|
|
9
|
+
Consul KV Structure:
|
|
10
|
+
onex/nodes/{node_id}/event_bus/subscribe_topics # [topic strings] for routing
|
|
11
|
+
onex/nodes/{node_id}/event_bus/publish_topics # [topic strings]
|
|
12
|
+
onex/nodes/{node_id}/event_bus/subscribe_entries # [full entries] for tooling
|
|
13
|
+
onex/nodes/{node_id}/event_bus/publish_entries # [full entries]
|
|
14
|
+
onex/topics/{topic}/subscribers # [node_ids] reverse index
|
|
15
|
+
|
|
16
|
+
Design Decisions:
|
|
17
|
+
1. Consul KV is the authoritative routing index
|
|
18
|
+
2. Index updates are idempotent (safe for restarts/retries)
|
|
19
|
+
3. Topic strings stored separately from full entries for routing efficiency
|
|
20
|
+
4. Delta computation for efficient index updates
|
|
21
|
+
|
|
22
|
+
Operations:
|
|
23
|
+
- Store event bus config for a node
|
|
24
|
+
- Update topic → node_id reverse index (idempotent)
|
|
25
|
+
- Add/remove subscriber from topic index
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import json
|
|
31
|
+
import logging
|
|
32
|
+
from collections.abc import Callable
|
|
33
|
+
from typing import TYPE_CHECKING, Protocol, TypeVar, cast
|
|
34
|
+
from uuid import UUID
|
|
35
|
+
|
|
36
|
+
from omnibase_infra.constants_topic_patterns import TOPIC_NAME_PATTERN
|
|
37
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
38
|
+
from omnibase_infra.errors import (
|
|
39
|
+
InfraConsulError,
|
|
40
|
+
ModelInfraErrorContext,
|
|
41
|
+
ProtocolConfigurationError,
|
|
42
|
+
)
|
|
43
|
+
from omnibase_infra.models.registration import ModelNodeEventBusConfig
|
|
44
|
+
|
|
45
|
+
if TYPE_CHECKING:
|
|
46
|
+
import consul as consul_lib
|
|
47
|
+
|
|
48
|
+
T = TypeVar("T")
|
|
49
|
+
|
|
50
|
+
logger = logging.getLogger(__name__)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ProtocolConsulTopicIndexDependencies(Protocol):
|
|
54
|
+
"""Protocol defining required dependencies for topic index operations.
|
|
55
|
+
|
|
56
|
+
HandlerConsul must provide these attributes/methods for the mixin to work.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
_client: consul_lib.Consul | None
|
|
60
|
+
_config: object | None
|
|
61
|
+
|
|
62
|
+
async def _execute_with_retry(
|
|
63
|
+
self,
|
|
64
|
+
operation: str,
|
|
65
|
+
func: Callable[[], T],
|
|
66
|
+
correlation_id: UUID,
|
|
67
|
+
) -> T:
|
|
68
|
+
"""Execute operation with retry logic."""
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class MixinConsulTopicIndex:
|
|
73
|
+
"""Mixin providing Consul topic index management operations.
|
|
74
|
+
|
|
75
|
+
This mixin extracts topic index operations from HandlerConsul to support
|
|
76
|
+
ONEX node registry with event bus configuration storage and reverse indexing.
|
|
77
|
+
|
|
78
|
+
Required Dependencies (from host class):
|
|
79
|
+
- _client: consul.Consul client instance
|
|
80
|
+
- _config: Handler configuration
|
|
81
|
+
- _execute_with_retry: Retry execution method
|
|
82
|
+
|
|
83
|
+
KV Structure:
|
|
84
|
+
Node event bus config:
|
|
85
|
+
onex/nodes/{node_id}/event_bus/subscribe_topics # JSON array of topic strings
|
|
86
|
+
onex/nodes/{node_id}/event_bus/publish_topics # JSON array of topic strings
|
|
87
|
+
onex/nodes/{node_id}/event_bus/subscribe_entries # JSON array of full entries
|
|
88
|
+
onex/nodes/{node_id}/event_bus/publish_entries # JSON array of full entries
|
|
89
|
+
|
|
90
|
+
Topic reverse index:
|
|
91
|
+
onex/topics/{topic}/subscribers # JSON array of node_ids
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
# Instance attribute declarations for type checking
|
|
95
|
+
_client: consul_lib.Consul | None
|
|
96
|
+
_config: object | None
|
|
97
|
+
|
|
98
|
+
# Methods from host class (abstract stubs for type checking)
|
|
99
|
+
async def _execute_with_retry(
|
|
100
|
+
self,
|
|
101
|
+
operation: str,
|
|
102
|
+
func: Callable[[], T],
|
|
103
|
+
correlation_id: UUID,
|
|
104
|
+
) -> T:
|
|
105
|
+
"""Execute operation with retry logic - provided by host class."""
|
|
106
|
+
raise NotImplementedError("Must be provided by implementing class") # type: ignore[return-value]
|
|
107
|
+
|
|
108
|
+
def _validate_topic_format(self, topic: str, correlation_id: UUID) -> None:
|
|
109
|
+
"""Validate topic format for safe use in Consul KV paths.
|
|
110
|
+
|
|
111
|
+
Topics are interpolated into Consul KV paths like `onex/topics/{topic}/subscribers`.
|
|
112
|
+
Invalid characters (especially slashes) could create unexpected key hierarchies
|
|
113
|
+
or bypass ACL prefix matching.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
topic: The topic string to validate.
|
|
117
|
+
correlation_id: Correlation ID for error context.
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
ProtocolConfigurationError: If topic contains invalid characters.
|
|
121
|
+
Valid characters: alphanumeric (a-zA-Z0-9), periods (.), underscores (_),
|
|
122
|
+
and hyphens (-).
|
|
123
|
+
"""
|
|
124
|
+
if not TOPIC_NAME_PATTERN.match(topic):
|
|
125
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
126
|
+
correlation_id=correlation_id,
|
|
127
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
128
|
+
operation="validate_topic_format",
|
|
129
|
+
target_name="consul_handler",
|
|
130
|
+
)
|
|
131
|
+
raise ProtocolConfigurationError(
|
|
132
|
+
f"Topic name '{topic}' contains invalid characters. "
|
|
133
|
+
"Only alphanumeric characters, periods (.), underscores (_), "
|
|
134
|
+
"and hyphens (-) are allowed. Slashes and other special "
|
|
135
|
+
"characters are prohibited to prevent Consul KV path traversal.",
|
|
136
|
+
context=context,
|
|
137
|
+
parameter="topic",
|
|
138
|
+
value=topic,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
async def _kv_get_raw(
|
|
142
|
+
self,
|
|
143
|
+
key: str,
|
|
144
|
+
correlation_id: UUID,
|
|
145
|
+
) -> str | None:
|
|
146
|
+
"""Get raw string value from Consul KV store.
|
|
147
|
+
|
|
148
|
+
This is a simplified internal method for topic index operations.
|
|
149
|
+
Unlike _kv_get, it returns the raw string value or None.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
key: KV key path
|
|
153
|
+
correlation_id: Correlation ID for tracing
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
The stored value as a string, or None if key doesn't exist.
|
|
157
|
+
|
|
158
|
+
Raises:
|
|
159
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
160
|
+
"""
|
|
161
|
+
# Early validation - fail fast before entering retry machinery
|
|
162
|
+
if self._client is None:
|
|
163
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
164
|
+
correlation_id=correlation_id,
|
|
165
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
166
|
+
operation="consul.kv_get_raw",
|
|
167
|
+
target_name="consul_handler",
|
|
168
|
+
)
|
|
169
|
+
raise InfraConsulError(
|
|
170
|
+
"Consul client not initialized",
|
|
171
|
+
context=context,
|
|
172
|
+
consul_key=key,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def get_func() -> tuple[int, dict[str, object] | None]:
|
|
176
|
+
# NOTE: This inner check is NOT redundant. It's required because:
|
|
177
|
+
# 1. Type narrowing: Outer check narrows self._client in method scope,
|
|
178
|
+
# but closures capture `self`, not the narrowed type. Without this
|
|
179
|
+
# check, mypy would error on self._client.kv access.
|
|
180
|
+
# 2. Race protection: Between outer check and thread pool execution
|
|
181
|
+
# (via run_in_executor), _client could become None during cleanup.
|
|
182
|
+
if self._client is None:
|
|
183
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
184
|
+
correlation_id=correlation_id,
|
|
185
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
186
|
+
operation="consul.kv_get_raw",
|
|
187
|
+
target_name="consul_handler",
|
|
188
|
+
)
|
|
189
|
+
raise InfraConsulError(
|
|
190
|
+
"Consul client not initialized",
|
|
191
|
+
context=ctx,
|
|
192
|
+
consul_key=key,
|
|
193
|
+
)
|
|
194
|
+
index, data = self._client.kv.get(key, recurse=False)
|
|
195
|
+
return index, data
|
|
196
|
+
|
|
197
|
+
KVGetResult = tuple[int, dict[str, object] | None]
|
|
198
|
+
result = await self._execute_with_retry(
|
|
199
|
+
"consul.kv_get_raw",
|
|
200
|
+
get_func,
|
|
201
|
+
correlation_id,
|
|
202
|
+
)
|
|
203
|
+
_, data = cast("KVGetResult", result)
|
|
204
|
+
|
|
205
|
+
if data is None:
|
|
206
|
+
return None
|
|
207
|
+
|
|
208
|
+
value = data.get("Value")
|
|
209
|
+
if isinstance(value, bytes):
|
|
210
|
+
return value.decode("utf-8")
|
|
211
|
+
if isinstance(value, str):
|
|
212
|
+
return value
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
async def _kv_put_raw(
|
|
216
|
+
self,
|
|
217
|
+
key: str,
|
|
218
|
+
value: str,
|
|
219
|
+
correlation_id: UUID,
|
|
220
|
+
) -> bool:
|
|
221
|
+
"""Put raw string value to Consul KV store.
|
|
222
|
+
|
|
223
|
+
This is a simplified internal method for topic index operations.
|
|
224
|
+
Unlike _kv_put, it takes a string value directly.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
key: KV key path
|
|
228
|
+
value: String value to store
|
|
229
|
+
correlation_id: Correlation ID for tracing
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
True if the operation succeeded.
|
|
233
|
+
|
|
234
|
+
Raises:
|
|
235
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
236
|
+
"""
|
|
237
|
+
# Early validation - fail fast before entering retry machinery
|
|
238
|
+
if self._client is None:
|
|
239
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
240
|
+
correlation_id=correlation_id,
|
|
241
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
242
|
+
operation="consul.kv_put_raw",
|
|
243
|
+
target_name="consul_handler",
|
|
244
|
+
)
|
|
245
|
+
raise InfraConsulError(
|
|
246
|
+
"Consul client not initialized",
|
|
247
|
+
context=context,
|
|
248
|
+
consul_key=key,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
def put_func() -> bool:
|
|
252
|
+
# NOTE: This inner check is NOT redundant. It's required because:
|
|
253
|
+
# 1. Type narrowing: Outer check narrows self._client in method scope,
|
|
254
|
+
# but closures capture `self`, not the narrowed type. Without this
|
|
255
|
+
# check, mypy would error on self._client.kv access.
|
|
256
|
+
# 2. Race protection: Between outer check and thread pool execution
|
|
257
|
+
# (via run_in_executor), _client could become None during cleanup.
|
|
258
|
+
if self._client is None:
|
|
259
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
260
|
+
correlation_id=correlation_id,
|
|
261
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
262
|
+
operation="consul.kv_put_raw",
|
|
263
|
+
target_name="consul_handler",
|
|
264
|
+
)
|
|
265
|
+
raise InfraConsulError(
|
|
266
|
+
"Consul client not initialized",
|
|
267
|
+
context=ctx,
|
|
268
|
+
consul_key=key,
|
|
269
|
+
)
|
|
270
|
+
result: bool = self._client.kv.put(key, value)
|
|
271
|
+
return result
|
|
272
|
+
|
|
273
|
+
result = await self._execute_with_retry(
|
|
274
|
+
"consul.kv_put_raw",
|
|
275
|
+
put_func,
|
|
276
|
+
correlation_id,
|
|
277
|
+
)
|
|
278
|
+
return cast("bool", result)
|
|
279
|
+
|
|
280
|
+
async def _store_node_event_bus(
|
|
281
|
+
self,
|
|
282
|
+
node_id: str,
|
|
283
|
+
event_bus: ModelNodeEventBusConfig,
|
|
284
|
+
correlation_id: UUID,
|
|
285
|
+
) -> None:
|
|
286
|
+
"""Store event_bus config in Consul KV.
|
|
287
|
+
|
|
288
|
+
Stores both topic strings (for efficient routing lookups) and full
|
|
289
|
+
entries (for tooling and introspection) separately.
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
node_id: The node identifier.
|
|
293
|
+
event_bus: The resolved event bus configuration.
|
|
294
|
+
correlation_id: Correlation ID for tracing.
|
|
295
|
+
|
|
296
|
+
Raises:
|
|
297
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
298
|
+
"""
|
|
299
|
+
logger.debug(
|
|
300
|
+
"Storing event_bus config for node %s",
|
|
301
|
+
node_id,
|
|
302
|
+
extra={"correlation_id": str(correlation_id), "node_id": node_id},
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Store topic strings (for routing)
|
|
306
|
+
await self._kv_put_raw(
|
|
307
|
+
key=f"onex/nodes/{node_id}/event_bus/subscribe_topics",
|
|
308
|
+
value=json.dumps(event_bus.subscribe_topic_strings),
|
|
309
|
+
correlation_id=correlation_id,
|
|
310
|
+
)
|
|
311
|
+
await self._kv_put_raw(
|
|
312
|
+
key=f"onex/nodes/{node_id}/event_bus/publish_topics",
|
|
313
|
+
value=json.dumps(event_bus.publish_topic_strings),
|
|
314
|
+
correlation_id=correlation_id,
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
# Store full entries (for tooling)
|
|
318
|
+
await self._kv_put_raw(
|
|
319
|
+
key=f"onex/nodes/{node_id}/event_bus/subscribe_entries",
|
|
320
|
+
value=json.dumps([e.model_dump() for e in event_bus.subscribe_topics]),
|
|
321
|
+
correlation_id=correlation_id,
|
|
322
|
+
)
|
|
323
|
+
await self._kv_put_raw(
|
|
324
|
+
key=f"onex/nodes/{node_id}/event_bus/publish_entries",
|
|
325
|
+
value=json.dumps([e.model_dump() for e in event_bus.publish_topics]),
|
|
326
|
+
correlation_id=correlation_id,
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
logger.info(
|
|
330
|
+
"Stored event_bus config for node %s: %d subscribe topics, %d publish topics",
|
|
331
|
+
node_id,
|
|
332
|
+
len(event_bus.subscribe_topics),
|
|
333
|
+
len(event_bus.publish_topics),
|
|
334
|
+
extra={"correlation_id": str(correlation_id), "node_id": node_id},
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
async def _update_topic_index(
|
|
338
|
+
self,
|
|
339
|
+
node_id: str,
|
|
340
|
+
event_bus: ModelNodeEventBusConfig,
|
|
341
|
+
correlation_id: UUID,
|
|
342
|
+
) -> None:
|
|
343
|
+
"""Idempotent update of topic -> node_id reverse index.
|
|
344
|
+
|
|
345
|
+
Computes the delta between previously registered topics and new topics,
|
|
346
|
+
then adds/removes the node_id from the appropriate topic subscriber lists.
|
|
347
|
+
|
|
348
|
+
This method is idempotent - calling it multiple times with the same
|
|
349
|
+
parameters produces the same result.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
node_id: The node identifier.
|
|
353
|
+
event_bus: The resolved event bus configuration.
|
|
354
|
+
correlation_id: Correlation ID for tracing.
|
|
355
|
+
|
|
356
|
+
Raises:
|
|
357
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
358
|
+
|
|
359
|
+
Note:
|
|
360
|
+
This operation is NOT atomic. In high-concurrency scenarios with multiple
|
|
361
|
+
nodes updating the same topic's subscriber list simultaneously, race
|
|
362
|
+
conditions may occur. For MVP, this is an accepted limitation.
|
|
363
|
+
|
|
364
|
+
For production with high concurrency, consider:
|
|
365
|
+
- Using Consul transactions (txn endpoint) for atomic read-modify-write
|
|
366
|
+
- Implementing optimistic locking with Consul's ModifyIndex
|
|
367
|
+
"""
|
|
368
|
+
# NOTE: Non-atomic read-modify-write. See docstring for concurrency notes.
|
|
369
|
+
logger.debug(
|
|
370
|
+
"Updating topic index for node %s",
|
|
371
|
+
node_id,
|
|
372
|
+
extra={"correlation_id": str(correlation_id), "node_id": node_id},
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
# Get previous registrations
|
|
376
|
+
previous_key = f"onex/nodes/{node_id}/event_bus/subscribe_topics"
|
|
377
|
+
previous_result = await self._kv_get_raw(previous_key, correlation_id)
|
|
378
|
+
try:
|
|
379
|
+
old_topics = set(json.loads(previous_result) if previous_result else [])
|
|
380
|
+
except (json.JSONDecodeError, TypeError) as e:
|
|
381
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
382
|
+
correlation_id=correlation_id,
|
|
383
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
384
|
+
operation="consul.kv_get_raw",
|
|
385
|
+
target_name="consul_handler",
|
|
386
|
+
)
|
|
387
|
+
raise InfraConsulError(
|
|
388
|
+
"Invalid JSON in Consul topic index",
|
|
389
|
+
context=context,
|
|
390
|
+
consul_key=previous_key,
|
|
391
|
+
) from e
|
|
392
|
+
new_topics = set(event_bus.subscribe_topic_strings)
|
|
393
|
+
|
|
394
|
+
# Compute delta
|
|
395
|
+
topics_to_add = new_topics - old_topics
|
|
396
|
+
topics_to_remove = old_topics - new_topics
|
|
397
|
+
|
|
398
|
+
logger.debug(
|
|
399
|
+
"Topic index delta for node %s: +%d topics, -%d topics",
|
|
400
|
+
node_id,
|
|
401
|
+
len(topics_to_add),
|
|
402
|
+
len(topics_to_remove),
|
|
403
|
+
extra={
|
|
404
|
+
"correlation_id": str(correlation_id),
|
|
405
|
+
"node_id": node_id,
|
|
406
|
+
"topics_added": len(topics_to_add),
|
|
407
|
+
"topics_removed": len(topics_to_remove),
|
|
408
|
+
},
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
# Update index - add to new topics
|
|
412
|
+
for topic in topics_to_add:
|
|
413
|
+
await self._add_subscriber_to_topic(topic, node_id, correlation_id)
|
|
414
|
+
|
|
415
|
+
# Update index - remove from old topics
|
|
416
|
+
for topic in topics_to_remove:
|
|
417
|
+
await self._remove_subscriber_from_topic(topic, node_id, correlation_id)
|
|
418
|
+
|
|
419
|
+
logger.info(
|
|
420
|
+
"Updated topic index for node %s: added to %d topics, removed from %d topics",
|
|
421
|
+
node_id,
|
|
422
|
+
len(topics_to_add),
|
|
423
|
+
len(topics_to_remove),
|
|
424
|
+
extra={"correlation_id": str(correlation_id), "node_id": node_id},
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
async def _add_subscriber_to_topic(
|
|
428
|
+
self,
|
|
429
|
+
topic: str,
|
|
430
|
+
node_id: str,
|
|
431
|
+
correlation_id: UUID,
|
|
432
|
+
) -> None:
|
|
433
|
+
"""Add node_id to topic's subscriber list (idempotent).
|
|
434
|
+
|
|
435
|
+
If the node_id is already in the list, this is a no-op.
|
|
436
|
+
The subscriber list is stored as a sorted JSON array.
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
topic: The topic string.
|
|
440
|
+
node_id: The node identifier to add.
|
|
441
|
+
correlation_id: Correlation ID for tracing.
|
|
442
|
+
|
|
443
|
+
Raises:
|
|
444
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
445
|
+
ProtocolConfigurationError: If topic contains invalid characters.
|
|
446
|
+
|
|
447
|
+
Note:
|
|
448
|
+
Non-atomic read-modify-write. See _update_topic_index docstring for
|
|
449
|
+
concurrency notes. Accepted MVP limitation.
|
|
450
|
+
"""
|
|
451
|
+
# Validate topic format before KV path interpolation to prevent path traversal
|
|
452
|
+
self._validate_topic_format(topic, correlation_id)
|
|
453
|
+
|
|
454
|
+
# NOTE: Non-atomic read-modify-write. See _update_topic_index for details.
|
|
455
|
+
key = f"onex/topics/{topic}/subscribers"
|
|
456
|
+
existing = await self._kv_get_raw(key, correlation_id)
|
|
457
|
+
try:
|
|
458
|
+
subscribers = set(json.loads(existing) if existing else [])
|
|
459
|
+
except (json.JSONDecodeError, TypeError) as e:
|
|
460
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
461
|
+
correlation_id=correlation_id,
|
|
462
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
463
|
+
operation="consul.kv_get_raw",
|
|
464
|
+
target_name="consul_handler",
|
|
465
|
+
)
|
|
466
|
+
raise InfraConsulError(
|
|
467
|
+
"Invalid JSON in Consul topic subscriber list",
|
|
468
|
+
context=context,
|
|
469
|
+
consul_key=key,
|
|
470
|
+
) from e
|
|
471
|
+
subscribers.add(node_id)
|
|
472
|
+
await self._kv_put_raw(key, json.dumps(sorted(subscribers)), correlation_id)
|
|
473
|
+
|
|
474
|
+
logger.debug(
|
|
475
|
+
"Added node %s to topic %s subscribers",
|
|
476
|
+
node_id,
|
|
477
|
+
topic,
|
|
478
|
+
extra={
|
|
479
|
+
"correlation_id": str(correlation_id),
|
|
480
|
+
"node_id": node_id,
|
|
481
|
+
"topic": topic,
|
|
482
|
+
},
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
async def _remove_subscriber_from_topic(
|
|
486
|
+
self,
|
|
487
|
+
topic: str,
|
|
488
|
+
node_id: str,
|
|
489
|
+
correlation_id: UUID,
|
|
490
|
+
) -> None:
|
|
491
|
+
"""Remove node_id from topic's subscriber list.
|
|
492
|
+
|
|
493
|
+
If the node_id is not in the list, this is a no-op.
|
|
494
|
+
The subscriber list is stored as a sorted JSON array.
|
|
495
|
+
|
|
496
|
+
Args:
|
|
497
|
+
topic: The topic string.
|
|
498
|
+
node_id: The node identifier to remove.
|
|
499
|
+
correlation_id: Correlation ID for tracing.
|
|
500
|
+
|
|
501
|
+
Raises:
|
|
502
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
503
|
+
ProtocolConfigurationError: If topic contains invalid characters.
|
|
504
|
+
|
|
505
|
+
Note:
|
|
506
|
+
Non-atomic read-modify-write. See _update_topic_index docstring for
|
|
507
|
+
concurrency notes. Accepted MVP limitation.
|
|
508
|
+
"""
|
|
509
|
+
# Validate topic format before KV path interpolation to prevent path traversal
|
|
510
|
+
self._validate_topic_format(topic, correlation_id)
|
|
511
|
+
|
|
512
|
+
# NOTE: Non-atomic read-modify-write. See _update_topic_index for details.
|
|
513
|
+
key = f"onex/topics/{topic}/subscribers"
|
|
514
|
+
existing = await self._kv_get_raw(key, correlation_id)
|
|
515
|
+
if existing:
|
|
516
|
+
try:
|
|
517
|
+
subscribers = set(json.loads(existing))
|
|
518
|
+
except (json.JSONDecodeError, TypeError) as e:
|
|
519
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
520
|
+
correlation_id=correlation_id,
|
|
521
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
522
|
+
operation="consul.kv_get_raw",
|
|
523
|
+
target_name="consul_handler",
|
|
524
|
+
)
|
|
525
|
+
raise InfraConsulError(
|
|
526
|
+
"Invalid JSON in Consul topic subscriber list",
|
|
527
|
+
context=context,
|
|
528
|
+
consul_key=key,
|
|
529
|
+
) from e
|
|
530
|
+
subscribers.discard(node_id)
|
|
531
|
+
await self._kv_put_raw(key, json.dumps(sorted(subscribers)), correlation_id)
|
|
532
|
+
|
|
533
|
+
logger.debug(
|
|
534
|
+
"Removed node %s from topic %s subscribers",
|
|
535
|
+
node_id,
|
|
536
|
+
topic,
|
|
537
|
+
extra={
|
|
538
|
+
"correlation_id": str(correlation_id),
|
|
539
|
+
"node_id": node_id,
|
|
540
|
+
"topic": topic,
|
|
541
|
+
},
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
async def _get_topic_subscribers(
|
|
545
|
+
self,
|
|
546
|
+
topic: str,
|
|
547
|
+
correlation_id: UUID,
|
|
548
|
+
) -> list[str]:
|
|
549
|
+
"""Get list of node_ids subscribed to a topic.
|
|
550
|
+
|
|
551
|
+
Args:
|
|
552
|
+
topic: The topic string.
|
|
553
|
+
correlation_id: Correlation ID for tracing.
|
|
554
|
+
|
|
555
|
+
Returns:
|
|
556
|
+
List of node_ids subscribed to the topic, empty list if none.
|
|
557
|
+
|
|
558
|
+
Raises:
|
|
559
|
+
InfraConsulError: If Consul client not initialized or operation fails.
|
|
560
|
+
ProtocolConfigurationError: If topic contains invalid characters.
|
|
561
|
+
"""
|
|
562
|
+
# Validate topic format before KV path interpolation to prevent path traversal
|
|
563
|
+
self._validate_topic_format(topic, correlation_id)
|
|
564
|
+
|
|
565
|
+
key = f"onex/topics/{topic}/subscribers"
|
|
566
|
+
existing = await self._kv_get_raw(key, correlation_id)
|
|
567
|
+
if existing:
|
|
568
|
+
try:
|
|
569
|
+
return sorted(json.loads(existing))
|
|
570
|
+
except (json.JSONDecodeError, TypeError) as e:
|
|
571
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
572
|
+
correlation_id=correlation_id,
|
|
573
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
574
|
+
operation="consul.kv_get_raw",
|
|
575
|
+
target_name="consul_handler",
|
|
576
|
+
)
|
|
577
|
+
raise InfraConsulError(
|
|
578
|
+
"Invalid JSON in Consul topic subscriber list",
|
|
579
|
+
context=context,
|
|
580
|
+
consul_key=key,
|
|
581
|
+
) from e
|
|
582
|
+
return []
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
__all__: list[str] = ["MixinConsulTopicIndex"]
|