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,678 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatcher Registry for Message Dispatch Engine.
|
|
5
|
+
|
|
6
|
+
This module provides the RegistryDispatcher class and ProtocolMessageDispatcher protocol
|
|
7
|
+
for managing dispatcher registrations in the dispatch engine. Dispatchers are the execution
|
|
8
|
+
units that process messages after routing.
|
|
9
|
+
|
|
10
|
+
Design Pattern:
|
|
11
|
+
The RegistryDispatcher follows the "freeze after init" pattern (like EnvelopeRouter):
|
|
12
|
+
1. Registration phase: Register dispatchers during startup (single-threaded)
|
|
13
|
+
2. Freeze: Call freeze() to prevent further modifications
|
|
14
|
+
3. Execution phase: Thread-safe read access for dispatcher lookup
|
|
15
|
+
|
|
16
|
+
This pattern ensures:
|
|
17
|
+
- No runtime registration overhead (no locking on reads)
|
|
18
|
+
- Thread-safe concurrent access after freeze
|
|
19
|
+
- Clear separation between configuration and execution phases
|
|
20
|
+
|
|
21
|
+
Thread Safety:
|
|
22
|
+
- Registration methods are protected by threading.Lock
|
|
23
|
+
- After freeze(), the registry is read-only and thread-safe
|
|
24
|
+
- Execution shape validation occurs at registration time
|
|
25
|
+
|
|
26
|
+
Related:
|
|
27
|
+
- OMN-934: Dispatcher registry for message dispatch engine
|
|
28
|
+
- EnvelopeRouter: Uses similar freeze-after-init pattern
|
|
29
|
+
- ModelDispatcherRegistration: Dispatcher metadata model
|
|
30
|
+
- ModelExecutionShapeValidation: Validates execution shapes
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.4.0
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
__all__ = [
|
|
38
|
+
"RegistryDispatcher",
|
|
39
|
+
"ProtocolMessageDispatcher",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
import logging
|
|
43
|
+
import threading
|
|
44
|
+
from collections import defaultdict
|
|
45
|
+
from uuid import uuid4
|
|
46
|
+
|
|
47
|
+
from omnibase_core.enums import EnumCoreErrorCode, EnumNodeKind
|
|
48
|
+
from omnibase_core.models.errors import ModelOnexError
|
|
49
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
50
|
+
from omnibase_infra.models.validation.model_execution_shape_validation import (
|
|
51
|
+
ModelExecutionShapeValidation,
|
|
52
|
+
)
|
|
53
|
+
from omnibase_infra.protocols.protocol_message_dispatcher import (
|
|
54
|
+
ProtocolMessageDispatcher,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
logger = logging.getLogger(__name__)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class DispatchEntryInternal:
|
|
61
|
+
"""
|
|
62
|
+
Internal entry for a registered dispatcher.
|
|
63
|
+
|
|
64
|
+
Stores the dispatcher instance and its registration metadata.
|
|
65
|
+
This is an implementation detail and not part of the public API.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
__slots__ = ("dispatcher", "message_types", "registration_id")
|
|
69
|
+
|
|
70
|
+
def __init__(
|
|
71
|
+
self,
|
|
72
|
+
dispatcher: ProtocolMessageDispatcher,
|
|
73
|
+
message_types: set[str],
|
|
74
|
+
registration_id: str,
|
|
75
|
+
) -> None:
|
|
76
|
+
self.dispatcher = dispatcher
|
|
77
|
+
self.message_types = message_types
|
|
78
|
+
self.registration_id = registration_id
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class RegistryDispatcher:
|
|
82
|
+
"""
|
|
83
|
+
Thread-safe registry for message dispatchers with freeze pattern.
|
|
84
|
+
|
|
85
|
+
The RegistryDispatcher manages dispatcher registrations for the dispatch engine.
|
|
86
|
+
It stores dispatchers by category and message type, validates execution shapes
|
|
87
|
+
at registration time, and provides efficient lookup for dispatching.
|
|
88
|
+
|
|
89
|
+
Design Pattern:
|
|
90
|
+
The registry follows the "freeze after init" pattern:
|
|
91
|
+
1. Registration phase: Register dispatchers during startup
|
|
92
|
+
2. Freeze: Call freeze() to lock the registry
|
|
93
|
+
3. Execution phase: Thread-safe reads for dispatcher lookup
|
|
94
|
+
|
|
95
|
+
Thread Safety:
|
|
96
|
+
- Registration methods are protected by threading.Lock
|
|
97
|
+
- After freeze(), the registry is read-only and safe for concurrent access
|
|
98
|
+
- Execution shape validation occurs at registration time
|
|
99
|
+
|
|
100
|
+
Execution Shape Validation:
|
|
101
|
+
At registration time, the registry validates that the dispatcher's category
|
|
102
|
+
and node_kind combination forms a valid execution shape per ONEX standards:
|
|
103
|
+
- EVENT -> REDUCER (valid)
|
|
104
|
+
- EVENT -> ORCHESTRATOR (valid)
|
|
105
|
+
- COMMAND -> ORCHESTRATOR (valid)
|
|
106
|
+
- COMMAND -> EFFECT (valid)
|
|
107
|
+
- INTENT -> EFFECT (valid)
|
|
108
|
+
- Other combinations are rejected
|
|
109
|
+
|
|
110
|
+
Example:
|
|
111
|
+
.. code-block:: python
|
|
112
|
+
|
|
113
|
+
from omnibase_infra.runtime import RegistryDispatcher
|
|
114
|
+
|
|
115
|
+
# 1. Create registry and register dispatchers
|
|
116
|
+
registry = RegistryDispatcher()
|
|
117
|
+
registry.register_dispatcher(user_event_dispatcher)
|
|
118
|
+
registry.register_dispatcher(order_command_dispatcher)
|
|
119
|
+
|
|
120
|
+
# 2. Freeze to prevent modifications
|
|
121
|
+
registry.freeze()
|
|
122
|
+
|
|
123
|
+
# 3. Look up dispatchers (thread-safe after freeze)
|
|
124
|
+
dispatchers = registry.get_dispatchers(
|
|
125
|
+
category=EnumMessageCategory.EVENT,
|
|
126
|
+
message_type="UserCreated",
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
Attributes:
|
|
130
|
+
_dispatchers_by_category: Dispatchers organized by category -> list of entries
|
|
131
|
+
_dispatchers_by_id: Dispatchers indexed by dispatcher_id for fast lookup
|
|
132
|
+
_frozen: If True, registration is disabled
|
|
133
|
+
_registration_lock: Lock protecting registration methods
|
|
134
|
+
|
|
135
|
+
See Also:
|
|
136
|
+
- :class:`ProtocolMessageDispatcher`: Dispatcher protocol definition
|
|
137
|
+
- :class:`~omnibase_core.runtime.envelope_router.EnvelopeRouter`:
|
|
138
|
+
Similar freeze-after-init pattern
|
|
139
|
+
- :class:`~omnibase_infra.models.validation.model_execution_shape_validation.ModelExecutionShapeValidation`:
|
|
140
|
+
Execution shape validation
|
|
141
|
+
|
|
142
|
+
.. versionadded:: 0.4.0
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
def __init__(self) -> None:
|
|
146
|
+
"""
|
|
147
|
+
Initialize RegistryDispatcher with empty registries.
|
|
148
|
+
|
|
149
|
+
Creates empty dispatcher registries. Dispatchers must be registered before
|
|
150
|
+
dispatch. Call ``freeze()`` after registration to prevent further
|
|
151
|
+
modifications and enable safe concurrent access.
|
|
152
|
+
"""
|
|
153
|
+
# Dispatchers organized by category
|
|
154
|
+
self._dispatchers_by_category: dict[
|
|
155
|
+
EnumMessageCategory, list[DispatchEntryInternal]
|
|
156
|
+
] = defaultdict(list)
|
|
157
|
+
# Dispatchers indexed by dispatcher_id for fast lookup and duplicate detection
|
|
158
|
+
self._dispatchers_by_id: dict[str, DispatchEntryInternal] = {}
|
|
159
|
+
# Frozen flag
|
|
160
|
+
self._frozen: bool = False
|
|
161
|
+
# Lock protects registration methods
|
|
162
|
+
self._registration_lock: threading.Lock = threading.Lock()
|
|
163
|
+
|
|
164
|
+
def register_dispatcher(
|
|
165
|
+
self,
|
|
166
|
+
dispatcher: ProtocolMessageDispatcher,
|
|
167
|
+
message_types: set[str] | None = None,
|
|
168
|
+
) -> None:
|
|
169
|
+
"""
|
|
170
|
+
Register a dispatcher for message dispatch.
|
|
171
|
+
|
|
172
|
+
Registers the dispatcher and validates that its category/node_kind
|
|
173
|
+
combination forms a valid execution shape.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
dispatcher: A dispatcher implementing ProtocolMessageDispatcher.
|
|
177
|
+
message_types: Optional override for message types.
|
|
178
|
+
If None, uses dispatcher.message_types property.
|
|
179
|
+
If empty set, dispatcher accepts all message types in category.
|
|
180
|
+
|
|
181
|
+
Raises:
|
|
182
|
+
ModelOnexError: If registry is frozen (INVALID_STATE).
|
|
183
|
+
ModelOnexError: If dispatcher is None (INVALID_PARAMETER).
|
|
184
|
+
ModelOnexError: If dispatcher lacks required properties (INVALID_PARAMETER).
|
|
185
|
+
ModelOnexError: If dispatcher_id is already registered (DUPLICATE_REGISTRATION).
|
|
186
|
+
ModelOnexError: If execution shape is invalid (VALIDATION_FAILED).
|
|
187
|
+
|
|
188
|
+
Example:
|
|
189
|
+
.. code-block:: python
|
|
190
|
+
|
|
191
|
+
registry = RegistryDispatcher()
|
|
192
|
+
|
|
193
|
+
# Register with dispatcher's message_types
|
|
194
|
+
registry.register_dispatcher(user_event_dispatcher)
|
|
195
|
+
|
|
196
|
+
# Register with custom message_types
|
|
197
|
+
registry.register_dispatcher(
|
|
198
|
+
order_dispatcher,
|
|
199
|
+
message_types={"OrderCreated", "OrderUpdated"},
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# After registration, freeze
|
|
203
|
+
registry.freeze()
|
|
204
|
+
|
|
205
|
+
Thread Safety:
|
|
206
|
+
This method is protected by an internal lock to ensure atomic
|
|
207
|
+
validation and registration.
|
|
208
|
+
|
|
209
|
+
.. versionadded:: 0.4.0
|
|
210
|
+
"""
|
|
211
|
+
# Validate dispatcher outside lock
|
|
212
|
+
self._validate_dispatcher(dispatcher)
|
|
213
|
+
|
|
214
|
+
# Get dispatcher properties
|
|
215
|
+
dispatcher_id = dispatcher.dispatcher_id
|
|
216
|
+
category = dispatcher.category
|
|
217
|
+
node_kind = dispatcher.node_kind
|
|
218
|
+
effective_message_types = (
|
|
219
|
+
message_types if message_types is not None else dispatcher.message_types
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Validate execution shape outside lock
|
|
223
|
+
self._validate_execution_shape(dispatcher_id, category, node_kind)
|
|
224
|
+
|
|
225
|
+
# Create registration entry
|
|
226
|
+
registration_id = str(uuid4())
|
|
227
|
+
entry = DispatchEntryInternal(
|
|
228
|
+
dispatcher=dispatcher,
|
|
229
|
+
message_types=effective_message_types,
|
|
230
|
+
registration_id=registration_id,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# Lock for atomic frozen check + registration
|
|
234
|
+
with self._registration_lock:
|
|
235
|
+
if self._frozen:
|
|
236
|
+
raise ModelOnexError(
|
|
237
|
+
message="Cannot register dispatcher: RegistryDispatcher is frozen. "
|
|
238
|
+
"Registration is not allowed after freeze() has been called.",
|
|
239
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if dispatcher_id in self._dispatchers_by_id:
|
|
243
|
+
raise ModelOnexError(
|
|
244
|
+
message=f"Dispatcher with ID '{dispatcher_id}' is already registered. "
|
|
245
|
+
"Use unregister_dispatcher() first to replace.",
|
|
246
|
+
error_code=EnumCoreErrorCode.DUPLICATE_REGISTRATION,
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# Register in both indexes
|
|
250
|
+
self._dispatchers_by_id[dispatcher_id] = entry
|
|
251
|
+
self._dispatchers_by_category[category].append(entry)
|
|
252
|
+
|
|
253
|
+
logger.debug(
|
|
254
|
+
"Registered dispatcher '%s' for category '%s' with %d message types",
|
|
255
|
+
dispatcher_id,
|
|
256
|
+
category.value,
|
|
257
|
+
len(effective_message_types) if effective_message_types else 0,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
def unregister_dispatcher(self, dispatcher_id: str) -> bool:
|
|
261
|
+
"""
|
|
262
|
+
Unregister a dispatcher by its ID.
|
|
263
|
+
|
|
264
|
+
Removes the dispatcher from the registry. Returns True if the dispatcher
|
|
265
|
+
was found and removed, False if not found.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
dispatcher_id: The unique identifier of the dispatcher to remove.
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
bool: True if dispatcher was found and removed, False if not found.
|
|
272
|
+
|
|
273
|
+
Raises:
|
|
274
|
+
ModelOnexError: If registry is frozen (INVALID_STATE).
|
|
275
|
+
|
|
276
|
+
Example:
|
|
277
|
+
.. code-block:: python
|
|
278
|
+
|
|
279
|
+
registry = RegistryDispatcher()
|
|
280
|
+
registry.register_dispatcher(dispatcher)
|
|
281
|
+
|
|
282
|
+
# Remove the dispatcher
|
|
283
|
+
removed = registry.unregister_dispatcher("my-dispatcher")
|
|
284
|
+
assert removed is True
|
|
285
|
+
|
|
286
|
+
# Try to remove again
|
|
287
|
+
removed = registry.unregister_dispatcher("my-dispatcher")
|
|
288
|
+
assert removed is False
|
|
289
|
+
|
|
290
|
+
Thread Safety:
|
|
291
|
+
This method is protected by an internal lock.
|
|
292
|
+
|
|
293
|
+
.. versionadded:: 0.4.0
|
|
294
|
+
"""
|
|
295
|
+
with self._registration_lock:
|
|
296
|
+
if self._frozen:
|
|
297
|
+
raise ModelOnexError(
|
|
298
|
+
message="Cannot unregister dispatcher: RegistryDispatcher is frozen. "
|
|
299
|
+
"Modification is not allowed after freeze() has been called.",
|
|
300
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
if dispatcher_id not in self._dispatchers_by_id:
|
|
304
|
+
return False
|
|
305
|
+
|
|
306
|
+
entry = self._dispatchers_by_id.pop(dispatcher_id)
|
|
307
|
+
|
|
308
|
+
# Remove from category index
|
|
309
|
+
category = entry.dispatcher.category
|
|
310
|
+
category_list = self._dispatchers_by_category[category]
|
|
311
|
+
self._dispatchers_by_category[category] = [
|
|
312
|
+
e for e in category_list if e.registration_id != entry.registration_id
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
logger.debug("Unregistered dispatcher '%s'", dispatcher_id)
|
|
316
|
+
return True
|
|
317
|
+
|
|
318
|
+
def get_dispatchers(
|
|
319
|
+
self,
|
|
320
|
+
category: EnumMessageCategory,
|
|
321
|
+
message_type: str | None = None,
|
|
322
|
+
) -> list[ProtocolMessageDispatcher]:
|
|
323
|
+
"""
|
|
324
|
+
Get dispatchers that can process the given category and message type.
|
|
325
|
+
|
|
326
|
+
Returns dispatchers matching the category and optionally filtering by
|
|
327
|
+
message type. Dispatchers with empty message_types accept all message
|
|
328
|
+
types in their category.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
category: The message category to look up.
|
|
332
|
+
message_type: Optional specific message type to filter by.
|
|
333
|
+
|
|
334
|
+
Returns:
|
|
335
|
+
list[ProtocolMessageDispatcher]: List of matching dispatchers.
|
|
336
|
+
Empty list if no dispatchers match.
|
|
337
|
+
|
|
338
|
+
Raises:
|
|
339
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE).
|
|
340
|
+
|
|
341
|
+
Example:
|
|
342
|
+
.. code-block:: python
|
|
343
|
+
|
|
344
|
+
registry = RegistryDispatcher()
|
|
345
|
+
registry.register_dispatcher(user_dispatcher)
|
|
346
|
+
registry.freeze()
|
|
347
|
+
|
|
348
|
+
# Get all EVENT dispatchers
|
|
349
|
+
dispatchers = registry.get_dispatchers(EnumMessageCategory.EVENT)
|
|
350
|
+
|
|
351
|
+
# Get dispatchers for specific message type
|
|
352
|
+
dispatchers = registry.get_dispatchers(
|
|
353
|
+
EnumMessageCategory.EVENT,
|
|
354
|
+
message_type="UserCreated",
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
Thread Safety:
|
|
358
|
+
This method is safe for concurrent access after freeze().
|
|
359
|
+
|
|
360
|
+
.. versionadded:: 0.4.0
|
|
361
|
+
"""
|
|
362
|
+
# Enforce freeze contract for thread safety
|
|
363
|
+
if not self._frozen:
|
|
364
|
+
raise ModelOnexError(
|
|
365
|
+
message="get_dispatchers() called before freeze(). "
|
|
366
|
+
"Registration MUST complete and freeze() MUST be called before lookup. "
|
|
367
|
+
"This is required for thread safety.",
|
|
368
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
entries = self._dispatchers_by_category.get(category, [])
|
|
372
|
+
result: list[ProtocolMessageDispatcher] = []
|
|
373
|
+
|
|
374
|
+
for entry in entries:
|
|
375
|
+
# Check if dispatcher accepts this message type
|
|
376
|
+
if message_type is None:
|
|
377
|
+
# No type filter - include all dispatchers for category
|
|
378
|
+
result.append(entry.dispatcher)
|
|
379
|
+
elif not entry.message_types:
|
|
380
|
+
# Empty message_types means accept all
|
|
381
|
+
result.append(entry.dispatcher)
|
|
382
|
+
elif message_type in entry.message_types:
|
|
383
|
+
# Specific message type matches
|
|
384
|
+
result.append(entry.dispatcher)
|
|
385
|
+
|
|
386
|
+
return result
|
|
387
|
+
|
|
388
|
+
def get_dispatcher_by_id(
|
|
389
|
+
self, dispatcher_id: str
|
|
390
|
+
) -> ProtocolMessageDispatcher | None:
|
|
391
|
+
"""
|
|
392
|
+
Get a dispatcher by its unique ID.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
dispatcher_id: The dispatcher's unique identifier.
|
|
396
|
+
|
|
397
|
+
Returns:
|
|
398
|
+
ProtocolMessageDispatcher or None if not found.
|
|
399
|
+
|
|
400
|
+
Raises:
|
|
401
|
+
ModelOnexError: If registry is not frozen (INVALID_STATE).
|
|
402
|
+
|
|
403
|
+
Example:
|
|
404
|
+
.. code-block:: python
|
|
405
|
+
|
|
406
|
+
registry = RegistryDispatcher()
|
|
407
|
+
registry.register_dispatcher(my_dispatcher)
|
|
408
|
+
registry.freeze()
|
|
409
|
+
|
|
410
|
+
dispatcher = registry.get_dispatcher_by_id("my-dispatcher")
|
|
411
|
+
if dispatcher:
|
|
412
|
+
result = await dispatcher.handle(envelope)
|
|
413
|
+
|
|
414
|
+
Thread Safety:
|
|
415
|
+
This method is safe for concurrent access after freeze().
|
|
416
|
+
|
|
417
|
+
.. versionadded:: 0.4.0
|
|
418
|
+
"""
|
|
419
|
+
if not self._frozen:
|
|
420
|
+
raise ModelOnexError(
|
|
421
|
+
message="get_dispatcher_by_id() called before freeze(). "
|
|
422
|
+
"Registration MUST complete and freeze() MUST be called before lookup.",
|
|
423
|
+
error_code=EnumCoreErrorCode.INVALID_STATE,
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
entry = self._dispatchers_by_id.get(dispatcher_id)
|
|
427
|
+
return entry.dispatcher if entry else None
|
|
428
|
+
|
|
429
|
+
def freeze(self) -> None:
|
|
430
|
+
"""
|
|
431
|
+
Freeze the registry to prevent further modifications.
|
|
432
|
+
|
|
433
|
+
Once frozen, any calls to ``register_dispatcher()`` or ``unregister_dispatcher()``
|
|
434
|
+
will raise ModelOnexError with INVALID_STATE error code. This enforces
|
|
435
|
+
the read-only-after-init pattern for thread safety.
|
|
436
|
+
|
|
437
|
+
The freeze operation is idempotent - calling freeze() multiple times
|
|
438
|
+
has no additional effect.
|
|
439
|
+
|
|
440
|
+
Example:
|
|
441
|
+
.. code-block:: python
|
|
442
|
+
|
|
443
|
+
registry = RegistryDispatcher()
|
|
444
|
+
registry.register_dispatcher(dispatcher)
|
|
445
|
+
|
|
446
|
+
# Freeze to prevent modifications
|
|
447
|
+
registry.freeze()
|
|
448
|
+
assert registry.is_frozen
|
|
449
|
+
|
|
450
|
+
# Subsequent registration attempts raise INVALID_STATE
|
|
451
|
+
registry.register_dispatcher(another_dispatcher) # Raises!
|
|
452
|
+
|
|
453
|
+
Note:
|
|
454
|
+
This is a one-way operation - there is no ``unfreeze()`` method
|
|
455
|
+
by design, as unfreezing would defeat the thread-safety guarantees.
|
|
456
|
+
|
|
457
|
+
Thread Safety:
|
|
458
|
+
This method is protected by an internal lock to ensure atomic
|
|
459
|
+
setting of the frozen flag.
|
|
460
|
+
|
|
461
|
+
.. versionadded:: 0.4.0
|
|
462
|
+
"""
|
|
463
|
+
with self._registration_lock:
|
|
464
|
+
self._frozen = True
|
|
465
|
+
|
|
466
|
+
@property
|
|
467
|
+
def is_frozen(self) -> bool:
|
|
468
|
+
"""
|
|
469
|
+
Check if the registry is frozen.
|
|
470
|
+
|
|
471
|
+
Returns:
|
|
472
|
+
bool: True if frozen and registration is disabled,
|
|
473
|
+
False if registration is still allowed.
|
|
474
|
+
|
|
475
|
+
Example:
|
|
476
|
+
.. code-block:: python
|
|
477
|
+
|
|
478
|
+
registry = RegistryDispatcher()
|
|
479
|
+
assert not registry.is_frozen
|
|
480
|
+
|
|
481
|
+
registry.freeze()
|
|
482
|
+
assert registry.is_frozen
|
|
483
|
+
|
|
484
|
+
.. versionadded:: 0.4.0
|
|
485
|
+
"""
|
|
486
|
+
return self._frozen
|
|
487
|
+
|
|
488
|
+
@property
|
|
489
|
+
def dispatcher_count(self) -> int:
|
|
490
|
+
"""
|
|
491
|
+
Get the total number of registered dispatchers.
|
|
492
|
+
|
|
493
|
+
Returns:
|
|
494
|
+
int: Number of registered dispatchers.
|
|
495
|
+
|
|
496
|
+
Example:
|
|
497
|
+
.. code-block:: python
|
|
498
|
+
|
|
499
|
+
registry = RegistryDispatcher()
|
|
500
|
+
assert registry.dispatcher_count == 0
|
|
501
|
+
|
|
502
|
+
registry.register_dispatcher(dispatcher)
|
|
503
|
+
assert registry.dispatcher_count == 1
|
|
504
|
+
|
|
505
|
+
.. versionadded:: 0.4.0
|
|
506
|
+
"""
|
|
507
|
+
return len(self._dispatchers_by_id)
|
|
508
|
+
|
|
509
|
+
def _validate_dispatcher(
|
|
510
|
+
self, dispatcher: ProtocolMessageDispatcher | None
|
|
511
|
+
) -> None:
|
|
512
|
+
"""
|
|
513
|
+
Validate that a dispatcher meets the ProtocolMessageDispatcher requirements.
|
|
514
|
+
|
|
515
|
+
This method provides comprehensive validation using duck typing patterns.
|
|
516
|
+
It validates:
|
|
517
|
+
|
|
518
|
+
- Property values have correct types (e.g., dispatcher_id is a non-empty str)
|
|
519
|
+
- EnumMessageCategory and EnumNodeKind are the actual enum instances
|
|
520
|
+
- message_types is a set (not just any iterable)
|
|
521
|
+
- handle method is callable
|
|
522
|
+
|
|
523
|
+
**When to Use Each Validation Approach**:
|
|
524
|
+
|
|
525
|
+
- ``hasattr() + callable()``: Quick structural check via duck typing,
|
|
526
|
+
suitable for type guards or early rejection of obviously invalid objects.
|
|
527
|
+
- ``_validate_dispatcher()``: Comprehensive validation with detailed error
|
|
528
|
+
messages, used internally by ``register_dispatcher()``.
|
|
529
|
+
|
|
530
|
+
Args:
|
|
531
|
+
dispatcher: The dispatcher to validate.
|
|
532
|
+
|
|
533
|
+
Raises:
|
|
534
|
+
ModelOnexError: If dispatcher is None or lacks required properties.
|
|
535
|
+
Error codes used:
|
|
536
|
+
- INVALID_PARAMETER: Missing or invalid property
|
|
537
|
+
"""
|
|
538
|
+
if dispatcher is None:
|
|
539
|
+
raise ModelOnexError(
|
|
540
|
+
message="Cannot register None dispatcher. Dispatcher is required.",
|
|
541
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
# Validate dispatcher_id property
|
|
545
|
+
if not hasattr(dispatcher, "dispatcher_id"):
|
|
546
|
+
raise ModelOnexError(
|
|
547
|
+
message="Dispatcher must have 'dispatcher_id' property. "
|
|
548
|
+
"Ensure dispatcher implements ProtocolMessageDispatcher interface.",
|
|
549
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
dispatcher_id = dispatcher.dispatcher_id
|
|
553
|
+
if not isinstance(dispatcher_id, str) or not dispatcher_id:
|
|
554
|
+
raise ModelOnexError(
|
|
555
|
+
message=f"Dispatcher dispatcher_id must be non-empty string, got {type(dispatcher_id).__name__}",
|
|
556
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
# Validate category property
|
|
560
|
+
if not hasattr(dispatcher, "category"):
|
|
561
|
+
raise ModelOnexError(
|
|
562
|
+
message="Dispatcher must have 'category' property. "
|
|
563
|
+
"Ensure dispatcher implements ProtocolMessageDispatcher interface.",
|
|
564
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
category = dispatcher.category
|
|
568
|
+
if not isinstance(category, EnumMessageCategory):
|
|
569
|
+
raise ModelOnexError(
|
|
570
|
+
message=f"Dispatcher category must be EnumMessageCategory, got {type(category).__name__}",
|
|
571
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
# Validate node_kind property
|
|
575
|
+
if not hasattr(dispatcher, "node_kind"):
|
|
576
|
+
raise ModelOnexError(
|
|
577
|
+
message="Dispatcher must have 'node_kind' property. "
|
|
578
|
+
"Ensure dispatcher implements ProtocolMessageDispatcher interface.",
|
|
579
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
node_kind = dispatcher.node_kind
|
|
583
|
+
if not isinstance(node_kind, EnumNodeKind):
|
|
584
|
+
raise ModelOnexError(
|
|
585
|
+
message=f"Dispatcher node_kind must be EnumNodeKind, got {type(node_kind).__name__}",
|
|
586
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
# Validate message_types property
|
|
590
|
+
if not hasattr(dispatcher, "message_types"):
|
|
591
|
+
raise ModelOnexError(
|
|
592
|
+
message="Dispatcher must have 'message_types' property. "
|
|
593
|
+
"Ensure dispatcher implements ProtocolMessageDispatcher interface.",
|
|
594
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
message_types = dispatcher.message_types
|
|
598
|
+
if not isinstance(message_types, set):
|
|
599
|
+
raise ModelOnexError(
|
|
600
|
+
message=f"Dispatcher message_types must be set[str], got {type(message_types).__name__}",
|
|
601
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
602
|
+
)
|
|
603
|
+
|
|
604
|
+
# Validate handle method is callable
|
|
605
|
+
if not hasattr(dispatcher, "handle") or not callable(
|
|
606
|
+
getattr(dispatcher, "handle", None)
|
|
607
|
+
):
|
|
608
|
+
raise ModelOnexError(
|
|
609
|
+
message="Dispatcher must have callable 'handle' method. "
|
|
610
|
+
"Ensure dispatcher implements ProtocolMessageDispatcher interface.",
|
|
611
|
+
error_code=EnumCoreErrorCode.INVALID_PARAMETER,
|
|
612
|
+
)
|
|
613
|
+
|
|
614
|
+
def _validate_execution_shape(
|
|
615
|
+
self,
|
|
616
|
+
dispatcher_id: str,
|
|
617
|
+
category: EnumMessageCategory,
|
|
618
|
+
node_kind: EnumNodeKind,
|
|
619
|
+
) -> None:
|
|
620
|
+
"""
|
|
621
|
+
Validate that the dispatcher's category/node_kind forms a valid execution shape.
|
|
622
|
+
|
|
623
|
+
Uses ModelExecutionShapeValidation to check ONEX architectural compliance.
|
|
624
|
+
|
|
625
|
+
Args:
|
|
626
|
+
dispatcher_id: Dispatcher ID for error messages.
|
|
627
|
+
category: The message category.
|
|
628
|
+
node_kind: The target node kind.
|
|
629
|
+
|
|
630
|
+
Raises:
|
|
631
|
+
ModelOnexError: If execution shape is not valid (VALIDATION_FAILED).
|
|
632
|
+
"""
|
|
633
|
+
validation = ModelExecutionShapeValidation.validate_shape(
|
|
634
|
+
source_category=category,
|
|
635
|
+
target_node_kind=node_kind,
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
if not validation.is_allowed:
|
|
639
|
+
raise ModelOnexError(
|
|
640
|
+
message=f"Dispatcher '{dispatcher_id}' has invalid execution shape: "
|
|
641
|
+
f"{category.value} -> {node_kind.value}. {validation.rationale}",
|
|
642
|
+
error_code=EnumCoreErrorCode.VALIDATION_FAILED,
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
def __str__(self) -> str:
|
|
646
|
+
"""
|
|
647
|
+
Human-readable string representation.
|
|
648
|
+
|
|
649
|
+
Returns:
|
|
650
|
+
str: Format "RegistryDispatcher[dispatchers=N, frozen=bool]"
|
|
651
|
+
"""
|
|
652
|
+
return f"RegistryDispatcher[dispatchers={len(self._dispatchers_by_id)}, frozen={self._frozen}]"
|
|
653
|
+
|
|
654
|
+
def __repr__(self) -> str:
|
|
655
|
+
"""
|
|
656
|
+
Detailed representation for debugging.
|
|
657
|
+
|
|
658
|
+
Returns:
|
|
659
|
+
str: Detailed format including dispatcher IDs and categories.
|
|
660
|
+
"""
|
|
661
|
+
dispatcher_ids = list(self._dispatchers_by_id.keys())
|
|
662
|
+
categories = list(self._dispatchers_by_category.keys())
|
|
663
|
+
|
|
664
|
+
# Limit output for large registries
|
|
665
|
+
if len(dispatcher_ids) > 10:
|
|
666
|
+
dispatcher_repr = f"<{len(dispatcher_ids)} dispatchers>"
|
|
667
|
+
else:
|
|
668
|
+
dispatcher_repr = repr(dispatcher_ids)
|
|
669
|
+
|
|
670
|
+
if len(categories) > 5:
|
|
671
|
+
category_repr = f"<{len(categories)} categories>"
|
|
672
|
+
else:
|
|
673
|
+
category_repr = repr([c.value for c in categories])
|
|
674
|
+
|
|
675
|
+
return (
|
|
676
|
+
f"RegistryDispatcher(dispatchers={dispatcher_repr}, "
|
|
677
|
+
f"categories={category_repr}, frozen={self._frozen})"
|
|
678
|
+
)
|