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,400 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Dispatch log context model for structured logging in the dispatch engine.
|
|
4
|
+
|
|
5
|
+
This model replaces the union-heavy dict pattern in MessageDispatchEngine's
|
|
6
|
+
``_build_log_context`` method. Instead of building a dict with 9+ nullable
|
|
7
|
+
parameters, this model provides typed fields with clear semantics.
|
|
8
|
+
|
|
9
|
+
The model supports two usage patterns:
|
|
10
|
+
1. Direct construction with all relevant fields
|
|
11
|
+
2. Builder pattern for incremental construction
|
|
12
|
+
|
|
13
|
+
**Sentinel Values**:
|
|
14
|
+
This model uses sentinel values internally instead of ``None``:
|
|
15
|
+
- String fields: empty string ``""`` means "not set"
|
|
16
|
+
- Numeric fields: ``-1`` means "not set"
|
|
17
|
+
- UUID fields: nil UUID (all zeros) means "not set"
|
|
18
|
+
- Enum fields: kept as ``None`` (unavoidable for type safety)
|
|
19
|
+
|
|
20
|
+
**Input Conversion**:
|
|
21
|
+
Constructors accept ``None`` and convert to sentinel values for convenience.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.6.0
|
|
24
|
+
Created as part of Union Reduction Phase 2 (OMN-1002).
|
|
25
|
+
|
|
26
|
+
.. versionchanged:: 0.6.1
|
|
27
|
+
Refactored to use sentinel values, reducing union count from 25 to 3.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from uuid import UUID
|
|
33
|
+
|
|
34
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
35
|
+
|
|
36
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
37
|
+
from omnibase_core.types import PrimitiveValue
|
|
38
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
39
|
+
|
|
40
|
+
# Sentinel values for "not set" state
|
|
41
|
+
_SENTINEL_STR: str = ""
|
|
42
|
+
_SENTINEL_INT: int = -1
|
|
43
|
+
_SENTINEL_FLOAT: float = -1.0
|
|
44
|
+
_SENTINEL_UUID: UUID = UUID(int=0) # Nil UUID (00000000-0000-0000-0000-000000000000)
|
|
45
|
+
|
|
46
|
+
# Type alias for log context dict values (reduces union count)
|
|
47
|
+
type LogContextDict = dict[str, PrimitiveValue]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ModelDispatchLogContext(BaseModel):
|
|
51
|
+
"""Structured log context for dispatch engine operations.
|
|
52
|
+
|
|
53
|
+
This model provides a type-safe alternative to the dict-based log context.
|
|
54
|
+
Uses sentinel values instead of ``None`` to minimize union types.
|
|
55
|
+
|
|
56
|
+
**Sentinel Values**:
|
|
57
|
+
- ``topic=""``: Not set
|
|
58
|
+
- ``message_type=""``: Not set
|
|
59
|
+
- ``dispatcher_id=""``: Not set
|
|
60
|
+
- ``dispatcher_count=-1``: Not set
|
|
61
|
+
- ``duration_ms=-1.0``: Not set
|
|
62
|
+
- ``correlation_id=UUID(int=0)``: Not set (nil UUID)
|
|
63
|
+
- ``trace_id=UUID(int=0)``: Not set (nil UUID)
|
|
64
|
+
|
|
65
|
+
**None Handling**:
|
|
66
|
+
Constructors accept ``None`` for any field and convert to the sentinel value.
|
|
67
|
+
This provides a convenient API for optional fields.
|
|
68
|
+
|
|
69
|
+
The model is designed for immutability (frozen=True) for thread-safety.
|
|
70
|
+
|
|
71
|
+
Attributes:
|
|
72
|
+
topic: The topic being dispatched to. Empty string if not set.
|
|
73
|
+
category: The message category (EVENT, COMMAND, INTENT). None if not set.
|
|
74
|
+
message_type: The message type being dispatched. Empty string if not set.
|
|
75
|
+
dispatcher_id: Dispatcher ID or comma-separated list of IDs. Empty if not set.
|
|
76
|
+
dispatcher_count: Number of dispatchers matched. -1 if not set.
|
|
77
|
+
duration_ms: Dispatch duration in milliseconds. -1.0 if not set.
|
|
78
|
+
correlation_id: Correlation ID from envelope. Nil UUID if not set.
|
|
79
|
+
trace_id: Trace ID from envelope. Nil UUID if not set.
|
|
80
|
+
error_code: Error code if dispatch failed. None if not set.
|
|
81
|
+
|
|
82
|
+
Example:
|
|
83
|
+
>>> from uuid import uuid4
|
|
84
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
85
|
+
>>> ctx = ModelDispatchLogContext(
|
|
86
|
+
... topic="dev.user.events.v1",
|
|
87
|
+
... category=EnumMessageCategory.EVENT,
|
|
88
|
+
... message_type="UserCreatedEvent",
|
|
89
|
+
... dispatcher_count=2,
|
|
90
|
+
... correlation_id=uuid4(),
|
|
91
|
+
... )
|
|
92
|
+
>>> log_dict = ctx.to_dict()
|
|
93
|
+
|
|
94
|
+
.. versionadded:: 0.6.0
|
|
95
|
+
.. versionchanged:: 0.6.1
|
|
96
|
+
Refactored to use sentinel values instead of nullable unions.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
model_config = ConfigDict(
|
|
100
|
+
frozen=True,
|
|
101
|
+
extra="forbid",
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# String fields use empty string sentinel
|
|
105
|
+
topic: str = Field(
|
|
106
|
+
default=_SENTINEL_STR,
|
|
107
|
+
description="The topic being dispatched to. Empty string if not set.",
|
|
108
|
+
)
|
|
109
|
+
message_type: str = Field(
|
|
110
|
+
default=_SENTINEL_STR,
|
|
111
|
+
description="The message type being dispatched. Empty string if not set.",
|
|
112
|
+
)
|
|
113
|
+
dispatcher_id: str = Field(
|
|
114
|
+
default=_SENTINEL_STR,
|
|
115
|
+
description="Dispatcher ID or comma-separated list of IDs. Empty if not set.",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Numeric fields use -1 sentinel
|
|
119
|
+
dispatcher_count: int = Field(
|
|
120
|
+
default=_SENTINEL_INT,
|
|
121
|
+
description="Number of dispatchers matched. -1 if not set.",
|
|
122
|
+
)
|
|
123
|
+
duration_ms: float = Field(
|
|
124
|
+
default=_SENTINEL_FLOAT,
|
|
125
|
+
description="Dispatch duration in milliseconds. -1.0 if not set.",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# UUID fields use nil UUID sentinel
|
|
129
|
+
correlation_id: UUID = Field(
|
|
130
|
+
default=_SENTINEL_UUID,
|
|
131
|
+
description="Correlation ID from envelope. Nil UUID if not set.",
|
|
132
|
+
)
|
|
133
|
+
trace_id: UUID = Field(
|
|
134
|
+
default=_SENTINEL_UUID,
|
|
135
|
+
description="Trace ID from envelope. Nil UUID if not set.",
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Enum fields keep None (unavoidable for type safety without modifying enums)
|
|
139
|
+
category: EnumMessageCategory | None = Field(
|
|
140
|
+
default=None,
|
|
141
|
+
description="The message category (EVENT, COMMAND, INTENT).",
|
|
142
|
+
)
|
|
143
|
+
error_code: EnumCoreErrorCode | None = Field(
|
|
144
|
+
default=None,
|
|
145
|
+
description="Error code if dispatch failed.",
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Validators to convert None to sentinel values (backwards compatibility)
|
|
149
|
+
# Note: Using `object` instead of unions to minimize union count per OMN-1002
|
|
150
|
+
@field_validator("topic", "message_type", "dispatcher_id", mode="before")
|
|
151
|
+
@classmethod
|
|
152
|
+
def _convert_none_to_str_sentinel(cls, v: object) -> str:
|
|
153
|
+
"""Convert None to empty string sentinel."""
|
|
154
|
+
if v is None:
|
|
155
|
+
return _SENTINEL_STR
|
|
156
|
+
if isinstance(v, str):
|
|
157
|
+
return v
|
|
158
|
+
return str(v)
|
|
159
|
+
|
|
160
|
+
@field_validator("dispatcher_count", mode="before")
|
|
161
|
+
@classmethod
|
|
162
|
+
def _convert_none_to_int_sentinel(cls, v: object) -> int:
|
|
163
|
+
"""Convert None to -1 sentinel."""
|
|
164
|
+
if v is None:
|
|
165
|
+
return _SENTINEL_INT
|
|
166
|
+
if isinstance(v, int):
|
|
167
|
+
return v
|
|
168
|
+
# Fallback for numeric strings - cast to int
|
|
169
|
+
return int(str(v))
|
|
170
|
+
|
|
171
|
+
@field_validator("duration_ms", mode="before")
|
|
172
|
+
@classmethod
|
|
173
|
+
def _convert_none_to_float_sentinel(cls, v: object) -> float:
|
|
174
|
+
"""Convert None to -1.0 sentinel."""
|
|
175
|
+
if v is None:
|
|
176
|
+
return _SENTINEL_FLOAT
|
|
177
|
+
if isinstance(v, int | float):
|
|
178
|
+
return float(v)
|
|
179
|
+
# Fallback for numeric strings - cast to float
|
|
180
|
+
return float(str(v))
|
|
181
|
+
|
|
182
|
+
@field_validator("correlation_id", "trace_id", mode="before")
|
|
183
|
+
@classmethod
|
|
184
|
+
def _convert_none_to_uuid_sentinel(cls, v: object) -> UUID:
|
|
185
|
+
"""Convert None to nil UUID sentinel."""
|
|
186
|
+
if v is None:
|
|
187
|
+
return _SENTINEL_UUID
|
|
188
|
+
if isinstance(v, UUID):
|
|
189
|
+
return v
|
|
190
|
+
return UUID(str(v))
|
|
191
|
+
|
|
192
|
+
def _is_set_str(self, value: str) -> bool:
|
|
193
|
+
"""Check if a string field is set (not sentinel)."""
|
|
194
|
+
return value != _SENTINEL_STR
|
|
195
|
+
|
|
196
|
+
def _is_set_int(self, value: int) -> bool:
|
|
197
|
+
"""Check if an int field is set (not sentinel)."""
|
|
198
|
+
return value != _SENTINEL_INT
|
|
199
|
+
|
|
200
|
+
def _is_set_float(self, value: float) -> bool:
|
|
201
|
+
"""Check if a float field is set (not sentinel)."""
|
|
202
|
+
return value != _SENTINEL_FLOAT
|
|
203
|
+
|
|
204
|
+
def _is_set_uuid(self, value: UUID) -> bool:
|
|
205
|
+
"""Check if a UUID field is set (not nil UUID)."""
|
|
206
|
+
return value != _SENTINEL_UUID
|
|
207
|
+
|
|
208
|
+
def to_dict(self) -> LogContextDict:
|
|
209
|
+
"""Convert to dictionary for use with logging formatters.
|
|
210
|
+
|
|
211
|
+
Returns a dictionary containing only fields that are set (non-sentinel),
|
|
212
|
+
suitable for passing to ``logging.Logger`` methods via the ``extra`` parameter.
|
|
213
|
+
|
|
214
|
+
UUIDs are converted to strings for JSON serialization.
|
|
215
|
+
Enums are converted to their string values.
|
|
216
|
+
Sentinel values are excluded from the output.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Dictionary with string keys and JSON-compatible values.
|
|
220
|
+
|
|
221
|
+
Example:
|
|
222
|
+
>>> from uuid import uuid4
|
|
223
|
+
>>> ctx = ModelDispatchLogContext(
|
|
224
|
+
... topic="dev.user.events.v1",
|
|
225
|
+
... duration_ms=42.5,
|
|
226
|
+
... correlation_id=uuid4(),
|
|
227
|
+
... )
|
|
228
|
+
>>> d = ctx.to_dict()
|
|
229
|
+
>>> "topic" in d
|
|
230
|
+
True
|
|
231
|
+
>>> "category" in d # None values excluded
|
|
232
|
+
False
|
|
233
|
+
|
|
234
|
+
.. versionadded:: 0.6.0
|
|
235
|
+
.. versionchanged:: 0.6.1
|
|
236
|
+
Updated to exclude sentinel values instead of None values.
|
|
237
|
+
"""
|
|
238
|
+
result: LogContextDict = {}
|
|
239
|
+
|
|
240
|
+
# String fields - exclude empty string sentinel
|
|
241
|
+
if self._is_set_str(self.topic):
|
|
242
|
+
result["topic"] = self.topic
|
|
243
|
+
if self._is_set_str(self.message_type):
|
|
244
|
+
result["message_type"] = self.message_type
|
|
245
|
+
if self._is_set_str(self.dispatcher_id):
|
|
246
|
+
result["dispatcher_id"] = self.dispatcher_id
|
|
247
|
+
|
|
248
|
+
# Numeric fields - exclude -1 sentinel
|
|
249
|
+
if self._is_set_int(self.dispatcher_count):
|
|
250
|
+
result["dispatcher_count"] = self.dispatcher_count
|
|
251
|
+
if self._is_set_float(self.duration_ms):
|
|
252
|
+
# Round to 3 decimals: microsecond precision sufficient for log analysis
|
|
253
|
+
result["duration_ms"] = round(self.duration_ms, 3)
|
|
254
|
+
|
|
255
|
+
# UUID fields - exclude nil UUID sentinel
|
|
256
|
+
if self._is_set_uuid(self.correlation_id):
|
|
257
|
+
result["correlation_id"] = str(self.correlation_id)
|
|
258
|
+
if self._is_set_uuid(self.trace_id):
|
|
259
|
+
result["trace_id"] = str(self.trace_id)
|
|
260
|
+
|
|
261
|
+
# Enum fields - exclude None (these still use unions)
|
|
262
|
+
if self.category is not None:
|
|
263
|
+
result["category"] = self.category.value
|
|
264
|
+
if self.error_code is not None:
|
|
265
|
+
result["error_code"] = self.error_code.name
|
|
266
|
+
|
|
267
|
+
return result
|
|
268
|
+
|
|
269
|
+
@classmethod
|
|
270
|
+
def for_dispatch_start(
|
|
271
|
+
cls,
|
|
272
|
+
topic: str,
|
|
273
|
+
category: EnumMessageCategory,
|
|
274
|
+
correlation_id: UUID = _SENTINEL_UUID,
|
|
275
|
+
trace_id: UUID = _SENTINEL_UUID,
|
|
276
|
+
) -> ModelDispatchLogContext:
|
|
277
|
+
"""Create context for dispatch start logging.
|
|
278
|
+
|
|
279
|
+
Factory method for the common pattern of logging dispatch start.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
topic: The topic being dispatched to.
|
|
283
|
+
category: The message category.
|
|
284
|
+
correlation_id: Correlation ID. Defaults to nil UUID (not set).
|
|
285
|
+
trace_id: Trace ID. Defaults to nil UUID (not set).
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
A ModelDispatchLogContext for dispatch start.
|
|
289
|
+
|
|
290
|
+
Example:
|
|
291
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
292
|
+
>>> ctx = ModelDispatchLogContext.for_dispatch_start(
|
|
293
|
+
... topic="dev.user.events.v1",
|
|
294
|
+
... category=EnumMessageCategory.EVENT,
|
|
295
|
+
... )
|
|
296
|
+
|
|
297
|
+
.. versionadded:: 0.6.0
|
|
298
|
+
.. versionchanged:: 0.6.1
|
|
299
|
+
Changed to use sentinel defaults instead of None.
|
|
300
|
+
"""
|
|
301
|
+
return cls(
|
|
302
|
+
topic=topic,
|
|
303
|
+
category=category,
|
|
304
|
+
correlation_id=correlation_id,
|
|
305
|
+
trace_id=trace_id,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
@classmethod
|
|
309
|
+
def for_dispatch_complete(
|
|
310
|
+
cls,
|
|
311
|
+
topic: str,
|
|
312
|
+
category: EnumMessageCategory,
|
|
313
|
+
message_type: str,
|
|
314
|
+
dispatcher_id: str,
|
|
315
|
+
dispatcher_count: int,
|
|
316
|
+
duration_ms: float,
|
|
317
|
+
correlation_id: UUID = _SENTINEL_UUID,
|
|
318
|
+
trace_id: UUID = _SENTINEL_UUID,
|
|
319
|
+
) -> ModelDispatchLogContext:
|
|
320
|
+
"""Create context for successful dispatch completion.
|
|
321
|
+
|
|
322
|
+
Factory method for the common pattern of logging dispatch completion.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
topic: The topic dispatched to.
|
|
326
|
+
category: The message category.
|
|
327
|
+
message_type: The message type.
|
|
328
|
+
dispatcher_id: Comma-separated list of dispatcher IDs.
|
|
329
|
+
dispatcher_count: Number of dispatchers executed.
|
|
330
|
+
duration_ms: Total dispatch duration.
|
|
331
|
+
correlation_id: Correlation ID. Defaults to nil UUID (not set).
|
|
332
|
+
trace_id: Trace ID. Defaults to nil UUID (not set).
|
|
333
|
+
|
|
334
|
+
Returns:
|
|
335
|
+
A ModelDispatchLogContext for dispatch completion.
|
|
336
|
+
|
|
337
|
+
.. versionadded:: 0.6.0
|
|
338
|
+
.. versionchanged:: 0.6.1
|
|
339
|
+
Changed to use sentinel defaults instead of None.
|
|
340
|
+
"""
|
|
341
|
+
return cls(
|
|
342
|
+
topic=topic,
|
|
343
|
+
category=category,
|
|
344
|
+
message_type=message_type,
|
|
345
|
+
dispatcher_id=dispatcher_id,
|
|
346
|
+
dispatcher_count=dispatcher_count,
|
|
347
|
+
duration_ms=duration_ms,
|
|
348
|
+
correlation_id=correlation_id,
|
|
349
|
+
trace_id=trace_id,
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
@classmethod
|
|
353
|
+
def for_dispatch_error(
|
|
354
|
+
cls,
|
|
355
|
+
topic: str,
|
|
356
|
+
error_code: EnumCoreErrorCode,
|
|
357
|
+
duration_ms: float = _SENTINEL_FLOAT,
|
|
358
|
+
category: EnumMessageCategory | None = None,
|
|
359
|
+
message_type: str = _SENTINEL_STR,
|
|
360
|
+
dispatcher_id: str = _SENTINEL_STR,
|
|
361
|
+
dispatcher_count: int = _SENTINEL_INT,
|
|
362
|
+
correlation_id: UUID = _SENTINEL_UUID,
|
|
363
|
+
trace_id: UUID = _SENTINEL_UUID,
|
|
364
|
+
) -> ModelDispatchLogContext:
|
|
365
|
+
"""Create context for dispatch error logging.
|
|
366
|
+
|
|
367
|
+
Factory method for the common pattern of logging dispatch errors.
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
topic: The topic that failed.
|
|
371
|
+
error_code: The error code.
|
|
372
|
+
duration_ms: Duration before failure. Defaults to -1.0 (not set).
|
|
373
|
+
category: Message category. Defaults to None (not set).
|
|
374
|
+
message_type: Message type. Defaults to empty string (not set).
|
|
375
|
+
dispatcher_id: Dispatcher ID. Defaults to empty string (not set).
|
|
376
|
+
dispatcher_count: Dispatcher count. Defaults to -1 (not set).
|
|
377
|
+
correlation_id: Correlation ID. Defaults to nil UUID (not set).
|
|
378
|
+
trace_id: Trace ID. Defaults to nil UUID (not set).
|
|
379
|
+
|
|
380
|
+
Returns:
|
|
381
|
+
A ModelDispatchLogContext for dispatch error.
|
|
382
|
+
|
|
383
|
+
.. versionadded:: 0.6.0
|
|
384
|
+
.. versionchanged:: 0.6.1
|
|
385
|
+
Changed to use sentinel defaults instead of None.
|
|
386
|
+
"""
|
|
387
|
+
return cls(
|
|
388
|
+
topic=topic,
|
|
389
|
+
category=category,
|
|
390
|
+
message_type=message_type,
|
|
391
|
+
dispatcher_id=dispatcher_id,
|
|
392
|
+
dispatcher_count=dispatcher_count,
|
|
393
|
+
duration_ms=duration_ms,
|
|
394
|
+
correlation_id=correlation_id,
|
|
395
|
+
trace_id=trace_id,
|
|
396
|
+
error_code=error_code,
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
__all__ = ["ModelDispatchLogContext"]
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatch Metadata Model.
|
|
5
|
+
|
|
6
|
+
Provides strongly-typed metadata for dispatch operations, replacing raw dict usage
|
|
7
|
+
while maintaining extensibility for custom fields.
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
ModelDispatchMetadata is a pure data model that captures common dispatch
|
|
11
|
+
metadata fields with strong typing:
|
|
12
|
+
- Source and target node identifiers
|
|
13
|
+
- Retry information
|
|
14
|
+
- Routing decision explanations
|
|
15
|
+
|
|
16
|
+
The model uses `extra="allow"` to permit custom metadata fields beyond
|
|
17
|
+
the known typed fields, enabling extensibility for domain-specific needs
|
|
18
|
+
without modifying the core model.
|
|
19
|
+
|
|
20
|
+
This model uses sentinel values (empty string) instead of nullable unions
|
|
21
|
+
to minimize union count in the codebase (OMN-1002).
|
|
22
|
+
|
|
23
|
+
Sentinel Values:
|
|
24
|
+
- Empty string ("") means "not set" for all string fields
|
|
25
|
+
- Use the ``has_*`` properties to check if a field has been set
|
|
26
|
+
|
|
27
|
+
Thread Safety:
|
|
28
|
+
ModelDispatchMetadata is immutable (frozen=True) after creation,
|
|
29
|
+
making it thread-safe for concurrent read access.
|
|
30
|
+
|
|
31
|
+
Example:
|
|
32
|
+
>>> from omnibase_infra.models.dispatch import ModelDispatchMetadata
|
|
33
|
+
>>>
|
|
34
|
+
>>> # Create metadata with known fields
|
|
35
|
+
>>> metadata = ModelDispatchMetadata(
|
|
36
|
+
... source_node="user-service",
|
|
37
|
+
... target_node="notification-service",
|
|
38
|
+
... routing_decision="fanout to notification handlers",
|
|
39
|
+
... )
|
|
40
|
+
>>>
|
|
41
|
+
>>> # Create metadata with custom fields (extra="allow")
|
|
42
|
+
>>> extended = ModelDispatchMetadata(
|
|
43
|
+
... source_node="order-service",
|
|
44
|
+
... custom_field="custom_value",
|
|
45
|
+
... priority="high",
|
|
46
|
+
... )
|
|
47
|
+
>>> extended.model_extra["custom_field"]
|
|
48
|
+
'custom_value'
|
|
49
|
+
|
|
50
|
+
See Also:
|
|
51
|
+
omnibase_infra.models.dispatch.ModelDispatchContext: Context with time injection
|
|
52
|
+
omnibase_infra.models.dispatch.ModelDispatchResult: Dispatch operation result
|
|
53
|
+
|
|
54
|
+
.. versionchanged:: 0.7.0
|
|
55
|
+
Refactored to use sentinel values instead of nullable unions (OMN-1004).
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
59
|
+
|
|
60
|
+
# Sentinel value for "not set" state
|
|
61
|
+
_SENTINEL_STR: str = ""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ModelDispatchMetadata(BaseModel):
|
|
65
|
+
"""
|
|
66
|
+
Dispatch operation metadata with known fields and extensibility.
|
|
67
|
+
|
|
68
|
+
Provides strongly-typed common metadata fields while allowing custom
|
|
69
|
+
metadata via extra="allow" config. This replaces raw dict[str, str]
|
|
70
|
+
usage with a proper Pydantic model that maintains type safety for
|
|
71
|
+
known fields.
|
|
72
|
+
|
|
73
|
+
Sentinel Values:
|
|
74
|
+
- Empty string ("") means "not set" for all string fields
|
|
75
|
+
- Use ``has_source_node``, ``has_target_node``, etc. to check
|
|
76
|
+
|
|
77
|
+
Null Coercion:
|
|
78
|
+
Constructors accept ``None`` for any field and convert to sentinel.
|
|
79
|
+
|
|
80
|
+
Attributes:
|
|
81
|
+
source_node: Identifier of the node that originated the dispatch.
|
|
82
|
+
Empty string if not set.
|
|
83
|
+
target_node: Identifier of the target node receiving the dispatch.
|
|
84
|
+
Empty string if not set.
|
|
85
|
+
retry_reason: Explanation for why this dispatch is a retry attempt.
|
|
86
|
+
Empty string if not set.
|
|
87
|
+
routing_decision: Description of the routing decision that was made.
|
|
88
|
+
Empty string if not set.
|
|
89
|
+
|
|
90
|
+
Example:
|
|
91
|
+
>>> # Basic usage with known fields
|
|
92
|
+
>>> meta = ModelDispatchMetadata(
|
|
93
|
+
... source_node="event-processor",
|
|
94
|
+
... target_node="state-reducer",
|
|
95
|
+
... )
|
|
96
|
+
>>> meta.has_source_node
|
|
97
|
+
True
|
|
98
|
+
>>>
|
|
99
|
+
>>> # With custom extensibility fields
|
|
100
|
+
>>> meta = ModelDispatchMetadata(
|
|
101
|
+
... source_node="api-gateway",
|
|
102
|
+
... custom_trace_id="abc123",
|
|
103
|
+
... environment="production",
|
|
104
|
+
... )
|
|
105
|
+
>>> # Access custom fields via model_extra
|
|
106
|
+
>>> meta.model_extra["custom_trace_id"]
|
|
107
|
+
'abc123'
|
|
108
|
+
|
|
109
|
+
.. versionchanged:: 0.7.0
|
|
110
|
+
Refactored to use sentinel values instead of nullable unions (OMN-1004).
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
model_config = ConfigDict(
|
|
114
|
+
frozen=True,
|
|
115
|
+
extra="allow",
|
|
116
|
+
from_attributes=True,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# ---- Known Dispatch Metadata Fields ----
|
|
120
|
+
source_node: str = Field(
|
|
121
|
+
default=_SENTINEL_STR,
|
|
122
|
+
description="Identifier of the node that originated the dispatch. "
|
|
123
|
+
"Empty string if not set.",
|
|
124
|
+
)
|
|
125
|
+
target_node: str = Field(
|
|
126
|
+
default=_SENTINEL_STR,
|
|
127
|
+
description="Identifier of the target node receiving the dispatch. "
|
|
128
|
+
"Empty string if not set.",
|
|
129
|
+
)
|
|
130
|
+
retry_reason: str = Field(
|
|
131
|
+
default=_SENTINEL_STR,
|
|
132
|
+
description="Explanation for why this dispatch is a retry attempt. "
|
|
133
|
+
"Empty string if not set.",
|
|
134
|
+
)
|
|
135
|
+
routing_decision: str = Field(
|
|
136
|
+
default=_SENTINEL_STR,
|
|
137
|
+
description="Description of the routing decision that was made. "
|
|
138
|
+
"Empty string if not set.",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# ---- Validators for None-to-Sentinel Conversion ----
|
|
142
|
+
@field_validator(
|
|
143
|
+
"source_node", "target_node", "retry_reason", "routing_decision", mode="before"
|
|
144
|
+
)
|
|
145
|
+
@classmethod
|
|
146
|
+
def _convert_none_to_str_sentinel(cls, v: object) -> str:
|
|
147
|
+
"""Convert None to empty string sentinel for null coercion."""
|
|
148
|
+
if v is None:
|
|
149
|
+
return _SENTINEL_STR
|
|
150
|
+
if isinstance(v, str):
|
|
151
|
+
return v
|
|
152
|
+
return str(v)
|
|
153
|
+
|
|
154
|
+
# ---- Sentinel Check Properties ----
|
|
155
|
+
@property
|
|
156
|
+
def has_source_node(self) -> bool:
|
|
157
|
+
"""Check if source_node is set (not empty string)."""
|
|
158
|
+
return self.source_node != _SENTINEL_STR
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def has_target_node(self) -> bool:
|
|
162
|
+
"""Check if target_node is set (not empty string)."""
|
|
163
|
+
return self.target_node != _SENTINEL_STR
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def has_retry_reason(self) -> bool:
|
|
167
|
+
"""Check if retry_reason is set (not empty string)."""
|
|
168
|
+
return self.retry_reason != _SENTINEL_STR
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def has_routing_decision(self) -> bool:
|
|
172
|
+
"""Check if routing_decision is set (not empty string)."""
|
|
173
|
+
return self.routing_decision != _SENTINEL_STR
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def is_empty(self) -> bool:
|
|
177
|
+
"""Check if all known fields are unset (ignoring extra fields)."""
|
|
178
|
+
return (
|
|
179
|
+
not self.has_source_node
|
|
180
|
+
and not self.has_target_node
|
|
181
|
+
and not self.has_retry_reason
|
|
182
|
+
and not self.has_routing_decision
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
def to_dict(self) -> dict[str, str]:
|
|
186
|
+
"""Convert to dictionary with only set fields.
|
|
187
|
+
|
|
188
|
+
Returns a dictionary containing only fields that are set (non-empty),
|
|
189
|
+
including any extra fields from model_extra.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Dictionary with string keys and values.
|
|
193
|
+
|
|
194
|
+
Example:
|
|
195
|
+
>>> meta = ModelDispatchMetadata(
|
|
196
|
+
... source_node="event-processor",
|
|
197
|
+
... custom_field="value",
|
|
198
|
+
... )
|
|
199
|
+
>>> d = meta.to_dict()
|
|
200
|
+
>>> "source_node" in d
|
|
201
|
+
True
|
|
202
|
+
>>> "target_node" in d # Empty string excluded
|
|
203
|
+
False
|
|
204
|
+
>>> "custom_field" in d # Extra fields included
|
|
205
|
+
True
|
|
206
|
+
|
|
207
|
+
.. versionadded:: 0.7.0
|
|
208
|
+
"""
|
|
209
|
+
result: dict[str, str] = {}
|
|
210
|
+
if self.has_source_node:
|
|
211
|
+
result["source_node"] = self.source_node
|
|
212
|
+
if self.has_target_node:
|
|
213
|
+
result["target_node"] = self.target_node
|
|
214
|
+
if self.has_retry_reason:
|
|
215
|
+
result["retry_reason"] = self.retry_reason
|
|
216
|
+
if self.has_routing_decision:
|
|
217
|
+
result["routing_decision"] = self.routing_decision
|
|
218
|
+
# Include extra fields
|
|
219
|
+
if self.model_extra:
|
|
220
|
+
for key, value in self.model_extra.items():
|
|
221
|
+
if isinstance(value, str):
|
|
222
|
+
result[key] = value
|
|
223
|
+
else:
|
|
224
|
+
result[key] = str(value)
|
|
225
|
+
return result
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
__all__ = ["ModelDispatchMetadata"]
|