omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Dead Letter Queue event model for callback payloads.
|
|
4
|
+
|
|
5
|
+
Provides a strongly-typed model for DLQ events that captures all relevant
|
|
6
|
+
context for alerting, monitoring, and debugging failed message processing.
|
|
7
|
+
|
|
8
|
+
This model is passed to DLQ callback hooks when messages are published to
|
|
9
|
+
the dead letter queue, enabling custom alerting integration (PagerDuty,
|
|
10
|
+
Slack, email, etc.) without coupling the EventBusKafka to specific
|
|
11
|
+
alerting implementations.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
```python
|
|
15
|
+
from omnibase_infra.event_bus.models import ModelDlqEvent
|
|
16
|
+
|
|
17
|
+
async def alert_on_dlq(event: ModelDlqEvent) -> None:
|
|
18
|
+
'''Custom alerting callback for DLQ events.'''
|
|
19
|
+
if event.success:
|
|
20
|
+
logger.warning(
|
|
21
|
+
"Message sent to DLQ",
|
|
22
|
+
extra=event.to_log_context(),
|
|
23
|
+
)
|
|
24
|
+
else:
|
|
25
|
+
# DLQ publish itself failed - critical alert
|
|
26
|
+
pagerduty.trigger(
|
|
27
|
+
summary=f"DLQ publish failed: {event.dlq_error_type}",
|
|
28
|
+
severity="critical",
|
|
29
|
+
details=event.to_log_context(),
|
|
30
|
+
)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
See Also:
|
|
34
|
+
ModelDlqMetrics: Aggregate metrics for DLQ operations
|
|
35
|
+
EventBusKafka._publish_to_dlq: DLQ publishing implementation
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from __future__ import annotations
|
|
39
|
+
|
|
40
|
+
from datetime import UTC, datetime
|
|
41
|
+
from uuid import UUID
|
|
42
|
+
|
|
43
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ModelDlqEvent(BaseModel):
|
|
47
|
+
"""Event model for dead letter queue publish operations.
|
|
48
|
+
|
|
49
|
+
Captures comprehensive context for a DLQ publish event, including:
|
|
50
|
+
- Original message context (topic, offset, partition)
|
|
51
|
+
- Failure information (error type, error message)
|
|
52
|
+
- DLQ publish result (success/failure, DLQ error if failed)
|
|
53
|
+
- Tracing information (correlation_id, timestamps)
|
|
54
|
+
|
|
55
|
+
This model follows the ONEX immutable model pattern with frozen=True
|
|
56
|
+
to ensure thread-safe sharing across callback invocations.
|
|
57
|
+
|
|
58
|
+
Attributes:
|
|
59
|
+
original_topic: The Kafka topic where the message was originally consumed
|
|
60
|
+
dlq_topic: The dead letter queue topic where the message was published
|
|
61
|
+
correlation_id: Correlation ID for distributed tracing
|
|
62
|
+
error_type: The type name of the exception that caused the original failure
|
|
63
|
+
error_message: The error message from the original failure
|
|
64
|
+
retry_count: Number of retry attempts before DLQ
|
|
65
|
+
message_offset: Original message offset (if available)
|
|
66
|
+
message_partition: Original message partition (if available)
|
|
67
|
+
success: Whether the DLQ publish succeeded
|
|
68
|
+
dlq_error_type: Type of error if DLQ publish failed (None if success)
|
|
69
|
+
dlq_error_message: Error message if DLQ publish failed (None if success)
|
|
70
|
+
timestamp: When the DLQ event occurred
|
|
71
|
+
environment: Environment identifier (e.g., "prod", "staging")
|
|
72
|
+
consumer_group: Consumer group that processed the message
|
|
73
|
+
|
|
74
|
+
Example:
|
|
75
|
+
>>> event = ModelDlqEvent(
|
|
76
|
+
... original_topic="orders.created",
|
|
77
|
+
... dlq_topic="dlq.orders",
|
|
78
|
+
... correlation_id=uuid4(),
|
|
79
|
+
... error_type="ValidationError",
|
|
80
|
+
... error_message="Invalid order format",
|
|
81
|
+
... success=True,
|
|
82
|
+
... )
|
|
83
|
+
>>> print(event.to_log_context())
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
87
|
+
|
|
88
|
+
# Original message context
|
|
89
|
+
original_topic: str = Field(
|
|
90
|
+
description="The Kafka topic where the message was originally consumed",
|
|
91
|
+
)
|
|
92
|
+
dlq_topic: str = Field(
|
|
93
|
+
description="The dead letter queue topic where the message was published",
|
|
94
|
+
)
|
|
95
|
+
correlation_id: UUID = Field(
|
|
96
|
+
description="Correlation ID for distributed tracing",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Failure information
|
|
100
|
+
error_type: str = Field(
|
|
101
|
+
description="The type name of the exception that caused the original failure",
|
|
102
|
+
)
|
|
103
|
+
error_message: str = Field(
|
|
104
|
+
description="The error message from the original failure (sanitized)",
|
|
105
|
+
)
|
|
106
|
+
retry_count: int = Field(
|
|
107
|
+
default=0,
|
|
108
|
+
description="Number of retry attempts before DLQ",
|
|
109
|
+
ge=0,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# Original message metadata (optional, may not be available)
|
|
113
|
+
message_offset: str | None = Field(
|
|
114
|
+
default=None,
|
|
115
|
+
description="Original message offset (if available)",
|
|
116
|
+
)
|
|
117
|
+
message_partition: int | None = Field(
|
|
118
|
+
default=None,
|
|
119
|
+
description="Original message partition (if available)",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# DLQ publish result
|
|
123
|
+
success: bool = Field(
|
|
124
|
+
description="Whether the DLQ publish succeeded",
|
|
125
|
+
)
|
|
126
|
+
dlq_error_type: str | None = Field(
|
|
127
|
+
default=None,
|
|
128
|
+
description="Type of error if DLQ publish failed (None if success)",
|
|
129
|
+
)
|
|
130
|
+
dlq_error_message: str | None = Field(
|
|
131
|
+
default=None,
|
|
132
|
+
description="Error message if DLQ publish failed (None if success)",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Tracing and environment
|
|
136
|
+
timestamp: datetime = Field(
|
|
137
|
+
default_factory=lambda: datetime.now(UTC),
|
|
138
|
+
description="When the DLQ event occurred",
|
|
139
|
+
)
|
|
140
|
+
environment: str = Field(
|
|
141
|
+
default="unknown",
|
|
142
|
+
description="Environment identifier (e.g., 'prod', 'staging')",
|
|
143
|
+
)
|
|
144
|
+
consumer_group: str = Field(
|
|
145
|
+
default="unknown",
|
|
146
|
+
description="Consumer group that processed the message",
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def to_log_context(self) -> dict[str, object]:
|
|
150
|
+
"""Convert to a dictionary suitable for structured logging.
|
|
151
|
+
|
|
152
|
+
Returns a dictionary with all fields formatted for logging,
|
|
153
|
+
with correlation_id converted to string and timestamp to ISO format.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Dictionary with all event fields for structured logging
|
|
157
|
+
"""
|
|
158
|
+
return {
|
|
159
|
+
"original_topic": self.original_topic,
|
|
160
|
+
"dlq_topic": self.dlq_topic,
|
|
161
|
+
"correlation_id": str(self.correlation_id),
|
|
162
|
+
"error_type": self.error_type,
|
|
163
|
+
"error_message": self.error_message,
|
|
164
|
+
"retry_count": self.retry_count,
|
|
165
|
+
"message_offset": self.message_offset,
|
|
166
|
+
"message_partition": self.message_partition,
|
|
167
|
+
"success": self.success,
|
|
168
|
+
"dlq_error_type": self.dlq_error_type,
|
|
169
|
+
"dlq_error_message": self.dlq_error_message,
|
|
170
|
+
"timestamp": self.timestamp.isoformat(),
|
|
171
|
+
"environment": self.environment,
|
|
172
|
+
"consumer_group": self.consumer_group,
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def is_critical(self) -> bool:
|
|
177
|
+
"""Determine if this event represents a critical failure.
|
|
178
|
+
|
|
179
|
+
A critical failure is when the DLQ publish itself failed,
|
|
180
|
+
meaning the failed message was lost and cannot be recovered
|
|
181
|
+
from the DLQ for later analysis or retry.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
True if DLQ publish failed (message potentially lost)
|
|
185
|
+
"""
|
|
186
|
+
return not self.success
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def metric_labels(self) -> dict[str, str]:
|
|
190
|
+
"""Return labels suitable for metrics emission.
|
|
191
|
+
|
|
192
|
+
Provides a consistent set of labels for metrics counters,
|
|
193
|
+
following Prometheus/OpenTelemetry labeling conventions.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Dictionary of label names to values for metrics
|
|
197
|
+
"""
|
|
198
|
+
return {
|
|
199
|
+
"original_topic": self.original_topic,
|
|
200
|
+
"error_type": self.error_type,
|
|
201
|
+
"environment": self.environment,
|
|
202
|
+
"success": str(self.success).lower(),
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
__all__: list[str] = ["ModelDlqEvent"]
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Dead Letter Queue metrics model for operational visibility.
|
|
4
|
+
|
|
5
|
+
Provides a Pydantic model for tracking operational metrics of the dead letter
|
|
6
|
+
queue, enabling monitoring of:
|
|
7
|
+
- DLQ publish success/failure rates
|
|
8
|
+
- Per-topic breakdown of DLQ messages
|
|
9
|
+
- Per-error-type breakdown for debugging
|
|
10
|
+
- Latency statistics for DLQ operations
|
|
11
|
+
|
|
12
|
+
Design Pattern:
|
|
13
|
+
Like ModelDispatchMetrics, this model uses the copy-on-write pattern.
|
|
14
|
+
Update methods return NEW instances rather than mutating in place:
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
# Copy-on-write: returns new instance, does not mutate
|
|
18
|
+
metrics = metrics.record_dlq_publish(
|
|
19
|
+
original_topic="orders.created",
|
|
20
|
+
error_type="ValidationError",
|
|
21
|
+
success=True,
|
|
22
|
+
duration_ms=15.5,
|
|
23
|
+
)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Thread Safety:
|
|
27
|
+
Individual ModelDlqMetrics instances are safe to share across threads
|
|
28
|
+
since update operations return new instances. The EventBusKafka uses
|
|
29
|
+
a lock to ensure atomic read-modify-write cycles when updating the
|
|
30
|
+
shared metrics reference.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
>>> from omnibase_infra.event_bus.models import ModelDlqMetrics
|
|
34
|
+
>>>
|
|
35
|
+
>>> metrics = ModelDlqMetrics()
|
|
36
|
+
>>> metrics = metrics.record_dlq_publish(
|
|
37
|
+
... original_topic="orders.created",
|
|
38
|
+
... error_type="ValidationError",
|
|
39
|
+
... success=True,
|
|
40
|
+
... duration_ms=15.5,
|
|
41
|
+
... )
|
|
42
|
+
>>> print(f"DLQ success rate: {metrics.success_rate:.1%}")
|
|
43
|
+
DLQ success rate: 100.0%
|
|
44
|
+
|
|
45
|
+
See Also:
|
|
46
|
+
ModelDlqEvent: Individual DLQ event for callbacks
|
|
47
|
+
ModelDispatchMetrics: Similar pattern for dispatch metrics
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
from __future__ import annotations
|
|
51
|
+
|
|
52
|
+
from datetime import UTC, datetime
|
|
53
|
+
|
|
54
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ModelDlqMetrics(BaseModel):
|
|
58
|
+
"""Aggregate metrics for dead letter queue operations.
|
|
59
|
+
|
|
60
|
+
Provides comprehensive observability for DLQ health including:
|
|
61
|
+
- Total publish counts and success/failure rates
|
|
62
|
+
- Per-topic metrics breakdown
|
|
63
|
+
- Per-error-type metrics breakdown
|
|
64
|
+
- Latency statistics for DLQ publish operations
|
|
65
|
+
- Last operation timestamps for staleness detection
|
|
66
|
+
|
|
67
|
+
Attributes:
|
|
68
|
+
total_publishes: Total number of DLQ publish attempts
|
|
69
|
+
successful_publishes: Number of successful DLQ publishes
|
|
70
|
+
failed_publishes: Number of failed DLQ publishes
|
|
71
|
+
topic_counts: Per-original-topic DLQ message counts
|
|
72
|
+
error_type_counts: Per-error-type DLQ message counts
|
|
73
|
+
total_latency_ms: Cumulative DLQ publish latency in milliseconds
|
|
74
|
+
min_latency_ms: Minimum observed DLQ publish latency
|
|
75
|
+
max_latency_ms: Maximum observed DLQ publish latency
|
|
76
|
+
last_publish_at: Timestamp of the last DLQ publish attempt
|
|
77
|
+
last_failure_at: Timestamp of the last failed DLQ publish (if any)
|
|
78
|
+
|
|
79
|
+
Example:
|
|
80
|
+
>>> metrics = ModelDlqMetrics()
|
|
81
|
+
>>> print(f"Total DLQ publishes: {metrics.total_publishes}")
|
|
82
|
+
>>> print(f"Success rate: {metrics.success_rate:.1%}")
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
model_config = ConfigDict(
|
|
86
|
+
extra="forbid",
|
|
87
|
+
from_attributes=True,
|
|
88
|
+
validate_assignment=True,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# ---- Publish Counts ----
|
|
92
|
+
total_publishes: int = Field(
|
|
93
|
+
default=0,
|
|
94
|
+
description="Total number of DLQ publish attempts",
|
|
95
|
+
ge=0,
|
|
96
|
+
)
|
|
97
|
+
successful_publishes: int = Field(
|
|
98
|
+
default=0,
|
|
99
|
+
description="Number of successful DLQ publishes",
|
|
100
|
+
ge=0,
|
|
101
|
+
)
|
|
102
|
+
failed_publishes: int = Field(
|
|
103
|
+
default=0,
|
|
104
|
+
description="Number of failed DLQ publishes",
|
|
105
|
+
ge=0,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# ---- Per-Topic Metrics ----
|
|
109
|
+
topic_counts: dict[str, int] = Field(
|
|
110
|
+
default_factory=dict,
|
|
111
|
+
description=(
|
|
112
|
+
"Per-original-topic DLQ message counts. Keys are topic names, "
|
|
113
|
+
"values are the number of messages from that topic sent to DLQ."
|
|
114
|
+
),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# ---- Per-Error-Type Metrics ----
|
|
118
|
+
error_type_counts: dict[str, int] = Field(
|
|
119
|
+
default_factory=dict,
|
|
120
|
+
description=(
|
|
121
|
+
"Per-error-type DLQ message counts. Keys are error type names "
|
|
122
|
+
"(e.g., 'ValidationError'), values are occurrence counts."
|
|
123
|
+
),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# ---- Latency Statistics ----
|
|
127
|
+
total_latency_ms: float = Field(
|
|
128
|
+
default=0.0,
|
|
129
|
+
description="Cumulative DLQ publish latency in milliseconds",
|
|
130
|
+
ge=0,
|
|
131
|
+
)
|
|
132
|
+
min_latency_ms: float | None = Field(
|
|
133
|
+
default=None,
|
|
134
|
+
description="Minimum observed DLQ publish latency in milliseconds",
|
|
135
|
+
)
|
|
136
|
+
max_latency_ms: float | None = Field(
|
|
137
|
+
default=None,
|
|
138
|
+
description="Maximum observed DLQ publish latency in milliseconds",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# ---- Timestamps ----
|
|
142
|
+
last_publish_at: datetime | None = Field(
|
|
143
|
+
default=None,
|
|
144
|
+
description="Timestamp of the last DLQ publish attempt",
|
|
145
|
+
)
|
|
146
|
+
last_failure_at: datetime | None = Field(
|
|
147
|
+
default=None,
|
|
148
|
+
description="Timestamp of the last failed DLQ publish (if any)",
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def avg_latency_ms(self) -> float:
|
|
153
|
+
"""Calculate average DLQ publish latency.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Average latency in milliseconds, or 0.0 if no publishes.
|
|
157
|
+
"""
|
|
158
|
+
if self.total_publishes == 0:
|
|
159
|
+
return 0.0
|
|
160
|
+
return self.total_latency_ms / self.total_publishes
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def success_rate(self) -> float:
|
|
164
|
+
"""Calculate DLQ publish success rate.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Success rate as a decimal (0.0 to 1.0), or 1.0 if no publishes.
|
|
168
|
+
"""
|
|
169
|
+
if self.total_publishes == 0:
|
|
170
|
+
return 1.0
|
|
171
|
+
return self.successful_publishes / self.total_publishes
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def failure_rate(self) -> float:
|
|
175
|
+
"""Calculate DLQ publish failure rate.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Failure rate as a decimal (0.0 to 1.0), or 0.0 if no publishes.
|
|
179
|
+
"""
|
|
180
|
+
if self.total_publishes == 0:
|
|
181
|
+
return 0.0
|
|
182
|
+
return self.failed_publishes / self.total_publishes
|
|
183
|
+
|
|
184
|
+
def record_dlq_publish(
|
|
185
|
+
self,
|
|
186
|
+
original_topic: str,
|
|
187
|
+
error_type: str,
|
|
188
|
+
success: bool,
|
|
189
|
+
duration_ms: float,
|
|
190
|
+
) -> ModelDlqMetrics:
|
|
191
|
+
"""Record a DLQ publish operation and return updated metrics.
|
|
192
|
+
|
|
193
|
+
Creates a new ModelDlqMetrics instance with updated statistics.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
original_topic: The topic where the original message was consumed
|
|
197
|
+
error_type: The type name of the exception that caused DLQ
|
|
198
|
+
success: Whether the DLQ publish succeeded
|
|
199
|
+
duration_ms: Duration of the DLQ publish operation in milliseconds
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
New ModelDlqMetrics with updated statistics
|
|
203
|
+
"""
|
|
204
|
+
now = datetime.now(UTC)
|
|
205
|
+
|
|
206
|
+
# Update latency statistics
|
|
207
|
+
new_min = (
|
|
208
|
+
duration_ms
|
|
209
|
+
if self.min_latency_ms is None
|
|
210
|
+
else min(self.min_latency_ms, duration_ms)
|
|
211
|
+
)
|
|
212
|
+
new_max = (
|
|
213
|
+
duration_ms
|
|
214
|
+
if self.max_latency_ms is None
|
|
215
|
+
else max(self.max_latency_ms, duration_ms)
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Update topic counts
|
|
219
|
+
new_topic_counts = dict(self.topic_counts)
|
|
220
|
+
new_topic_counts[original_topic] = new_topic_counts.get(original_topic, 0) + 1
|
|
221
|
+
|
|
222
|
+
# Update error type counts
|
|
223
|
+
new_error_type_counts = dict(self.error_type_counts)
|
|
224
|
+
new_error_type_counts[error_type] = new_error_type_counts.get(error_type, 0) + 1
|
|
225
|
+
|
|
226
|
+
# Determine timestamps
|
|
227
|
+
new_last_failure_at = self.last_failure_at
|
|
228
|
+
if not success:
|
|
229
|
+
new_last_failure_at = now
|
|
230
|
+
|
|
231
|
+
return self.model_copy(
|
|
232
|
+
update={
|
|
233
|
+
"total_publishes": self.total_publishes + 1,
|
|
234
|
+
"successful_publishes": self.successful_publishes
|
|
235
|
+
+ (1 if success else 0),
|
|
236
|
+
"failed_publishes": self.failed_publishes + (0 if success else 1),
|
|
237
|
+
"topic_counts": new_topic_counts,
|
|
238
|
+
"error_type_counts": new_error_type_counts,
|
|
239
|
+
"total_latency_ms": self.total_latency_ms + duration_ms,
|
|
240
|
+
"min_latency_ms": new_min,
|
|
241
|
+
"max_latency_ms": new_max,
|
|
242
|
+
"last_publish_at": now,
|
|
243
|
+
"last_failure_at": new_last_failure_at,
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def get_topic_count(self, topic: str) -> int:
|
|
248
|
+
"""Get DLQ message count for a specific original topic.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
topic: The original topic name
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
Number of messages from this topic sent to DLQ
|
|
255
|
+
"""
|
|
256
|
+
return self.topic_counts.get(topic, 0)
|
|
257
|
+
|
|
258
|
+
def get_error_type_count(self, error_type: str) -> int:
|
|
259
|
+
"""Get DLQ message count for a specific error type.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
error_type: The error type name (e.g., 'ValidationError')
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
Number of messages sent to DLQ due to this error type
|
|
266
|
+
"""
|
|
267
|
+
return self.error_type_counts.get(error_type, 0)
|
|
268
|
+
|
|
269
|
+
def to_dict(self) -> dict[str, object]:
|
|
270
|
+
"""Convert to dictionary with computed properties included.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
Dictionary with all metrics including computed properties
|
|
274
|
+
"""
|
|
275
|
+
return {
|
|
276
|
+
"total_publishes": self.total_publishes,
|
|
277
|
+
"successful_publishes": self.successful_publishes,
|
|
278
|
+
"failed_publishes": self.failed_publishes,
|
|
279
|
+
"success_rate": self.success_rate,
|
|
280
|
+
"failure_rate": self.failure_rate,
|
|
281
|
+
"avg_latency_ms": self.avg_latency_ms,
|
|
282
|
+
"min_latency_ms": self.min_latency_ms,
|
|
283
|
+
"max_latency_ms": self.max_latency_ms,
|
|
284
|
+
"topic_counts": self.topic_counts,
|
|
285
|
+
"error_type_counts": self.error_type_counts,
|
|
286
|
+
"last_publish_at": (
|
|
287
|
+
self.last_publish_at.isoformat() if self.last_publish_at else None
|
|
288
|
+
),
|
|
289
|
+
"last_failure_at": (
|
|
290
|
+
self.last_failure_at.isoformat() if self.last_failure_at else None
|
|
291
|
+
),
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
@classmethod
|
|
295
|
+
def create_empty(cls) -> ModelDlqMetrics:
|
|
296
|
+
"""Create a new empty metrics instance.
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
New ModelDlqMetrics with all counters at zero
|
|
300
|
+
"""
|
|
301
|
+
return cls()
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
__all__: list[str] = ["ModelDlqMetrics"]
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""Event headers model for ONEX event bus messages.
|
|
2
|
+
|
|
3
|
+
This module provides ModelEventHeaders, a Pydantic model implementing
|
|
4
|
+
ProtocolEventHeaders from omnibase_spi for use with event bus implementations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from typing import Literal
|
|
11
|
+
from uuid import UUID, uuid4
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
14
|
+
|
|
15
|
+
from omnibase_infra.utils import validate_timezone_aware_datetime
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelEventHeaders(BaseModel):
|
|
19
|
+
"""Headers for ONEX event bus messages implementing ProtocolEventHeaders.
|
|
20
|
+
|
|
21
|
+
Standardized headers for ONEX event bus messages ensuring strict
|
|
22
|
+
interoperability across all agents and preventing integration failures.
|
|
23
|
+
Includes tracing, routing, and retry configuration.
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
content_type: MIME type of the message body.
|
|
27
|
+
correlation_id: UUID for correlating related messages.
|
|
28
|
+
message_id: Unique identifier for this message.
|
|
29
|
+
timestamp: Message creation timestamp.
|
|
30
|
+
source: Service that produced the message.
|
|
31
|
+
event_type: Type identifier for the event.
|
|
32
|
+
schema_version: Version of the message schema (simplified from ProtocolSemVer).
|
|
33
|
+
destination: Optional target destination.
|
|
34
|
+
trace_id: Distributed tracing trace ID.
|
|
35
|
+
span_id: Distributed tracing span ID.
|
|
36
|
+
parent_span_id: Parent span for trace hierarchy.
|
|
37
|
+
operation_name: Name of the operation being traced.
|
|
38
|
+
priority: Message priority level.
|
|
39
|
+
routing_key: Key for message routing.
|
|
40
|
+
partition_key: Key for partition assignment.
|
|
41
|
+
retry_count: Current MESSAGE-LEVEL retry attempt number (application-level).
|
|
42
|
+
This tracks end-to-end message delivery attempts across services,
|
|
43
|
+
incremented when a handler fails and the message is republished.
|
|
44
|
+
Distinct from bus-level retry in EventBusKafka (max_retry_attempts)
|
|
45
|
+
which handles transient Kafka connection failures.
|
|
46
|
+
max_retries: Maximum MESSAGE-LEVEL retry attempts allowed (application-level).
|
|
47
|
+
When retry_count >= max_retries, message should be sent to DLQ.
|
|
48
|
+
ttl_seconds: Message time-to-live in seconds.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
```python
|
|
52
|
+
from datetime import UTC, datetime
|
|
53
|
+
headers = ModelEventHeaders(
|
|
54
|
+
source="order-service",
|
|
55
|
+
event_type="order.created",
|
|
56
|
+
routing_key="orders.us-east",
|
|
57
|
+
timestamp=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
58
|
+
)
|
|
59
|
+
is_valid = await headers.validate_headers()
|
|
60
|
+
```
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
content_type: str = Field(default="application/json")
|
|
64
|
+
correlation_id: UUID = Field(default_factory=uuid4)
|
|
65
|
+
message_id: UUID = Field(default_factory=uuid4)
|
|
66
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
67
|
+
timestamp: datetime = Field(
|
|
68
|
+
..., description="Message creation timestamp (must be explicitly provided)"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@field_validator("timestamp")
|
|
72
|
+
@classmethod
|
|
73
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
74
|
+
"""Validate that timestamp is timezone-aware.
|
|
75
|
+
|
|
76
|
+
Delegates to shared utility for consistent validation across all models.
|
|
77
|
+
"""
|
|
78
|
+
return validate_timezone_aware_datetime(v)
|
|
79
|
+
|
|
80
|
+
source: str
|
|
81
|
+
event_type: str
|
|
82
|
+
schema_version: str = Field(default="1.0.0")
|
|
83
|
+
destination: str | None = Field(default=None)
|
|
84
|
+
trace_id: str | None = Field(default=None)
|
|
85
|
+
span_id: str | None = Field(default=None)
|
|
86
|
+
parent_span_id: str | None = Field(default=None)
|
|
87
|
+
operation_name: str | None = Field(default=None)
|
|
88
|
+
priority: Literal["low", "normal", "high", "critical"] = Field(default="normal")
|
|
89
|
+
routing_key: str | None = Field(default=None)
|
|
90
|
+
partition_key: str | None = Field(default=None)
|
|
91
|
+
retry_count: int = Field(
|
|
92
|
+
default=0,
|
|
93
|
+
description=(
|
|
94
|
+
"Current MESSAGE-LEVEL retry attempt (application-level). "
|
|
95
|
+
"Distinct from EventBusKafka.max_retry_attempts (bus-level)."
|
|
96
|
+
),
|
|
97
|
+
)
|
|
98
|
+
max_retries: int = Field(
|
|
99
|
+
default=3,
|
|
100
|
+
description=(
|
|
101
|
+
"Maximum MESSAGE-LEVEL retry attempts (application-level). "
|
|
102
|
+
"When retry_count >= max_retries, message should go to DLQ."
|
|
103
|
+
),
|
|
104
|
+
)
|
|
105
|
+
ttl_seconds: int | None = Field(default=None)
|
|
106
|
+
|
|
107
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
108
|
+
|
|
109
|
+
async def validate_headers(self) -> bool:
|
|
110
|
+
"""Validate that required headers are present and valid.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
True if correlation_id and event_type are valid, False otherwise.
|
|
114
|
+
"""
|
|
115
|
+
return bool(self.correlation_id and self.event_type)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Event message model for ONEX event bus.
|
|
2
|
+
|
|
3
|
+
This module provides ModelEventMessage, a Pydantic model implementing
|
|
4
|
+
ProtocolEventMessage from omnibase_spi for use with event bus implementations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
10
|
+
|
|
11
|
+
from omnibase_infra.event_bus.models.model_event_headers import ModelEventHeaders
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelEventMessage(BaseModel):
|
|
15
|
+
"""Event bus message implementing ProtocolEventMessage.
|
|
16
|
+
|
|
17
|
+
Defines the contract that all event message implementations must satisfy
|
|
18
|
+
for Kafka/RedPanda compatibility following ONEX Messaging Design.
|
|
19
|
+
Supports partitioning, offset tracking, and acknowledgment.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
topic: Kafka topic the message belongs to.
|
|
23
|
+
key: Optional message key for partitioning (bytes).
|
|
24
|
+
value: Serialized message body as bytes.
|
|
25
|
+
headers: Structured message headers.
|
|
26
|
+
offset: Kafka offset (for consumed messages).
|
|
27
|
+
partition: Kafka partition number.
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
```python
|
|
31
|
+
message = ModelEventMessage(
|
|
32
|
+
topic="onex.orders.created",
|
|
33
|
+
key=b"customer-123",
|
|
34
|
+
value=b'{"order_id": "ORD-123", "amount": 99.99}',
|
|
35
|
+
headers=ModelEventHeaders(
|
|
36
|
+
source="order-service",
|
|
37
|
+
event_type="order.created",
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
await message.ack() # Acknowledge after processing
|
|
41
|
+
```
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
topic: str
|
|
45
|
+
key: bytes | None = Field(default=None)
|
|
46
|
+
value: bytes
|
|
47
|
+
headers: ModelEventHeaders
|
|
48
|
+
offset: str | None = Field(default=None)
|
|
49
|
+
partition: int | None = Field(default=None)
|
|
50
|
+
|
|
51
|
+
model_config = ConfigDict(
|
|
52
|
+
frozen=True, extra="forbid", arbitrary_types_allowed=True, from_attributes=True
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
async def ack(self) -> None:
|
|
56
|
+
"""Acknowledge message processing.
|
|
57
|
+
|
|
58
|
+
For in-memory event bus, this is a no-op.
|
|
59
|
+
For real Kafka/RedPanda implementations, this would commit the offset.
|
|
60
|
+
"""
|