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,464 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Routing Loader for Contract-Driven Orchestrators.
|
|
4
|
+
|
|
5
|
+
This module provides utilities for loading handler routing configuration
|
|
6
|
+
from contract.yaml files. It supports the ONEX declarative pattern where
|
|
7
|
+
orchestrators define handler routing in YAML rather than Python code.
|
|
8
|
+
|
|
9
|
+
Part of OMN-1316: Extract handler routing loader to shared utility.
|
|
10
|
+
|
|
11
|
+
The loader converts contract.yaml handler_routing sections into
|
|
12
|
+
ModelRoutingSubcontract instances that can be used by orchestrators
|
|
13
|
+
and the runtime for declarative handler dispatch.
|
|
14
|
+
|
|
15
|
+
Contract Structure:
|
|
16
|
+
The contract.yaml uses a nested structure for handler routing::
|
|
17
|
+
|
|
18
|
+
handler_routing:
|
|
19
|
+
routing_strategy: "payload_type_match"
|
|
20
|
+
handlers:
|
|
21
|
+
- event_model:
|
|
22
|
+
name: "ModelNodeIntrospectionEvent"
|
|
23
|
+
module: "omnibase_infra.models..."
|
|
24
|
+
handler:
|
|
25
|
+
name: "HandlerNodeIntrospected"
|
|
26
|
+
module: "omnibase_infra.nodes..."
|
|
27
|
+
|
|
28
|
+
This is converted to ModelRoutingEntry with flat fields::
|
|
29
|
+
|
|
30
|
+
ModelRoutingEntry(
|
|
31
|
+
routing_key="ModelNodeIntrospectionEvent", # from event_model.name
|
|
32
|
+
handler_key="handler-node-introspected", # kebab-case of handler.name
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
Usage:
|
|
36
|
+
```python
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
39
|
+
load_handler_routing_subcontract,
|
|
40
|
+
convert_class_to_handler_key,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Load routing from contract.yaml
|
|
44
|
+
contract_path = Path("nodes/my_orchestrator/contract.yaml")
|
|
45
|
+
routing = load_handler_routing_subcontract(contract_path)
|
|
46
|
+
|
|
47
|
+
# Access routing entries
|
|
48
|
+
for entry in routing.handlers:
|
|
49
|
+
print(f"{entry.routing_key} -> {entry.handler_key}")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
See Also:
|
|
53
|
+
- ModelRoutingSubcontract: Model for routing configuration
|
|
54
|
+
- ModelRoutingEntry: Model for individual routing mappings
|
|
55
|
+
- CLAUDE.md: Handler Plugin Loader patterns
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
from __future__ import annotations
|
|
59
|
+
|
|
60
|
+
import logging
|
|
61
|
+
import re
|
|
62
|
+
from pathlib import Path
|
|
63
|
+
|
|
64
|
+
import yaml
|
|
65
|
+
|
|
66
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
67
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
68
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
69
|
+
from omnibase_infra.models.routing import (
|
|
70
|
+
ModelRoutingEntry,
|
|
71
|
+
ModelRoutingSubcontract,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
logger = logging.getLogger(__name__)
|
|
75
|
+
|
|
76
|
+
# Maximum allowed file size for contract.yaml files (10MB)
|
|
77
|
+
# Security control to prevent memory exhaustion via large YAML files
|
|
78
|
+
# Error code: FILE_SIZE_EXCEEDED (HANDLER_LOADER_050)
|
|
79
|
+
MAX_CONTRACT_FILE_SIZE_BYTES: int = 10 * 1024 * 1024 # 10MB
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _check_file_size(contract_path: Path, operation: str) -> None:
|
|
83
|
+
"""Check that contract file does not exceed maximum allowed size.
|
|
84
|
+
|
|
85
|
+
This is a security control to prevent memory exhaustion attacks via
|
|
86
|
+
oversized YAML files. Per CLAUDE.md Handler Plugin Loader security patterns,
|
|
87
|
+
a 10MB file size limit is enforced.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
contract_path: Path to the contract.yaml file.
|
|
91
|
+
operation: Name of the operation for error context.
|
|
92
|
+
|
|
93
|
+
Raises:
|
|
94
|
+
ProtocolConfigurationError: If file exceeds MAX_CONTRACT_FILE_SIZE_BYTES.
|
|
95
|
+
Error code: FILE_SIZE_EXCEEDED (HANDLER_LOADER_050).
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
file_size = contract_path.stat().st_size
|
|
99
|
+
except FileNotFoundError:
|
|
100
|
+
# Let the caller handle FileNotFoundError with its own error message
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
if file_size > MAX_CONTRACT_FILE_SIZE_BYTES:
|
|
104
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
105
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
106
|
+
operation=operation,
|
|
107
|
+
target_name=str(contract_path),
|
|
108
|
+
)
|
|
109
|
+
logger.error(
|
|
110
|
+
"Contract file exceeds maximum size: %d bytes > %d bytes at %s",
|
|
111
|
+
file_size,
|
|
112
|
+
MAX_CONTRACT_FILE_SIZE_BYTES,
|
|
113
|
+
contract_path,
|
|
114
|
+
)
|
|
115
|
+
raise ProtocolConfigurationError(
|
|
116
|
+
f"Contract file exceeds maximum size: {file_size} bytes > "
|
|
117
|
+
f"{MAX_CONTRACT_FILE_SIZE_BYTES} bytes. "
|
|
118
|
+
f"Reduce the contract.yaml file size or split into multiple contracts. "
|
|
119
|
+
f"Error code: FILE_SIZE_EXCEEDED (HANDLER_LOADER_050)",
|
|
120
|
+
context=ctx,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _load_and_validate_contract_yaml(
|
|
125
|
+
contract_path: Path,
|
|
126
|
+
operation: str,
|
|
127
|
+
) -> tuple[dict, dict]:
|
|
128
|
+
"""Load and validate contract.yaml with handler_routing section.
|
|
129
|
+
|
|
130
|
+
Private helper that consolidates common YAML loading and validation logic
|
|
131
|
+
used by multiple loader functions. This reduces code duplication for:
|
|
132
|
+
- File existence checking with proper error context
|
|
133
|
+
- YAML parsing with error handling
|
|
134
|
+
- Empty contract validation
|
|
135
|
+
- handler_routing section validation
|
|
136
|
+
|
|
137
|
+
Note on direct file operations:
|
|
138
|
+
This function uses direct file I/O rather than a FileRegistry abstraction.
|
|
139
|
+
See handler_contract_source.py for the same pattern and rationale:
|
|
140
|
+
- RegistryFileBased (FileRegistry) does not yet exist in omnibase_core
|
|
141
|
+
- Once available, this should be refactored for consistency
|
|
142
|
+
- See: docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
|
|
143
|
+
|
|
144
|
+
TODO [OMN-1352]: Refactor to use RegistryFileBased once available in omnibase_core.
|
|
145
|
+
This will provide consistent file access patterns across all contract loaders.
|
|
146
|
+
|
|
147
|
+
Security Note:
|
|
148
|
+
File size is checked BEFORE YAML parsing (line 164) to prevent memory
|
|
149
|
+
exhaustion attacks via oversized files. This ordering is critical -
|
|
150
|
+
_check_file_size() MUST be called before yaml.safe_load().
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
contract_path: Path to the contract.yaml file to load.
|
|
154
|
+
operation: Name of the calling operation for error context
|
|
155
|
+
(e.g., "load_handler_routing_contract", "load_handler_class_info").
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Tuple of (contract_dict, handler_routing_dict) where:
|
|
159
|
+
- contract_dict: The full parsed contract
|
|
160
|
+
- handler_routing_dict: The handler_routing section
|
|
161
|
+
|
|
162
|
+
Raises:
|
|
163
|
+
ProtocolConfigurationError: If contract.yaml does not exist, contains
|
|
164
|
+
invalid YAML syntax, is empty, exceeds maximum file size,
|
|
165
|
+
or handler_routing section is missing.
|
|
166
|
+
"""
|
|
167
|
+
# Check file size before loading (security control)
|
|
168
|
+
_check_file_size(contract_path, operation)
|
|
169
|
+
|
|
170
|
+
# Load YAML file
|
|
171
|
+
try:
|
|
172
|
+
with contract_path.open("r", encoding="utf-8") as f:
|
|
173
|
+
contract = yaml.safe_load(f)
|
|
174
|
+
except FileNotFoundError as e:
|
|
175
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
176
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
177
|
+
operation=operation,
|
|
178
|
+
target_name=str(contract_path),
|
|
179
|
+
)
|
|
180
|
+
logger.exception(
|
|
181
|
+
"contract.yaml not found at %s - cannot load contract",
|
|
182
|
+
contract_path,
|
|
183
|
+
)
|
|
184
|
+
raise ProtocolConfigurationError(
|
|
185
|
+
f"Contract file not found: {contract_path}. "
|
|
186
|
+
f"Ensure the contract.yaml exists in the orchestrator directory. "
|
|
187
|
+
f"Error code: CONTRACT_NOT_FOUND (HANDLER_LOADER_020)",
|
|
188
|
+
context=ctx,
|
|
189
|
+
) from e
|
|
190
|
+
except yaml.YAMLError as e:
|
|
191
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
192
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
193
|
+
operation=operation,
|
|
194
|
+
target_name=str(contract_path),
|
|
195
|
+
)
|
|
196
|
+
# Sanitize error message - don't include raw YAML error which may contain file contents
|
|
197
|
+
error_type = type(e).__name__
|
|
198
|
+
logger.exception(
|
|
199
|
+
"Invalid YAML syntax in contract.yaml at %s: %s",
|
|
200
|
+
contract_path,
|
|
201
|
+
error_type,
|
|
202
|
+
)
|
|
203
|
+
raise ProtocolConfigurationError(
|
|
204
|
+
f"Invalid YAML syntax in contract.yaml at {contract_path}: {error_type}. "
|
|
205
|
+
f"Verify the YAML syntax is correct. "
|
|
206
|
+
f"Error code: YAML_PARSE_ERROR (HANDLER_LOADER_021)",
|
|
207
|
+
context=ctx,
|
|
208
|
+
) from e
|
|
209
|
+
|
|
210
|
+
# Validate contract is not empty
|
|
211
|
+
if contract is None:
|
|
212
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
213
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
214
|
+
operation=operation,
|
|
215
|
+
target_name=str(contract_path),
|
|
216
|
+
)
|
|
217
|
+
msg = (
|
|
218
|
+
f"Contract file is empty: {contract_path}. "
|
|
219
|
+
f"The contract.yaml must contain valid YAML with a 'handler_routing' section. "
|
|
220
|
+
f"Error code: CONTRACT_EMPTY (HANDLER_LOADER_022)"
|
|
221
|
+
)
|
|
222
|
+
logger.error(msg)
|
|
223
|
+
raise ProtocolConfigurationError(msg, context=ctx)
|
|
224
|
+
|
|
225
|
+
# Validate handler_routing section exists
|
|
226
|
+
handler_routing = contract.get("handler_routing")
|
|
227
|
+
if handler_routing is None:
|
|
228
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
229
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
230
|
+
operation=operation,
|
|
231
|
+
target_name=str(contract_path),
|
|
232
|
+
)
|
|
233
|
+
msg = (
|
|
234
|
+
f"Missing 'handler_routing' section in contract: {contract_path}. "
|
|
235
|
+
f"Add a handler_routing section with routing_strategy and handlers. "
|
|
236
|
+
f"Error code: MISSING_HANDLER_ROUTING (HANDLER_LOADER_023)"
|
|
237
|
+
)
|
|
238
|
+
logger.error(msg)
|
|
239
|
+
raise ProtocolConfigurationError(msg, context=ctx)
|
|
240
|
+
|
|
241
|
+
return contract, handler_routing
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
# Valid routing strategies for handler routing contracts.
|
|
245
|
+
# Currently only "payload_type_match" is implemented. Additional strategies
|
|
246
|
+
# such as "first_match" or "all_match" may be added in future versions.
|
|
247
|
+
# Unknown strategies will trigger a warning and fall back to "payload_type_match".
|
|
248
|
+
VALID_ROUTING_STRATEGIES: frozenset[str] = frozenset(
|
|
249
|
+
{
|
|
250
|
+
"payload_type_match", # Match by payload type (default and only implemented)
|
|
251
|
+
}
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def convert_class_to_handler_key(class_name: str) -> str:
|
|
256
|
+
"""Convert handler class name to handler_key format (kebab-case).
|
|
257
|
+
|
|
258
|
+
Converts CamelCase handler class names to kebab-case handler keys
|
|
259
|
+
as used in ServiceHandlerRegistry.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
class_name: Handler class name in CamelCase (e.g., "HandlerNodeIntrospected").
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
Handler key in kebab-case (e.g., "handler-node-introspected").
|
|
266
|
+
|
|
267
|
+
Example:
|
|
268
|
+
>>> convert_class_to_handler_key("HandlerNodeIntrospected")
|
|
269
|
+
'handler-node-introspected'
|
|
270
|
+
>>> convert_class_to_handler_key("HandlerRuntimeTick")
|
|
271
|
+
'handler-runtime-tick'
|
|
272
|
+
>>> convert_class_to_handler_key("MyHTTPHandler")
|
|
273
|
+
'my-http-handler'
|
|
274
|
+
"""
|
|
275
|
+
# Insert hyphen before uppercase letters that follow lowercase letters
|
|
276
|
+
s1 = re.sub("(.)([A-Z][a-z]+)", r"\1-\2", class_name)
|
|
277
|
+
# Insert hyphen before uppercase letters that follow other uppercase+lowercase sequences
|
|
278
|
+
return re.sub("([a-z0-9])([A-Z])", r"\1-\2", s1).lower()
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def load_handler_routing_subcontract(contract_path: Path) -> ModelRoutingSubcontract:
|
|
282
|
+
"""Load handler routing configuration from contract.yaml.
|
|
283
|
+
|
|
284
|
+
Loads the handler_routing section from a contract.yaml file
|
|
285
|
+
and converts it to ModelRoutingSubcontract format. This follows
|
|
286
|
+
the Handler Plugin Loader pattern (see CLAUDE.md) where routing is
|
|
287
|
+
defined declaratively in contract.yaml, not hardcoded in Python.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
contract_path: Path to the contract.yaml file to load.
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
ModelRoutingSubcontract with entries mapping event models to handlers.
|
|
294
|
+
The version defaults to 1.0.0 if not specified in the contract.
|
|
295
|
+
The routing_strategy defaults to "payload_type_match" if not specified.
|
|
296
|
+
|
|
297
|
+
Raises:
|
|
298
|
+
ProtocolConfigurationError: If contract.yaml does not exist, contains invalid
|
|
299
|
+
YAML syntax, is empty, or handler_routing section is missing. Error context
|
|
300
|
+
includes operation and target_name for debugging.
|
|
301
|
+
|
|
302
|
+
Example:
|
|
303
|
+
```python
|
|
304
|
+
from pathlib import Path
|
|
305
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
306
|
+
load_handler_routing_subcontract,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
contract_path = Path(__file__).parent / "contract.yaml"
|
|
310
|
+
routing = load_handler_routing_subcontract(contract_path)
|
|
311
|
+
|
|
312
|
+
# Use routing entries
|
|
313
|
+
for entry in routing.handlers:
|
|
314
|
+
print(f"Route {entry.routing_key} to {entry.handler_key}")
|
|
315
|
+
```
|
|
316
|
+
"""
|
|
317
|
+
# Use shared helper for YAML loading and validation
|
|
318
|
+
_contract, handler_routing = _load_and_validate_contract_yaml(
|
|
319
|
+
contract_path, "load_handler_routing_contract"
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# Build routing entries from contract
|
|
323
|
+
entries: list[ModelRoutingEntry] = []
|
|
324
|
+
handlers_config = handler_routing.get("handlers", [])
|
|
325
|
+
|
|
326
|
+
for handler_config in handlers_config:
|
|
327
|
+
event_model = handler_config.get("event_model", {})
|
|
328
|
+
handler = handler_config.get("handler", {})
|
|
329
|
+
|
|
330
|
+
event_model_name = event_model.get("name")
|
|
331
|
+
handler_class_name = handler.get("name")
|
|
332
|
+
|
|
333
|
+
if not event_model_name:
|
|
334
|
+
logger.warning(
|
|
335
|
+
"Skipping handler entry with missing event_model.name in contract.yaml at %s",
|
|
336
|
+
contract_path,
|
|
337
|
+
)
|
|
338
|
+
continue
|
|
339
|
+
|
|
340
|
+
if not handler_class_name:
|
|
341
|
+
logger.warning(
|
|
342
|
+
"Skipping handler entry for %s with missing handler.name in contract.yaml at %s",
|
|
343
|
+
event_model_name,
|
|
344
|
+
contract_path,
|
|
345
|
+
)
|
|
346
|
+
continue
|
|
347
|
+
|
|
348
|
+
entries.append(
|
|
349
|
+
ModelRoutingEntry(
|
|
350
|
+
routing_key=event_model_name,
|
|
351
|
+
handler_key=convert_class_to_handler_key(handler_class_name),
|
|
352
|
+
)
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
logger.debug(
|
|
356
|
+
"Loaded %d handler routing entries from contract.yaml at %s",
|
|
357
|
+
len(entries),
|
|
358
|
+
contract_path,
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# IMPORTANT: Validate routing_strategy BEFORE constructing ModelRoutingSubcontract.
|
|
362
|
+
# This ensures invalid strategy values are caught and corrected (with warning)
|
|
363
|
+
# before the model is instantiated, preventing invalid state in the model.
|
|
364
|
+
routing_strategy = handler_routing.get("routing_strategy", "payload_type_match")
|
|
365
|
+
if routing_strategy not in VALID_ROUTING_STRATEGIES:
|
|
366
|
+
logger.warning(
|
|
367
|
+
"Unknown routing_strategy '%s' in contract at %s. "
|
|
368
|
+
"Valid values: %s. Using 'payload_type_match' as default.",
|
|
369
|
+
routing_strategy,
|
|
370
|
+
contract_path,
|
|
371
|
+
", ".join(sorted(VALID_ROUTING_STRATEGIES)),
|
|
372
|
+
)
|
|
373
|
+
routing_strategy = "payload_type_match"
|
|
374
|
+
|
|
375
|
+
# Now construct the model with validated routing_strategy
|
|
376
|
+
return ModelRoutingSubcontract(
|
|
377
|
+
version=ModelSemVer(major=1, minor=0, patch=0),
|
|
378
|
+
routing_strategy=routing_strategy,
|
|
379
|
+
handlers=entries,
|
|
380
|
+
default_handler=None,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def load_handler_class_info_from_contract(
|
|
385
|
+
contract_path: Path,
|
|
386
|
+
) -> list[dict[str, str]]:
|
|
387
|
+
"""Load handler class and module information from contract.yaml.
|
|
388
|
+
|
|
389
|
+
Extracts handler class and module information from the handler_routing
|
|
390
|
+
section of contract.yaml. This is used by registries that need to
|
|
391
|
+
dynamically load and instantiate handler classes.
|
|
392
|
+
|
|
393
|
+
This function consolidates YAML loading logic that would otherwise be
|
|
394
|
+
duplicated in registry modules (see OMN-1316).
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
contract_path: Path to the contract.yaml file.
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
List of handler configurations, each containing:
|
|
401
|
+
- handler_class: The handler class name (e.g., "HandlerNodeIntrospected")
|
|
402
|
+
- handler_module: The fully qualified module path
|
|
403
|
+
|
|
404
|
+
Raises:
|
|
405
|
+
ProtocolConfigurationError: If the contract file cannot be loaded,
|
|
406
|
+
contains invalid YAML, is empty, or handler_routing section is missing.
|
|
407
|
+
|
|
408
|
+
Example:
|
|
409
|
+
```python
|
|
410
|
+
from pathlib import Path
|
|
411
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
412
|
+
load_handler_class_info_from_contract,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
contract_path = Path(__file__).parent / "contract.yaml"
|
|
416
|
+
handler_infos = load_handler_class_info_from_contract(contract_path)
|
|
417
|
+
|
|
418
|
+
for info in handler_infos:
|
|
419
|
+
handler_cls = importlib.import_module(info["handler_module"])
|
|
420
|
+
handler = getattr(handler_cls, info["handler_class"])
|
|
421
|
+
```
|
|
422
|
+
"""
|
|
423
|
+
# Use shared helper for YAML loading and validation
|
|
424
|
+
_contract, handler_routing = _load_and_validate_contract_yaml(
|
|
425
|
+
contract_path, "load_handler_class_info_from_contract"
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
handlers_config = handler_routing.get("handlers", [])
|
|
429
|
+
result: list[dict[str, str]] = []
|
|
430
|
+
|
|
431
|
+
for handler_entry in handlers_config:
|
|
432
|
+
handler_info = handler_entry.get("handler", {})
|
|
433
|
+
handler_class = handler_info.get("name")
|
|
434
|
+
handler_module = handler_info.get("module")
|
|
435
|
+
|
|
436
|
+
if handler_class and handler_module:
|
|
437
|
+
result.append(
|
|
438
|
+
{
|
|
439
|
+
"handler_class": handler_class,
|
|
440
|
+
"handler_module": handler_module,
|
|
441
|
+
}
|
|
442
|
+
)
|
|
443
|
+
else:
|
|
444
|
+
logger.warning(
|
|
445
|
+
"Skipping handler entry with missing name or module in contract.yaml at %s",
|
|
446
|
+
contract_path,
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
logger.debug(
|
|
450
|
+
"Loaded %d handler class info entries from contract.yaml at %s",
|
|
451
|
+
len(result),
|
|
452
|
+
contract_path,
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
return result
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
__all__ = [
|
|
459
|
+
"MAX_CONTRACT_FILE_SIZE_BYTES",
|
|
460
|
+
"VALID_ROUTING_STRATEGIES",
|
|
461
|
+
"convert_class_to_handler_key",
|
|
462
|
+
"load_handler_class_info_from_contract",
|
|
463
|
+
"load_handler_routing_subcontract",
|
|
464
|
+
]
|