omnibase_infra 0.2.6__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/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -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 +132 -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_consumer_group_purpose.py +92 -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 +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -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_kafka_acks.py +99 -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 +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -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 +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -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 +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -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 +693 -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/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -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 +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -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 +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -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 +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -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 +922 -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 +1051 -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 +109 -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/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -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 +2670 -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 +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -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 +330 -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 +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -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_materialized_dispatch.py +141 -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 +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -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/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -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 +591 -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 +68 -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_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -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 +49 -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 +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -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 +57 -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 +203 -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 +106 -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/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -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/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -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 +482 -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 +694 -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 +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -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 +220 -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 +112 -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 +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -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 +417 -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 +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -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 +1138 -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 +449 -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 +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -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 +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -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/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -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_contract_load_result.py +224 -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 +229 -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_notification_config.py +171 -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_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -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_security_config.py +109 -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/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -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 +1330 -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 +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -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 +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -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/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -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 +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -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 +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -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_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -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 +1514 -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 +2033 -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 +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Contract-Based Handler Discovery Service for ONEX Infrastructure.
|
|
4
|
+
|
|
5
|
+
This module provides ContractHandlerDiscovery, which bridges the HandlerPluginLoader
|
|
6
|
+
(which loads handler metadata from contracts) with the RegistryProtocolBinding
|
|
7
|
+
(which tracks handler classes for runtime instantiation).
|
|
8
|
+
|
|
9
|
+
Part of OMN-1133: Handler Discovery Service implementation.
|
|
10
|
+
|
|
11
|
+
The discovery service is responsible for:
|
|
12
|
+
- Scanning contract paths for handler definitions
|
|
13
|
+
- Loading handler classes via the plugin loader
|
|
14
|
+
- Registering discovered handlers with the handler registry
|
|
15
|
+
- Tracking errors and warnings without failing the entire operation
|
|
16
|
+
|
|
17
|
+
Thread Safety:
|
|
18
|
+
The discovery service is stateless and can be safely invoked from multiple
|
|
19
|
+
threads concurrently. All shared state (if any) is delegated to the injected
|
|
20
|
+
plugin_loader and handler_registry, which maintain their own thread safety.
|
|
21
|
+
|
|
22
|
+
Error Handling Strategy:
|
|
23
|
+
Individual handler failures do NOT fail the entire discovery operation.
|
|
24
|
+
Instead, errors are captured in the ModelDiscoveryResult for the caller
|
|
25
|
+
to handle. This enables graceful degradation where some handlers can be
|
|
26
|
+
registered even if others fail to load.
|
|
27
|
+
|
|
28
|
+
Example Usage:
|
|
29
|
+
```python
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from omnibase_infra.runtime import (
|
|
32
|
+
ContractHandlerDiscovery,
|
|
33
|
+
HandlerPluginLoader,
|
|
34
|
+
get_handler_registry,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
discovery = ContractHandlerDiscovery(
|
|
38
|
+
plugin_loader=HandlerPluginLoader(),
|
|
39
|
+
handler_registry=get_handler_registry(),
|
|
40
|
+
)
|
|
41
|
+
result = await discovery.discover_and_register([Path("nodes/")])
|
|
42
|
+
if result:
|
|
43
|
+
print(f"Registered {result.handlers_registered} handlers")
|
|
44
|
+
else:
|
|
45
|
+
for error in result.errors:
|
|
46
|
+
print(f"Error: {error.message}")
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
See Also:
|
|
50
|
+
- HandlerPluginLoader: Loader for reading handler contracts from filesystem
|
|
51
|
+
- RegistryProtocolBinding: Registry for storing discovered handler classes
|
|
52
|
+
- ModelDiscoveryResult: Model representing discovery operation results
|
|
53
|
+
- ProtocolHandlerDiscovery: Protocol interface this class implements
|
|
54
|
+
|
|
55
|
+
.. versionadded:: 0.7.0
|
|
56
|
+
Created as part of OMN-1133 contract-based handler discovery.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
from __future__ import annotations
|
|
60
|
+
|
|
61
|
+
import importlib
|
|
62
|
+
import logging
|
|
63
|
+
from pathlib import Path
|
|
64
|
+
from typing import TYPE_CHECKING
|
|
65
|
+
from uuid import UUID, uuid4
|
|
66
|
+
|
|
67
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
68
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
69
|
+
from omnibase_infra.models.runtime.model_discovery_error import ModelDiscoveryError
|
|
70
|
+
from omnibase_infra.models.runtime.model_discovery_result import ModelDiscoveryResult
|
|
71
|
+
from omnibase_infra.models.runtime.model_discovery_warning import (
|
|
72
|
+
ModelDiscoveryWarning,
|
|
73
|
+
)
|
|
74
|
+
from omnibase_infra.runtime.registry.registry_protocol_binding import RegistryError
|
|
75
|
+
|
|
76
|
+
if TYPE_CHECKING:
|
|
77
|
+
from omnibase_infra.runtime.handler_registry import RegistryProtocolBinding
|
|
78
|
+
from omnibase_infra.runtime.protocol_handler_plugin_loader import (
|
|
79
|
+
ProtocolHandlerPluginLoader,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
logger = logging.getLogger(__name__)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ContractHandlerDiscovery:
|
|
86
|
+
"""Discovers and registers handlers from contracts automatically.
|
|
87
|
+
|
|
88
|
+
This class bridges the HandlerPluginLoader (which loads handler metadata from
|
|
89
|
+
contracts) with the RegistryProtocolBinding (which tracks handler classes for
|
|
90
|
+
runtime instantiation).
|
|
91
|
+
|
|
92
|
+
Pattern: Stateless service that coordinates between plugin loader and registry.
|
|
93
|
+
|
|
94
|
+
The discovery process:
|
|
95
|
+
1. Scans each provided path for handler contracts
|
|
96
|
+
2. Uses the plugin_loader to load and validate handlers
|
|
97
|
+
3. Imports handler classes for registration
|
|
98
|
+
4. Registers classes with the handler_registry
|
|
99
|
+
5. Tracks errors/warnings without failing the entire operation
|
|
100
|
+
|
|
101
|
+
Attributes:
|
|
102
|
+
_plugin_loader: Loader for reading handler contracts from filesystem.
|
|
103
|
+
_handler_registry: Registry for storing discovered handler classes.
|
|
104
|
+
_last_discovery_result: Cached result from the most recent discovery operation.
|
|
105
|
+
Populated after each call to ``discover_and_register()``. Enables
|
|
106
|
+
observability tools to query what was discovered without re-running
|
|
107
|
+
discovery. Initially None until first discovery completes.
|
|
108
|
+
|
|
109
|
+
Example:
|
|
110
|
+
>>> from pathlib import Path
|
|
111
|
+
>>> discovery = ContractHandlerDiscovery(
|
|
112
|
+
... plugin_loader=HandlerPluginLoader(),
|
|
113
|
+
... handler_registry=get_handler_registry(),
|
|
114
|
+
... )
|
|
115
|
+
>>> result = await discovery.discover_and_register([Path("nodes/")])
|
|
116
|
+
>>> if result:
|
|
117
|
+
... print(f"Registered {result.handlers_registered} handlers")
|
|
118
|
+
Registered 5 handlers
|
|
119
|
+
|
|
120
|
+
.. versionadded:: 0.7.0
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
def __init__(
|
|
124
|
+
self,
|
|
125
|
+
plugin_loader: ProtocolHandlerPluginLoader,
|
|
126
|
+
handler_registry: RegistryProtocolBinding,
|
|
127
|
+
) -> None:
|
|
128
|
+
"""Initialize the discovery service.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
plugin_loader: Loader for reading handler contracts from filesystem.
|
|
132
|
+
Must implement ProtocolHandlerPluginLoader protocol.
|
|
133
|
+
handler_registry: Registry for storing discovered handler classes.
|
|
134
|
+
Must implement RegistryProtocolBinding interface.
|
|
135
|
+
"""
|
|
136
|
+
self._plugin_loader = plugin_loader
|
|
137
|
+
self._handler_registry = handler_registry
|
|
138
|
+
self._last_discovery_result: ModelDiscoveryResult | None = None
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def last_discovery_result(self) -> ModelDiscoveryResult | None:
|
|
142
|
+
"""Return cached discovery result for observability.
|
|
143
|
+
|
|
144
|
+
This property provides access to the result of the most recent
|
|
145
|
+
``discover_and_register()`` call. Useful for observability tools,
|
|
146
|
+
monitoring dashboards, and debugging without re-running discovery.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
The cached ModelDiscoveryResult from the last discovery operation,
|
|
150
|
+
or None if discovery has not been run yet.
|
|
151
|
+
|
|
152
|
+
Example:
|
|
153
|
+
>>> discovery = ContractHandlerDiscovery(loader, registry)
|
|
154
|
+
>>> # Before any discovery
|
|
155
|
+
>>> discovery.last_discovery_result is None
|
|
156
|
+
True
|
|
157
|
+
>>> # After discovery
|
|
158
|
+
>>> await discovery.discover_and_register([Path("nodes/")])
|
|
159
|
+
>>> discovery.last_discovery_result.handlers_registered
|
|
160
|
+
5
|
|
161
|
+
|
|
162
|
+
.. versionadded:: 0.7.0
|
|
163
|
+
"""
|
|
164
|
+
return self._last_discovery_result
|
|
165
|
+
|
|
166
|
+
async def discover_and_register(
|
|
167
|
+
self,
|
|
168
|
+
contract_paths: list[Path],
|
|
169
|
+
correlation_id: UUID | None = None,
|
|
170
|
+
) -> ModelDiscoveryResult:
|
|
171
|
+
"""Discover handlers from contracts and register them.
|
|
172
|
+
|
|
173
|
+
This is the primary entry point for contract-driven handler discovery.
|
|
174
|
+
It combines path scanning, handler loading, class importing, and
|
|
175
|
+
registration into a single operation.
|
|
176
|
+
|
|
177
|
+
Discovery process:
|
|
178
|
+
1. Scan each path for handler contracts (handler_contract.yaml or contract.yaml)
|
|
179
|
+
2. Load and validate handler metadata via plugin_loader
|
|
180
|
+
3. Import handler classes from their module paths
|
|
181
|
+
4. Register classes with handler_registry using handler_name as key
|
|
182
|
+
5. Track errors/warnings without failing entire operation
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
contract_paths: Paths to scan for handler contracts. Can be:
|
|
186
|
+
- **Directories**: Recursively scanned for contract files
|
|
187
|
+
- **Files**: Directly loaded as contract files
|
|
188
|
+
- **Mixed**: Both directories and files in the same call
|
|
189
|
+
correlation_id: Optional correlation ID for tracing and error context.
|
|
190
|
+
If not provided, a new UUID4 is auto-generated to ensure all
|
|
191
|
+
operations are traceable via structured logging.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
ModelDiscoveryResult containing:
|
|
195
|
+
- ``handlers_discovered``: Number of handlers found
|
|
196
|
+
- ``handlers_registered``: Number successfully registered
|
|
197
|
+
- ``errors``: List of errors (individual failures don't fail operation)
|
|
198
|
+
- ``warnings``: List of non-fatal warnings
|
|
199
|
+
- ``discovered_at``: Timestamp of completion
|
|
200
|
+
|
|
201
|
+
The result's ``__bool__`` returns True only if no errors occurred,
|
|
202
|
+
enabling idiomatic success checking: ``if result: ...``
|
|
203
|
+
|
|
204
|
+
Raises:
|
|
205
|
+
This method does NOT raise exceptions for individual handler failures.
|
|
206
|
+
All errors are captured in the result's ``errors`` list. Only critical
|
|
207
|
+
system failures (out of memory, etc.) would propagate exceptions.
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
.. code-block:: python
|
|
211
|
+
|
|
212
|
+
from pathlib import Path
|
|
213
|
+
|
|
214
|
+
discovery = ContractHandlerDiscovery(
|
|
215
|
+
plugin_loader=HandlerPluginLoader(),
|
|
216
|
+
handler_registry=get_handler_registry(),
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
# Discover from multiple paths
|
|
220
|
+
result = await discovery.discover_and_register([
|
|
221
|
+
Path("src/nodes/handlers"),
|
|
222
|
+
Path("plugins/custom_handler/contract.yaml"),
|
|
223
|
+
])
|
|
224
|
+
|
|
225
|
+
# Check for success
|
|
226
|
+
if result:
|
|
227
|
+
print(f"Registered {result.handlers_registered} handlers")
|
|
228
|
+
else:
|
|
229
|
+
for error in result.errors:
|
|
230
|
+
print(f"Error [{error.error_code}]: {error.message}")
|
|
231
|
+
|
|
232
|
+
Thread Safety:
|
|
233
|
+
This method is stateless and can be called concurrently from multiple
|
|
234
|
+
threads or coroutines. The underlying plugin_loader and handler_registry
|
|
235
|
+
are responsible for their own thread safety.
|
|
236
|
+
|
|
237
|
+
Note:
|
|
238
|
+
This method performs synchronous file I/O and module imports despite
|
|
239
|
+
being declared async. This is intentional for simplicity since discovery
|
|
240
|
+
is typically performed at application startup when blocking is acceptable.
|
|
241
|
+
For high-concurrency scenarios where blocking the event loop is problematic,
|
|
242
|
+
consider wrapping this call with ``asyncio.to_thread()`` or running it
|
|
243
|
+
in a dedicated thread pool executor.
|
|
244
|
+
|
|
245
|
+
.. versionadded:: 0.7.0
|
|
246
|
+
"""
|
|
247
|
+
# Auto-generate correlation_id if not provided (per ONEX guidelines)
|
|
248
|
+
correlation_id = correlation_id or uuid4()
|
|
249
|
+
|
|
250
|
+
errors: list[ModelDiscoveryError] = []
|
|
251
|
+
warnings: list[ModelDiscoveryWarning] = []
|
|
252
|
+
handlers_discovered = 0
|
|
253
|
+
handlers_registered = 0
|
|
254
|
+
|
|
255
|
+
logger.info(
|
|
256
|
+
"Starting handler discovery",
|
|
257
|
+
extra={
|
|
258
|
+
"correlation_id": str(correlation_id),
|
|
259
|
+
"contract_paths": [str(p) for p in contract_paths],
|
|
260
|
+
"path_count": len(contract_paths),
|
|
261
|
+
},
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
for path in contract_paths:
|
|
265
|
+
path_handlers_discovered = 0
|
|
266
|
+
path_handlers_registered = 0
|
|
267
|
+
|
|
268
|
+
try:
|
|
269
|
+
# Determine path type and load accordingly
|
|
270
|
+
# path.is_dir() and path.is_file() can raise OSError for:
|
|
271
|
+
# - Permission denied when accessing the path
|
|
272
|
+
# - Filesystem errors (unmounted volumes, network failures)
|
|
273
|
+
#
|
|
274
|
+
# Initialize before try block to ensure these variables are always
|
|
275
|
+
# defined, even if an unexpected (non-OSError) exception occurs.
|
|
276
|
+
# This prevents NameError in the outer exception handlers that
|
|
277
|
+
# reference is_file (lines 430, 448, 460).
|
|
278
|
+
is_directory = False
|
|
279
|
+
is_file = False
|
|
280
|
+
try:
|
|
281
|
+
is_directory = path.is_dir()
|
|
282
|
+
is_file = path.is_file()
|
|
283
|
+
path_exists = path.exists()
|
|
284
|
+
except OSError as e:
|
|
285
|
+
errors.append(
|
|
286
|
+
ModelDiscoveryError(
|
|
287
|
+
error_code="PATH_ACCESS_ERROR",
|
|
288
|
+
message=f"Failed to access path: {e}",
|
|
289
|
+
contract_path=path,
|
|
290
|
+
details={"exception_type": type(e).__name__},
|
|
291
|
+
)
|
|
292
|
+
)
|
|
293
|
+
continue
|
|
294
|
+
|
|
295
|
+
if not path_exists:
|
|
296
|
+
errors.append(
|
|
297
|
+
ModelDiscoveryError(
|
|
298
|
+
error_code="PATH_NOT_FOUND",
|
|
299
|
+
message=f"Contract path does not exist: {path}",
|
|
300
|
+
contract_path=path,
|
|
301
|
+
)
|
|
302
|
+
)
|
|
303
|
+
continue
|
|
304
|
+
|
|
305
|
+
# Load handlers based on path type
|
|
306
|
+
if is_directory:
|
|
307
|
+
# Directory: use load_from_directory for recursive scanning
|
|
308
|
+
loaded_handlers = self._plugin_loader.load_from_directory(
|
|
309
|
+
directory=path,
|
|
310
|
+
correlation_id=correlation_id,
|
|
311
|
+
)
|
|
312
|
+
elif is_file:
|
|
313
|
+
# File: use load_from_contract for direct loading
|
|
314
|
+
loaded_handler = self._plugin_loader.load_from_contract(
|
|
315
|
+
contract_path=path,
|
|
316
|
+
correlation_id=correlation_id,
|
|
317
|
+
)
|
|
318
|
+
loaded_handlers = [loaded_handler]
|
|
319
|
+
else:
|
|
320
|
+
# Path exists but is neither file nor directory (e.g., symlink to nothing)
|
|
321
|
+
errors.append(
|
|
322
|
+
ModelDiscoveryError(
|
|
323
|
+
error_code="INVALID_PATH_TYPE",
|
|
324
|
+
message=f"Path exists but is not a file or directory: {path}",
|
|
325
|
+
contract_path=path,
|
|
326
|
+
)
|
|
327
|
+
)
|
|
328
|
+
continue
|
|
329
|
+
|
|
330
|
+
path_handlers_discovered = len(loaded_handlers)
|
|
331
|
+
handlers_discovered += path_handlers_discovered
|
|
332
|
+
|
|
333
|
+
# Register each discovered handler
|
|
334
|
+
for loaded in loaded_handlers:
|
|
335
|
+
try:
|
|
336
|
+
# Import the handler class from its fully-qualified path
|
|
337
|
+
# The plugin_loader already validated the class during loading,
|
|
338
|
+
# but ModelLoadedHandler only stores the string path
|
|
339
|
+
handler_class = self._import_handler_class(
|
|
340
|
+
loaded.handler_class,
|
|
341
|
+
correlation_id,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# Register with handler_registry using protocol_type as key
|
|
345
|
+
# This enables runtime lookup by protocol type (e.g., "db", "http")
|
|
346
|
+
# which matches how message routing selects handlers
|
|
347
|
+
self._handler_registry.register(
|
|
348
|
+
loaded.protocol_type,
|
|
349
|
+
handler_class,
|
|
350
|
+
)
|
|
351
|
+
handlers_registered += 1
|
|
352
|
+
path_handlers_registered += 1
|
|
353
|
+
|
|
354
|
+
logger.debug(
|
|
355
|
+
"Registered handler: %s (protocol=%s) -> %s",
|
|
356
|
+
loaded.handler_name,
|
|
357
|
+
loaded.protocol_type,
|
|
358
|
+
loaded.handler_class,
|
|
359
|
+
extra={
|
|
360
|
+
"correlation_id": str(correlation_id),
|
|
361
|
+
"handler_name": loaded.handler_name,
|
|
362
|
+
"protocol_type": loaded.protocol_type,
|
|
363
|
+
"handler_class": loaded.handler_class,
|
|
364
|
+
"contract_path": str(loaded.contract_path),
|
|
365
|
+
},
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
except RegistryError as e:
|
|
369
|
+
# Registration failed (e.g., invalid handler protocol)
|
|
370
|
+
errors.append(
|
|
371
|
+
ModelDiscoveryError(
|
|
372
|
+
error_code="REGISTRATION_FAILED",
|
|
373
|
+
message=f"Failed to register handler: {e}",
|
|
374
|
+
contract_path=loaded.contract_path,
|
|
375
|
+
handler_name=loaded.handler_name,
|
|
376
|
+
details={
|
|
377
|
+
"exception_type": type(e).__name__,
|
|
378
|
+
"handler_class": loaded.handler_class,
|
|
379
|
+
},
|
|
380
|
+
)
|
|
381
|
+
)
|
|
382
|
+
except (
|
|
383
|
+
AttributeError,
|
|
384
|
+
ImportError,
|
|
385
|
+
ProtocolConfigurationError,
|
|
386
|
+
) as e:
|
|
387
|
+
# Module/class import failed
|
|
388
|
+
# AttributeError: Class not found in module (from getattr)
|
|
389
|
+
# ImportError: Module not found or import failure
|
|
390
|
+
# ProtocolConfigurationError: Invalid class path or non-class type
|
|
391
|
+
# Uses IMPORT_ERROR for consistency with EnumHandlerLoaderError
|
|
392
|
+
errors.append(
|
|
393
|
+
ModelDiscoveryError(
|
|
394
|
+
error_code="IMPORT_ERROR",
|
|
395
|
+
message=f"Failed to import handler class: {e}",
|
|
396
|
+
contract_path=loaded.contract_path,
|
|
397
|
+
handler_name=loaded.handler_name,
|
|
398
|
+
details={
|
|
399
|
+
"exception_type": type(e).__name__,
|
|
400
|
+
"handler_class": loaded.handler_class,
|
|
401
|
+
},
|
|
402
|
+
)
|
|
403
|
+
)
|
|
404
|
+
except Exception as e:
|
|
405
|
+
# CATCH-ALL: Individual handler failures must NOT crash the entire
|
|
406
|
+
# discovery operation. This enables graceful degradation where some
|
|
407
|
+
# handlers can be registered even if others fail unexpectedly. All
|
|
408
|
+
# errors are captured in the result for the caller to handle.
|
|
409
|
+
errors.append(
|
|
410
|
+
ModelDiscoveryError(
|
|
411
|
+
error_code="REGISTRATION_UNEXPECTED_ERROR",
|
|
412
|
+
message=f"Unexpected error during handler registration: {e}",
|
|
413
|
+
contract_path=loaded.contract_path,
|
|
414
|
+
handler_name=loaded.handler_name,
|
|
415
|
+
details={
|
|
416
|
+
"exception_type": type(e).__name__,
|
|
417
|
+
"handler_class": loaded.handler_class,
|
|
418
|
+
},
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
logger.debug(
|
|
423
|
+
"Processed path: %s",
|
|
424
|
+
path,
|
|
425
|
+
extra={
|
|
426
|
+
"correlation_id": str(correlation_id),
|
|
427
|
+
"path": str(path),
|
|
428
|
+
"handlers_discovered": path_handlers_discovered,
|
|
429
|
+
"handlers_registered": path_handlers_registered,
|
|
430
|
+
},
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
except ProtocolConfigurationError as e:
|
|
434
|
+
# Plugin loader configuration errors (e.g., invalid contract)
|
|
435
|
+
error_code = "LOAD_ERROR"
|
|
436
|
+
# Extract error code from exception if available
|
|
437
|
+
if hasattr(e, "model") and hasattr(e.model, "context"):
|
|
438
|
+
context_dict = e.model.context
|
|
439
|
+
if isinstance(context_dict, dict):
|
|
440
|
+
loader_error = context_dict.get("loader_error")
|
|
441
|
+
error_code = (
|
|
442
|
+
str(loader_error)
|
|
443
|
+
if loader_error is not None
|
|
444
|
+
else error_code
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
errors.append(
|
|
448
|
+
ModelDiscoveryError(
|
|
449
|
+
error_code=error_code,
|
|
450
|
+
message=str(e),
|
|
451
|
+
contract_path=path if is_file else None,
|
|
452
|
+
details={"exception_type": type(e).__name__},
|
|
453
|
+
)
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
except Exception as e:
|
|
457
|
+
# CATCH-ALL: Discovery must be resilient - a single failing path must NOT
|
|
458
|
+
# crash the entire discovery operation. This enables processing remaining
|
|
459
|
+
# paths even if one path encounters unexpected errors (e.g., filesystem
|
|
460
|
+
# race conditions, corrupted files, unexpected plugin loader exceptions).
|
|
461
|
+
# All errors are captured in the result for the caller to handle.
|
|
462
|
+
#
|
|
463
|
+
# NOTE: Use stored is_file boolean, NOT path.is_file() call
|
|
464
|
+
# which could raise OSError while already handling an exception.
|
|
465
|
+
errors.append(
|
|
466
|
+
ModelDiscoveryError(
|
|
467
|
+
error_code="UNEXPECTED_ERROR",
|
|
468
|
+
message=f"Unexpected error during discovery: {e}",
|
|
469
|
+
contract_path=path if is_file else None,
|
|
470
|
+
details={"exception_type": type(e).__name__},
|
|
471
|
+
)
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
result = ModelDiscoveryResult(
|
|
475
|
+
handlers_discovered=handlers_discovered,
|
|
476
|
+
handlers_registered=handlers_registered,
|
|
477
|
+
errors=errors,
|
|
478
|
+
warnings=warnings,
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
# Cache result for observability (enables monitoring/debugging without re-running)
|
|
482
|
+
self._last_discovery_result = result
|
|
483
|
+
|
|
484
|
+
# Log at appropriate level based on error count
|
|
485
|
+
log_level = logging.WARNING if result.has_errors else logging.INFO
|
|
486
|
+
logger.log(
|
|
487
|
+
log_level,
|
|
488
|
+
"Handler discovery completed: %d discovered, %d registered, %d errors",
|
|
489
|
+
handlers_discovered,
|
|
490
|
+
handlers_registered,
|
|
491
|
+
len(errors),
|
|
492
|
+
extra={
|
|
493
|
+
"correlation_id": str(correlation_id),
|
|
494
|
+
"handlers_discovered": handlers_discovered,
|
|
495
|
+
"handlers_registered": handlers_registered,
|
|
496
|
+
"error_count": len(errors),
|
|
497
|
+
"warning_count": len(warnings),
|
|
498
|
+
"success": not result.has_errors,
|
|
499
|
+
},
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
return result
|
|
503
|
+
|
|
504
|
+
def _import_handler_class(
|
|
505
|
+
self,
|
|
506
|
+
class_path: str,
|
|
507
|
+
correlation_id: UUID,
|
|
508
|
+
) -> type:
|
|
509
|
+
"""Import handler class from fully qualified path.
|
|
510
|
+
|
|
511
|
+
This method imports the handler class specified by the fully-qualified
|
|
512
|
+
class path. Since the HandlerPluginLoader already validated the class
|
|
513
|
+
during loading (checking that it implements ProtocolHandler), re-importing
|
|
514
|
+
here is essentially free due to Python's module caching in sys.modules.
|
|
515
|
+
|
|
516
|
+
Args:
|
|
517
|
+
class_path: Fully qualified class path (e.g., 'myapp.handlers.AuthHandler').
|
|
518
|
+
Must contain at least one dot separating module and class name.
|
|
519
|
+
correlation_id: Correlation ID for logging context.
|
|
520
|
+
|
|
521
|
+
Returns:
|
|
522
|
+
The imported handler class type.
|
|
523
|
+
|
|
524
|
+
Raises:
|
|
525
|
+
ImportError: If module cannot be imported (ModuleNotFoundError).
|
|
526
|
+
AttributeError: If class is not found in the imported module.
|
|
527
|
+
ValueError: If class_path doesn't contain a module separator.
|
|
528
|
+
|
|
529
|
+
Example:
|
|
530
|
+
>>> handler_class = discovery._import_handler_class(
|
|
531
|
+
... "myapp.handlers.AuthHandler",
|
|
532
|
+
... correlation_id=uuid4(),
|
|
533
|
+
... )
|
|
534
|
+
>>> handler_class.__name__
|
|
535
|
+
'AuthHandler'
|
|
536
|
+
|
|
537
|
+
Note:
|
|
538
|
+
This is a synchronous operation despite being called from an async
|
|
539
|
+
method. Python's import system is inherently synchronous, and the
|
|
540
|
+
importlib.import_module() call will block. In practice, this is
|
|
541
|
+
very fast due to module caching.
|
|
542
|
+
"""
|
|
543
|
+
if "." not in class_path:
|
|
544
|
+
context = ModelInfraErrorContext(
|
|
545
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
546
|
+
operation="import_handler_class",
|
|
547
|
+
correlation_id=correlation_id,
|
|
548
|
+
)
|
|
549
|
+
raise ProtocolConfigurationError(
|
|
550
|
+
f"Invalid class path '{class_path}': must be fully qualified "
|
|
551
|
+
"(e.g., 'myapp.handlers.AuthHandler')",
|
|
552
|
+
context=context,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
module_path, class_name = class_path.rsplit(".", 1)
|
|
556
|
+
module = importlib.import_module(module_path)
|
|
557
|
+
handler_class = getattr(module, class_name)
|
|
558
|
+
|
|
559
|
+
# Verify it's actually a class (also serves as type narrowing for mypy)
|
|
560
|
+
if not isinstance(handler_class, type):
|
|
561
|
+
context = ModelInfraErrorContext(
|
|
562
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
563
|
+
operation="import_handler_class",
|
|
564
|
+
correlation_id=correlation_id,
|
|
565
|
+
)
|
|
566
|
+
raise ProtocolConfigurationError(
|
|
567
|
+
f"'{class_path}' is not a class (got {type(handler_class).__name__})",
|
|
568
|
+
context=context,
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
logger.debug(
|
|
572
|
+
"Imported handler class: %s",
|
|
573
|
+
class_path,
|
|
574
|
+
extra={
|
|
575
|
+
"correlation_id": str(correlation_id),
|
|
576
|
+
"class_path": class_path,
|
|
577
|
+
"module_path": module_path,
|
|
578
|
+
"class_name": class_name,
|
|
579
|
+
},
|
|
580
|
+
)
|
|
581
|
+
|
|
582
|
+
return handler_class
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
__all__: list[str] = [
|
|
586
|
+
"ContractHandlerDiscovery",
|
|
587
|
+
]
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Contract loaders for declarative ONEX configuration.
|
|
4
|
+
|
|
5
|
+
This module provides utilities for loading contract-driven configuration
|
|
6
|
+
from contract.yaml files. These loaders support the ONEX declarative
|
|
7
|
+
pattern where behavior is defined in YAML rather than Python code.
|
|
8
|
+
|
|
9
|
+
Components:
|
|
10
|
+
- handler_routing_loader: Load handler routing subcontracts from contract.yaml
|
|
11
|
+
- operation_bindings_loader: Load operation bindings subcontracts from contract.yaml
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
```python
|
|
15
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
16
|
+
load_handler_routing_subcontract,
|
|
17
|
+
load_operation_bindings_subcontract,
|
|
18
|
+
convert_class_to_handler_key,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Load routing from contract.yaml
|
|
22
|
+
routing = load_handler_routing_subcontract(Path("path/to/contract.yaml"))
|
|
23
|
+
|
|
24
|
+
# Load bindings from contract.yaml
|
|
25
|
+
bindings = load_operation_bindings_subcontract(Path("path/to/contract.yaml"))
|
|
26
|
+
|
|
27
|
+
# Convert class name to handler key
|
|
28
|
+
key = convert_class_to_handler_key("HandlerNodeIntrospected")
|
|
29
|
+
# Returns: "handler-node-introspected"
|
|
30
|
+
```
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from omnibase_infra.runtime.contract_loaders.handler_routing_loader import (
|
|
34
|
+
MAX_CONTRACT_FILE_SIZE_BYTES,
|
|
35
|
+
VALID_ROUTING_STRATEGIES,
|
|
36
|
+
convert_class_to_handler_key,
|
|
37
|
+
load_handler_class_info_from_contract,
|
|
38
|
+
load_handler_routing_subcontract,
|
|
39
|
+
)
|
|
40
|
+
from omnibase_infra.runtime.contract_loaders.operation_bindings_loader import (
|
|
41
|
+
load_operation_bindings_subcontract,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
__all__ = [
|
|
45
|
+
"MAX_CONTRACT_FILE_SIZE_BYTES",
|
|
46
|
+
"VALID_ROUTING_STRATEGIES",
|
|
47
|
+
"convert_class_to_handler_key",
|
|
48
|
+
"load_handler_class_info_from_contract",
|
|
49
|
+
"load_handler_routing_subcontract",
|
|
50
|
+
"load_operation_bindings_subcontract",
|
|
51
|
+
]
|