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,656 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Coroutine-safe async circuit breaker mixin for infrastructure components.
|
|
4
|
+
|
|
5
|
+
This module provides a reusable circuit breaker implementation for infrastructure
|
|
6
|
+
components such as event buses, service adapters, HTTP clients, and database
|
|
7
|
+
connections. It implements the standard 3-state circuit breaker pattern with
|
|
8
|
+
coroutine-safe async operations.
|
|
9
|
+
|
|
10
|
+
Circuit Breaker States:
|
|
11
|
+
- CLOSED: Normal operation, requests allowed
|
|
12
|
+
- OPEN: Circuit tripped, requests blocked
|
|
13
|
+
- HALF_OPEN: Testing recovery, limited requests allowed
|
|
14
|
+
|
|
15
|
+
Features:
|
|
16
|
+
- Coroutine-safe state management using asyncio.Lock
|
|
17
|
+
- Automatic state transitions based on failure thresholds
|
|
18
|
+
- Time-based auto-reset with configurable timeout
|
|
19
|
+
- Infrastructure error integration (InfraUnavailableError)
|
|
20
|
+
- Correlation ID propagation for distributed tracing
|
|
21
|
+
- Configurable failure thresholds and reset timeouts
|
|
22
|
+
|
|
23
|
+
Usage:
|
|
24
|
+
```python
|
|
25
|
+
from omnibase_infra.mixins import MixinAsyncCircuitBreaker
|
|
26
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
27
|
+
|
|
28
|
+
class EventBusKafka(MixinAsyncCircuitBreaker):
|
|
29
|
+
def __init__(self, config):
|
|
30
|
+
# Initialize circuit breaker with configuration
|
|
31
|
+
self._init_circuit_breaker(
|
|
32
|
+
threshold=config.circuit_breaker_threshold,
|
|
33
|
+
reset_timeout=config.circuit_breaker_reset_timeout,
|
|
34
|
+
service_name=f"kafka.{config.environment}",
|
|
35
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
async def publish(
|
|
39
|
+
self, topic: str, key: str, value: bytes, correlation_id: UUID | None = None
|
|
40
|
+
) -> None:
|
|
41
|
+
# Check circuit before operation
|
|
42
|
+
async with self._circuit_breaker_lock:
|
|
43
|
+
await self._check_circuit_breaker(
|
|
44
|
+
operation="publish",
|
|
45
|
+
correlation_id=correlation_id,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
# Perform operation
|
|
50
|
+
await self._kafka_producer.send(topic, key, value)
|
|
51
|
+
|
|
52
|
+
# Record success
|
|
53
|
+
async with self._circuit_breaker_lock:
|
|
54
|
+
await self._reset_circuit_breaker()
|
|
55
|
+
|
|
56
|
+
except Exception:
|
|
57
|
+
# Record failure
|
|
58
|
+
async with self._circuit_breaker_lock:
|
|
59
|
+
await self._record_circuit_failure(
|
|
60
|
+
operation="publish",
|
|
61
|
+
correlation_id=correlation_id,
|
|
62
|
+
)
|
|
63
|
+
raise
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Concurrency Safety:
|
|
67
|
+
All circuit breaker methods require the caller to hold `_circuit_breaker_lock`
|
|
68
|
+
before invocation. This is documented in each method's docstring using:
|
|
69
|
+
"REQUIRES: self._circuit_breaker_lock must be held by caller."
|
|
70
|
+
|
|
71
|
+
Note: This mixin uses asyncio.Lock which provides coroutine-safe access,
|
|
72
|
+
not thread-safe access. For true multi-threaded usage, additional
|
|
73
|
+
synchronization (e.g., threading.Lock) would be required.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
```python
|
|
77
|
+
# Correct - lock held by caller
|
|
78
|
+
async with self._circuit_breaker_lock:
|
|
79
|
+
await self._check_circuit_breaker("operation")
|
|
80
|
+
|
|
81
|
+
# Incorrect - race condition between coroutines!
|
|
82
|
+
await self._check_circuit_breaker("operation")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Integration Requirements:
|
|
86
|
+
Classes using this mixin must:
|
|
87
|
+
1. Call `_init_circuit_breaker()` during initialization
|
|
88
|
+
2. Use `async with self._circuit_breaker_lock` before calling circuit methods
|
|
89
|
+
3. Pass appropriate operation name and correlation_id to circuit methods
|
|
90
|
+
4. Handle InfraUnavailableError when circuit is open
|
|
91
|
+
|
|
92
|
+
See Also:
|
|
93
|
+
- docs/analysis/CIRCUIT_BREAKER_COMPARISON.md for design rationale
|
|
94
|
+
- src/omnibase_infra/event_bus/event_bus_kafka.py for reference implementation
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
from __future__ import annotations
|
|
98
|
+
|
|
99
|
+
import asyncio
|
|
100
|
+
import logging
|
|
101
|
+
import time
|
|
102
|
+
from uuid import UUID, uuid4
|
|
103
|
+
|
|
104
|
+
from omnibase_core.types import JsonType
|
|
105
|
+
from omnibase_infra.enums import EnumCircuitState, EnumInfraTransportType
|
|
106
|
+
from omnibase_infra.errors import (
|
|
107
|
+
InfraUnavailableError,
|
|
108
|
+
ModelInfraErrorContext,
|
|
109
|
+
ProtocolConfigurationError,
|
|
110
|
+
)
|
|
111
|
+
from omnibase_infra.models.resilience import ModelCircuitBreakerConfig
|
|
112
|
+
|
|
113
|
+
logger = logging.getLogger(__name__)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class MixinAsyncCircuitBreaker:
|
|
117
|
+
"""Coroutine-safe async circuit breaker mixin for infrastructure components.
|
|
118
|
+
|
|
119
|
+
Provides circuit breaker pattern implementation with:
|
|
120
|
+
- Coroutine-safe state management using asyncio.Lock
|
|
121
|
+
- Configurable failure thresholds and reset timeouts
|
|
122
|
+
- Automatic state transitions (CLOSED → OPEN → HALF_OPEN → CLOSED)
|
|
123
|
+
- Infrastructure error integration (InfraUnavailableError)
|
|
124
|
+
- Correlation ID propagation for distributed tracing
|
|
125
|
+
|
|
126
|
+
State Variables:
|
|
127
|
+
_circuit_breaker_failures: Failure counter (incremented on each failure)
|
|
128
|
+
_circuit_breaker_open: Circuit open/closed state (True = open)
|
|
129
|
+
_circuit_breaker_open_until: Timestamp for automatic reset
|
|
130
|
+
_circuit_breaker_lock: asyncio.Lock for coroutine-safe access
|
|
131
|
+
|
|
132
|
+
Configuration Variables (public attributes set by _init_circuit_breaker):
|
|
133
|
+
circuit_breaker_threshold: Max failures before opening (default: 5)
|
|
134
|
+
circuit_breaker_reset_timeout: Auto-reset timeout in seconds (default: 60.0)
|
|
135
|
+
service_name: Service identifier for error context
|
|
136
|
+
|
|
137
|
+
Concurrency Safety:
|
|
138
|
+
All circuit breaker methods MUST be called while holding
|
|
139
|
+
`_circuit_breaker_lock`. Callers are responsible for lock acquisition.
|
|
140
|
+
Note: asyncio.Lock protects against concurrent coroutine access,
|
|
141
|
+
not OS thread access. For multi-threaded scenarios, use threading.Lock.
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
async with self._circuit_breaker_lock:
|
|
145
|
+
await self._check_circuit_breaker("operation")
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Example:
|
|
149
|
+
```python
|
|
150
|
+
class ConsulAdapter(MixinAsyncCircuitBreaker):
|
|
151
|
+
def __init__(self, config):
|
|
152
|
+
self._init_circuit_breaker(
|
|
153
|
+
threshold=5,
|
|
154
|
+
reset_timeout=30.0,
|
|
155
|
+
service_name="consul.dev",
|
|
156
|
+
transport_type=EnumInfraTransportType.CONSUL,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
async def register_service(
|
|
160
|
+
self, service: str, correlation_id: UUID | None = None
|
|
161
|
+
) -> None:
|
|
162
|
+
# Check circuit (coroutine-safe)
|
|
163
|
+
async with self._circuit_breaker_lock:
|
|
164
|
+
await self._check_circuit_breaker(
|
|
165
|
+
operation="register_service",
|
|
166
|
+
correlation_id=correlation_id,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
# Perform operation
|
|
171
|
+
await self._consul_client.register(service)
|
|
172
|
+
|
|
173
|
+
# Record success (coroutine-safe)
|
|
174
|
+
async with self._circuit_breaker_lock:
|
|
175
|
+
await self._reset_circuit_breaker()
|
|
176
|
+
|
|
177
|
+
except Exception:
|
|
178
|
+
# Record failure (coroutine-safe)
|
|
179
|
+
async with self._circuit_breaker_lock:
|
|
180
|
+
await self._record_circuit_failure(
|
|
181
|
+
operation="register_service",
|
|
182
|
+
correlation_id=correlation_id,
|
|
183
|
+
)
|
|
184
|
+
raise
|
|
185
|
+
```
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
def _init_circuit_breaker(
|
|
189
|
+
self,
|
|
190
|
+
threshold: int = 5,
|
|
191
|
+
reset_timeout: float = 60.0,
|
|
192
|
+
service_name: str = "unknown",
|
|
193
|
+
transport_type: EnumInfraTransportType = EnumInfraTransportType.HTTP,
|
|
194
|
+
) -> None:
|
|
195
|
+
"""Initialize circuit breaker state and configuration.
|
|
196
|
+
|
|
197
|
+
Must be called during class initialization before any circuit breaker
|
|
198
|
+
operations are performed.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
threshold: Maximum failures before opening circuit (default: 5)
|
|
202
|
+
reset_timeout: Seconds before automatic reset (default: 60.0)
|
|
203
|
+
service_name: Service identifier for error context (e.g., "kafka.dev")
|
|
204
|
+
transport_type: Transport type for error context (default: HTTP)
|
|
205
|
+
|
|
206
|
+
Raises:
|
|
207
|
+
ValueError: If threshold < 1 or reset_timeout < 0
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
```python
|
|
211
|
+
class MyService(MixinAsyncCircuitBreaker):
|
|
212
|
+
def __init__(self, config):
|
|
213
|
+
self._init_circuit_breaker(
|
|
214
|
+
threshold=config.circuit_breaker_threshold,
|
|
215
|
+
reset_timeout=config.circuit_breaker_reset_timeout,
|
|
216
|
+
service_name=f"my-service.{config.environment}",
|
|
217
|
+
transport_type=EnumInfraTransportType.HTTP,
|
|
218
|
+
)
|
|
219
|
+
```
|
|
220
|
+
"""
|
|
221
|
+
# Validate parameters
|
|
222
|
+
if threshold < 1:
|
|
223
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
224
|
+
transport_type=transport_type,
|
|
225
|
+
operation="init_circuit_breaker",
|
|
226
|
+
target_name=service_name,
|
|
227
|
+
)
|
|
228
|
+
raise ProtocolConfigurationError(
|
|
229
|
+
f"Circuit breaker threshold must be >= 1, got {threshold}",
|
|
230
|
+
context=context,
|
|
231
|
+
parameter="threshold",
|
|
232
|
+
value=threshold,
|
|
233
|
+
)
|
|
234
|
+
if reset_timeout < 0:
|
|
235
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
236
|
+
transport_type=transport_type,
|
|
237
|
+
operation="init_circuit_breaker",
|
|
238
|
+
target_name=service_name,
|
|
239
|
+
)
|
|
240
|
+
raise ProtocolConfigurationError(
|
|
241
|
+
f"Circuit breaker reset_timeout must be >= 0, got {reset_timeout}",
|
|
242
|
+
context=context,
|
|
243
|
+
parameter="reset_timeout",
|
|
244
|
+
value=reset_timeout,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# State variables
|
|
248
|
+
self._circuit_breaker_failures = 0
|
|
249
|
+
self._circuit_breaker_open = False
|
|
250
|
+
self._circuit_breaker_open_until: float = 0.0
|
|
251
|
+
|
|
252
|
+
# Configuration
|
|
253
|
+
self.circuit_breaker_threshold = threshold
|
|
254
|
+
self.circuit_breaker_reset_timeout = reset_timeout
|
|
255
|
+
self.service_name = service_name
|
|
256
|
+
self._cb_transport_type = (
|
|
257
|
+
transport_type # Use private name to avoid property conflicts
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Coroutine-safety lock (asyncio.Lock for concurrent async access, not thread-safe)
|
|
261
|
+
self._circuit_breaker_lock = asyncio.Lock()
|
|
262
|
+
|
|
263
|
+
logger.debug(
|
|
264
|
+
f"Circuit breaker initialized for {service_name}",
|
|
265
|
+
extra={
|
|
266
|
+
"threshold": threshold,
|
|
267
|
+
"reset_timeout": reset_timeout,
|
|
268
|
+
"transport_type": transport_type.value,
|
|
269
|
+
},
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
def _init_circuit_breaker_from_config(
|
|
273
|
+
self,
|
|
274
|
+
config: ModelCircuitBreakerConfig,
|
|
275
|
+
) -> None:
|
|
276
|
+
"""Initialize circuit breaker from a configuration model.
|
|
277
|
+
|
|
278
|
+
This method provides an alternative initialization path using a
|
|
279
|
+
configuration model instead of individual parameters. This reduces
|
|
280
|
+
union types in calling code and follows ONEX patterns.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
config: Configuration model containing all circuit breaker settings.
|
|
284
|
+
See ModelCircuitBreakerConfig for available options.
|
|
285
|
+
|
|
286
|
+
Raises:
|
|
287
|
+
ValueError: If config contains invalid values (validated by Pydantic).
|
|
288
|
+
|
|
289
|
+
Example:
|
|
290
|
+
```python
|
|
291
|
+
from omnibase_infra.models.resilience import ModelCircuitBreakerConfig
|
|
292
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
293
|
+
|
|
294
|
+
class EventBusKafka(MixinAsyncCircuitBreaker):
|
|
295
|
+
def __init__(self, environment: str):
|
|
296
|
+
config = ModelCircuitBreakerConfig(
|
|
297
|
+
threshold=5,
|
|
298
|
+
reset_timeout_seconds=60.0,
|
|
299
|
+
service_name=f"kafka.{environment}",
|
|
300
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
301
|
+
)
|
|
302
|
+
self._init_circuit_breaker_from_config(config)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
See Also:
|
|
306
|
+
_init_circuit_breaker: Original initialization method with parameters.
|
|
307
|
+
ModelCircuitBreakerConfig: Configuration model with all options.
|
|
308
|
+
"""
|
|
309
|
+
self._init_circuit_breaker(
|
|
310
|
+
threshold=config.threshold,
|
|
311
|
+
reset_timeout=config.reset_timeout_seconds,
|
|
312
|
+
service_name=config.service_name,
|
|
313
|
+
transport_type=config.transport_type,
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
async def _check_circuit_breaker(
|
|
317
|
+
self, operation: str, correlation_id: UUID | None = None
|
|
318
|
+
) -> None:
|
|
319
|
+
"""Check if circuit breaker allows operation.
|
|
320
|
+
|
|
321
|
+
Verifies circuit breaker state and raises InfraUnavailableError if
|
|
322
|
+
circuit is open. Automatically transitions from OPEN to HALF_OPEN
|
|
323
|
+
if reset timeout has elapsed.
|
|
324
|
+
|
|
325
|
+
Concurrency Safety:
|
|
326
|
+
REQUIRES: self._circuit_breaker_lock must be held by caller.
|
|
327
|
+
|
|
328
|
+
This method accesses shared state variables and MUST be called
|
|
329
|
+
while holding the lock to prevent race conditions between coroutines:
|
|
330
|
+
|
|
331
|
+
```python
|
|
332
|
+
# Correct
|
|
333
|
+
async with self._circuit_breaker_lock:
|
|
334
|
+
await self._check_circuit_breaker("operation")
|
|
335
|
+
|
|
336
|
+
# Incorrect - race condition between coroutines!
|
|
337
|
+
await self._check_circuit_breaker("operation")
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
operation: Operation name for error context (e.g., "publish", "register")
|
|
342
|
+
correlation_id: Optional correlation ID for distributed tracing.
|
|
343
|
+
If not provided, a new UUID will be generated.
|
|
344
|
+
|
|
345
|
+
Raises:
|
|
346
|
+
InfraUnavailableError: If circuit breaker is open and reset timeout
|
|
347
|
+
has not elapsed. Error includes:
|
|
348
|
+
- context.transport_type: Transport type from configuration
|
|
349
|
+
- context.operation: Operation name from parameter
|
|
350
|
+
- context.target_name: Service name from configuration
|
|
351
|
+
- context.correlation_id: Correlation ID (provided or generated)
|
|
352
|
+
- circuit_state: Current circuit state ("open")
|
|
353
|
+
- retry_after_seconds: Seconds remaining until auto-reset
|
|
354
|
+
|
|
355
|
+
Example:
|
|
356
|
+
```python
|
|
357
|
+
async def perform_operation(
|
|
358
|
+
self, correlation_id: UUID | None = None
|
|
359
|
+
) -> Result:
|
|
360
|
+
# Check circuit before operation (coroutine-safe)
|
|
361
|
+
async with self._circuit_breaker_lock:
|
|
362
|
+
await self._check_circuit_breaker(
|
|
363
|
+
operation="perform_operation",
|
|
364
|
+
correlation_id=correlation_id,
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# Proceed with operation if circuit allows
|
|
368
|
+
result = await self._do_work()
|
|
369
|
+
return result
|
|
370
|
+
```
|
|
371
|
+
"""
|
|
372
|
+
# Verify lock is held (debug assertion)
|
|
373
|
+
if not self._circuit_breaker_lock.locked():
|
|
374
|
+
logger.error(
|
|
375
|
+
"Circuit breaker lock not held during state check",
|
|
376
|
+
extra={
|
|
377
|
+
"service": self.service_name,
|
|
378
|
+
"operation": operation,
|
|
379
|
+
},
|
|
380
|
+
)
|
|
381
|
+
# Still proceed but log the violation for debugging
|
|
382
|
+
|
|
383
|
+
current_time = time.time()
|
|
384
|
+
|
|
385
|
+
# Check if circuit is open (atomic read protected by caller's lock)
|
|
386
|
+
if self._circuit_breaker_open:
|
|
387
|
+
# Check if reset timeout has passed
|
|
388
|
+
if current_time >= self._circuit_breaker_open_until:
|
|
389
|
+
# Transition to HALF_OPEN (atomic write protected by caller's lock)
|
|
390
|
+
self._circuit_breaker_open = False
|
|
391
|
+
self._circuit_breaker_failures = 0
|
|
392
|
+
logger.info(
|
|
393
|
+
f"Circuit breaker transitioning to half-open for {self.service_name}",
|
|
394
|
+
extra={
|
|
395
|
+
"service": self.service_name,
|
|
396
|
+
"operation": operation,
|
|
397
|
+
},
|
|
398
|
+
)
|
|
399
|
+
else:
|
|
400
|
+
# Circuit still open - block request
|
|
401
|
+
retry_after = int(self._circuit_breaker_open_until - current_time)
|
|
402
|
+
context = ModelInfraErrorContext(
|
|
403
|
+
transport_type=self._cb_transport_type,
|
|
404
|
+
operation=operation,
|
|
405
|
+
target_name=self.service_name,
|
|
406
|
+
correlation_id=correlation_id if correlation_id else uuid4(),
|
|
407
|
+
)
|
|
408
|
+
raise InfraUnavailableError(
|
|
409
|
+
f"Circuit breaker is open - {self.service_name} temporarily unavailable",
|
|
410
|
+
context=context,
|
|
411
|
+
circuit_state="open",
|
|
412
|
+
retry_after_seconds=retry_after,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
async def _record_circuit_failure(
|
|
416
|
+
self, operation: str, correlation_id: UUID | None = None
|
|
417
|
+
) -> None:
|
|
418
|
+
"""Record a circuit breaker failure and potentially open the circuit.
|
|
419
|
+
|
|
420
|
+
Increments the failure counter and opens the circuit if the threshold
|
|
421
|
+
is reached. When the circuit opens, it sets the reset timestamp for
|
|
422
|
+
automatic recovery.
|
|
423
|
+
|
|
424
|
+
Concurrency Safety:
|
|
425
|
+
REQUIRES: self._circuit_breaker_lock must be held by caller.
|
|
426
|
+
|
|
427
|
+
This method mutates shared state variables and MUST be called
|
|
428
|
+
while holding the lock to prevent race conditions between coroutines:
|
|
429
|
+
|
|
430
|
+
```python
|
|
431
|
+
# Correct
|
|
432
|
+
async with self._circuit_breaker_lock:
|
|
433
|
+
await self._record_circuit_failure("operation")
|
|
434
|
+
|
|
435
|
+
# Incorrect - race condition between coroutines!
|
|
436
|
+
await self._record_circuit_failure("operation")
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
Args:
|
|
440
|
+
operation: Operation name for logging context
|
|
441
|
+
correlation_id: Optional correlation ID for distributed tracing
|
|
442
|
+
|
|
443
|
+
State Transitions:
|
|
444
|
+
If failure count >= threshold:
|
|
445
|
+
CLOSED → OPEN
|
|
446
|
+
HALF_OPEN → OPEN
|
|
447
|
+
|
|
448
|
+
Side Effects:
|
|
449
|
+
- Increments _circuit_breaker_failures
|
|
450
|
+
- If threshold reached:
|
|
451
|
+
- Sets _circuit_breaker_open = True
|
|
452
|
+
- Sets _circuit_breaker_open_until = current_time + reset_timeout
|
|
453
|
+
- Logs warning message
|
|
454
|
+
|
|
455
|
+
Example:
|
|
456
|
+
```python
|
|
457
|
+
async def perform_operation(
|
|
458
|
+
self, correlation_id: UUID | None = None
|
|
459
|
+
) -> Result:
|
|
460
|
+
try:
|
|
461
|
+
result = await self._do_work()
|
|
462
|
+
return result
|
|
463
|
+
except Exception:
|
|
464
|
+
# Record failure on exception (coroutine-safe)
|
|
465
|
+
async with self._circuit_breaker_lock:
|
|
466
|
+
await self._record_circuit_failure(
|
|
467
|
+
operation="perform_operation",
|
|
468
|
+
correlation_id=correlation_id,
|
|
469
|
+
)
|
|
470
|
+
raise
|
|
471
|
+
```
|
|
472
|
+
"""
|
|
473
|
+
# Verify lock is held (debug assertion)
|
|
474
|
+
if not self._circuit_breaker_lock.locked():
|
|
475
|
+
logger.error(
|
|
476
|
+
"Circuit breaker lock not held during failure recording",
|
|
477
|
+
extra={
|
|
478
|
+
"service": self.service_name,
|
|
479
|
+
"operation": operation,
|
|
480
|
+
},
|
|
481
|
+
)
|
|
482
|
+
# Still proceed but log the violation for debugging
|
|
483
|
+
|
|
484
|
+
# Increment failure counter (atomic write protected by caller's lock)
|
|
485
|
+
self._circuit_breaker_failures += 1
|
|
486
|
+
|
|
487
|
+
# Check if threshold reached
|
|
488
|
+
if self._circuit_breaker_failures >= self.circuit_breaker_threshold:
|
|
489
|
+
# Transition to OPEN state (atomic write protected by caller's lock)
|
|
490
|
+
self._circuit_breaker_open = True
|
|
491
|
+
self._circuit_breaker_open_until = (
|
|
492
|
+
time.time() + self.circuit_breaker_reset_timeout
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
logger.warning(
|
|
496
|
+
f"Circuit breaker opened for {self.service_name} after {self._circuit_breaker_failures} failures",
|
|
497
|
+
extra={
|
|
498
|
+
"service": self.service_name,
|
|
499
|
+
"operation": operation,
|
|
500
|
+
"failure_count": self._circuit_breaker_failures,
|
|
501
|
+
"threshold": self.circuit_breaker_threshold,
|
|
502
|
+
"reset_timeout": self.circuit_breaker_reset_timeout,
|
|
503
|
+
"correlation_id": str(correlation_id) if correlation_id else None,
|
|
504
|
+
},
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
async def _reset_circuit_breaker(self) -> None:
|
|
508
|
+
"""Reset circuit breaker to closed state.
|
|
509
|
+
|
|
510
|
+
Resets the failure counter and closes the circuit, allowing all
|
|
511
|
+
requests to proceed normally. Typically called after a successful
|
|
512
|
+
operation.
|
|
513
|
+
|
|
514
|
+
Concurrency Safety:
|
|
515
|
+
REQUIRES: self._circuit_breaker_lock must be held by caller.
|
|
516
|
+
|
|
517
|
+
This method mutates shared state variables and MUST be called
|
|
518
|
+
while holding the lock to prevent race conditions between coroutines:
|
|
519
|
+
|
|
520
|
+
```python
|
|
521
|
+
# Correct
|
|
522
|
+
async with self._circuit_breaker_lock:
|
|
523
|
+
await self._reset_circuit_breaker()
|
|
524
|
+
|
|
525
|
+
# Incorrect - race condition between coroutines!
|
|
526
|
+
await self._reset_circuit_breaker()
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
State Transitions:
|
|
530
|
+
OPEN → CLOSED
|
|
531
|
+
HALF_OPEN → CLOSED
|
|
532
|
+
CLOSED → CLOSED (idempotent)
|
|
533
|
+
|
|
534
|
+
Side Effects:
|
|
535
|
+
- Sets _circuit_breaker_open = False
|
|
536
|
+
- Sets _circuit_breaker_failures = 0
|
|
537
|
+
- Sets _circuit_breaker_open_until = 0.0
|
|
538
|
+
- Logs info message if circuit was not already closed
|
|
539
|
+
|
|
540
|
+
Example:
|
|
541
|
+
```python
|
|
542
|
+
async def perform_operation(self):
|
|
543
|
+
try:
|
|
544
|
+
result = await self._do_work()
|
|
545
|
+
|
|
546
|
+
# Reset circuit on success (coroutine-safe)
|
|
547
|
+
async with self._circuit_breaker_lock:
|
|
548
|
+
await self._reset_circuit_breaker()
|
|
549
|
+
|
|
550
|
+
return result
|
|
551
|
+
except Exception:
|
|
552
|
+
async with self._circuit_breaker_lock:
|
|
553
|
+
await self._record_circuit_failure("perform_operation")
|
|
554
|
+
raise
|
|
555
|
+
```
|
|
556
|
+
"""
|
|
557
|
+
# Verify lock is held (debug assertion)
|
|
558
|
+
if not self._circuit_breaker_lock.locked():
|
|
559
|
+
logger.error(
|
|
560
|
+
"Circuit breaker lock not held during reset",
|
|
561
|
+
extra={
|
|
562
|
+
"service": self.service_name,
|
|
563
|
+
},
|
|
564
|
+
)
|
|
565
|
+
# Still proceed but log the violation for debugging
|
|
566
|
+
|
|
567
|
+
# Log state transition if circuit was open or had failures
|
|
568
|
+
if self._circuit_breaker_open or self._circuit_breaker_failures > 0:
|
|
569
|
+
previous_state = "open" if self._circuit_breaker_open else "closed"
|
|
570
|
+
logger.info(
|
|
571
|
+
f"Circuit breaker reset from {previous_state} to closed for {self.service_name}",
|
|
572
|
+
extra={
|
|
573
|
+
"service": self.service_name,
|
|
574
|
+
"previous_state": previous_state,
|
|
575
|
+
"previous_failures": self._circuit_breaker_failures,
|
|
576
|
+
},
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
# Reset state (atomic write protected by caller's lock)
|
|
580
|
+
self._circuit_breaker_open = False
|
|
581
|
+
self._circuit_breaker_failures = 0
|
|
582
|
+
self._circuit_breaker_open_until = 0.0
|
|
583
|
+
|
|
584
|
+
def _get_circuit_breaker_state(self) -> dict[str, JsonType]:
|
|
585
|
+
"""Return current circuit breaker state for introspection.
|
|
586
|
+
|
|
587
|
+
This method encapsulates circuit breaker internals for safe access
|
|
588
|
+
by subclasses implementing describe() or other introspection methods.
|
|
589
|
+
It provides a stable interface for reading circuit breaker state without
|
|
590
|
+
exposing internal attribute names.
|
|
591
|
+
|
|
592
|
+
Note:
|
|
593
|
+
This method does NOT require holding _circuit_breaker_lock because
|
|
594
|
+
it only performs reads for observability purposes. The state may be
|
|
595
|
+
slightly stale in concurrent scenarios, which is acceptable for
|
|
596
|
+
introspection use cases.
|
|
597
|
+
|
|
598
|
+
Returns:
|
|
599
|
+
dict containing:
|
|
600
|
+
- initialized: Whether circuit breaker has been initialized
|
|
601
|
+
- state: Current state ("closed", "open", or "half_open")
|
|
602
|
+
- failures: Current failure count
|
|
603
|
+
- threshold: Configured failure threshold
|
|
604
|
+
- reset_timeout_seconds: Configured reset timeout
|
|
605
|
+
- seconds_until_half_open: Seconds until half_open (only when open)
|
|
606
|
+
|
|
607
|
+
Example:
|
|
608
|
+
```python
|
|
609
|
+
def describe(self) -> dict[str, object]:
|
|
610
|
+
circuit_breaker_info = self._get_circuit_breaker_state()
|
|
611
|
+
return {
|
|
612
|
+
"handler_type": self.handler_type.value,
|
|
613
|
+
"circuit_breaker": circuit_breaker_info,
|
|
614
|
+
}
|
|
615
|
+
```
|
|
616
|
+
"""
|
|
617
|
+
# Check if circuit breaker has been initialized by looking for key attributes
|
|
618
|
+
cb_initialized = hasattr(self, "_circuit_breaker_lock") and hasattr(
|
|
619
|
+
self, "circuit_breaker_threshold"
|
|
620
|
+
)
|
|
621
|
+
|
|
622
|
+
# Read state variables with safe defaults for uninitialized state
|
|
623
|
+
cb_open = getattr(self, "_circuit_breaker_open", False)
|
|
624
|
+
cb_open_until = getattr(self, "_circuit_breaker_open_until", 0.0)
|
|
625
|
+
cb_failures = getattr(self, "_circuit_breaker_failures", 0)
|
|
626
|
+
cb_threshold = getattr(self, "circuit_breaker_threshold", 5)
|
|
627
|
+
cb_reset_timeout = getattr(self, "circuit_breaker_reset_timeout", 60.0)
|
|
628
|
+
|
|
629
|
+
# Calculate state: closed, open, or half_open
|
|
630
|
+
current_time = time.time()
|
|
631
|
+
if cb_open:
|
|
632
|
+
if current_time >= cb_open_until:
|
|
633
|
+
cb_state = "half_open"
|
|
634
|
+
seconds_until_half_open: float | None = None
|
|
635
|
+
else:
|
|
636
|
+
cb_state = "open"
|
|
637
|
+
seconds_until_half_open = round(cb_open_until - current_time, 2)
|
|
638
|
+
else:
|
|
639
|
+
cb_state = "closed"
|
|
640
|
+
seconds_until_half_open = None
|
|
641
|
+
|
|
642
|
+
result: dict[str, JsonType] = {
|
|
643
|
+
"initialized": cb_initialized,
|
|
644
|
+
"state": cb_state,
|
|
645
|
+
"failures": cb_failures,
|
|
646
|
+
"threshold": cb_threshold,
|
|
647
|
+
"reset_timeout_seconds": cb_reset_timeout,
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if seconds_until_half_open is not None:
|
|
651
|
+
result["seconds_until_half_open"] = seconds_until_half_open
|
|
652
|
+
|
|
653
|
+
return result
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
__all__ = ["EnumCircuitState", "MixinAsyncCircuitBreaker", "ModelCircuitBreakerConfig"]
|