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,190 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Backend Result Model for Registry Effect Operations.
|
|
4
|
+
|
|
5
|
+
This module provides ModelBackendResult, representing the result of an individual
|
|
6
|
+
backend operation (Consul or PostgreSQL) within the dual-registration workflow.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
ModelBackendResult captures the outcome of a single backend operation:
|
|
10
|
+
- success: Whether the operation completed successfully
|
|
11
|
+
- error: Error message if the operation failed (sanitized)
|
|
12
|
+
- duration_ms: Time taken for the operation
|
|
13
|
+
|
|
14
|
+
This model is used within ModelRegistryResponse to report per-backend status,
|
|
15
|
+
enabling partial failure detection and targeted retry strategies.
|
|
16
|
+
|
|
17
|
+
Security:
|
|
18
|
+
Error messages MUST be sanitized before inclusion. Never include:
|
|
19
|
+
- Credentials, connection strings, or secrets
|
|
20
|
+
- Internal IP addresses or hostnames
|
|
21
|
+
- PII (names, emails, etc.)
|
|
22
|
+
|
|
23
|
+
See CLAUDE.md "Error Sanitization Guidelines" for complete rules.
|
|
24
|
+
|
|
25
|
+
Related:
|
|
26
|
+
- ModelRegistryResponse: Uses this model for consul_result and postgres_result
|
|
27
|
+
- NodeRegistryEffect: Effect node that produces these results
|
|
28
|
+
- OMN-954: Partial failure scenario testing
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import logging
|
|
34
|
+
import re
|
|
35
|
+
from uuid import UUID
|
|
36
|
+
|
|
37
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
38
|
+
|
|
39
|
+
# Compiled regex for secret pattern detection (module-level for performance)
|
|
40
|
+
# Used by ModelBackendResult._warn_on_potential_secrets validator
|
|
41
|
+
_SECRET_PATTERNS: re.Pattern[str] = re.compile(
|
|
42
|
+
r"(password\s*=|api_key\s*=|token\s*=|secret\s*=|credentials|"
|
|
43
|
+
r"connection_string\s*=.*@)",
|
|
44
|
+
re.IGNORECASE,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
_logger = logging.getLogger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ModelBackendResult(BaseModel):
|
|
51
|
+
"""Result of an individual backend operation.
|
|
52
|
+
|
|
53
|
+
Captures the outcome of a single backend operation (Consul or PostgreSQL)
|
|
54
|
+
within the dual-registration workflow. Used to enable partial failure
|
|
55
|
+
detection and targeted retry strategies.
|
|
56
|
+
|
|
57
|
+
Immutability:
|
|
58
|
+
This model uses frozen=True to ensure backend results are immutable
|
|
59
|
+
once created, supporting safe concurrent access and comparison.
|
|
60
|
+
|
|
61
|
+
Attributes:
|
|
62
|
+
success: Whether the backend operation completed successfully.
|
|
63
|
+
error: Sanitized error message if success is False.
|
|
64
|
+
error_code: Optional error code for programmatic handling.
|
|
65
|
+
duration_ms: Time taken for the operation in milliseconds.
|
|
66
|
+
backend_id: Optional identifier for the backend instance.
|
|
67
|
+
|
|
68
|
+
Design Note - No ``retries`` Field:
|
|
69
|
+
This model intentionally does NOT include a ``retries`` field because:
|
|
70
|
+
|
|
71
|
+
1. **Effect layer dispatches once**: The effect node dispatches to handlers
|
|
72
|
+
exactly once per operation. It does not implement retry loops.
|
|
73
|
+
2. **Handlers own retry logic**: Handlers implement their own retry behavior
|
|
74
|
+
using the ``retry_policy`` configuration from the contract. Retry count
|
|
75
|
+
is internal handler state, not exposed in results.
|
|
76
|
+
3. **Caller-controlled retries**: Callers can use the ``retry_partial_failure``
|
|
77
|
+
operation for explicit retries after partial failures.
|
|
78
|
+
|
|
79
|
+
**Important**: At the effect layer, a ``retries`` field would always be 0.
|
|
80
|
+
Retry counts are only meaningful when aggregated by the orchestrator layer,
|
|
81
|
+
which tracks how many times ``retry_partial_failure`` was called.
|
|
82
|
+
|
|
83
|
+
For observability of retry attempts:
|
|
84
|
+
- Handlers should emit metrics/logs during internal retry loops
|
|
85
|
+
- Use ``correlation_id`` to correlate retry attempts across logs
|
|
86
|
+
- Orchestrator layer can track ``retry_partial_failure`` operation calls
|
|
87
|
+
|
|
88
|
+
See: ``contract.yaml`` error_handling.retry_policy for handler configuration.
|
|
89
|
+
|
|
90
|
+
Example:
|
|
91
|
+
>>> result = ModelBackendResult(
|
|
92
|
+
... success=True,
|
|
93
|
+
... duration_ms=45.2,
|
|
94
|
+
... backend_id="consul",
|
|
95
|
+
... )
|
|
96
|
+
>>> result.success
|
|
97
|
+
True
|
|
98
|
+
|
|
99
|
+
Example (failure case):
|
|
100
|
+
>>> result = ModelBackendResult(
|
|
101
|
+
... success=False,
|
|
102
|
+
... error="Connection refused to database host",
|
|
103
|
+
... error_code="DATABASE_CONNECTION_ERROR",
|
|
104
|
+
... duration_ms=5000.0,
|
|
105
|
+
... backend_id="postgres",
|
|
106
|
+
... )
|
|
107
|
+
>>> result.success
|
|
108
|
+
False
|
|
109
|
+
>>> result.error
|
|
110
|
+
'Connection refused to database host'
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
114
|
+
|
|
115
|
+
success: bool = Field(
|
|
116
|
+
...,
|
|
117
|
+
description="Whether the backend operation completed successfully",
|
|
118
|
+
)
|
|
119
|
+
error: str | None = Field(
|
|
120
|
+
default=None,
|
|
121
|
+
description="Sanitized error message if success is False",
|
|
122
|
+
)
|
|
123
|
+
error_code: str | None = Field(
|
|
124
|
+
default=None,
|
|
125
|
+
description="Error code for programmatic handling (e.g., DATABASE_CONNECTION_ERROR)",
|
|
126
|
+
)
|
|
127
|
+
duration_ms: float = Field(
|
|
128
|
+
default=0.0,
|
|
129
|
+
description="Time taken for the operation in milliseconds",
|
|
130
|
+
ge=0.0,
|
|
131
|
+
)
|
|
132
|
+
backend_id: str | None = Field(
|
|
133
|
+
default=None,
|
|
134
|
+
description="Optional identifier for the backend instance",
|
|
135
|
+
)
|
|
136
|
+
correlation_id: UUID | None = Field(
|
|
137
|
+
default=None,
|
|
138
|
+
description="Correlation ID for tracing the operation",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
@field_validator("error", mode="after")
|
|
142
|
+
@classmethod
|
|
143
|
+
def _warn_on_potential_secrets(cls, value: str | None) -> str | None:
|
|
144
|
+
"""Defense-in-depth validator to detect potential secret exposure in error messages.
|
|
145
|
+
|
|
146
|
+
This validator checks if the error string contains common patterns that might
|
|
147
|
+
indicate accidental secret exposure. It logs a warning if detected but does NOT
|
|
148
|
+
block or modify the value - this is defense-in-depth, not enforcement.
|
|
149
|
+
|
|
150
|
+
The actual sanitization should happen at the error source (see CLAUDE.md
|
|
151
|
+
"Error Sanitization Guidelines"). This validator serves as a safety net
|
|
152
|
+
to detect when sanitization was missed.
|
|
153
|
+
|
|
154
|
+
Detected Patterns:
|
|
155
|
+
- password= (case insensitive)
|
|
156
|
+
- api_key= (case insensitive)
|
|
157
|
+
- token= (case insensitive)
|
|
158
|
+
- secret= (case insensitive)
|
|
159
|
+
- credentials (case insensitive)
|
|
160
|
+
- connection_string=...@ (indicates embedded credentials)
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
value: The error string to check, or None.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
The original value unchanged.
|
|
167
|
+
|
|
168
|
+
Security:
|
|
169
|
+
This validator intentionally does NOT raise an exception or modify
|
|
170
|
+
the value. It only logs a warning to alert operators that a potential
|
|
171
|
+
secret may have been exposed. The rationale:
|
|
172
|
+
1. Blocking could cause unexpected runtime failures
|
|
173
|
+
2. Modification could mask debugging information
|
|
174
|
+
3. Warning provides observability without breaking functionality
|
|
175
|
+
"""
|
|
176
|
+
if value is None:
|
|
177
|
+
return value
|
|
178
|
+
|
|
179
|
+
if _SECRET_PATTERNS.search(value):
|
|
180
|
+
_logger.warning(
|
|
181
|
+
"Potential secret pattern detected in error message. "
|
|
182
|
+
"Error messages should be sanitized at the source. "
|
|
183
|
+
"See CLAUDE.md 'Error Sanitization Guidelines' for rules. "
|
|
184
|
+
"Pattern detected in error field of ModelBackendResult."
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return value
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
__all__ = ["ModelBackendResult"]
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Configuration model for Effect layer idempotency store.
|
|
4
|
+
|
|
5
|
+
This module provides configuration for the in-memory idempotency store used
|
|
6
|
+
by Effect nodes to track completed backends during dual-backend operations.
|
|
7
|
+
|
|
8
|
+
Memory Characteristics:
|
|
9
|
+
The default configuration limits memory usage:
|
|
10
|
+
- max_cache_size=10000 entries
|
|
11
|
+
- Each entry: ~100 bytes (UUID key + set of backend strings + timestamp)
|
|
12
|
+
- Max memory at default: ~1MB
|
|
13
|
+
|
|
14
|
+
For high-volume systems, adjust based on:
|
|
15
|
+
- Expected concurrent correlation IDs
|
|
16
|
+
- Backend completion tracking duration (TTL)
|
|
17
|
+
- Available memory headroom
|
|
18
|
+
|
|
19
|
+
Production Note:
|
|
20
|
+
This in-memory store does NOT persist across restarts and does NOT
|
|
21
|
+
support distributed scenarios. For production use:
|
|
22
|
+
- Use StoreIdempotencyPostgres from omnibase_infra.idempotency
|
|
23
|
+
- Or implement a Redis/Valkey-backed store
|
|
24
|
+
- Consider the existing ProtocolIdempotencyStore for full persistence
|
|
25
|
+
|
|
26
|
+
Related:
|
|
27
|
+
- NodeRegistryEffect: Uses this for dual-backend idempotency
|
|
28
|
+
- InMemoryEffectIdempotencyStore: Implementation using this config
|
|
29
|
+
- OMN-954: Registry effect idempotency requirements
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ModelEffectIdempotencyConfig(BaseModel):
|
|
38
|
+
"""Configuration for Effect layer in-memory idempotency store.
|
|
39
|
+
|
|
40
|
+
This configuration controls the bounded in-memory cache used for tracking
|
|
41
|
+
completed backends during dual-backend registration operations.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
max_cache_size: Maximum number of correlation IDs to track.
|
|
45
|
+
When exceeded, oldest entries are evicted (LRU).
|
|
46
|
+
Default: 10000 entries (~1MB memory).
|
|
47
|
+
cache_ttl_seconds: Time-to-live for entries in seconds.
|
|
48
|
+
Entries older than TTL are eligible for cleanup.
|
|
49
|
+
Default: 3600.0 (1 hour).
|
|
50
|
+
cleanup_interval_seconds: How often to run TTL cleanup.
|
|
51
|
+
Cleanup happens lazily on access, but this sets the minimum
|
|
52
|
+
interval between full cleanup passes.
|
|
53
|
+
Default: 300.0 (5 minutes).
|
|
54
|
+
|
|
55
|
+
Memory Estimation:
|
|
56
|
+
- Per-entry overhead: ~100 bytes
|
|
57
|
+
- max_cache_size=10000 -> ~1MB
|
|
58
|
+
- max_cache_size=100000 -> ~10MB
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
>>> config = ModelEffectIdempotencyConfig(
|
|
62
|
+
... max_cache_size=5000,
|
|
63
|
+
... cache_ttl_seconds=1800.0, # 30 minutes
|
|
64
|
+
... )
|
|
65
|
+
>>> store = InMemoryEffectIdempotencyStore(config)
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
max_cache_size: int = Field(
|
|
69
|
+
default=10000,
|
|
70
|
+
ge=1,
|
|
71
|
+
le=1000000,
|
|
72
|
+
description="Maximum entries before LRU eviction.",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
cache_ttl_seconds: float = Field(
|
|
76
|
+
default=3600.0,
|
|
77
|
+
ge=1.0,
|
|
78
|
+
le=86400.0,
|
|
79
|
+
description="Entry TTL in seconds (1 hour default).",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
cleanup_interval_seconds: float = Field(
|
|
83
|
+
default=300.0,
|
|
84
|
+
ge=1.0,
|
|
85
|
+
le=3600.0,
|
|
86
|
+
description="Minimum interval between TTL cleanup passes.",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
__all__ = ["ModelEffectIdempotencyConfig"]
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry Request Model for Registry Effect Operations.
|
|
4
|
+
|
|
5
|
+
This module provides ModelRegistryRequest, representing the input to the
|
|
6
|
+
NodeRegistryEffect node for dual-backend registration operations.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
ModelRegistryRequest captures all information needed to register a node
|
|
10
|
+
in both Consul and PostgreSQL backends:
|
|
11
|
+
- Node identity (node_id, node_type, node_version)
|
|
12
|
+
- Service discovery info (endpoints, health checks)
|
|
13
|
+
- Metadata for registration record
|
|
14
|
+
|
|
15
|
+
This model is typically created from a ModelNodeIntrospectionEvent
|
|
16
|
+
or directly constructed for programmatic registration.
|
|
17
|
+
|
|
18
|
+
Related:
|
|
19
|
+
- NodeRegistryEffect: Effect node that consumes this request
|
|
20
|
+
- ModelRegistryResponse: Response model for registry operations
|
|
21
|
+
- ModelNodeIntrospectionEvent: Source of registration data
|
|
22
|
+
- OMN-954: Partial failure scenario testing
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from datetime import datetime
|
|
28
|
+
from uuid import UUID, uuid4
|
|
29
|
+
|
|
30
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
31
|
+
|
|
32
|
+
from omnibase_core.enums import EnumNodeKind
|
|
33
|
+
from omnibase_core.models.primitives import ModelSemVer
|
|
34
|
+
from omnibase_infra.utils import validate_timezone_aware_datetime
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ModelRegistryRequest(BaseModel):
|
|
38
|
+
"""Request model for dual-backend registration operations.
|
|
39
|
+
|
|
40
|
+
Contains all information needed to register a node in both Consul
|
|
41
|
+
and PostgreSQL backends. The NodeRegistryEffect uses this request to
|
|
42
|
+
execute parallel or sequential registration operations.
|
|
43
|
+
|
|
44
|
+
Immutability:
|
|
45
|
+
This model uses frozen=True to ensure requests are immutable
|
|
46
|
+
once created, enabling safe concurrent access.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
node_id: Unique identifier for the node being registered.
|
|
50
|
+
node_type: Type of ONEX node (effect, compute, reducer, orchestrator).
|
|
51
|
+
node_version: Semantic version of the node.
|
|
52
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
53
|
+
service_name: Name for service discovery registration.
|
|
54
|
+
endpoints: Dict of endpoint type to URL (e.g., {"health": "http://..."}).
|
|
55
|
+
tags: List of tags for service discovery.
|
|
56
|
+
metadata: Additional metadata for the registration record.
|
|
57
|
+
health_check_config: Optional health check configuration for Consul.
|
|
58
|
+
timestamp: When this request was created.
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
>>> from datetime import UTC, datetime
|
|
62
|
+
>>> from uuid import uuid4
|
|
63
|
+
>>> from omnibase_core.enums.enum_node_kind import EnumNodeKind
|
|
64
|
+
>>> from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
65
|
+
>>> request = ModelRegistryRequest(
|
|
66
|
+
... node_id=uuid4(),
|
|
67
|
+
... node_type=EnumNodeKind.EFFECT,
|
|
68
|
+
... node_version=ModelSemVer(major=1, minor=0, patch=0),
|
|
69
|
+
... correlation_id=uuid4(),
|
|
70
|
+
... service_name="onex-effect",
|
|
71
|
+
... endpoints={"health": "http://localhost:8080/health"},
|
|
72
|
+
... timestamp=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
73
|
+
... )
|
|
74
|
+
>>> request.node_type
|
|
75
|
+
<EnumNodeKind.EFFECT: 'effect'>
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
79
|
+
|
|
80
|
+
node_id: UUID = Field(
|
|
81
|
+
...,
|
|
82
|
+
description="Unique identifier for the node being registered",
|
|
83
|
+
)
|
|
84
|
+
node_type: EnumNodeKind = Field(
|
|
85
|
+
...,
|
|
86
|
+
description="Type of ONEX node (effect, compute, reducer, orchestrator)",
|
|
87
|
+
)
|
|
88
|
+
node_version: ModelSemVer = Field(
|
|
89
|
+
...,
|
|
90
|
+
description="Semantic version of the node",
|
|
91
|
+
)
|
|
92
|
+
correlation_id: UUID = Field(
|
|
93
|
+
default_factory=uuid4,
|
|
94
|
+
description="Correlation ID for distributed tracing",
|
|
95
|
+
)
|
|
96
|
+
service_name: str | None = Field(
|
|
97
|
+
default=None,
|
|
98
|
+
description="Name for service discovery registration",
|
|
99
|
+
)
|
|
100
|
+
endpoints: dict[str, str] = Field(
|
|
101
|
+
default_factory=dict,
|
|
102
|
+
description="Dict of endpoint type to URL",
|
|
103
|
+
)
|
|
104
|
+
tags: list[str] = Field(
|
|
105
|
+
default_factory=list,
|
|
106
|
+
description="List of tags for service discovery",
|
|
107
|
+
)
|
|
108
|
+
metadata: dict[str, str] = Field(
|
|
109
|
+
default_factory=dict,
|
|
110
|
+
description="Additional metadata for the registration record",
|
|
111
|
+
)
|
|
112
|
+
health_check_config: dict[str, str] | None = Field(
|
|
113
|
+
default=None,
|
|
114
|
+
description="Optional health check configuration for Consul",
|
|
115
|
+
)
|
|
116
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
117
|
+
timestamp: datetime = Field(
|
|
118
|
+
...,
|
|
119
|
+
description="When this request was created (must be explicitly provided)",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
@field_validator("timestamp")
|
|
123
|
+
@classmethod
|
|
124
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
125
|
+
"""Validate that timestamp is timezone-aware.
|
|
126
|
+
|
|
127
|
+
Delegates to shared utility for consistent validation across all models.
|
|
128
|
+
"""
|
|
129
|
+
return validate_timezone_aware_datetime(v)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
__all__ = ["ModelRegistryRequest"]
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry Response Model for Dual-Backend Registration Operations.
|
|
4
|
+
|
|
5
|
+
This module provides ModelRegistryResponse, representing the complete response
|
|
6
|
+
from the NodeRegistryEffect node after executing dual-backend registration.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
ModelRegistryResponse captures the outcome of registering a node in both
|
|
10
|
+
Consul and PostgreSQL backends, with support for partial failure scenarios:
|
|
11
|
+
|
|
12
|
+
- status=EnumRegistryResponseStatus.SUCCESS: Both backends succeeded
|
|
13
|
+
- status=EnumRegistryResponseStatus.PARTIAL: One backend succeeded, one failed
|
|
14
|
+
- status=EnumRegistryResponseStatus.FAILED: Both backends failed
|
|
15
|
+
|
|
16
|
+
Each backend's individual result is captured in consul_result and
|
|
17
|
+
postgres_result fields, enabling targeted retry strategies.
|
|
18
|
+
|
|
19
|
+
Partial Failure Handling:
|
|
20
|
+
When one backend fails but the other succeeds:
|
|
21
|
+
1. Status is set to EnumRegistryResponseStatus.PARTIAL
|
|
22
|
+
2. The successful backend's result shows success=True
|
|
23
|
+
3. The failed backend's result shows success=False with error details
|
|
24
|
+
4. Retry logic can target only the failed backend
|
|
25
|
+
|
|
26
|
+
This supports idempotent retry: if Consul already succeeded, only
|
|
27
|
+
PostgreSQL needs to be retried on subsequent attempts.
|
|
28
|
+
|
|
29
|
+
Related:
|
|
30
|
+
- ModelBackendResult: Individual backend operation result
|
|
31
|
+
- NodeRegistryEffect: Effect node that produces this response
|
|
32
|
+
- ModelRegistryRequest: Input request model
|
|
33
|
+
- OMN-954: Partial failure scenario testing
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
from datetime import datetime
|
|
39
|
+
from uuid import UUID
|
|
40
|
+
|
|
41
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
42
|
+
|
|
43
|
+
from omnibase_infra.enums import EnumBackendType, EnumRegistryResponseStatus
|
|
44
|
+
from omnibase_infra.nodes.effects.models.model_backend_result import (
|
|
45
|
+
ModelBackendResult,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ModelRegistryResponse(BaseModel):
|
|
50
|
+
"""Response model for dual-backend registration operations.
|
|
51
|
+
|
|
52
|
+
Captures the complete outcome of registering a node in both Consul
|
|
53
|
+
and PostgreSQL backends, with individual results for each backend.
|
|
54
|
+
|
|
55
|
+
Status Semantics:
|
|
56
|
+
- SUCCESS: Both consul_result.success AND postgres_result.success are True
|
|
57
|
+
- PARTIAL: Exactly one of consul_result.success or postgres_result.success is True
|
|
58
|
+
- FAILED: Both consul_result.success AND postgres_result.success are False
|
|
59
|
+
|
|
60
|
+
Immutability:
|
|
61
|
+
This model uses frozen=True to ensure responses are immutable
|
|
62
|
+
once created, supporting safe concurrent access and comparison.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
status: Overall status of the dual-registration operation.
|
|
66
|
+
node_id: UUID of the node that was registered.
|
|
67
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
68
|
+
consul_result: Result of the Consul registration operation.
|
|
69
|
+
postgres_result: Result of the PostgreSQL upsert operation.
|
|
70
|
+
processing_time_ms: Total time for the dual-registration operation.
|
|
71
|
+
timestamp: When this response was created.
|
|
72
|
+
error_summary: Aggregated error message for failed operations.
|
|
73
|
+
|
|
74
|
+
Example (success):
|
|
75
|
+
>>> from uuid import uuid4
|
|
76
|
+
>>> from omnibase_infra.enums import EnumRegistryResponseStatus
|
|
77
|
+
>>> response = ModelRegistryResponse(
|
|
78
|
+
... status=EnumRegistryResponseStatus.SUCCESS,
|
|
79
|
+
... node_id=uuid4(),
|
|
80
|
+
... correlation_id=uuid4(),
|
|
81
|
+
... consul_result=ModelBackendResult(
|
|
82
|
+
... success=True, duration_ms=45.0, backend_id="consul"
|
|
83
|
+
... ),
|
|
84
|
+
... postgres_result=ModelBackendResult(
|
|
85
|
+
... success=True, duration_ms=30.0, backend_id="postgres"
|
|
86
|
+
... ),
|
|
87
|
+
... processing_time_ms=75.0,
|
|
88
|
+
... )
|
|
89
|
+
>>> response.status == EnumRegistryResponseStatus.SUCCESS
|
|
90
|
+
True
|
|
91
|
+
|
|
92
|
+
Example (partial failure):
|
|
93
|
+
>>> response = ModelRegistryResponse(
|
|
94
|
+
... status=EnumRegistryResponseStatus.PARTIAL,
|
|
95
|
+
... node_id=uuid4(),
|
|
96
|
+
... correlation_id=uuid4(),
|
|
97
|
+
... consul_result=ModelBackendResult(
|
|
98
|
+
... success=True, duration_ms=45.0, backend_id="consul"
|
|
99
|
+
... ),
|
|
100
|
+
... postgres_result=ModelBackendResult(
|
|
101
|
+
... success=False,
|
|
102
|
+
... error="Connection refused",
|
|
103
|
+
... duration_ms=5000.0,
|
|
104
|
+
... backend_id="postgres",
|
|
105
|
+
... ),
|
|
106
|
+
... processing_time_ms=5045.0,
|
|
107
|
+
... error_summary="PostgreSQL: Connection refused",
|
|
108
|
+
... )
|
|
109
|
+
>>> response.status == EnumRegistryResponseStatus.PARTIAL
|
|
110
|
+
True
|
|
111
|
+
>>> response.consul_result.success
|
|
112
|
+
True
|
|
113
|
+
>>> response.postgres_result.success
|
|
114
|
+
False
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
118
|
+
|
|
119
|
+
status: EnumRegistryResponseStatus = Field(
|
|
120
|
+
...,
|
|
121
|
+
description="Overall status: success, partial, or failed",
|
|
122
|
+
)
|
|
123
|
+
node_id: UUID = Field(
|
|
124
|
+
...,
|
|
125
|
+
description="UUID of the node that was registered",
|
|
126
|
+
)
|
|
127
|
+
correlation_id: UUID = Field(
|
|
128
|
+
...,
|
|
129
|
+
description="Correlation ID for distributed tracing",
|
|
130
|
+
)
|
|
131
|
+
consul_result: ModelBackendResult = Field(
|
|
132
|
+
...,
|
|
133
|
+
description="Result of the Consul registration operation",
|
|
134
|
+
)
|
|
135
|
+
postgres_result: ModelBackendResult = Field(
|
|
136
|
+
...,
|
|
137
|
+
description="Result of the PostgreSQL upsert operation",
|
|
138
|
+
)
|
|
139
|
+
processing_time_ms: float = Field(
|
|
140
|
+
default=0.0,
|
|
141
|
+
description="Total time for the dual-registration operation in milliseconds",
|
|
142
|
+
ge=0.0,
|
|
143
|
+
)
|
|
144
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
145
|
+
timestamp: datetime = Field(
|
|
146
|
+
...,
|
|
147
|
+
description="When this response was created (must be explicitly provided)",
|
|
148
|
+
)
|
|
149
|
+
error_summary: str | None = Field(
|
|
150
|
+
default=None,
|
|
151
|
+
description="Aggregated error message for failed operations",
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def from_backend_results(
|
|
156
|
+
cls,
|
|
157
|
+
node_id: UUID,
|
|
158
|
+
correlation_id: UUID,
|
|
159
|
+
consul_result: ModelBackendResult,
|
|
160
|
+
postgres_result: ModelBackendResult,
|
|
161
|
+
timestamp: datetime,
|
|
162
|
+
) -> ModelRegistryResponse:
|
|
163
|
+
"""Create a response from individual backend results.
|
|
164
|
+
|
|
165
|
+
Automatically determines the status based on backend success flags:
|
|
166
|
+
- Both success -> SUCCESS
|
|
167
|
+
- One success, one failure -> PARTIAL
|
|
168
|
+
- Both failure -> FAILED
|
|
169
|
+
|
|
170
|
+
Processing time is calculated from the sum of backend durations.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
node_id: UUID of the registered node.
|
|
174
|
+
correlation_id: Correlation ID for tracing.
|
|
175
|
+
consul_result: Result from Consul registration.
|
|
176
|
+
postgres_result: Result from PostgreSQL upsert.
|
|
177
|
+
timestamp: When this response was created (must be explicitly provided).
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
ModelRegistryResponse with computed status, processing_time, and error_summary.
|
|
181
|
+
"""
|
|
182
|
+
# Determine status based on backend results
|
|
183
|
+
if consul_result.success and postgres_result.success:
|
|
184
|
+
status = EnumRegistryResponseStatus.SUCCESS
|
|
185
|
+
elif consul_result.success or postgres_result.success:
|
|
186
|
+
status = EnumRegistryResponseStatus.PARTIAL
|
|
187
|
+
else:
|
|
188
|
+
status = EnumRegistryResponseStatus.FAILED
|
|
189
|
+
|
|
190
|
+
# Calculate processing time from backend durations
|
|
191
|
+
processing_time_ms = consul_result.duration_ms + postgres_result.duration_ms
|
|
192
|
+
|
|
193
|
+
# Build error summary from failed backends
|
|
194
|
+
errors: list[str] = []
|
|
195
|
+
if not consul_result.success and consul_result.error:
|
|
196
|
+
errors.append(f"Consul: {consul_result.error}")
|
|
197
|
+
if not postgres_result.success and postgres_result.error:
|
|
198
|
+
errors.append(f"PostgreSQL: {postgres_result.error}")
|
|
199
|
+
error_summary = "; ".join(errors) if errors else None
|
|
200
|
+
|
|
201
|
+
return cls(
|
|
202
|
+
status=status,
|
|
203
|
+
node_id=node_id,
|
|
204
|
+
correlation_id=correlation_id,
|
|
205
|
+
consul_result=consul_result,
|
|
206
|
+
postgres_result=postgres_result,
|
|
207
|
+
processing_time_ms=processing_time_ms,
|
|
208
|
+
timestamp=timestamp,
|
|
209
|
+
error_summary=error_summary,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
def is_complete_success(self) -> bool:
|
|
213
|
+
"""Check if both backends succeeded.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if status is SUCCESS, False otherwise.
|
|
217
|
+
"""
|
|
218
|
+
return self.status == EnumRegistryResponseStatus.SUCCESS
|
|
219
|
+
|
|
220
|
+
def is_partial_failure(self) -> bool:
|
|
221
|
+
"""Check if exactly one backend failed.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
True if status is PARTIAL, False otherwise.
|
|
225
|
+
"""
|
|
226
|
+
return self.status == EnumRegistryResponseStatus.PARTIAL
|
|
227
|
+
|
|
228
|
+
def is_complete_failure(self) -> bool:
|
|
229
|
+
"""Check if both backends failed.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
True if status is FAILED, False otherwise.
|
|
233
|
+
"""
|
|
234
|
+
return self.status == EnumRegistryResponseStatus.FAILED
|
|
235
|
+
|
|
236
|
+
def get_failed_backends(self) -> list[str]:
|
|
237
|
+
"""Get list of backends that failed.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
List of backend names that failed ("consul", "postgres").
|
|
241
|
+
"""
|
|
242
|
+
failed: list[str] = []
|
|
243
|
+
if not self.consul_result.success:
|
|
244
|
+
failed.append(EnumBackendType.CONSUL.value)
|
|
245
|
+
if not self.postgres_result.success:
|
|
246
|
+
failed.append(EnumBackendType.POSTGRES.value)
|
|
247
|
+
return failed
|
|
248
|
+
|
|
249
|
+
def get_successful_backends(self) -> list[str]:
|
|
250
|
+
"""Get list of backends that succeeded.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
List of backend names that succeeded ("consul", "postgres").
|
|
254
|
+
"""
|
|
255
|
+
succeeded: list[str] = []
|
|
256
|
+
if self.consul_result.success:
|
|
257
|
+
succeeded.append(EnumBackendType.CONSUL.value)
|
|
258
|
+
if self.postgres_result.success:
|
|
259
|
+
succeeded.append(EnumBackendType.POSTGRES.value)
|
|
260
|
+
return succeeded
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
__all__ = ["ModelRegistryResponse"]
|