omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler for NodeIntrospectionEvent - canonical registration trigger.
|
|
4
|
+
|
|
5
|
+
This handler processes NodeIntrospectionEvent payloads from nodes announcing
|
|
6
|
+
their presence in the cluster. It queries the projection for current state
|
|
7
|
+
and emits NodeRegistrationInitiated if the node is new or needs to retry.
|
|
8
|
+
|
|
9
|
+
Decision Logic:
|
|
10
|
+
The handler emits NodeRegistrationInitiated when:
|
|
11
|
+
- No projection exists (new node)
|
|
12
|
+
- State is LIVENESS_EXPIRED (re-registration after death)
|
|
13
|
+
- State is REJECTED (retry after rejection)
|
|
14
|
+
- State is ACK_TIMED_OUT (retry after timeout)
|
|
15
|
+
|
|
16
|
+
The handler does NOT emit when:
|
|
17
|
+
- State is PENDING_REGISTRATION (already processing)
|
|
18
|
+
- State is ACCEPTED (already accepted, waiting for ack)
|
|
19
|
+
- State is AWAITING_ACK (already waiting for ack)
|
|
20
|
+
- State is ACK_RECEIVED (already acknowledged)
|
|
21
|
+
- State is ACTIVE (already active - heartbeat should be used)
|
|
22
|
+
|
|
23
|
+
Projection Persistence:
|
|
24
|
+
When the handler initiates registration, it persists the projection to
|
|
25
|
+
PostgreSQL BEFORE returning events. This ensures read models are consistent
|
|
26
|
+
before downstream processing. The projection is written with state
|
|
27
|
+
PENDING_REGISTRATION.
|
|
28
|
+
|
|
29
|
+
If no projector is provided, the handler operates in read-only mode and
|
|
30
|
+
only emits events without persisting the projection. This mode is useful
|
|
31
|
+
for testing or when projection persistence is handled elsewhere.
|
|
32
|
+
|
|
33
|
+
Consul Registration (Dual Registration):
|
|
34
|
+
When the handler initiates registration and a HandlerConsul is provided,
|
|
35
|
+
it registers the node with Consul for service discovery AFTER persisting
|
|
36
|
+
to PostgreSQL. This enables dual registration:
|
|
37
|
+
- PostgreSQL: Projection state for orchestrator FSM
|
|
38
|
+
- Consul: Service discovery for runtime lookup
|
|
39
|
+
|
|
40
|
+
If HandlerConsul is not provided or Consul registration fails, the handler
|
|
41
|
+
logs the failure but continues (PostgreSQL is the source of truth).
|
|
42
|
+
|
|
43
|
+
Coroutine Safety:
|
|
44
|
+
This handler is stateless and coroutine-safe for concurrent calls
|
|
45
|
+
with different event instances.
|
|
46
|
+
|
|
47
|
+
Related Tickets:
|
|
48
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
49
|
+
- OMN-944 (F1): Registration Projection Schema
|
|
50
|
+
- OMN-892: 2-Way Registration E2E Integration Test
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
from __future__ import annotations
|
|
54
|
+
|
|
55
|
+
import logging
|
|
56
|
+
import time
|
|
57
|
+
from datetime import datetime, timedelta
|
|
58
|
+
from typing import TYPE_CHECKING
|
|
59
|
+
from urllib.parse import urlparse
|
|
60
|
+
from uuid import UUID, uuid4
|
|
61
|
+
|
|
62
|
+
from omnibase_core.enums import EnumMessageCategory, EnumNodeKind
|
|
63
|
+
from omnibase_core.models.dispatch.model_handler_output import ModelHandlerOutput
|
|
64
|
+
from omnibase_core.models.events.model_event_envelope import ModelEventEnvelope
|
|
65
|
+
from omnibase_infra.enums import EnumInfraTransportType, EnumRegistrationState
|
|
66
|
+
from omnibase_infra.errors import ModelInfraErrorContext
|
|
67
|
+
|
|
68
|
+
if TYPE_CHECKING:
|
|
69
|
+
from omnibase_infra.handlers import HandlerConsul
|
|
70
|
+
from omnibase_infra.runtime.projector_shell import ProjectorShell
|
|
71
|
+
from omnibase_infra.models.registration.events.model_node_registration_initiated import (
|
|
72
|
+
ModelNodeRegistrationInitiated,
|
|
73
|
+
)
|
|
74
|
+
from omnibase_infra.models.registration.model_node_introspection_event import (
|
|
75
|
+
ModelNodeIntrospectionEvent,
|
|
76
|
+
)
|
|
77
|
+
from omnibase_infra.projectors.projection_reader_registration import (
|
|
78
|
+
ProjectionReaderRegistration,
|
|
79
|
+
)
|
|
80
|
+
from omnibase_infra.utils import (
|
|
81
|
+
sanitize_error_message,
|
|
82
|
+
validate_timezone_aware_with_context,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
logger = logging.getLogger(__name__)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# States that allow re-registration (node can try again)
|
|
89
|
+
_RETRIABLE_STATES: frozenset[EnumRegistrationState] = frozenset(
|
|
90
|
+
{
|
|
91
|
+
EnumRegistrationState.LIVENESS_EXPIRED,
|
|
92
|
+
EnumRegistrationState.REJECTED,
|
|
93
|
+
EnumRegistrationState.ACK_TIMED_OUT,
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# States that block new registration (already in progress or active)
|
|
98
|
+
_BLOCKING_STATES: frozenset[EnumRegistrationState] = frozenset(
|
|
99
|
+
{
|
|
100
|
+
EnumRegistrationState.PENDING_REGISTRATION,
|
|
101
|
+
EnumRegistrationState.ACCEPTED,
|
|
102
|
+
EnumRegistrationState.AWAITING_ACK,
|
|
103
|
+
EnumRegistrationState.ACK_RECEIVED,
|
|
104
|
+
EnumRegistrationState.ACTIVE,
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class HandlerNodeIntrospected:
|
|
110
|
+
"""Handler for NodeIntrospectionEvent - canonical registration trigger.
|
|
111
|
+
|
|
112
|
+
This handler processes introspection events from nodes announcing
|
|
113
|
+
themselves to the cluster. It queries the current projection state
|
|
114
|
+
and decides whether to initiate a new registration workflow.
|
|
115
|
+
|
|
116
|
+
Projection Persistence:
|
|
117
|
+
When the handler initiates registration, it persists the projection
|
|
118
|
+
BEFORE returning events. This ordering is critical:
|
|
119
|
+
|
|
120
|
+
1. Handler decides to initiate registration
|
|
121
|
+
2. Projection is persisted with state PENDING_REGISTRATION
|
|
122
|
+
3. Events are returned for publishing
|
|
123
|
+
|
|
124
|
+
This ensures that `ProjectionReaderRegistration.get_entity_state()`
|
|
125
|
+
returns the updated projection immediately after event processing.
|
|
126
|
+
|
|
127
|
+
Consul Registration (Dual Registration):
|
|
128
|
+
When a HandlerConsul is configured, the handler registers the node
|
|
129
|
+
with Consul AFTER persisting to PostgreSQL. This enables service
|
|
130
|
+
discovery via Consul while maintaining PostgreSQL as source of truth.
|
|
131
|
+
|
|
132
|
+
Service naming convention:
|
|
133
|
+
- service_name: `onex-{node_type}` (matches ONEX convention)
|
|
134
|
+
- service_id: `onex-{node_type}-{node_id}` (unique identifier)
|
|
135
|
+
|
|
136
|
+
If Consul registration fails, the handler logs the error but continues
|
|
137
|
+
(PostgreSQL persistence is the source of truth).
|
|
138
|
+
|
|
139
|
+
State Decision Matrix:
|
|
140
|
+
| Current State | Action |
|
|
141
|
+
|---------------------|----------------------------------|
|
|
142
|
+
| None (new node) | Emit NodeRegistrationInitiated |
|
|
143
|
+
| LIVENESS_EXPIRED | Emit NodeRegistrationInitiated |
|
|
144
|
+
| REJECTED | Emit NodeRegistrationInitiated |
|
|
145
|
+
| ACK_TIMED_OUT | Emit NodeRegistrationInitiated |
|
|
146
|
+
| PENDING_REGISTRATION| No-op (already processing) |
|
|
147
|
+
| ACCEPTED | No-op (waiting for ack) |
|
|
148
|
+
| AWAITING_ACK | No-op (waiting for ack) |
|
|
149
|
+
| ACK_RECEIVED | No-op (transitioning to active) |
|
|
150
|
+
| ACTIVE | No-op (use heartbeat instead) |
|
|
151
|
+
|
|
152
|
+
Attributes:
|
|
153
|
+
_projection_reader: Reader for registration projection state.
|
|
154
|
+
_projector: Optional projector for persisting state transitions.
|
|
155
|
+
_consul_handler: Optional Consul handler for service discovery registration.
|
|
156
|
+
_ack_timeout_seconds: Timeout for node acknowledgment (default: 30s).
|
|
157
|
+
|
|
158
|
+
Example:
|
|
159
|
+
>>> from datetime import datetime, UTC
|
|
160
|
+
>>> from uuid import uuid4
|
|
161
|
+
>>> # Use explicit timestamps (time injection pattern) - not datetime.now()
|
|
162
|
+
>>> now = datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC)
|
|
163
|
+
>>> # With projector and Consul for full dual registration
|
|
164
|
+
>>> handler = HandlerNodeIntrospected(
|
|
165
|
+
... projection_reader,
|
|
166
|
+
... projector=projector,
|
|
167
|
+
... consul_handler=consul_handler,
|
|
168
|
+
... )
|
|
169
|
+
>>> events = await handler.handle(
|
|
170
|
+
... event=introspection_event,
|
|
171
|
+
... now=now,
|
|
172
|
+
... correlation_id=uuid4(),
|
|
173
|
+
... )
|
|
174
|
+
>>> if events:
|
|
175
|
+
... assert isinstance(events[0], ModelNodeRegistrationInitiated)
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
# Default timeout for node acknowledgment (30 seconds)
|
|
179
|
+
DEFAULT_ACK_TIMEOUT_SECONDS: float = 30.0
|
|
180
|
+
|
|
181
|
+
def __init__(
|
|
182
|
+
self,
|
|
183
|
+
projection_reader: ProjectionReaderRegistration,
|
|
184
|
+
projector: ProjectorShell | None = None,
|
|
185
|
+
ack_timeout_seconds: float | None = None,
|
|
186
|
+
consul_handler: HandlerConsul | None = None,
|
|
187
|
+
) -> None:
|
|
188
|
+
"""Initialize the handler with a projection reader and optional components.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
projection_reader: Reader for querying registration projection state.
|
|
192
|
+
projector: Optional ProjectorShell for persisting state transitions.
|
|
193
|
+
If None, the handler operates in read-only mode (useful for testing).
|
|
194
|
+
The projector should be loaded from the registration projector contract.
|
|
195
|
+
ack_timeout_seconds: Timeout in seconds for node acknowledgment.
|
|
196
|
+
Default: 30 seconds. Used to calculate ack_deadline when persisting.
|
|
197
|
+
consul_handler: Optional HandlerConsul for Consul service registration.
|
|
198
|
+
If provided, nodes will be registered with Consul for service discovery.
|
|
199
|
+
If None or not initialized, Consul registration is skipped.
|
|
200
|
+
"""
|
|
201
|
+
self._projection_reader = projection_reader
|
|
202
|
+
self._projector = projector
|
|
203
|
+
self._consul_handler = consul_handler
|
|
204
|
+
self._ack_timeout_seconds = (
|
|
205
|
+
ack_timeout_seconds
|
|
206
|
+
if ack_timeout_seconds is not None
|
|
207
|
+
else self.DEFAULT_ACK_TIMEOUT_SECONDS
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def handler_id(self) -> str:
|
|
212
|
+
"""Unique identifier for this handler."""
|
|
213
|
+
return "handler-node-introspected"
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def category(self) -> EnumMessageCategory:
|
|
217
|
+
"""Message category this handler processes."""
|
|
218
|
+
return EnumMessageCategory.EVENT
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def message_types(self) -> set[str]:
|
|
222
|
+
"""Set of message type names this handler can process."""
|
|
223
|
+
return {"ModelNodeIntrospectionEvent"}
|
|
224
|
+
|
|
225
|
+
@property
|
|
226
|
+
def node_kind(self) -> EnumNodeKind:
|
|
227
|
+
"""Node kind this handler belongs to."""
|
|
228
|
+
return EnumNodeKind.ORCHESTRATOR
|
|
229
|
+
|
|
230
|
+
@property
|
|
231
|
+
def has_projector(self) -> bool:
|
|
232
|
+
"""Check if projector is configured for projection persistence."""
|
|
233
|
+
return self._projector is not None
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def has_consul_handler(self) -> bool:
|
|
237
|
+
"""Check if HandlerConsul is configured for Consul registration."""
|
|
238
|
+
return self._consul_handler is not None
|
|
239
|
+
|
|
240
|
+
async def handle(
|
|
241
|
+
self,
|
|
242
|
+
envelope: ModelEventEnvelope[ModelNodeIntrospectionEvent],
|
|
243
|
+
) -> ModelHandlerOutput[object]:
|
|
244
|
+
"""Process introspection event and decide on registration.
|
|
245
|
+
|
|
246
|
+
Queries the current projection state for the node and decides
|
|
247
|
+
whether to emit a NodeRegistrationInitiated event to start
|
|
248
|
+
the registration workflow.
|
|
249
|
+
|
|
250
|
+
When initiating registration with a projector configured, the handler:
|
|
251
|
+
1. Persists the projection with state PENDING_REGISTRATION
|
|
252
|
+
2. Returns the NodeRegistrationInitiated event wrapped in ModelHandlerOutput
|
|
253
|
+
|
|
254
|
+
This ordering ensures projections are readable before events are published.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
envelope: Event envelope containing ModelNodeIntrospectionEvent payload.
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
ModelHandlerOutput containing ModelNodeRegistrationInitiated if
|
|
261
|
+
registration should be initiated, empty events tuple otherwise.
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
RuntimeHostError: If projection query or persist fails (propagated).
|
|
265
|
+
InfraConnectionError: If database connection fails during persist.
|
|
266
|
+
InfraTimeoutError: If database operation times out.
|
|
267
|
+
ProtocolConfigurationError: If envelope timestamp is naive (no timezone info).
|
|
268
|
+
"""
|
|
269
|
+
start_time = time.perf_counter()
|
|
270
|
+
|
|
271
|
+
# Extract from envelope
|
|
272
|
+
event = envelope.payload
|
|
273
|
+
now: datetime = envelope.envelope_timestamp
|
|
274
|
+
correlation_id: UUID = envelope.correlation_id or uuid4()
|
|
275
|
+
|
|
276
|
+
# Validate timezone-awareness for time injection pattern
|
|
277
|
+
ctx = ModelInfraErrorContext(
|
|
278
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
279
|
+
operation="handle_introspection_event",
|
|
280
|
+
target_name="handler.node_introspected",
|
|
281
|
+
correlation_id=correlation_id,
|
|
282
|
+
)
|
|
283
|
+
validate_timezone_aware_with_context(now, ctx)
|
|
284
|
+
|
|
285
|
+
node_id = event.node_id
|
|
286
|
+
|
|
287
|
+
# Query current projection state
|
|
288
|
+
projection = await self._projection_reader.get_entity_state(
|
|
289
|
+
entity_id=node_id,
|
|
290
|
+
domain="registration",
|
|
291
|
+
correlation_id=correlation_id,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
# Decision: Should we initiate registration?
|
|
295
|
+
should_initiate = False
|
|
296
|
+
current_state: EnumRegistrationState | None = None
|
|
297
|
+
|
|
298
|
+
if projection is None:
|
|
299
|
+
# New node - initiate registration
|
|
300
|
+
should_initiate = True
|
|
301
|
+
logger.info(
|
|
302
|
+
"New node detected, initiating registration",
|
|
303
|
+
extra={
|
|
304
|
+
"node_id": str(node_id),
|
|
305
|
+
"correlation_id": str(correlation_id),
|
|
306
|
+
},
|
|
307
|
+
)
|
|
308
|
+
else:
|
|
309
|
+
current_state = projection.current_state
|
|
310
|
+
|
|
311
|
+
if current_state in _RETRIABLE_STATES:
|
|
312
|
+
# Retriable state - allow re-registration
|
|
313
|
+
should_initiate = True
|
|
314
|
+
logger.info(
|
|
315
|
+
"Node in retriable state, initiating re-registration",
|
|
316
|
+
extra={
|
|
317
|
+
"node_id": str(node_id),
|
|
318
|
+
"current_state": str(current_state),
|
|
319
|
+
"correlation_id": str(correlation_id),
|
|
320
|
+
},
|
|
321
|
+
)
|
|
322
|
+
elif current_state in _BLOCKING_STATES:
|
|
323
|
+
# Blocking state - no-op
|
|
324
|
+
should_initiate = False
|
|
325
|
+
logger.debug(
|
|
326
|
+
"Node in blocking state, skipping registration",
|
|
327
|
+
extra={
|
|
328
|
+
"node_id": str(node_id),
|
|
329
|
+
"current_state": str(current_state),
|
|
330
|
+
"correlation_id": str(correlation_id),
|
|
331
|
+
},
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
if not should_initiate:
|
|
335
|
+
processing_time_ms = (time.perf_counter() - start_time) * 1000
|
|
336
|
+
return ModelHandlerOutput(
|
|
337
|
+
input_envelope_id=envelope.envelope_id,
|
|
338
|
+
correlation_id=correlation_id,
|
|
339
|
+
handler_id=self.handler_id,
|
|
340
|
+
node_kind=self.node_kind,
|
|
341
|
+
events=(),
|
|
342
|
+
intents=(),
|
|
343
|
+
projections=(),
|
|
344
|
+
result=None,
|
|
345
|
+
processing_time_ms=processing_time_ms,
|
|
346
|
+
timestamp=now,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
# Build NodeRegistrationInitiated event
|
|
350
|
+
registration_attempt_id = uuid4()
|
|
351
|
+
initiated_event = ModelNodeRegistrationInitiated(
|
|
352
|
+
entity_id=node_id,
|
|
353
|
+
node_id=node_id,
|
|
354
|
+
correlation_id=correlation_id,
|
|
355
|
+
causation_id=event.correlation_id, # Link to triggering event
|
|
356
|
+
emitted_at=now, # Use injected time for consistency
|
|
357
|
+
registration_attempt_id=registration_attempt_id,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# CRITICAL: Persist projection BEFORE returning events
|
|
361
|
+
# This ensures read models are consistent before downstream processing
|
|
362
|
+
if self._projector is not None:
|
|
363
|
+
# Calculate ack deadline
|
|
364
|
+
ack_deadline = now + timedelta(seconds=self._ack_timeout_seconds)
|
|
365
|
+
|
|
366
|
+
# Extract node type and version from introspection event
|
|
367
|
+
# node_type is EnumNodeKind (enum with values: effect, compute, reducer, orchestrator)
|
|
368
|
+
node_type = event.node_type
|
|
369
|
+
node_version = event.node_version
|
|
370
|
+
|
|
371
|
+
# Serialize capabilities to JSON string
|
|
372
|
+
capabilities = event.declared_capabilities
|
|
373
|
+
capabilities_json = capabilities.model_dump_json() if capabilities else "{}"
|
|
374
|
+
|
|
375
|
+
# Build values dict for upsert_partial
|
|
376
|
+
# Uses composite conflict key (entity_id, domain) for registration projections
|
|
377
|
+
projection_values: dict[str, object] = {
|
|
378
|
+
"entity_id": node_id,
|
|
379
|
+
"domain": "registration",
|
|
380
|
+
"current_state": EnumRegistrationState.PENDING_REGISTRATION.value,
|
|
381
|
+
"node_type": node_type.value,
|
|
382
|
+
"node_version": str(node_version) if node_version else None,
|
|
383
|
+
"capabilities": capabilities_json,
|
|
384
|
+
# Capability fields (defaults for new registration)
|
|
385
|
+
"contract_type": "unknown",
|
|
386
|
+
"intent_types": [],
|
|
387
|
+
"protocols": [],
|
|
388
|
+
"capability_tags": [],
|
|
389
|
+
"contract_version": None,
|
|
390
|
+
# Timestamps and tracking
|
|
391
|
+
"ack_deadline": ack_deadline,
|
|
392
|
+
"last_applied_event_id": registration_attempt_id,
|
|
393
|
+
"registered_at": now,
|
|
394
|
+
"updated_at": now,
|
|
395
|
+
"correlation_id": correlation_id,
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
await self._projector.upsert_partial(
|
|
399
|
+
aggregate_id=node_id,
|
|
400
|
+
values=projection_values,
|
|
401
|
+
correlation_id=correlation_id,
|
|
402
|
+
conflict_columns=["entity_id", "domain"],
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
logger.info(
|
|
406
|
+
"Projection persisted for registration initiation",
|
|
407
|
+
extra={
|
|
408
|
+
"node_id": str(node_id),
|
|
409
|
+
"new_state": EnumRegistrationState.PENDING_REGISTRATION.value,
|
|
410
|
+
"ack_deadline": ack_deadline.isoformat(),
|
|
411
|
+
"correlation_id": str(correlation_id),
|
|
412
|
+
},
|
|
413
|
+
)
|
|
414
|
+
else:
|
|
415
|
+
logger.debug(
|
|
416
|
+
"No projector configured, skipping projection persistence",
|
|
417
|
+
extra={
|
|
418
|
+
"node_id": str(node_id),
|
|
419
|
+
"correlation_id": str(correlation_id),
|
|
420
|
+
},
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
# Register with Consul for service discovery (dual registration)
|
|
424
|
+
# This happens AFTER PostgreSQL persistence (source of truth)
|
|
425
|
+
await self._register_with_consul(
|
|
426
|
+
node_id=node_id,
|
|
427
|
+
node_type=event.node_type.value,
|
|
428
|
+
endpoints=event.endpoints,
|
|
429
|
+
correlation_id=correlation_id,
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
logger.info(
|
|
433
|
+
"Emitting NodeRegistrationInitiated",
|
|
434
|
+
extra={
|
|
435
|
+
"node_id": str(node_id),
|
|
436
|
+
"registration_attempt_id": str(initiated_event.registration_attempt_id),
|
|
437
|
+
"correlation_id": str(correlation_id),
|
|
438
|
+
},
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
processing_time_ms = (time.perf_counter() - start_time) * 1000
|
|
442
|
+
return ModelHandlerOutput(
|
|
443
|
+
input_envelope_id=envelope.envelope_id,
|
|
444
|
+
correlation_id=correlation_id,
|
|
445
|
+
handler_id=self.handler_id,
|
|
446
|
+
node_kind=self.node_kind,
|
|
447
|
+
events=(initiated_event,),
|
|
448
|
+
intents=(),
|
|
449
|
+
projections=(),
|
|
450
|
+
result=None,
|
|
451
|
+
processing_time_ms=processing_time_ms,
|
|
452
|
+
timestamp=now,
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
async def _register_with_consul(
|
|
456
|
+
self,
|
|
457
|
+
node_id: UUID,
|
|
458
|
+
node_type: str,
|
|
459
|
+
endpoints: dict[str, str] | None,
|
|
460
|
+
correlation_id: UUID,
|
|
461
|
+
) -> None:
|
|
462
|
+
"""Register node with Consul for service discovery.
|
|
463
|
+
|
|
464
|
+
Registers the node as a Consul service with:
|
|
465
|
+
- service_name: `onex-{node_type}` (ONEX convention for service discovery)
|
|
466
|
+
- service_id: `onex-{node_type}-{node_id}` (unique identifier)
|
|
467
|
+
- tags: [`onex`, `node-type:{node_type}`]
|
|
468
|
+
- address/port: Extracted from endpoints if available
|
|
469
|
+
|
|
470
|
+
This method is idempotent - re-registering the same service_id updates it.
|
|
471
|
+
Errors are logged but not propagated (PostgreSQL is source of truth).
|
|
472
|
+
|
|
473
|
+
Args:
|
|
474
|
+
node_id: Node UUID for service naming.
|
|
475
|
+
node_type: ONEX node type (effect, compute, reducer, orchestrator).
|
|
476
|
+
endpoints: Optional dict of endpoint URLs from introspection event.
|
|
477
|
+
correlation_id: Correlation ID for tracing.
|
|
478
|
+
"""
|
|
479
|
+
if self._consul_handler is None:
|
|
480
|
+
logger.debug(
|
|
481
|
+
"No HandlerConsul configured, skipping Consul registration",
|
|
482
|
+
extra={
|
|
483
|
+
"node_id": str(node_id),
|
|
484
|
+
"correlation_id": str(correlation_id),
|
|
485
|
+
},
|
|
486
|
+
)
|
|
487
|
+
return
|
|
488
|
+
|
|
489
|
+
# Build service name following ONEX convention
|
|
490
|
+
# Format: onex-{node_type} (e.g., onex-effect, onex-compute)
|
|
491
|
+
service_name = f"onex-{node_type}"
|
|
492
|
+
service_id = f"onex-{node_type}-{node_id}"
|
|
493
|
+
|
|
494
|
+
# Extract address and port from endpoints if available
|
|
495
|
+
address: str | None = None
|
|
496
|
+
port: int | None = None
|
|
497
|
+
if endpoints:
|
|
498
|
+
# Try health endpoint first, then api
|
|
499
|
+
health_url = endpoints.get("health") or endpoints.get("api")
|
|
500
|
+
if health_url:
|
|
501
|
+
# Parse URL to extract host and port
|
|
502
|
+
# URL format: http://host:port/path
|
|
503
|
+
try:
|
|
504
|
+
parsed = urlparse(health_url)
|
|
505
|
+
if parsed.hostname:
|
|
506
|
+
address = parsed.hostname
|
|
507
|
+
else:
|
|
508
|
+
# URL parsed but no hostname extracted - log for troubleshooting
|
|
509
|
+
# NOTE: Don't log raw URL - may contain credentials
|
|
510
|
+
endpoint_type = "health" if endpoints.get("health") else "api"
|
|
511
|
+
logger.debug(
|
|
512
|
+
"URL parsed but no hostname extracted from %s endpoint",
|
|
513
|
+
endpoint_type,
|
|
514
|
+
extra={
|
|
515
|
+
"node_id": str(node_id),
|
|
516
|
+
"endpoint_type": endpoint_type,
|
|
517
|
+
"has_scheme": bool(parsed.scheme),
|
|
518
|
+
"has_netloc": bool(parsed.netloc),
|
|
519
|
+
"correlation_id": str(correlation_id),
|
|
520
|
+
},
|
|
521
|
+
)
|
|
522
|
+
if parsed.port:
|
|
523
|
+
port = parsed.port
|
|
524
|
+
else:
|
|
525
|
+
# URL parsed but no port extracted - log for troubleshooting
|
|
526
|
+
# This is common for URLs using default ports (80/443)
|
|
527
|
+
endpoint_type = "health" if endpoints.get("health") else "api"
|
|
528
|
+
logger.debug(
|
|
529
|
+
"URL parsed but no port extracted from %s endpoint "
|
|
530
|
+
"(may use default port)",
|
|
531
|
+
endpoint_type,
|
|
532
|
+
extra={
|
|
533
|
+
"node_id": str(node_id),
|
|
534
|
+
"endpoint_type": endpoint_type,
|
|
535
|
+
"hostname_extracted": address is not None,
|
|
536
|
+
"correlation_id": str(correlation_id),
|
|
537
|
+
},
|
|
538
|
+
)
|
|
539
|
+
except ValueError as e:
|
|
540
|
+
# urlparse raises ValueError for malformed URLs
|
|
541
|
+
# If parsing fails, continue without address/port
|
|
542
|
+
# NOTE: Don't log raw URL - may contain credentials (e.g., user:pass@host)
|
|
543
|
+
# Use sanitize_error_message to safely log error details
|
|
544
|
+
sanitized_error = sanitize_error_message(e)
|
|
545
|
+
endpoint_type = "health" if endpoints.get("health") else "api"
|
|
546
|
+
logger.debug(
|
|
547
|
+
"URL parsing failed for %s endpoint: %s",
|
|
548
|
+
endpoint_type,
|
|
549
|
+
sanitized_error,
|
|
550
|
+
extra={
|
|
551
|
+
"node_id": str(node_id),
|
|
552
|
+
"endpoint_type": endpoint_type,
|
|
553
|
+
"correlation_id": str(correlation_id),
|
|
554
|
+
},
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
# Build Consul registration payload
|
|
558
|
+
consul_payload: dict[str, object] = {
|
|
559
|
+
"name": service_name,
|
|
560
|
+
"service_id": service_id,
|
|
561
|
+
"tags": ["onex", f"node-type:{node_type}"],
|
|
562
|
+
}
|
|
563
|
+
if address:
|
|
564
|
+
consul_payload["address"] = address
|
|
565
|
+
if port:
|
|
566
|
+
consul_payload["port"] = port
|
|
567
|
+
|
|
568
|
+
try:
|
|
569
|
+
# Build envelope for HandlerConsul.execute()
|
|
570
|
+
envelope: dict[str, object] = {
|
|
571
|
+
"operation": "consul.register",
|
|
572
|
+
"payload": consul_payload,
|
|
573
|
+
"correlation_id": str(correlation_id),
|
|
574
|
+
"envelope_id": str(uuid4()),
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
await self._consul_handler.execute(envelope)
|
|
578
|
+
|
|
579
|
+
logger.info(
|
|
580
|
+
"Node registered with Consul for service discovery",
|
|
581
|
+
extra={
|
|
582
|
+
"node_id": str(node_id),
|
|
583
|
+
"service_name": service_name,
|
|
584
|
+
"service_id": service_id,
|
|
585
|
+
"correlation_id": str(correlation_id),
|
|
586
|
+
},
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
except Exception as e:
|
|
590
|
+
# Log error but don't propagate - PostgreSQL is source of truth
|
|
591
|
+
# Consul registration is best-effort for service discovery
|
|
592
|
+
# Use sanitize_error_message to avoid logging sensitive data
|
|
593
|
+
# NOTE: Do NOT use exc_info=True here - stack traces may contain
|
|
594
|
+
# connection strings, credentials, or other sensitive information
|
|
595
|
+
sanitized_error = sanitize_error_message(e)
|
|
596
|
+
logger.warning(
|
|
597
|
+
"Consul registration failed (non-fatal): %s (error_type=%s)",
|
|
598
|
+
sanitized_error,
|
|
599
|
+
type(e).__name__,
|
|
600
|
+
extra={
|
|
601
|
+
"node_id": str(node_id),
|
|
602
|
+
"service_name": service_name,
|
|
603
|
+
"correlation_id": str(correlation_id),
|
|
604
|
+
"error_type": type(e).__name__,
|
|
605
|
+
},
|
|
606
|
+
)
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
__all__: list[str] = ["HandlerNodeIntrospected"]
|