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,60 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""PostgreSQL upsert registration payload model for registration reducer.
|
|
4
|
+
|
|
5
|
+
This payload implements ProtocolIntentPayload for use with ModelIntent.
|
|
6
|
+
It contains the same data as ModelPostgresUpsertRegistrationIntent but with an
|
|
7
|
+
`intent_type` field instead of `kind` to satisfy the protocol.
|
|
8
|
+
|
|
9
|
+
Related:
|
|
10
|
+
- ModelPostgresUpsertRegistrationIntent: Core intent model (uses `kind` discriminator)
|
|
11
|
+
- ProtocolIntentPayload: Protocol requiring `intent_type` property
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from typing import Literal
|
|
17
|
+
from uuid import UUID
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field, SerializeAsAny
|
|
20
|
+
|
|
21
|
+
# NOTE: ModelIntentPayloadBase was removed in omnibase_core 0.6.2
|
|
22
|
+
# Using pydantic.BaseModel directly as the base class
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ModelPayloadPostgresUpsertRegistration(BaseModel):
|
|
26
|
+
"""Payload for PostgreSQL upsert registration intents.
|
|
27
|
+
|
|
28
|
+
This payload follows the ONEX intent payload pattern for use with ModelIntent.
|
|
29
|
+
|
|
30
|
+
Uses SerializeAsAny wrapper: the `record` field accepts any BaseModel subclass,
|
|
31
|
+
and serialization preserves all subclass fields via Pydantic's SerializeAsAny
|
|
32
|
+
type wrapper.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
intent_type: Discriminator literal for intent routing. Always "postgres.upsert_registration".
|
|
36
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
37
|
+
record: The registration record to upsert (uses SerializeAsAny for subclass preservation).
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
41
|
+
|
|
42
|
+
intent_type: Literal["postgres.upsert_registration"] = Field(
|
|
43
|
+
default="postgres.upsert_registration",
|
|
44
|
+
description="Discriminator literal for intent routing.",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
correlation_id: UUID = Field(
|
|
48
|
+
...,
|
|
49
|
+
description="Correlation ID for distributed tracing.",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
record: SerializeAsAny[BaseModel] = Field(
|
|
53
|
+
...,
|
|
54
|
+
description="Registration record to upsert. Accepts any BaseModel subclass.",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
__all__ = [
|
|
59
|
+
"ModelPayloadPostgresUpsertRegistration",
|
|
60
|
+
]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration Confirmation Model for Phase 2 Implementation.
|
|
4
|
+
|
|
5
|
+
This module provides ModelRegistrationConfirmation, the Pydantic model for
|
|
6
|
+
confirmation events from the Effect layer. These events complete the dual
|
|
7
|
+
registration workflow by confirming Consul and PostgreSQL operations.
|
|
8
|
+
|
|
9
|
+
Phase Status:
|
|
10
|
+
This is a Phase 1 placeholder model. The model contract is defined here
|
|
11
|
+
to ensure Phase 2 implementation aligns with Phase 1 reducer expectations.
|
|
12
|
+
|
|
13
|
+
Phase 2 Implementation (OMN-996):
|
|
14
|
+
- Effect layer nodes (ConsulAdapter, PostgresAdapter) will publish
|
|
15
|
+
confirmation events using this model
|
|
16
|
+
- RegistrationReducer.reduce_confirmation() will process these events
|
|
17
|
+
- Runtime will route confirmations based on event_type
|
|
18
|
+
|
|
19
|
+
Confirmation Event Flow:
|
|
20
|
+
1. Reducer emits intents (consul.register, postgres.upsert_registration)
|
|
21
|
+
2. Effect nodes execute intents and perform I/O
|
|
22
|
+
3. Effect nodes publish confirmation events to Kafka
|
|
23
|
+
4. Runtime routes confirmations to RegistrationReducer.reduce_confirmation()
|
|
24
|
+
5. Reducer updates state: pending -> partial -> complete (or -> failed)
|
|
25
|
+
|
|
26
|
+
Event Types:
|
|
27
|
+
- consul.registered: Consul service registration completed
|
|
28
|
+
- postgres.registration_upserted: PostgreSQL record upsert completed
|
|
29
|
+
|
|
30
|
+
Both event types may indicate success or failure via the ``success`` field.
|
|
31
|
+
On failure, ``error_message`` provides diagnostic information (sanitized).
|
|
32
|
+
|
|
33
|
+
State Transitions Triggered:
|
|
34
|
+
- success + consul.registered:
|
|
35
|
+
pending -> partial (if postgres pending)
|
|
36
|
+
partial -> complete (if postgres already confirmed)
|
|
37
|
+
|
|
38
|
+
- success + postgres.registration_upserted:
|
|
39
|
+
pending -> partial (if consul pending)
|
|
40
|
+
partial -> complete (if consul already confirmed)
|
|
41
|
+
|
|
42
|
+
- failure (any event_type):
|
|
43
|
+
pending -> failed
|
|
44
|
+
partial -> failed
|
|
45
|
+
|
|
46
|
+
Related:
|
|
47
|
+
- RegistrationReducer: Pure reducer that consumes this model
|
|
48
|
+
- ModelRegistrationState: State model updated by confirmations
|
|
49
|
+
- DESIGN_TWO_WAY_REGISTRATION_ARCHITECTURE.md: Architecture design
|
|
50
|
+
- OMN-889: Infrastructure MVP - Dual Registration Reducer
|
|
51
|
+
- OMN-996: Implement Confirmation Event Handling (follow-up)
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
from __future__ import annotations
|
|
55
|
+
|
|
56
|
+
from datetime import datetime
|
|
57
|
+
from uuid import UUID
|
|
58
|
+
|
|
59
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
60
|
+
|
|
61
|
+
from omnibase_infra.enums import EnumConfirmationEventType
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ModelRegistrationConfirmation(BaseModel):
|
|
65
|
+
"""Confirmation event for dual registration operations.
|
|
66
|
+
|
|
67
|
+
This model represents confirmation events published by Effect layer nodes
|
|
68
|
+
(ConsulAdapter, PostgresAdapter) after executing registration intents.
|
|
69
|
+
|
|
70
|
+
Phase 1 Stub:
|
|
71
|
+
This model defines the contract for confirmation events that will be
|
|
72
|
+
processed in Phase 2 implementation by RegistrationReducer.reduce_confirmation().
|
|
73
|
+
|
|
74
|
+
Immutability:
|
|
75
|
+
This model uses frozen=True to ensure confirmation events are immutable
|
|
76
|
+
once created. This aligns with the immutable event sourcing pattern.
|
|
77
|
+
|
|
78
|
+
Serialization:
|
|
79
|
+
This model is designed for Kafka transport. Effect nodes serialize using
|
|
80
|
+
``model_dump(mode="json")`` and the Runtime deserializes using
|
|
81
|
+
``model_validate()``.
|
|
82
|
+
|
|
83
|
+
Security Note:
|
|
84
|
+
The ``error_message`` field should contain sanitized error information
|
|
85
|
+
only. Effect nodes must NOT include credentials, connection strings,
|
|
86
|
+
or other sensitive information in error messages. See CLAUDE.md
|
|
87
|
+
"Error Sanitization Guidelines" for details.
|
|
88
|
+
|
|
89
|
+
Attributes:
|
|
90
|
+
event_type: The type of confirmation event.
|
|
91
|
+
- "consul.registered": Consul service registration result
|
|
92
|
+
- "postgres.registration_upserted": PostgreSQL upsert result
|
|
93
|
+
correlation_id: UUID linking this confirmation to the original
|
|
94
|
+
introspection event. Used by the reducer to match confirmations
|
|
95
|
+
to pending registrations.
|
|
96
|
+
node_id: UUID of the node being registered. Used for validation
|
|
97
|
+
to ensure confirmation matches the expected node.
|
|
98
|
+
success: Whether the registration operation succeeded.
|
|
99
|
+
- True: Operation completed successfully
|
|
100
|
+
- False: Operation failed (see error_message)
|
|
101
|
+
error_message: Optional error message if success is False.
|
|
102
|
+
Must be sanitized - no credentials or PII.
|
|
103
|
+
timestamp: When the confirmation was generated by the Effect node.
|
|
104
|
+
Used for observability and timeout tracking.
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
>>> from datetime import datetime, UTC
|
|
108
|
+
>>> from uuid import uuid4
|
|
109
|
+
>>> from omnibase_infra.enums import EnumConfirmationEventType
|
|
110
|
+
>>> confirmation = ModelRegistrationConfirmation(
|
|
111
|
+
... event_type=EnumConfirmationEventType.CONSUL_REGISTERED,
|
|
112
|
+
... correlation_id=uuid4(),
|
|
113
|
+
... node_id=uuid4(),
|
|
114
|
+
... success=True,
|
|
115
|
+
... timestamp=datetime.now(UTC),
|
|
116
|
+
... )
|
|
117
|
+
>>> confirmation.event_type
|
|
118
|
+
<EnumConfirmationEventType.CONSUL_REGISTERED: 'consul.registered'>
|
|
119
|
+
>>> confirmation.success
|
|
120
|
+
True
|
|
121
|
+
|
|
122
|
+
Example (failure case):
|
|
123
|
+
>>> from omnibase_infra.enums import EnumConfirmationEventType
|
|
124
|
+
>>> confirmation = ModelRegistrationConfirmation(
|
|
125
|
+
... event_type=EnumConfirmationEventType.POSTGRES_REGISTRATION_UPSERTED,
|
|
126
|
+
... correlation_id=uuid4(),
|
|
127
|
+
... node_id=uuid4(),
|
|
128
|
+
... success=False,
|
|
129
|
+
... error_message="Connection refused to database host",
|
|
130
|
+
... timestamp=datetime.now(UTC),
|
|
131
|
+
... )
|
|
132
|
+
>>> confirmation.success
|
|
133
|
+
False
|
|
134
|
+
>>> confirmation.error_message
|
|
135
|
+
'Connection refused to database host'
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
139
|
+
|
|
140
|
+
event_type: EnumConfirmationEventType = Field(
|
|
141
|
+
...,
|
|
142
|
+
description="The type of confirmation event (consul or postgres)",
|
|
143
|
+
)
|
|
144
|
+
correlation_id: UUID = Field(
|
|
145
|
+
...,
|
|
146
|
+
description="UUID linking this to the original registration request",
|
|
147
|
+
)
|
|
148
|
+
node_id: UUID = Field(
|
|
149
|
+
...,
|
|
150
|
+
description="UUID of the node being registered",
|
|
151
|
+
)
|
|
152
|
+
success: bool = Field(
|
|
153
|
+
...,
|
|
154
|
+
description="Whether the registration operation succeeded",
|
|
155
|
+
)
|
|
156
|
+
error_message: str | None = Field(
|
|
157
|
+
default=None,
|
|
158
|
+
description="Optional sanitized error message if success is False",
|
|
159
|
+
)
|
|
160
|
+
timestamp: datetime = Field(
|
|
161
|
+
...,
|
|
162
|
+
description="When the confirmation was generated",
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
__all__ = ["ModelRegistrationConfirmation"]
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration State Model for Pure Reducer Pattern.
|
|
4
|
+
|
|
5
|
+
This module provides ModelRegistrationState, an immutable state model for the
|
|
6
|
+
dual registration reducer workflow. The state follows the pure reducer pattern
|
|
7
|
+
where state is passed in and returned from reduce(), with no internal mutation.
|
|
8
|
+
|
|
9
|
+
Architecture:
|
|
10
|
+
ModelRegistrationState is designed for use with the canonical RegistrationReducer
|
|
11
|
+
pattern defined in DESIGN_TWO_WAY_REGISTRATION_ARCHITECTURE.md. The state is:
|
|
12
|
+
|
|
13
|
+
- Immutable (frozen=True): State transitions create new instances
|
|
14
|
+
- Minimal: Only tracks essential workflow state
|
|
15
|
+
- Type-safe: All fields have strict type annotations
|
|
16
|
+
|
|
17
|
+
State transitions are performed via `with_*` methods that return new
|
|
18
|
+
instances, ensuring the reducer remains pure and deterministic.
|
|
19
|
+
|
|
20
|
+
States:
|
|
21
|
+
- idle: Waiting for introspection events
|
|
22
|
+
- pending: Registration workflow started
|
|
23
|
+
- partial: One backend confirmed, waiting for the other
|
|
24
|
+
- complete: Both backends confirmed
|
|
25
|
+
- failed: Validation or registration failed
|
|
26
|
+
|
|
27
|
+
State Management:
|
|
28
|
+
This section documents the state lifecycle including immutability guarantees,
|
|
29
|
+
transition methods, and integration with the persistence layer.
|
|
30
|
+
|
|
31
|
+
**IMMUTABILITY GUARANTEES:**
|
|
32
|
+
|
|
33
|
+
This model enforces strict immutability via Pydantic's frozen=True:
|
|
34
|
+
|
|
35
|
+
- All field assignments after construction raise TypeError
|
|
36
|
+
- State transitions return NEW instances; original is unchanged
|
|
37
|
+
- This enables safe sharing across threads/async contexts
|
|
38
|
+
- The reducer can safely compare old_state vs new_state
|
|
39
|
+
|
|
40
|
+
Example of immutability behavior::
|
|
41
|
+
|
|
42
|
+
state1 = ModelRegistrationState(status=EnumRegistrationStatus.IDLE)
|
|
43
|
+
state2 = state1.with_pending_registration(node_id, event_id)
|
|
44
|
+
|
|
45
|
+
# state1 is unchanged (immutable)
|
|
46
|
+
assert state1.status == EnumRegistrationStatus.IDLE
|
|
47
|
+
assert state2.status == EnumRegistrationStatus.PENDING
|
|
48
|
+
|
|
49
|
+
# Attempting to mutate raises TypeError
|
|
50
|
+
state1.status = EnumRegistrationStatus.PENDING # Raises TypeError
|
|
51
|
+
|
|
52
|
+
**STATE TRANSITION METHODS:**
|
|
53
|
+
|
|
54
|
+
All state transitions are performed via ``with_*`` methods:
|
|
55
|
+
|
|
56
|
+
- ``with_pending_registration(node_id, event_id)``: idle -> pending
|
|
57
|
+
- ``with_consul_confirmed(event_id)``: pending -> partial, or partial -> complete
|
|
58
|
+
- ``with_postgres_confirmed(event_id)``: pending -> partial, or partial -> complete
|
|
59
|
+
- ``with_failure(reason, event_id)``: any -> failed
|
|
60
|
+
- ``with_reset(event_id)``: failed -> idle (recovery transition)
|
|
61
|
+
|
|
62
|
+
Each method:
|
|
63
|
+
|
|
64
|
+
1. Creates a NEW ModelRegistrationState instance
|
|
65
|
+
2. Copies relevant fields from self
|
|
66
|
+
3. Updates fields per transition logic
|
|
67
|
+
4. Returns the new instance (self is unchanged)
|
|
68
|
+
|
|
69
|
+
**INTEGRATION WITH PERSISTENCE LAYER:**
|
|
70
|
+
|
|
71
|
+
This model is persisted to PostgreSQL by the Projector component:
|
|
72
|
+
|
|
73
|
+
1. **Reducer Returns State**: After reduce() or reduce_confirmation(),
|
|
74
|
+
the RegistrationReducer returns ModelReducerOutput containing the
|
|
75
|
+
new state in the ``result`` field.
|
|
76
|
+
|
|
77
|
+
2. **Runtime Extracts State**: The Runtime extracts the state from
|
|
78
|
+
ModelReducerOutput.result for persistence.
|
|
79
|
+
|
|
80
|
+
3. **Projector Persists State**: The Projector writes the state to
|
|
81
|
+
PostgreSQL synchronously before any Kafka publishing.
|
|
82
|
+
|
|
83
|
+
4. **Serialization**: The Projector uses Pydantic's ``model_dump(mode="json")``
|
|
84
|
+
to serialize state for PostgreSQL storage.
|
|
85
|
+
|
|
86
|
+
PostgreSQL Storage::
|
|
87
|
+
|
|
88
|
+
# Conceptual Projector implementation
|
|
89
|
+
async def persist(self, state: ModelRegistrationState, offset: int) -> None:
|
|
90
|
+
'''Persist state to PostgreSQL with idempotency.'''
|
|
91
|
+
await self.db.execute(
|
|
92
|
+
'''
|
|
93
|
+
UPDATE node_registrations
|
|
94
|
+
SET
|
|
95
|
+
status = $1,
|
|
96
|
+
consul_confirmed = $2,
|
|
97
|
+
postgres_confirmed = $3,
|
|
98
|
+
last_processed_event_id = $4,
|
|
99
|
+
failure_reason = $5,
|
|
100
|
+
last_event_offset = $6,
|
|
101
|
+
updated_at = NOW()
|
|
102
|
+
WHERE
|
|
103
|
+
node_id = $7
|
|
104
|
+
AND (last_event_offset IS NULL OR $6 > last_event_offset)
|
|
105
|
+
''',
|
|
106
|
+
state.status,
|
|
107
|
+
state.consul_confirmed,
|
|
108
|
+
state.postgres_confirmed,
|
|
109
|
+
state.last_processed_event_id,
|
|
110
|
+
state.failure_reason,
|
|
111
|
+
offset,
|
|
112
|
+
state.node_id,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
**State Loading (Projection Reader)**::
|
|
116
|
+
|
|
117
|
+
# Conceptual ProtocolProjectionReader implementation
|
|
118
|
+
async def get_projection(
|
|
119
|
+
self, entity_type: str, entity_id: UUID
|
|
120
|
+
) -> ModelRegistrationState | None:
|
|
121
|
+
'''Load state from PostgreSQL projection.'''
|
|
122
|
+
row = await self.db.fetchone(
|
|
123
|
+
'SELECT * FROM node_registrations WHERE node_id = $1',
|
|
124
|
+
entity_id,
|
|
125
|
+
)
|
|
126
|
+
if row is None:
|
|
127
|
+
return None # Orchestrator creates initial idle state
|
|
128
|
+
return ModelRegistrationState(
|
|
129
|
+
status=row['status'],
|
|
130
|
+
node_id=row['node_id'],
|
|
131
|
+
consul_confirmed=row['consul_confirmed'],
|
|
132
|
+
postgres_confirmed=row['postgres_confirmed'],
|
|
133
|
+
last_processed_event_id=row['last_processed_event_id'],
|
|
134
|
+
failure_reason=row['failure_reason'],
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
**IDEMPOTENCY VIA last_processed_event_id:**
|
|
138
|
+
|
|
139
|
+
The ``last_processed_event_id`` field enables idempotent event processing:
|
|
140
|
+
|
|
141
|
+
- Each event has a unique ID (correlation_id or generated UUID)
|
|
142
|
+
- Before processing, the reducer checks ``state.is_duplicate_event(event_id)``
|
|
143
|
+
- If True, the event was already processed; reducer returns current state
|
|
144
|
+
- This enables safe replay after crashes or redelivery
|
|
145
|
+
|
|
146
|
+
Two levels of idempotency:
|
|
147
|
+
|
|
148
|
+
1. **Reducer Level**: ``is_duplicate_event()`` checks ``last_processed_event_id``
|
|
149
|
+
2. **Persistence Level**: Projector checks ``last_event_offset`` in SQL
|
|
150
|
+
|
|
151
|
+
Both levels are required for full replay safety.
|
|
152
|
+
|
|
153
|
+
Related:
|
|
154
|
+
- RegistrationReducer: Pure reducer that uses this state model
|
|
155
|
+
- DESIGN_TWO_WAY_REGISTRATION_ARCHITECTURE.md: Architecture design
|
|
156
|
+
- ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md: Tickets F0, F1, B3
|
|
157
|
+
- OMN-889: Infrastructure MVP
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
from __future__ import annotations
|
|
161
|
+
|
|
162
|
+
from typing import Literal
|
|
163
|
+
from uuid import UUID
|
|
164
|
+
|
|
165
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
166
|
+
|
|
167
|
+
from omnibase_infra.enums import EnumRegistrationStatus
|
|
168
|
+
|
|
169
|
+
# Type alias for failure reason literals
|
|
170
|
+
FailureReason = Literal[
|
|
171
|
+
"validation_failed",
|
|
172
|
+
"consul_failed",
|
|
173
|
+
"postgres_failed",
|
|
174
|
+
"both_failed",
|
|
175
|
+
"invalid_reset_state",
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class ModelRegistrationState(BaseModel):
|
|
180
|
+
"""State model for the dual registration reducer workflow.
|
|
181
|
+
|
|
182
|
+
Immutable state passed to and returned from reduce().
|
|
183
|
+
Follows pure reducer pattern - no internal state mutation.
|
|
184
|
+
|
|
185
|
+
The state tracks the current workflow status and confirmation state
|
|
186
|
+
for both Consul and PostgreSQL backends. State transitions are
|
|
187
|
+
performed via ``with_*`` methods that return new immutable instances.
|
|
188
|
+
|
|
189
|
+
Persistence Integration:
|
|
190
|
+
This model is designed for persistence to PostgreSQL via the Projector:
|
|
191
|
+
|
|
192
|
+
- **Stored**: By Runtime calling Projector.persist() after reduce() returns
|
|
193
|
+
- **Retrieved**: By Orchestrator via ProtocolProjectionReader before reduce()
|
|
194
|
+
- **Idempotency**: ``last_processed_event_id`` enables duplicate detection
|
|
195
|
+
|
|
196
|
+
The reducer does NOT persist state directly - it returns the new state
|
|
197
|
+
in ModelReducerOutput.result. The Runtime handles persistence.
|
|
198
|
+
|
|
199
|
+
See the module docstring "State Management" section for complete details
|
|
200
|
+
on persistence integration, including PostgreSQL schema and example code.
|
|
201
|
+
|
|
202
|
+
Immutability:
|
|
203
|
+
This model uses frozen=True to enforce strict immutability:
|
|
204
|
+
|
|
205
|
+
- All fields are immutable after construction
|
|
206
|
+
- Transition methods (with_*) return NEW instances
|
|
207
|
+
- Original state is never modified
|
|
208
|
+
- Safe for concurrent access and comparison
|
|
209
|
+
|
|
210
|
+
Attributes:
|
|
211
|
+
status: Current workflow status (idle, pending, partial, complete, failed).
|
|
212
|
+
node_id: UUID of the node being registered, if any.
|
|
213
|
+
consul_confirmed: Whether Consul registration is confirmed.
|
|
214
|
+
postgres_confirmed: Whether PostgreSQL registration is confirmed.
|
|
215
|
+
last_processed_event_id: UUID of last processed event for idempotency.
|
|
216
|
+
failure_reason: Reason for failure, if status is "failed".
|
|
217
|
+
|
|
218
|
+
Example:
|
|
219
|
+
>>> from uuid import uuid4
|
|
220
|
+
>>> state = ModelRegistrationState() # Initial idle state
|
|
221
|
+
>>> state.status
|
|
222
|
+
'idle'
|
|
223
|
+
>>> node_id, event_id = uuid4(), uuid4()
|
|
224
|
+
>>> state = state.with_pending_registration(node_id, event_id)
|
|
225
|
+
>>> state.status
|
|
226
|
+
'pending'
|
|
227
|
+
>>> state = state.with_consul_confirmed(uuid4())
|
|
228
|
+
>>> state.status
|
|
229
|
+
'partial'
|
|
230
|
+
>>> state = state.with_postgres_confirmed(uuid4())
|
|
231
|
+
>>> state.status
|
|
232
|
+
'complete'
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
236
|
+
|
|
237
|
+
status: EnumRegistrationStatus = Field(
|
|
238
|
+
default=EnumRegistrationStatus.IDLE,
|
|
239
|
+
description="Current workflow status",
|
|
240
|
+
)
|
|
241
|
+
node_id: UUID | None = Field(
|
|
242
|
+
default=None,
|
|
243
|
+
description="Node being registered",
|
|
244
|
+
)
|
|
245
|
+
consul_confirmed: bool = Field(
|
|
246
|
+
default=False,
|
|
247
|
+
description="Whether Consul registration is confirmed",
|
|
248
|
+
)
|
|
249
|
+
postgres_confirmed: bool = Field(
|
|
250
|
+
default=False,
|
|
251
|
+
description="Whether PostgreSQL registration is confirmed",
|
|
252
|
+
)
|
|
253
|
+
last_processed_event_id: UUID | None = Field(
|
|
254
|
+
default=None,
|
|
255
|
+
description="Last processed event ID for idempotency",
|
|
256
|
+
)
|
|
257
|
+
failure_reason: FailureReason | None = Field(
|
|
258
|
+
default=None,
|
|
259
|
+
description="Reason for failure, if status is failed",
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
def with_pending_registration(
|
|
263
|
+
self, node_id: UUID, event_id: UUID
|
|
264
|
+
) -> ModelRegistrationState:
|
|
265
|
+
"""Transition to pending state for a new registration.
|
|
266
|
+
|
|
267
|
+
Creates a new state instance with status="pending" and the given
|
|
268
|
+
node_id. Resets confirmation flags and clears any failure reason.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
node_id: UUID of the node being registered.
|
|
272
|
+
event_id: UUID of the event triggering this transition.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
New ModelRegistrationState with pending status.
|
|
276
|
+
"""
|
|
277
|
+
return ModelRegistrationState(
|
|
278
|
+
status=EnumRegistrationStatus.PENDING,
|
|
279
|
+
node_id=node_id,
|
|
280
|
+
consul_confirmed=False,
|
|
281
|
+
postgres_confirmed=False,
|
|
282
|
+
last_processed_event_id=event_id,
|
|
283
|
+
failure_reason=None,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
def with_consul_confirmed(self, event_id: UUID) -> ModelRegistrationState:
|
|
287
|
+
"""Transition state after Consul registration is confirmed.
|
|
288
|
+
|
|
289
|
+
If PostgreSQL is already confirmed, status becomes "complete".
|
|
290
|
+
Otherwise, status becomes "partial".
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
event_id: UUID of the event confirming Consul registration.
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
New ModelRegistrationState with consul_confirmed=True.
|
|
297
|
+
"""
|
|
298
|
+
new_status: EnumRegistrationStatus = (
|
|
299
|
+
EnumRegistrationStatus.COMPLETE
|
|
300
|
+
if self.postgres_confirmed
|
|
301
|
+
else EnumRegistrationStatus.PARTIAL
|
|
302
|
+
)
|
|
303
|
+
return ModelRegistrationState(
|
|
304
|
+
status=new_status,
|
|
305
|
+
node_id=self.node_id,
|
|
306
|
+
consul_confirmed=True,
|
|
307
|
+
postgres_confirmed=self.postgres_confirmed,
|
|
308
|
+
last_processed_event_id=event_id,
|
|
309
|
+
failure_reason=None,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
def with_postgres_confirmed(self, event_id: UUID) -> ModelRegistrationState:
|
|
313
|
+
"""Transition state after PostgreSQL registration is confirmed.
|
|
314
|
+
|
|
315
|
+
If Consul is already confirmed, status becomes "complete".
|
|
316
|
+
Otherwise, status becomes "partial".
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
event_id: UUID of the event confirming PostgreSQL registration.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
New ModelRegistrationState with postgres_confirmed=True.
|
|
323
|
+
"""
|
|
324
|
+
new_status: EnumRegistrationStatus = (
|
|
325
|
+
EnumRegistrationStatus.COMPLETE
|
|
326
|
+
if self.consul_confirmed
|
|
327
|
+
else EnumRegistrationStatus.PARTIAL
|
|
328
|
+
)
|
|
329
|
+
return ModelRegistrationState(
|
|
330
|
+
status=new_status,
|
|
331
|
+
node_id=self.node_id,
|
|
332
|
+
consul_confirmed=self.consul_confirmed,
|
|
333
|
+
postgres_confirmed=True,
|
|
334
|
+
last_processed_event_id=event_id,
|
|
335
|
+
failure_reason=None,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
def with_failure(
|
|
339
|
+
self, reason: FailureReason, event_id: UUID
|
|
340
|
+
) -> ModelRegistrationState:
|
|
341
|
+
"""Transition to failed state with a reason.
|
|
342
|
+
|
|
343
|
+
Preserves current confirmation flags for diagnostic purposes.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
reason: The failure reason (validation_failed, consul_failed,
|
|
347
|
+
postgres_failed, or both_failed).
|
|
348
|
+
event_id: UUID of the event triggering the failure.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
New ModelRegistrationState with status="failed" and failure_reason set.
|
|
352
|
+
"""
|
|
353
|
+
return ModelRegistrationState(
|
|
354
|
+
status=EnumRegistrationStatus.FAILED,
|
|
355
|
+
node_id=self.node_id,
|
|
356
|
+
consul_confirmed=self.consul_confirmed,
|
|
357
|
+
postgres_confirmed=self.postgres_confirmed,
|
|
358
|
+
last_processed_event_id=event_id,
|
|
359
|
+
failure_reason=reason,
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
def is_duplicate_event(self, event_id: UUID) -> bool:
|
|
363
|
+
"""Check if an event has already been processed.
|
|
364
|
+
|
|
365
|
+
Used for idempotency to skip duplicate event processing.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
event_id: UUID of the event to check.
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
True if this event_id matches the last processed event.
|
|
372
|
+
"""
|
|
373
|
+
return self.last_processed_event_id == event_id
|
|
374
|
+
|
|
375
|
+
def with_reset(self, event_id: UUID) -> ModelRegistrationState:
|
|
376
|
+
"""Transition from failed state back to idle for retry.
|
|
377
|
+
|
|
378
|
+
Allows recovery from failed states by resetting to idle. This enables
|
|
379
|
+
the FSM to process new introspection events after a failure.
|
|
380
|
+
|
|
381
|
+
This method can be called from any state but is primarily intended
|
|
382
|
+
for recovery from the failed state. All confirmation flags are reset
|
|
383
|
+
and the failure reason is cleared.
|
|
384
|
+
|
|
385
|
+
State Diagram::
|
|
386
|
+
|
|
387
|
+
+--------+ reset event +------+
|
|
388
|
+
| failed | --------------> | idle |
|
|
389
|
+
+--------+ +------+
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
event_id: UUID of the reset event triggering this transition.
|
|
393
|
+
|
|
394
|
+
Returns:
|
|
395
|
+
New ModelRegistrationState with status="idle" and all flags reset.
|
|
396
|
+
|
|
397
|
+
Example:
|
|
398
|
+
>>> from uuid import uuid4
|
|
399
|
+
>>> from omnibase_infra.enums import EnumRegistrationStatus
|
|
400
|
+
>>> state = ModelRegistrationState(
|
|
401
|
+
... status=EnumRegistrationStatus.FAILED, failure_reason="consul_failed"
|
|
402
|
+
... )
|
|
403
|
+
>>> reset_state = state.with_reset(uuid4())
|
|
404
|
+
>>> reset_state.status == EnumRegistrationStatus.IDLE
|
|
405
|
+
True
|
|
406
|
+
>>> reset_state.failure_reason is None
|
|
407
|
+
True
|
|
408
|
+
"""
|
|
409
|
+
return ModelRegistrationState(
|
|
410
|
+
status=EnumRegistrationStatus.IDLE,
|
|
411
|
+
node_id=None,
|
|
412
|
+
consul_confirmed=False,
|
|
413
|
+
postgres_confirmed=False,
|
|
414
|
+
last_processed_event_id=event_id,
|
|
415
|
+
failure_reason=None,
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
def can_reset(self) -> bool:
|
|
419
|
+
"""Check if the current state allows reset to idle.
|
|
420
|
+
|
|
421
|
+
Returns True if the state is in a terminal or error state that
|
|
422
|
+
can be reset. This includes 'failed' and 'complete' states.
|
|
423
|
+
|
|
424
|
+
Returns:
|
|
425
|
+
True if reset is allowed from the current state.
|
|
426
|
+
"""
|
|
427
|
+
return self.status in (
|
|
428
|
+
EnumRegistrationStatus.FAILED,
|
|
429
|
+
EnumRegistrationStatus.COMPLETE,
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
__all__ = ["ModelRegistrationState"]
|