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,170 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Protocol for Service Discovery Handler.
|
|
4
|
+
|
|
5
|
+
This module defines the protocol that service discovery handlers must implement
|
|
6
|
+
to be used with capability-oriented nodes.
|
|
7
|
+
|
|
8
|
+
Protocol Duplication Note:
|
|
9
|
+
This protocol is intentionally separate from the node-level protocol
|
|
10
|
+
at ``nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py``:
|
|
11
|
+
|
|
12
|
+
- **This protocol (handlers/*/protocol_*.py)**: Handler implementation
|
|
13
|
+
contract used by tests for compliance verification. Uses
|
|
14
|
+
``ModelServiceInfo`` with optional ``correlation_id``.
|
|
15
|
+
|
|
16
|
+
- **Node protocol (nodes/*/protocols/)**: Node-level contract used for
|
|
17
|
+
container-based dependency injection and registry binding.
|
|
18
|
+
|
|
19
|
+
The separation allows different parameter models and independent evolution
|
|
20
|
+
of handler contracts vs node-level DI contracts.
|
|
21
|
+
|
|
22
|
+
Concurrency Safety:
|
|
23
|
+
Implementations MUST be safe for concurrent async calls.
|
|
24
|
+
Multiple coroutines may invoke methods simultaneously.
|
|
25
|
+
Implementations should use asyncio.Lock for coroutine-safety
|
|
26
|
+
when protecting shared state.
|
|
27
|
+
|
|
28
|
+
Related:
|
|
29
|
+
- NodeServiceDiscoveryEffect: Effect node that uses this protocol
|
|
30
|
+
- HandlerServiceDiscoveryConsul: Consul implementation
|
|
31
|
+
- HandlerServiceDiscoveryMock: In-memory mock for testing
|
|
32
|
+
- nodes/node_service_discovery_effect/protocols/: Node-level protocol
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
from typing import Protocol, runtime_checkable
|
|
38
|
+
from uuid import UUID
|
|
39
|
+
|
|
40
|
+
from omnibase_infra.handlers.service_discovery.models import (
|
|
41
|
+
ModelDiscoveryResult,
|
|
42
|
+
ModelHandlerRegistrationResult,
|
|
43
|
+
ModelServiceInfo,
|
|
44
|
+
)
|
|
45
|
+
from omnibase_infra.nodes.node_service_discovery_effect.models import (
|
|
46
|
+
ModelDiscoveryQuery,
|
|
47
|
+
ModelServiceDiscoveryHealthCheckResult,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@runtime_checkable
|
|
52
|
+
class ProtocolDiscoveryOperations(Protocol):
|
|
53
|
+
"""Protocol for service discovery handler implementations.
|
|
54
|
+
|
|
55
|
+
Defines the interface that all service discovery handlers must implement.
|
|
56
|
+
Handlers are responsible for service registration, deregistration,
|
|
57
|
+
discovery, and health checking.
|
|
58
|
+
|
|
59
|
+
Concurrency Safety:
|
|
60
|
+
Implementations MUST be safe for concurrent async coroutine calls.
|
|
61
|
+
|
|
62
|
+
**Guarantees implementers MUST provide:**
|
|
63
|
+
- Concurrent method calls are coroutine-safe
|
|
64
|
+
- Connection pooling (if used) is async-safe
|
|
65
|
+
- Internal state (if any) is protected by asyncio.Lock
|
|
66
|
+
|
|
67
|
+
**What callers can assume:**
|
|
68
|
+
- Multiple coroutines can call methods concurrently
|
|
69
|
+
- Each operation is independent
|
|
70
|
+
- Failures in one operation do not affect others
|
|
71
|
+
|
|
72
|
+
Note: asyncio.Lock provides coroutine-safety, not thread-safety.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def handler_type(self) -> str:
|
|
77
|
+
"""Return the handler type identifier.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Handler type string (e.g., "consul", "mock").
|
|
81
|
+
"""
|
|
82
|
+
...
|
|
83
|
+
|
|
84
|
+
async def register_service(
|
|
85
|
+
self,
|
|
86
|
+
service_info: ModelServiceInfo,
|
|
87
|
+
correlation_id: UUID | None = None,
|
|
88
|
+
) -> ModelHandlerRegistrationResult:
|
|
89
|
+
"""Register a service with the discovery backend.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
service_info: Service information to register.
|
|
93
|
+
correlation_id: Optional correlation ID for tracing.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
ModelHandlerRegistrationResult with success status, service ID,
|
|
97
|
+
and operation metadata.
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
InfraConnectionError: If connection to backend fails.
|
|
101
|
+
InfraTimeoutError: If operation times out.
|
|
102
|
+
InfraUnavailableError: If circuit breaker is open.
|
|
103
|
+
"""
|
|
104
|
+
...
|
|
105
|
+
|
|
106
|
+
async def deregister_service(
|
|
107
|
+
self,
|
|
108
|
+
service_id: UUID,
|
|
109
|
+
correlation_id: UUID | None = None,
|
|
110
|
+
) -> None:
|
|
111
|
+
"""Deregister a service from the discovery backend.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
service_id: UUID of the service to deregister.
|
|
115
|
+
correlation_id: Optional correlation ID for tracing.
|
|
116
|
+
|
|
117
|
+
Raises:
|
|
118
|
+
InfraConnectionError: If connection to backend fails.
|
|
119
|
+
InfraTimeoutError: If operation times out.
|
|
120
|
+
InfraUnavailableError: If circuit breaker is open.
|
|
121
|
+
"""
|
|
122
|
+
...
|
|
123
|
+
|
|
124
|
+
async def discover_services(
|
|
125
|
+
self,
|
|
126
|
+
query: ModelDiscoveryQuery,
|
|
127
|
+
correlation_id: UUID | None = None,
|
|
128
|
+
) -> ModelDiscoveryResult:
|
|
129
|
+
"""Discover services matching the query criteria.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
query: Query parameters including service_name, tags,
|
|
133
|
+
and health_filter for filtering services.
|
|
134
|
+
correlation_id: Optional correlation ID for tracing.
|
|
135
|
+
If not provided, uses query.correlation_id.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
ModelDiscoveryResult with list of matching services
|
|
139
|
+
and operation metadata.
|
|
140
|
+
|
|
141
|
+
Raises:
|
|
142
|
+
InfraConnectionError: If connection to backend fails.
|
|
143
|
+
InfraTimeoutError: If operation times out.
|
|
144
|
+
InfraUnavailableError: If circuit breaker is open.
|
|
145
|
+
"""
|
|
146
|
+
...
|
|
147
|
+
|
|
148
|
+
async def health_check(
|
|
149
|
+
self,
|
|
150
|
+
correlation_id: UUID | None = None,
|
|
151
|
+
) -> ModelServiceDiscoveryHealthCheckResult:
|
|
152
|
+
"""Perform a health check on the handler.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
correlation_id: Optional correlation ID for tracing.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
ModelServiceDiscoveryHealthCheckResult: Health status including:
|
|
159
|
+
- healthy: bool indicating overall health
|
|
160
|
+
- backend_type: str identifying the backend
|
|
161
|
+
- latency_ms: float connection latency
|
|
162
|
+
- reason: str explaining the health status
|
|
163
|
+
- error_type: str | None exception type if failed
|
|
164
|
+
- details: ModelServiceDiscoveryHealthCheckDetails with typed diagnostics
|
|
165
|
+
- correlation_id: UUID | None for tracing
|
|
166
|
+
"""
|
|
167
|
+
...
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
__all__ = ["ProtocolDiscoveryOperations"]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure Idempotency System.
|
|
4
|
+
|
|
5
|
+
This module provides idempotency checking and deduplication capabilities
|
|
6
|
+
for message processing in distributed systems.
|
|
7
|
+
|
|
8
|
+
Components:
|
|
9
|
+
- Models: Pydantic models for idempotency records, check results, configuration, and metrics
|
|
10
|
+
- Store: Persistent storage backends for idempotency records (PostgreSQL, in-memory)
|
|
11
|
+
- Guard: Decorator and middleware for automatic idempotency checking
|
|
12
|
+
|
|
13
|
+
Models:
|
|
14
|
+
- ModelIdempotencyRecord: Record of a processed message for deduplication
|
|
15
|
+
- ModelIdempotencyCheckResult: Result of an idempotency check operation
|
|
16
|
+
- ModelIdempotencyStoreMetrics: Metrics for store observability
|
|
17
|
+
- ModelPostgresIdempotencyStoreConfig: Configuration for PostgreSQL store
|
|
18
|
+
- ModelIdempotencyGuardConfig: Configuration for the idempotency guard
|
|
19
|
+
|
|
20
|
+
Stores:
|
|
21
|
+
- StoreIdempotencyInmemory: In-memory store for testing (OMN-945)
|
|
22
|
+
- StoreIdempotencyPostgres: Production PostgreSQL store (OMN-945)
|
|
23
|
+
|
|
24
|
+
Example - InMemory (Testing):
|
|
25
|
+
>>> from omnibase_infra.idempotency import StoreIdempotencyInmemory
|
|
26
|
+
>>> from uuid import uuid4
|
|
27
|
+
>>>
|
|
28
|
+
>>> store = StoreIdempotencyInmemory()
|
|
29
|
+
>>> message_id = uuid4()
|
|
30
|
+
>>>
|
|
31
|
+
>>> # First call returns True (message is new)
|
|
32
|
+
>>> result = await store.check_and_record(message_id, domain="test")
|
|
33
|
+
>>> assert result is True
|
|
34
|
+
>>>
|
|
35
|
+
>>> # Second call returns False (duplicate)
|
|
36
|
+
>>> result = await store.check_and_record(message_id, domain="test")
|
|
37
|
+
>>> assert result is False
|
|
38
|
+
|
|
39
|
+
Example - Models:
|
|
40
|
+
>>> from omnibase_infra.idempotency import (
|
|
41
|
+
... ModelIdempotencyRecord,
|
|
42
|
+
... ModelIdempotencyCheckResult,
|
|
43
|
+
... ModelIdempotencyStoreMetrics,
|
|
44
|
+
... ModelPostgresIdempotencyStoreConfig,
|
|
45
|
+
... ModelIdempotencyGuardConfig,
|
|
46
|
+
... )
|
|
47
|
+
>>> from uuid import uuid4
|
|
48
|
+
>>> from datetime import datetime, timezone
|
|
49
|
+
>>>
|
|
50
|
+
>>> # Create an idempotency record
|
|
51
|
+
>>> record = ModelIdempotencyRecord(
|
|
52
|
+
... message_id=uuid4(),
|
|
53
|
+
... domain="orders",
|
|
54
|
+
... processed_at=datetime.now(timezone.utc),
|
|
55
|
+
... )
|
|
56
|
+
>>>
|
|
57
|
+
>>> # Configure the guard
|
|
58
|
+
>>> guard_config = ModelIdempotencyGuardConfig(
|
|
59
|
+
... enabled=True,
|
|
60
|
+
... store_type="postgres",
|
|
61
|
+
... domain_from_operation=True,
|
|
62
|
+
... )
|
|
63
|
+
>>>
|
|
64
|
+
>>> # Get store metrics
|
|
65
|
+
>>> metrics = store.get_metrics()
|
|
66
|
+
>>> print(f"Duplicate rate: {metrics.duplicate_rate:.2%}")
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
from omnibase_infra.idempotency.models import (
|
|
70
|
+
ModelIdempotencyCheckResult,
|
|
71
|
+
ModelIdempotencyGuardConfig,
|
|
72
|
+
ModelIdempotencyRecord,
|
|
73
|
+
ModelIdempotencyStoreMetrics,
|
|
74
|
+
ModelPostgresIdempotencyStoreConfig,
|
|
75
|
+
)
|
|
76
|
+
from omnibase_infra.idempotency.protocol_idempotency_store import (
|
|
77
|
+
ProtocolIdempotencyStore,
|
|
78
|
+
)
|
|
79
|
+
from omnibase_infra.idempotency.store_inmemory import StoreIdempotencyInmemory
|
|
80
|
+
from omnibase_infra.idempotency.store_postgres import StoreIdempotencyPostgres
|
|
81
|
+
|
|
82
|
+
__all__: list[str] = [
|
|
83
|
+
# Stores
|
|
84
|
+
"StoreIdempotencyInmemory",
|
|
85
|
+
# Models
|
|
86
|
+
"ModelIdempotencyCheckResult",
|
|
87
|
+
"ModelIdempotencyGuardConfig",
|
|
88
|
+
"ModelIdempotencyRecord",
|
|
89
|
+
"ModelIdempotencyStoreMetrics",
|
|
90
|
+
"ModelPostgresIdempotencyStoreConfig",
|
|
91
|
+
"StoreIdempotencyPostgres",
|
|
92
|
+
# Protocol
|
|
93
|
+
"ProtocolIdempotencyStore",
|
|
94
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure Idempotency Models.
|
|
4
|
+
|
|
5
|
+
This module provides Pydantic models for the idempotency system,
|
|
6
|
+
including records, check results, configuration, and metrics models.
|
|
7
|
+
|
|
8
|
+
Exports:
|
|
9
|
+
ModelIdempotencyStoreHealthCheckResult: Result of an idempotency store health check
|
|
10
|
+
ModelIdempotencyRecord: Represents a stored idempotency record
|
|
11
|
+
ModelIdempotencyCheckResult: Result of an idempotency check operation
|
|
12
|
+
ModelIdempotencyGuardConfig: Configuration for idempotency guard middleware
|
|
13
|
+
ModelIdempotencyStoreMetrics: Metrics for store observability
|
|
14
|
+
ModelPostgresIdempotencyStoreConfig: Configuration for PostgreSQL store
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from omnibase_infra.idempotency.models.model_idempotency_check_result import (
|
|
18
|
+
ModelIdempotencyCheckResult,
|
|
19
|
+
)
|
|
20
|
+
from omnibase_infra.idempotency.models.model_idempotency_guard_config import (
|
|
21
|
+
ModelIdempotencyGuardConfig,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.idempotency.models.model_idempotency_record import (
|
|
24
|
+
ModelIdempotencyRecord,
|
|
25
|
+
)
|
|
26
|
+
from omnibase_infra.idempotency.models.model_idempotency_store_health_check_result import (
|
|
27
|
+
ModelIdempotencyStoreHealthCheckResult,
|
|
28
|
+
)
|
|
29
|
+
from omnibase_infra.idempotency.models.model_idempotency_store_metrics import (
|
|
30
|
+
ModelIdempotencyStoreMetrics,
|
|
31
|
+
)
|
|
32
|
+
from omnibase_infra.idempotency.models.model_postgres_idempotency_store_config import (
|
|
33
|
+
ModelPostgresIdempotencyStoreConfig,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"ModelIdempotencyCheckResult",
|
|
38
|
+
"ModelIdempotencyGuardConfig",
|
|
39
|
+
"ModelIdempotencyRecord",
|
|
40
|
+
"ModelIdempotencyStoreHealthCheckResult",
|
|
41
|
+
"ModelIdempotencyStoreMetrics",
|
|
42
|
+
"ModelPostgresIdempotencyStoreConfig",
|
|
43
|
+
]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Idempotency Check Result Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for the result of an idempotency
|
|
6
|
+
check operation, indicating whether a message is a duplicate and providing
|
|
7
|
+
details about the original processing if applicable.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from uuid import UUID
|
|
14
|
+
|
|
15
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelIdempotencyCheckResult(BaseModel):
|
|
19
|
+
"""Result of an idempotency check operation.
|
|
20
|
+
|
|
21
|
+
This model represents the outcome of checking whether a message has
|
|
22
|
+
already been processed. It provides all necessary information for
|
|
23
|
+
the caller to decide how to proceed.
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
is_duplicate: True if the message has already been processed.
|
|
27
|
+
When True, the caller should skip processing this message.
|
|
28
|
+
message_id: The unique identifier of the checked message.
|
|
29
|
+
Echoed back for verification and logging purposes.
|
|
30
|
+
domain: Optional domain/namespace that was checked.
|
|
31
|
+
Matches the domain used in the idempotency check.
|
|
32
|
+
original_processed_at: Timestamp when the message was first processed.
|
|
33
|
+
Only populated when is_duplicate is True. Useful for debugging
|
|
34
|
+
and understanding the timing of duplicate messages.
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
>>> from uuid import uuid4
|
|
38
|
+
>>> from datetime import datetime, timezone
|
|
39
|
+
>>> # Non-duplicate result
|
|
40
|
+
>>> result = ModelIdempotencyCheckResult(
|
|
41
|
+
... is_duplicate=False,
|
|
42
|
+
... message_id=uuid4(),
|
|
43
|
+
... domain="orders",
|
|
44
|
+
... original_processed_at=None,
|
|
45
|
+
... )
|
|
46
|
+
>>> if not result.is_duplicate:
|
|
47
|
+
... print("Processing message...")
|
|
48
|
+
Processing message...
|
|
49
|
+
|
|
50
|
+
>>> # Duplicate result
|
|
51
|
+
>>> duplicate_result = ModelIdempotencyCheckResult(
|
|
52
|
+
... is_duplicate=True,
|
|
53
|
+
... message_id=uuid4(),
|
|
54
|
+
... domain="orders",
|
|
55
|
+
... original_processed_at=datetime.now(timezone.utc),
|
|
56
|
+
... )
|
|
57
|
+
>>> if duplicate_result.is_duplicate:
|
|
58
|
+
... print(f"Skipping duplicate, first processed at {duplicate_result.original_processed_at}")
|
|
59
|
+
Skipping duplicate, first processed at ...
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
model_config = ConfigDict(
|
|
63
|
+
frozen=True,
|
|
64
|
+
extra="forbid",
|
|
65
|
+
from_attributes=True,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
is_duplicate: bool = Field(
|
|
69
|
+
description="True if the message has already been processed",
|
|
70
|
+
)
|
|
71
|
+
message_id: UUID = Field(
|
|
72
|
+
description="Unique identifier of the checked message",
|
|
73
|
+
)
|
|
74
|
+
domain: str | None = Field(
|
|
75
|
+
default=None,
|
|
76
|
+
description="Domain/namespace that was checked",
|
|
77
|
+
max_length=255,
|
|
78
|
+
)
|
|
79
|
+
original_processed_at: datetime | None = Field(
|
|
80
|
+
default=None,
|
|
81
|
+
description="Timestamp when the message was first processed (only if duplicate)",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
__all__: list[str] = ["ModelIdempotencyCheckResult"]
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Idempotency Guard Configuration Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic configuration model for the idempotency
|
|
6
|
+
guard, which controls how idempotency checking is applied to message handlers.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Literal
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelIdempotencyGuardConfig(BaseModel):
|
|
17
|
+
"""Configuration for the idempotency guard.
|
|
18
|
+
|
|
19
|
+
The idempotency guard is a decorator or middleware that automatically
|
|
20
|
+
applies idempotency checking to message handlers. This configuration
|
|
21
|
+
controls its behavior, including which store backend to use and which
|
|
22
|
+
operations to skip.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
enabled: Whether idempotency checking is enabled.
|
|
26
|
+
When False, all messages are processed without deduplication.
|
|
27
|
+
Default: True.
|
|
28
|
+
store_type: Type of idempotency store to use.
|
|
29
|
+
"postgres" uses PostgreSQL for persistent storage.
|
|
30
|
+
"memory" uses in-memory storage (for testing only).
|
|
31
|
+
Default: "postgres".
|
|
32
|
+
domain_from_operation: Whether to extract domain from operation prefix.
|
|
33
|
+
When True, operations like "db.query" will use "db" as the domain.
|
|
34
|
+
This enables per-domain idempotency partitioning.
|
|
35
|
+
Default: True.
|
|
36
|
+
skip_operations: List of operations to skip idempotency checking for.
|
|
37
|
+
Useful for health checks, metrics endpoints, or other operations
|
|
38
|
+
that should always be processed.
|
|
39
|
+
Default: [].
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
>>> config = ModelIdempotencyGuardConfig(
|
|
43
|
+
... enabled=True,
|
|
44
|
+
... store_type="postgres",
|
|
45
|
+
... domain_from_operation=True,
|
|
46
|
+
... skip_operations=["health.check", "metrics.collect"],
|
|
47
|
+
... )
|
|
48
|
+
>>> print(config.store_type)
|
|
49
|
+
postgres
|
|
50
|
+
|
|
51
|
+
>>> # Check if an operation should be skipped
|
|
52
|
+
>>> "health.check" in config.skip_operations
|
|
53
|
+
True
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
model_config = ConfigDict(
|
|
57
|
+
frozen=True,
|
|
58
|
+
extra="forbid",
|
|
59
|
+
from_attributes=True,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
enabled: bool = Field(
|
|
63
|
+
default=True,
|
|
64
|
+
description="Whether idempotency checking is enabled",
|
|
65
|
+
)
|
|
66
|
+
store_type: Literal["postgres", "memory"] = Field(
|
|
67
|
+
default="postgres",
|
|
68
|
+
description="Type of idempotency store to use ('postgres' for production, 'memory' for testing)",
|
|
69
|
+
)
|
|
70
|
+
domain_from_operation: bool = Field(
|
|
71
|
+
default=True,
|
|
72
|
+
description="Extract domain from operation prefix (e.g., 'db.query' -> 'db')",
|
|
73
|
+
)
|
|
74
|
+
skip_operations: list[str] = Field(
|
|
75
|
+
default_factory=list,
|
|
76
|
+
description="Operations to skip idempotency checking for (e.g., health checks)",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
def should_check_idempotency(self, operation: str) -> bool:
|
|
80
|
+
"""Determine if idempotency should be checked for an operation.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
operation: The operation name to check.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
True if idempotency should be checked, False if skipped.
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
>>> config = ModelIdempotencyGuardConfig(
|
|
90
|
+
... enabled=True,
|
|
91
|
+
... skip_operations=["health.check"],
|
|
92
|
+
... )
|
|
93
|
+
>>> config.should_check_idempotency("db.query")
|
|
94
|
+
True
|
|
95
|
+
>>> config.should_check_idempotency("health.check")
|
|
96
|
+
False
|
|
97
|
+
"""
|
|
98
|
+
if not self.enabled:
|
|
99
|
+
return False
|
|
100
|
+
return operation not in self.skip_operations
|
|
101
|
+
|
|
102
|
+
def extract_domain(self, operation: str) -> str | None:
|
|
103
|
+
"""Extract domain from operation name if configured.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
operation: The operation name (e.g., "db.query", "orders.create").
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
The extracted domain if domain_from_operation is True and
|
|
110
|
+
operation contains a dot separator, otherwise None.
|
|
111
|
+
|
|
112
|
+
Example:
|
|
113
|
+
>>> config = ModelIdempotencyGuardConfig(domain_from_operation=True)
|
|
114
|
+
>>> config.extract_domain("db.query")
|
|
115
|
+
'db'
|
|
116
|
+
>>> config.extract_domain("simple_operation")
|
|
117
|
+
None
|
|
118
|
+
|
|
119
|
+
>>> config_no_domain = ModelIdempotencyGuardConfig(domain_from_operation=False)
|
|
120
|
+
>>> config_no_domain.extract_domain("db.query")
|
|
121
|
+
None
|
|
122
|
+
"""
|
|
123
|
+
if not self.domain_from_operation:
|
|
124
|
+
return None
|
|
125
|
+
if "." in operation:
|
|
126
|
+
return operation.split(".")[0]
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
__all__: list[str] = ["ModelIdempotencyGuardConfig"]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Idempotency Record Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for storing idempotency records
|
|
6
|
+
that track processed messages to prevent duplicate processing.
|
|
7
|
+
|
|
8
|
+
The record captures essential metadata about when and how a message was
|
|
9
|
+
processed, enabling deduplication across distributed systems.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from uuid import UUID, uuid4
|
|
16
|
+
|
|
17
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ModelIdempotencyRecord(BaseModel):
|
|
21
|
+
"""Record of a processed message for idempotency tracking.
|
|
22
|
+
|
|
23
|
+
This model represents a single idempotency record that tracks whether
|
|
24
|
+
a specific message has been processed. It is used by idempotency stores
|
|
25
|
+
to persist deduplication state.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
id: Unique identifier for this record (auto-generated UUID4).
|
|
29
|
+
domain: Optional domain/namespace for message categorization.
|
|
30
|
+
Used to partition idempotency checks (e.g., "orders", "payments").
|
|
31
|
+
message_id: The unique identifier of the processed message.
|
|
32
|
+
This is the primary key for idempotency lookups.
|
|
33
|
+
correlation_id: Optional correlation ID for distributed tracing.
|
|
34
|
+
Links this record to a broader request context.
|
|
35
|
+
processed_at: Timestamp when the message was processed.
|
|
36
|
+
Used for TTL-based cleanup of old records.
|
|
37
|
+
handler_type: Optional handler type identifier for debugging.
|
|
38
|
+
Records which handler processed this message.
|
|
39
|
+
|
|
40
|
+
Example:
|
|
41
|
+
>>> from uuid import uuid4
|
|
42
|
+
>>> from datetime import datetime, timezone
|
|
43
|
+
>>> record = ModelIdempotencyRecord(
|
|
44
|
+
... message_id=uuid4(),
|
|
45
|
+
... domain="orders",
|
|
46
|
+
... correlation_id=uuid4(),
|
|
47
|
+
... processed_at=datetime.now(timezone.utc),
|
|
48
|
+
... handler_type="OrderCreatedHandler",
|
|
49
|
+
... )
|
|
50
|
+
>>> print(record.message_id)
|
|
51
|
+
UUID('...')
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
model_config = ConfigDict(
|
|
55
|
+
frozen=True,
|
|
56
|
+
extra="forbid",
|
|
57
|
+
from_attributes=True,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
id: UUID = Field(
|
|
61
|
+
default_factory=uuid4,
|
|
62
|
+
description="Unique identifier for this idempotency record",
|
|
63
|
+
)
|
|
64
|
+
domain: str | None = Field(
|
|
65
|
+
default=None,
|
|
66
|
+
description="Domain/namespace for message categorization (e.g., 'orders', 'payments')",
|
|
67
|
+
max_length=255,
|
|
68
|
+
)
|
|
69
|
+
message_id: UUID = Field(
|
|
70
|
+
description="Unique identifier of the processed message (primary idempotency key)",
|
|
71
|
+
)
|
|
72
|
+
correlation_id: UUID | None = Field(
|
|
73
|
+
default=None,
|
|
74
|
+
description="Correlation ID for distributed tracing",
|
|
75
|
+
)
|
|
76
|
+
processed_at: datetime = Field(
|
|
77
|
+
description="Timestamp when the message was processed",
|
|
78
|
+
)
|
|
79
|
+
handler_type: str | None = Field(
|
|
80
|
+
default=None,
|
|
81
|
+
description="Handler type identifier for debugging purposes",
|
|
82
|
+
max_length=255,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
__all__: list[str] = ["ModelIdempotencyRecord"]
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Idempotency Store Health Check Result Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for health check results from
|
|
6
|
+
idempotency stores, replacing untyped dict[str, object] returns with
|
|
7
|
+
strongly-typed model instances.
|
|
8
|
+
|
|
9
|
+
Note:
|
|
10
|
+
This model is domain-specific to idempotency stores and uses a Literal
|
|
11
|
+
type for the `reason` field to constrain valid status values. For
|
|
12
|
+
general-purpose handler health checks, see
|
|
13
|
+
``omnibase_infra.runtime.models.ModelHealthCheckResult``.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from typing import Literal
|
|
19
|
+
|
|
20
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelIdempotencyStoreHealthCheckResult(BaseModel):
|
|
24
|
+
"""Result of an idempotency store health check.
|
|
25
|
+
|
|
26
|
+
This model represents the outcome of a health check operation on an
|
|
27
|
+
idempotency store, providing structured diagnostics about the store's
|
|
28
|
+
operational status.
|
|
29
|
+
|
|
30
|
+
Attributes:
|
|
31
|
+
healthy: Whether the store is healthy and operational.
|
|
32
|
+
When True, the store can accept operations normally.
|
|
33
|
+
When False, consult the reason field for diagnostics.
|
|
34
|
+
reason: Descriptive reason for the health status.
|
|
35
|
+
- "ok": Store is healthy and operational
|
|
36
|
+
- "not_initialized": Store has not been initialized
|
|
37
|
+
- "table_not_found": Required database table does not exist
|
|
38
|
+
- "check_failed": Health check encountered an exception
|
|
39
|
+
error_type: Exception type name if health check failed.
|
|
40
|
+
Only populated when reason is "check_failed".
|
|
41
|
+
Useful for debugging and categorizing failures.
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
>>> # Healthy store
|
|
45
|
+
>>> result = ModelIdempotencyStoreHealthCheckResult(healthy=True, reason="ok")
|
|
46
|
+
>>> if result.healthy:
|
|
47
|
+
... print("Store is operational")
|
|
48
|
+
Store is operational
|
|
49
|
+
|
|
50
|
+
>>> # Failed health check
|
|
51
|
+
>>> result = ModelIdempotencyStoreHealthCheckResult(
|
|
52
|
+
... healthy=False,
|
|
53
|
+
... reason="check_failed",
|
|
54
|
+
... error_type="ConnectionRefusedError",
|
|
55
|
+
... )
|
|
56
|
+
>>> if not result.healthy:
|
|
57
|
+
... print(f"Store unhealthy: {result.reason} ({result.error_type})")
|
|
58
|
+
Store unhealthy: check_failed (ConnectionRefusedError)
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
model_config = ConfigDict(
|
|
62
|
+
frozen=True,
|
|
63
|
+
extra="forbid",
|
|
64
|
+
from_attributes=True,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
healthy: bool = Field(
|
|
68
|
+
description="Whether the store is healthy and operational",
|
|
69
|
+
)
|
|
70
|
+
reason: Literal["ok", "not_initialized", "table_not_found", "check_failed"] = Field(
|
|
71
|
+
description="Reason for the health status",
|
|
72
|
+
)
|
|
73
|
+
error_type: str | None = Field(
|
|
74
|
+
default=None,
|
|
75
|
+
description="Exception type name if health check failed",
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
__all__: list[str] = [
|
|
80
|
+
"ModelIdempotencyStoreHealthCheckResult",
|
|
81
|
+
]
|