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,127 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Event Bus Protocol for Introspection.
|
|
4
|
+
|
|
5
|
+
This module provides the minimal protocol interface for event bus compatibility
|
|
6
|
+
with infrastructure components like ServiceTimeoutEmitter and MixinNodeIntrospection.
|
|
7
|
+
|
|
8
|
+
Thread Safety:
|
|
9
|
+
Implementations of ProtocolEventBusLike MUST be thread-safe for concurrent
|
|
10
|
+
async calls. Multiple coroutines may invoke publish methods simultaneously.
|
|
11
|
+
|
|
12
|
+
Design Requirements:
|
|
13
|
+
- **Connection Pooling**: Use connection pools for underlying transports
|
|
14
|
+
- **Async-Safe Clients**: Ensure underlying clients (aiokafka, etc.) are async-safe
|
|
15
|
+
- **No Shared Mutable State**: Avoid instance-level caches that could race
|
|
16
|
+
|
|
17
|
+
Recommended Patterns:
|
|
18
|
+
- Use asyncio.Lock for any shared mutable state (e.g., circuit breakers)
|
|
19
|
+
- Use MixinAsyncCircuitBreaker for fault tolerance
|
|
20
|
+
- Keep publish operations stateless where possible
|
|
21
|
+
|
|
22
|
+
Related:
|
|
23
|
+
- docs/architecture/CIRCUIT_BREAKER_THREAD_SAFETY.md: Circuit breaker patterns
|
|
24
|
+
- EventBusKafka: Production implementation with circuit breaker integration
|
|
25
|
+
- EventBusInmemory: Simple implementation for testing
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.4.0
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from typing import Protocol, runtime_checkable
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@runtime_checkable
|
|
36
|
+
class ProtocolEventBusLike(Protocol):
|
|
37
|
+
"""Protocol for event bus compatibility.
|
|
38
|
+
|
|
39
|
+
This protocol defines the minimal interface required for an event bus
|
|
40
|
+
to be used with infrastructure components. Any object implementing either
|
|
41
|
+
``publish_envelope`` or ``publish`` method is compatible.
|
|
42
|
+
|
|
43
|
+
The mixin prefers ``publish_envelope`` when available, falling back
|
|
44
|
+
to ``publish`` for raw bytes publishing.
|
|
45
|
+
|
|
46
|
+
Thread Safety:
|
|
47
|
+
Implementations MUST be thread-safe for concurrent async calls.
|
|
48
|
+
|
|
49
|
+
**Guarantees implementers MUST provide:**
|
|
50
|
+
- Concurrent calls to publish methods are safe
|
|
51
|
+
- Internal state (if any) is protected by appropriate locks
|
|
52
|
+
- Underlying transport clients are async-safe
|
|
53
|
+
|
|
54
|
+
**Locking recommendations:**
|
|
55
|
+
- Use asyncio.Lock for shared mutable state
|
|
56
|
+
- Use MixinAsyncCircuitBreaker for fault tolerance (optional)
|
|
57
|
+
- Connection state management should use async-safe patterns
|
|
58
|
+
|
|
59
|
+
**What callers can assume:**
|
|
60
|
+
- Multiple coroutines can call publish methods concurrently
|
|
61
|
+
- Order of message delivery may not match call order (Kafka partitioning)
|
|
62
|
+
- Each publish is an independent operation
|
|
63
|
+
|
|
64
|
+
Note:
|
|
65
|
+
Method bodies in this Protocol use ``...`` (Ellipsis) rather than
|
|
66
|
+
``raise NotImplementedError()``. This is the standard Python convention
|
|
67
|
+
for ``typing.Protocol`` classes per PEP 544.
|
|
68
|
+
|
|
69
|
+
See Also:
|
|
70
|
+
- docs/architecture/CIRCUIT_BREAKER_THREAD_SAFETY.md: Thread safety patterns
|
|
71
|
+
- MixinAsyncCircuitBreaker: Recommended for production implementations
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
async def publish_envelope(
|
|
75
|
+
self,
|
|
76
|
+
envelope: object,
|
|
77
|
+
topic: str,
|
|
78
|
+
) -> None:
|
|
79
|
+
"""Publish an event envelope to a topic.
|
|
80
|
+
|
|
81
|
+
Thread Safety:
|
|
82
|
+
This method MUST be safe for concurrent calls from multiple
|
|
83
|
+
coroutines. Implementations should not rely on call ordering.
|
|
84
|
+
|
|
85
|
+
Envelope Structure:
|
|
86
|
+
The envelope is typically a Pydantic model (ModelEventEnvelope
|
|
87
|
+
from omnibase_core) with the following fields:
|
|
88
|
+
|
|
89
|
+
- correlation_id: UUID for distributed tracing
|
|
90
|
+
- event_type: String identifying the event type
|
|
91
|
+
- payload: The event data (dict or Pydantic model)
|
|
92
|
+
- metadata: Optional metadata dict
|
|
93
|
+
- timestamp: When the event was created
|
|
94
|
+
|
|
95
|
+
Implementations should support:
|
|
96
|
+
- Pydantic v2 models (model_dump method)
|
|
97
|
+
- Pydantic v1 models (dict method)
|
|
98
|
+
- Plain dict objects
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
envelope: The event envelope/model to publish. Typically
|
|
102
|
+
ModelEventEnvelope, but any Pydantic model or dict is supported.
|
|
103
|
+
topic: The topic to publish to.
|
|
104
|
+
"""
|
|
105
|
+
...
|
|
106
|
+
|
|
107
|
+
async def publish(
|
|
108
|
+
self,
|
|
109
|
+
topic: str,
|
|
110
|
+
key: bytes | None,
|
|
111
|
+
value: bytes,
|
|
112
|
+
) -> None:
|
|
113
|
+
"""Publish raw bytes to a topic (fallback method).
|
|
114
|
+
|
|
115
|
+
Thread Safety:
|
|
116
|
+
This method MUST be safe for concurrent calls from multiple
|
|
117
|
+
coroutines. Implementations should not rely on call ordering.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
topic: The topic to publish to.
|
|
121
|
+
key: Optional message key as bytes.
|
|
122
|
+
value: The message value as bytes.
|
|
123
|
+
"""
|
|
124
|
+
...
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
__all__: list[str] = ["ProtocolEventBusLike"]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Event projector protocol for event-to-state projection.
|
|
4
|
+
|
|
5
|
+
Provides the protocol definition for event projectors that transform
|
|
6
|
+
events into persistent state projections.
|
|
7
|
+
|
|
8
|
+
Part of OMN-1168: ProjectorPluginLoader contract discovery loading.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
14
|
+
from uuid import UUID
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from omnibase_core.models.events import ModelEventEnvelope
|
|
18
|
+
from omnibase_core.models.projectors import ModelProjectionResult
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@runtime_checkable
|
|
22
|
+
class ProtocolEventProjector(Protocol):
|
|
23
|
+
"""Protocol for event-to-state projection.
|
|
24
|
+
|
|
25
|
+
Defines the interface that event projectors must implement to transform
|
|
26
|
+
events into persistent state projections.
|
|
27
|
+
|
|
28
|
+
Note:
|
|
29
|
+
This protocol is defined locally until omnibase_spi provides an
|
|
30
|
+
official definition. Once available, this should be imported from
|
|
31
|
+
omnibase_spi instead.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def projector_id(self) -> str:
|
|
36
|
+
"""Unique identifier for this projector."""
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def aggregate_type(self) -> str:
|
|
41
|
+
"""The aggregate type this projector handles."""
|
|
42
|
+
...
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def consumed_events(self) -> list[str]:
|
|
46
|
+
"""Event types this projector consumes."""
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def is_placeholder(self) -> bool:
|
|
51
|
+
"""Whether this is a placeholder implementation.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
True if this is a placeholder that will raise NotImplementedError
|
|
55
|
+
on projection methods, False for full implementations.
|
|
56
|
+
"""
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
async def project(
|
|
60
|
+
self,
|
|
61
|
+
event: ModelEventEnvelope,
|
|
62
|
+
correlation_id: UUID,
|
|
63
|
+
) -> ModelProjectionResult:
|
|
64
|
+
"""Project event to persistence store.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
event: The event envelope to project.
|
|
68
|
+
correlation_id: Correlation ID for distributed tracing. Required
|
|
69
|
+
to ensure proper observability across service boundaries.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Result of the projection operation.
|
|
73
|
+
"""
|
|
74
|
+
...
|
|
75
|
+
|
|
76
|
+
async def get_state(
|
|
77
|
+
self,
|
|
78
|
+
aggregate_id: UUID,
|
|
79
|
+
correlation_id: UUID,
|
|
80
|
+
) -> object | None:
|
|
81
|
+
"""Get current projected state for an aggregate.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
aggregate_id: The unique identifier of the aggregate.
|
|
85
|
+
correlation_id: Correlation ID for distributed tracing. Required
|
|
86
|
+
to ensure proper observability across service boundaries.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
The current projected state, or None if no state exists.
|
|
90
|
+
"""
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
__all__ = [
|
|
95
|
+
"ProtocolEventProjector",
|
|
96
|
+
]
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Idempotency Store Protocol Definition.
|
|
4
|
+
|
|
5
|
+
This module defines the protocol interface for idempotency stores used
|
|
6
|
+
to track processed messages and prevent duplicate processing.
|
|
7
|
+
|
|
8
|
+
Note: This protocol is defined locally in omnibase_infra until it is
|
|
9
|
+
promoted to omnibase_spi. Once available in omnibase_spi, imports should
|
|
10
|
+
be updated to use the canonical location.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from typing import Protocol, runtime_checkable
|
|
17
|
+
from uuid import UUID
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@runtime_checkable
|
|
21
|
+
class ProtocolIdempotencyStore(Protocol):
|
|
22
|
+
"""Protocol for idempotency stores.
|
|
23
|
+
|
|
24
|
+
Idempotency stores track processed message IDs to enable exactly-once
|
|
25
|
+
or at-least-once-with-dedup semantics in distributed message processing.
|
|
26
|
+
|
|
27
|
+
Key Operations:
|
|
28
|
+
- check_and_record: Atomically check if message is new and record it
|
|
29
|
+
- is_processed: Read-only check if message was already processed
|
|
30
|
+
- mark_processed: Explicitly mark a message as processed
|
|
31
|
+
- cleanup_expired: Remove old records based on TTL
|
|
32
|
+
|
|
33
|
+
Concurrency Safety:
|
|
34
|
+
All implementations MUST be safe for concurrent coroutine access. The
|
|
35
|
+
check_and_record method MUST provide atomic check-and-set semantics to
|
|
36
|
+
prevent race conditions. Use asyncio.Lock for coroutine-safety.
|
|
37
|
+
|
|
38
|
+
Domain Isolation:
|
|
39
|
+
The optional `domain` parameter allows different message namespaces
|
|
40
|
+
to be tracked independently. The same message_id can exist in different
|
|
41
|
+
domains without conflict.
|
|
42
|
+
|
|
43
|
+
Example Usage:
|
|
44
|
+
>>> store: ProtocolIdempotencyStore = get_store()
|
|
45
|
+
>>> is_new = await store.check_and_record(
|
|
46
|
+
... message_id=uuid4(),
|
|
47
|
+
... domain="orders",
|
|
48
|
+
... correlation_id=uuid4(),
|
|
49
|
+
... )
|
|
50
|
+
>>> if is_new:
|
|
51
|
+
... # Process the message
|
|
52
|
+
... await process_order(message)
|
|
53
|
+
>>> else:
|
|
54
|
+
... # Duplicate - skip processing
|
|
55
|
+
... log.info("Skipping duplicate message")
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
async def check_and_record(
|
|
59
|
+
self,
|
|
60
|
+
message_id: UUID,
|
|
61
|
+
domain: str | None = None,
|
|
62
|
+
correlation_id: UUID | None = None,
|
|
63
|
+
) -> bool:
|
|
64
|
+
"""Atomically check if message was processed and record if not.
|
|
65
|
+
|
|
66
|
+
This is the primary idempotency check method. It MUST be atomic:
|
|
67
|
+
when multiple concurrent calls are made with the same (domain, message_id),
|
|
68
|
+
exactly ONE caller receives True.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
message_id: Unique identifier for the message.
|
|
72
|
+
domain: Optional domain namespace for isolated deduplication.
|
|
73
|
+
correlation_id: Optional correlation ID for distributed tracing.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
True if message is new (should be processed).
|
|
77
|
+
False if message is duplicate (should be skipped).
|
|
78
|
+
"""
|
|
79
|
+
...
|
|
80
|
+
|
|
81
|
+
async def is_processed(
|
|
82
|
+
self,
|
|
83
|
+
message_id: UUID,
|
|
84
|
+
domain: str | None = None,
|
|
85
|
+
) -> bool:
|
|
86
|
+
"""Check if a message was already processed.
|
|
87
|
+
|
|
88
|
+
Read-only check that does not modify the store. Use this for
|
|
89
|
+
inspection or status queries where recording is not desired.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
message_id: Unique identifier for the message.
|
|
93
|
+
domain: Optional domain namespace.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
True if the message has been processed.
|
|
97
|
+
False if the message has not been processed.
|
|
98
|
+
"""
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
async def mark_processed(
|
|
102
|
+
self,
|
|
103
|
+
message_id: UUID,
|
|
104
|
+
domain: str | None = None,
|
|
105
|
+
correlation_id: UUID | None = None,
|
|
106
|
+
processed_at: datetime | None = None,
|
|
107
|
+
) -> None:
|
|
108
|
+
"""Mark a message as processed.
|
|
109
|
+
|
|
110
|
+
Records a message as processed without checking if it already exists.
|
|
111
|
+
Use this for explicit marking, such as when replaying events or
|
|
112
|
+
seeding the store with known processed messages.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
message_id: Unique identifier for the message.
|
|
116
|
+
domain: Optional domain namespace for isolated deduplication.
|
|
117
|
+
correlation_id: Optional correlation ID for tracing.
|
|
118
|
+
processed_at: Optional timestamp of when processing occurred.
|
|
119
|
+
If None, implementations should use current time.
|
|
120
|
+
"""
|
|
121
|
+
...
|
|
122
|
+
|
|
123
|
+
async def cleanup_expired(
|
|
124
|
+
self,
|
|
125
|
+
ttl_seconds: int,
|
|
126
|
+
) -> int:
|
|
127
|
+
"""Remove entries older than TTL.
|
|
128
|
+
|
|
129
|
+
Cleans up old idempotency records based on their processed_at timestamp.
|
|
130
|
+
This prevents unbounded growth of the store.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
ttl_seconds: Time-to-live in seconds. Records older than this
|
|
134
|
+
value (based on processed_at timestamp) are removed.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Number of entries removed.
|
|
138
|
+
"""
|
|
139
|
+
...
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
__all__: list[str] = ["ProtocolIdempotencyStore"]
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Protocol for Message Dispatchers in the ONEX Dispatch Engine.
|
|
5
|
+
|
|
6
|
+
This module defines the ProtocolMessageDispatcher protocol for category-based
|
|
7
|
+
message dispatchers. Dispatchers are the execution units that process messages
|
|
8
|
+
after routing in the dispatch engine.
|
|
9
|
+
|
|
10
|
+
Thread Safety:
|
|
11
|
+
Dispatcher implementations may be invoked concurrently from the dispatch engine.
|
|
12
|
+
The same dispatcher instance may be called from multiple coroutines simultaneously.
|
|
13
|
+
|
|
14
|
+
Design Requirements:
|
|
15
|
+
- Stateless Dispatchers (Recommended): Keep dispatchers stateless by
|
|
16
|
+
extracting all needed data from the envelope. This is the safest
|
|
17
|
+
approach and requires no synchronization.
|
|
18
|
+
- Stateful Dispatchers: If state is required, use appropriate
|
|
19
|
+
synchronization primitives (asyncio.Lock for async state).
|
|
20
|
+
|
|
21
|
+
Related:
|
|
22
|
+
- OMN-934: Dispatcher registry for message dispatch engine
|
|
23
|
+
- RegistryDispatcher: Registry for managing dispatcher registrations
|
|
24
|
+
- ModelDispatchResult: Result model for dispatch operations
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.5.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
__all__ = ["ProtocolMessageDispatcher"]
|
|
32
|
+
|
|
33
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
34
|
+
|
|
35
|
+
from omnibase_core.enums import EnumNodeKind
|
|
36
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
37
|
+
from omnibase_infra.models.dispatch.model_dispatch_result import ModelDispatchResult
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from omnibase_core.models.events.model_event_envelope import ModelEventEnvelope
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@runtime_checkable
|
|
44
|
+
class ProtocolMessageDispatcher(Protocol):
|
|
45
|
+
"""
|
|
46
|
+
Protocol for category-based message dispatchers in the dispatch engine.
|
|
47
|
+
|
|
48
|
+
Message dispatchers are the execution units that process messages after routing.
|
|
49
|
+
Each dispatcher is classified by:
|
|
50
|
+
- category: The message category it handles (EVENT, COMMAND, INTENT)
|
|
51
|
+
- message_types: Specific message types it accepts (empty = all)
|
|
52
|
+
- node_kind: The ONEX node kind this dispatcher represents
|
|
53
|
+
|
|
54
|
+
Protocol Verification:
|
|
55
|
+
Per ONEX conventions, protocol compliance is verified via duck typing rather
|
|
56
|
+
than isinstance checks. Verify required methods and properties exist:
|
|
57
|
+
|
|
58
|
+
**Validation Approaches**:
|
|
59
|
+
|
|
60
|
+
1. **Duck Typing Check** (recommended for quick structural validation):
|
|
61
|
+
Use when you need to verify an object implements the dispatcher interface
|
|
62
|
+
before passing it to components that expect a dispatcher.
|
|
63
|
+
|
|
64
|
+
.. code-block:: python
|
|
65
|
+
|
|
66
|
+
# Verify required properties and methods exist
|
|
67
|
+
if (hasattr(dispatcher, 'dispatcher_id') and
|
|
68
|
+
hasattr(dispatcher, 'category') and
|
|
69
|
+
hasattr(dispatcher, 'handle') and callable(dispatcher.handle)):
|
|
70
|
+
registry.register_dispatcher(dispatcher)
|
|
71
|
+
else:
|
|
72
|
+
raise TypeError("Object does not implement ProtocolMessageDispatcher")
|
|
73
|
+
|
|
74
|
+
2. **RegistryDispatcher Validation** (comprehensive validation):
|
|
75
|
+
The ``RegistryDispatcher.register_dispatcher()`` method performs thorough
|
|
76
|
+
validation including:
|
|
77
|
+
- All required properties exist and have correct types
|
|
78
|
+
- Execution shape is valid (category -> node_kind combination)
|
|
79
|
+
- ``handle()`` method is callable
|
|
80
|
+
|
|
81
|
+
This is the recommended approach for production registration as it
|
|
82
|
+
provides detailed error messages for debugging.
|
|
83
|
+
|
|
84
|
+
**Note**: For complete type safety, use static type checking (mypy)
|
|
85
|
+
in addition to duck typing verification.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
.. code-block:: python
|
|
89
|
+
|
|
90
|
+
from omnibase_core.enums.enum_node_kind import EnumNodeKind
|
|
91
|
+
from omnibase_core.models.events.model_event_envelope import ModelEventEnvelope
|
|
92
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
93
|
+
from omnibase_infra.enums.enum_dispatch_status import EnumDispatchStatus
|
|
94
|
+
from omnibase_infra.models.dispatch.model_dispatch_result import ModelDispatchResult
|
|
95
|
+
from omnibase_infra.protocols import ProtocolMessageDispatcher
|
|
96
|
+
|
|
97
|
+
class UserEventDispatcher:
|
|
98
|
+
'''Dispatcher for user-related events.'''
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def dispatcher_id(self) -> str:
|
|
102
|
+
return "user-event-dispatcher"
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def category(self) -> EnumMessageCategory:
|
|
106
|
+
return EnumMessageCategory.EVENT
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def message_types(self) -> set[str]:
|
|
110
|
+
return {"UserCreated", "UserUpdated", "UserDeleted"}
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def node_kind(self) -> EnumNodeKind:
|
|
114
|
+
return EnumNodeKind.REDUCER
|
|
115
|
+
|
|
116
|
+
async def handle(
|
|
117
|
+
self, envelope: ModelEventEnvelope[object]
|
|
118
|
+
) -> ModelDispatchResult:
|
|
119
|
+
# Process the event
|
|
120
|
+
return ModelDispatchResult(
|
|
121
|
+
status=EnumDispatchStatus.SUCCESS,
|
|
122
|
+
topic="user.events",
|
|
123
|
+
dispatcher_id=self.dispatcher_id,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Verify protocol compliance via duck typing (per ONEX conventions)
|
|
127
|
+
dispatcher = UserEventDispatcher()
|
|
128
|
+
assert hasattr(dispatcher, 'dispatcher_id')
|
|
129
|
+
assert hasattr(dispatcher, 'category')
|
|
130
|
+
assert hasattr(dispatcher, 'handle') and callable(dispatcher.handle)
|
|
131
|
+
|
|
132
|
+
Attributes:
|
|
133
|
+
dispatcher_id: Unique identifier for this dispatcher.
|
|
134
|
+
category: The message category this dispatcher processes.
|
|
135
|
+
message_types: Specific message types this dispatcher accepts.
|
|
136
|
+
Empty set means dispatcher accepts all message types in its category.
|
|
137
|
+
node_kind: The ONEX node kind this dispatcher represents.
|
|
138
|
+
|
|
139
|
+
Note:
|
|
140
|
+
Method bodies in this Protocol use ``...`` (Ellipsis) rather than
|
|
141
|
+
``raise NotImplementedError()``. This is the standard Python convention
|
|
142
|
+
for ``typing.Protocol`` classes per PEP 544.
|
|
143
|
+
|
|
144
|
+
.. versionadded:: 0.5.0
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def dispatcher_id(self) -> str:
|
|
149
|
+
"""
|
|
150
|
+
Return the unique identifier for this dispatcher.
|
|
151
|
+
|
|
152
|
+
The dispatcher ID is used for:
|
|
153
|
+
- Registration and lookup in the registry
|
|
154
|
+
- Tracing and observability
|
|
155
|
+
- Error reporting and debugging
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
str: Unique dispatcher identifier (e.g., "user-event-dispatcher")
|
|
159
|
+
"""
|
|
160
|
+
...
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def category(self) -> EnumMessageCategory:
|
|
164
|
+
"""
|
|
165
|
+
Return the message category this dispatcher processes.
|
|
166
|
+
|
|
167
|
+
Dispatchers are classified by the category of messages they can handle:
|
|
168
|
+
- EVENT: Past-tense immutable facts
|
|
169
|
+
- COMMAND: Imperative action requests
|
|
170
|
+
- INTENT: Goal-oriented desires
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
EnumMessageCategory: The message category (EVENT, COMMAND, or INTENT)
|
|
174
|
+
"""
|
|
175
|
+
...
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def message_types(self) -> set[str]:
|
|
179
|
+
"""
|
|
180
|
+
Return the specific message types this dispatcher accepts.
|
|
181
|
+
|
|
182
|
+
When empty, the dispatcher accepts all message types within its category.
|
|
183
|
+
When non-empty, only the listed message types are accepted.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
set[str]: Set of accepted message types, or empty for all types
|
|
187
|
+
"""
|
|
188
|
+
...
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def node_kind(self) -> EnumNodeKind:
|
|
192
|
+
"""
|
|
193
|
+
Return the ONEX node kind this dispatcher represents.
|
|
194
|
+
|
|
195
|
+
The node kind determines valid execution shapes:
|
|
196
|
+
- REDUCER: Handles EVENT messages for state aggregation
|
|
197
|
+
- ORCHESTRATOR: Handles EVENT and COMMAND messages for coordination
|
|
198
|
+
- EFFECT: Handles INTENT and COMMAND messages for external I/O
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
EnumNodeKind: The node kind (REDUCER, ORCHESTRATOR, EFFECT, etc.)
|
|
202
|
+
"""
|
|
203
|
+
...
|
|
204
|
+
|
|
205
|
+
async def handle(
|
|
206
|
+
self,
|
|
207
|
+
envelope: ModelEventEnvelope[object],
|
|
208
|
+
) -> ModelDispatchResult:
|
|
209
|
+
"""
|
|
210
|
+
Handle the given envelope and return a dispatch result.
|
|
211
|
+
|
|
212
|
+
This is the primary execution method. The dispatcher receives an input
|
|
213
|
+
envelope, processes it according to its category and node kind,
|
|
214
|
+
and returns a dispatch result indicating success or failure.
|
|
215
|
+
|
|
216
|
+
Typing Note (ModelEventEnvelope[object]):
|
|
217
|
+
The envelope parameter uses ``ModelEventEnvelope[object]`` instead of
|
|
218
|
+
``Any`` per CLAUDE.md guidance: "Use ``object`` for generic payloads".
|
|
219
|
+
|
|
220
|
+
This is intentional:
|
|
221
|
+
- CLAUDE.md mandates "NEVER use ``Any``" and specifies ``object`` for
|
|
222
|
+
generic payloads that can accept multiple event types
|
|
223
|
+
- Generic dispatchers must handle multiple event types at runtime;
|
|
224
|
+
the dispatch engine routes based on topic/category/message_type,
|
|
225
|
+
not payload shape
|
|
226
|
+
- Payload extraction uses ``isinstance()`` type guards for runtime
|
|
227
|
+
safety (see dispatcher implementations)
|
|
228
|
+
- ``object`` provides better type safety than ``Any`` while allowing
|
|
229
|
+
the flexibility required for polymorphic dispatch
|
|
230
|
+
|
|
231
|
+
For type-specific processing, dispatcher implementations should use
|
|
232
|
+
type guards to narrow the payload type:
|
|
233
|
+
|
|
234
|
+
.. code-block:: python
|
|
235
|
+
|
|
236
|
+
payload = envelope.payload
|
|
237
|
+
if isinstance(payload, SpecificEventType):
|
|
238
|
+
# Type-safe processing here
|
|
239
|
+
process_specific_event(payload)
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
envelope: The input envelope containing the message to process.
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
ModelDispatchResult: The result of the dispatch operation.
|
|
246
|
+
"""
|
|
247
|
+
...
|