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,748 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""MCP Handler - Model Context Protocol integration for ONEX nodes.
|
|
4
|
+
|
|
5
|
+
Exposes ONEX nodes as MCP tools for AI agent integration via streamable HTTP transport.
|
|
6
|
+
This handler enables AI agents (Claude, etc.) to discover and invoke ONEX nodes as tools.
|
|
7
|
+
|
|
8
|
+
The handler implements the MCP protocol specification using the official MCP Python SDK,
|
|
9
|
+
providing a bridge between the ONEX node ecosystem and AI agent tool interfaces.
|
|
10
|
+
|
|
11
|
+
Key Features:
|
|
12
|
+
- Streamable HTTP transport for production scalability
|
|
13
|
+
- Dynamic tool discovery from ONEX node registry
|
|
14
|
+
- Contract-to-MCP schema generation
|
|
15
|
+
- Request/response correlation for observability
|
|
16
|
+
|
|
17
|
+
Note:
|
|
18
|
+
This handler requires the `mcp` package (anthropic-ai/mcp-python-sdk).
|
|
19
|
+
Install via: poetry add mcp
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import logging
|
|
25
|
+
import time
|
|
26
|
+
from typing import TYPE_CHECKING
|
|
27
|
+
from uuid import UUID, uuid4
|
|
28
|
+
|
|
29
|
+
from pydantic import ValidationError
|
|
30
|
+
|
|
31
|
+
from omnibase_core.models.dispatch import ModelHandlerOutput
|
|
32
|
+
from omnibase_infra.enums import (
|
|
33
|
+
EnumHandlerType,
|
|
34
|
+
EnumHandlerTypeCategory,
|
|
35
|
+
EnumInfraTransportType,
|
|
36
|
+
)
|
|
37
|
+
from omnibase_infra.errors import (
|
|
38
|
+
InfraUnavailableError,
|
|
39
|
+
ModelInfraErrorContext,
|
|
40
|
+
ProtocolConfigurationError,
|
|
41
|
+
RuntimeHostError,
|
|
42
|
+
)
|
|
43
|
+
from omnibase_infra.handlers.models.mcp import (
|
|
44
|
+
EnumMcpOperationType,
|
|
45
|
+
ModelMcpHandlerConfig,
|
|
46
|
+
ModelMcpToolResult,
|
|
47
|
+
)
|
|
48
|
+
from omnibase_infra.mixins import MixinAsyncCircuitBreaker, MixinEnvelopeExtraction
|
|
49
|
+
|
|
50
|
+
if TYPE_CHECKING:
|
|
51
|
+
from collections.abc import Sequence
|
|
52
|
+
|
|
53
|
+
from omnibase_core.models.container.model_onex_container import ModelONEXContainer
|
|
54
|
+
from omnibase_spi.protocols.types.protocol_mcp_tool_types import (
|
|
55
|
+
ProtocolMCPToolDefinition,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
logger = logging.getLogger(__name__)
|
|
59
|
+
|
|
60
|
+
# Handler ID for ModelHandlerOutput
|
|
61
|
+
HANDLER_ID_MCP: str = "mcp-handler"
|
|
62
|
+
|
|
63
|
+
# Supported operations
|
|
64
|
+
_SUPPORTED_OPERATIONS: frozenset[str] = frozenset(
|
|
65
|
+
{op.value for op in EnumMcpOperationType}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class HandlerMCP(MixinEnvelopeExtraction, MixinAsyncCircuitBreaker):
|
|
70
|
+
"""MCP protocol handler for exposing ONEX nodes as AI agent tools.
|
|
71
|
+
|
|
72
|
+
This handler creates an MCP server using streamable HTTP transport,
|
|
73
|
+
enabling AI agents to discover and invoke ONEX nodes as tools.
|
|
74
|
+
|
|
75
|
+
The handler integrates with the ONEX registry to dynamically expose
|
|
76
|
+
registered nodes as MCP tools, translating ONEX contracts into
|
|
77
|
+
MCP tool definitions.
|
|
78
|
+
|
|
79
|
+
Architecture:
|
|
80
|
+
- Uses official MCP Python SDK for protocol compliance
|
|
81
|
+
- Streamable HTTP transport for production deployments
|
|
82
|
+
- Stateless mode for horizontal scaling
|
|
83
|
+
- JSON response mode for compatibility
|
|
84
|
+
|
|
85
|
+
Security Features:
|
|
86
|
+
- Tool execution timeout enforcement (via config.timeout_seconds)
|
|
87
|
+
- Request size limits inherited from ONEX nodes
|
|
88
|
+
- Correlation ID propagation for tracing
|
|
89
|
+
- Circuit breaker protection against cascading failures
|
|
90
|
+
|
|
91
|
+
Authentication:
|
|
92
|
+
Authentication is NOT yet implemented in this MVP version. The MCP
|
|
93
|
+
endpoint is currently open/unauthenticated. Authentication will be
|
|
94
|
+
added in a future release via:
|
|
95
|
+
- Bearer token validation in the transport layer
|
|
96
|
+
- Integration with ONEX identity service for token verification
|
|
97
|
+
- Optional API key support for service-to-service communication
|
|
98
|
+
See: TODO(OMN-1288) for authentication implementation tracking
|
|
99
|
+
|
|
100
|
+
For production deployments before authentication is implemented,
|
|
101
|
+
deploy behind an API gateway with authentication or restrict
|
|
102
|
+
network access to trusted clients.
|
|
103
|
+
|
|
104
|
+
Dispatcher Integration:
|
|
105
|
+
This MVP version uses placeholder tool execution. Full ONEX dispatcher
|
|
106
|
+
integration is planned to enable:
|
|
107
|
+
- Routing tool calls to the appropriate ONEX node
|
|
108
|
+
- Timeout enforcement via asyncio.wait_for()
|
|
109
|
+
- Full observability through the ONEX runtime
|
|
110
|
+
See: TODO(OMN-1288) for dispatcher integration tracking
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
def __init__(self, container: ModelONEXContainer) -> None:
|
|
114
|
+
"""Initialize HandlerMCP with ONEX container for dependency injection.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
container: ONEX container providing dependency injection for
|
|
118
|
+
services, configuration, and runtime context.
|
|
119
|
+
|
|
120
|
+
Note:
|
|
121
|
+
The container is stored for interface compliance with the standard ONEX
|
|
122
|
+
handler pattern (def __init__(self, container: ModelONEXContainer)) and
|
|
123
|
+
to enable future DI-based service resolution (e.g., dispatcher routing,
|
|
124
|
+
metrics integration). Currently, the handler operates independently but
|
|
125
|
+
the container parameter ensures API consistency across all handlers.
|
|
126
|
+
"""
|
|
127
|
+
self._container = container
|
|
128
|
+
self._config: ModelMcpHandlerConfig | None = None
|
|
129
|
+
self._initialized: bool = False
|
|
130
|
+
self._tool_registry: dict[str, ProtocolMCPToolDefinition] = {}
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def handler_type(self) -> EnumHandlerType:
|
|
134
|
+
"""Return the architectural role of this handler.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
EnumHandlerType.INFRA_HANDLER - This handler is an infrastructure
|
|
138
|
+
protocol/transport handler that exposes ONEX nodes via MCP.
|
|
139
|
+
"""
|
|
140
|
+
return EnumHandlerType.INFRA_HANDLER
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def handler_category(self) -> EnumHandlerTypeCategory:
|
|
144
|
+
"""Return the behavioral classification of this handler.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
EnumHandlerTypeCategory.EFFECT - This handler performs side-effecting
|
|
148
|
+
I/O operations (tool execution via MCP protocol).
|
|
149
|
+
"""
|
|
150
|
+
return EnumHandlerTypeCategory.EFFECT
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def transport_type(self) -> EnumInfraTransportType:
|
|
154
|
+
"""Return the transport protocol identifier.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
EnumInfraTransportType.MCP - Model Context Protocol transport.
|
|
158
|
+
"""
|
|
159
|
+
return EnumInfraTransportType.MCP
|
|
160
|
+
|
|
161
|
+
async def initialize(self, config: dict[str, object]) -> None:
|
|
162
|
+
"""Initialize MCP handler with configuration.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
config: Configuration dict containing:
|
|
166
|
+
- host: Host to bind MCP server to (default: 0.0.0.0)
|
|
167
|
+
- port: Port for MCP endpoint (default: 8090)
|
|
168
|
+
- path: URL path for MCP endpoint (default: /mcp)
|
|
169
|
+
- stateless: Enable stateless mode (default: True)
|
|
170
|
+
- json_response: Return JSON responses (default: True)
|
|
171
|
+
- timeout_seconds: Tool execution timeout (default: 30.0)
|
|
172
|
+
- max_tools: Maximum tools to expose (default: 100)
|
|
173
|
+
|
|
174
|
+
Raises:
|
|
175
|
+
ProtocolConfigurationError: If configuration is invalid.
|
|
176
|
+
"""
|
|
177
|
+
init_correlation_id = uuid4()
|
|
178
|
+
|
|
179
|
+
logger.info(
|
|
180
|
+
"Initializing %s",
|
|
181
|
+
self.__class__.__name__,
|
|
182
|
+
extra={
|
|
183
|
+
"handler": self.__class__.__name__,
|
|
184
|
+
"correlation_id": str(init_correlation_id),
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
try:
|
|
189
|
+
# Use Pydantic validation for type-safe configuration parsing.
|
|
190
|
+
# Pydantic handles type coercion (e.g., str "8090" -> int 8090) automatically.
|
|
191
|
+
# ValidationError will be raised for truly invalid types that cannot be coerced.
|
|
192
|
+
self._config = ModelMcpHandlerConfig(**config)
|
|
193
|
+
|
|
194
|
+
# Initialize tool registry (empty until tools are registered)
|
|
195
|
+
self._tool_registry = {}
|
|
196
|
+
|
|
197
|
+
# Initialize circuit breaker for tool execution resilience
|
|
198
|
+
# Configuration from contract.yaml: threshold=5, reset_timeout=60.0
|
|
199
|
+
self._init_circuit_breaker(
|
|
200
|
+
threshold=5,
|
|
201
|
+
reset_timeout=60.0,
|
|
202
|
+
service_name="mcp-handler",
|
|
203
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
# Note: The MCP server is created lazily when start_server() is called
|
|
207
|
+
# This allows the handler to be initialized before tools are registered
|
|
208
|
+
self._initialized = True
|
|
209
|
+
|
|
210
|
+
logger.info(
|
|
211
|
+
"%s initialized successfully",
|
|
212
|
+
self.__class__.__name__,
|
|
213
|
+
extra={
|
|
214
|
+
"handler": self.__class__.__name__,
|
|
215
|
+
"host": self._config.host,
|
|
216
|
+
"port": self._config.port,
|
|
217
|
+
"path": self._config.path,
|
|
218
|
+
"stateless": self._config.stateless,
|
|
219
|
+
"correlation_id": str(init_correlation_id),
|
|
220
|
+
},
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
except ValidationError as e:
|
|
224
|
+
ctx = ModelInfraErrorContext(
|
|
225
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
226
|
+
operation="initialize",
|
|
227
|
+
target_name="mcp_handler",
|
|
228
|
+
correlation_id=init_correlation_id,
|
|
229
|
+
)
|
|
230
|
+
raise ProtocolConfigurationError(
|
|
231
|
+
f"Invalid MCP handler configuration: {e}", context=ctx
|
|
232
|
+
) from e
|
|
233
|
+
except (TypeError, ValueError) as e:
|
|
234
|
+
ctx = ModelInfraErrorContext(
|
|
235
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
236
|
+
operation="initialize",
|
|
237
|
+
target_name="mcp_handler",
|
|
238
|
+
correlation_id=init_correlation_id,
|
|
239
|
+
)
|
|
240
|
+
raise ProtocolConfigurationError(
|
|
241
|
+
f"Invalid MCP handler configuration: {e}", context=ctx
|
|
242
|
+
) from e
|
|
243
|
+
|
|
244
|
+
async def shutdown(self) -> None:
|
|
245
|
+
"""Shutdown MCP handler and release resources."""
|
|
246
|
+
self._tool_registry.clear()
|
|
247
|
+
self._config = None
|
|
248
|
+
self._initialized = False
|
|
249
|
+
logger.info("HandlerMCP shutdown complete")
|
|
250
|
+
|
|
251
|
+
async def execute(
|
|
252
|
+
self, envelope: dict[str, object]
|
|
253
|
+
) -> ModelHandlerOutput[dict[str, object]]:
|
|
254
|
+
"""Execute MCP operation from envelope.
|
|
255
|
+
|
|
256
|
+
Supported operations:
|
|
257
|
+
- mcp.list_tools: List all available MCP tools
|
|
258
|
+
- mcp.call_tool: Invoke a specific tool
|
|
259
|
+
- mcp.describe: Return handler metadata
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
envelope: Request envelope containing:
|
|
263
|
+
- operation: One of the supported MCP operations
|
|
264
|
+
- payload: Operation-specific payload
|
|
265
|
+
- correlation_id: Optional correlation ID
|
|
266
|
+
- envelope_id: Optional envelope ID
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
ModelHandlerOutput containing operation result.
|
|
270
|
+
|
|
271
|
+
Raises:
|
|
272
|
+
RuntimeHostError: If handler not initialized.
|
|
273
|
+
ProtocolConfigurationError: If operation invalid.
|
|
274
|
+
"""
|
|
275
|
+
correlation_id = self._extract_correlation_id(envelope)
|
|
276
|
+
input_envelope_id = self._extract_envelope_id(envelope)
|
|
277
|
+
|
|
278
|
+
if not self._initialized:
|
|
279
|
+
ctx = ModelInfraErrorContext(
|
|
280
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
281
|
+
operation="execute",
|
|
282
|
+
target_name="mcp_handler",
|
|
283
|
+
correlation_id=correlation_id,
|
|
284
|
+
)
|
|
285
|
+
raise RuntimeHostError(
|
|
286
|
+
"HandlerMCP not initialized. Call initialize() first.", context=ctx
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
operation = envelope.get("operation")
|
|
290
|
+
if not isinstance(operation, str):
|
|
291
|
+
ctx = ModelInfraErrorContext(
|
|
292
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
293
|
+
operation="execute",
|
|
294
|
+
target_name="mcp_handler",
|
|
295
|
+
correlation_id=correlation_id,
|
|
296
|
+
)
|
|
297
|
+
raise ProtocolConfigurationError(
|
|
298
|
+
"Missing or invalid 'operation' in envelope", context=ctx
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
if operation not in _SUPPORTED_OPERATIONS:
|
|
302
|
+
ctx = ModelInfraErrorContext(
|
|
303
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
304
|
+
operation=operation,
|
|
305
|
+
target_name="mcp_handler",
|
|
306
|
+
correlation_id=correlation_id,
|
|
307
|
+
)
|
|
308
|
+
raise ProtocolConfigurationError(
|
|
309
|
+
f"Operation '{operation}' not supported. "
|
|
310
|
+
f"Available: {', '.join(sorted(_SUPPORTED_OPERATIONS))}",
|
|
311
|
+
context=ctx,
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
payload = envelope.get("payload", {})
|
|
315
|
+
if not isinstance(payload, dict):
|
|
316
|
+
payload = {}
|
|
317
|
+
|
|
318
|
+
# Route to operation handler
|
|
319
|
+
if operation == EnumMcpOperationType.LIST_TOOLS.value:
|
|
320
|
+
return await self._handle_list_tools(
|
|
321
|
+
payload, correlation_id, input_envelope_id
|
|
322
|
+
)
|
|
323
|
+
elif operation == EnumMcpOperationType.CALL_TOOL.value:
|
|
324
|
+
return await self._handle_call_tool(
|
|
325
|
+
payload, correlation_id, input_envelope_id
|
|
326
|
+
)
|
|
327
|
+
else: # mcp.describe
|
|
328
|
+
return await self._handle_describe(correlation_id, input_envelope_id)
|
|
329
|
+
|
|
330
|
+
async def _handle_list_tools(
|
|
331
|
+
self,
|
|
332
|
+
payload: dict[str, object],
|
|
333
|
+
correlation_id: UUID,
|
|
334
|
+
input_envelope_id: UUID,
|
|
335
|
+
) -> ModelHandlerOutput[dict[str, object]]:
|
|
336
|
+
"""Handle mcp.list_tools operation.
|
|
337
|
+
|
|
338
|
+
Returns a list of all registered MCP tools with their schemas.
|
|
339
|
+
"""
|
|
340
|
+
tools = self._get_tool_definitions()
|
|
341
|
+
|
|
342
|
+
# Convert to MCP-compatible format
|
|
343
|
+
tool_list = [
|
|
344
|
+
{
|
|
345
|
+
"name": tool.name,
|
|
346
|
+
"description": tool.description,
|
|
347
|
+
"inputSchema": self._build_input_schema(tool),
|
|
348
|
+
}
|
|
349
|
+
for tool in tools
|
|
350
|
+
]
|
|
351
|
+
|
|
352
|
+
return ModelHandlerOutput.for_compute(
|
|
353
|
+
input_envelope_id=input_envelope_id,
|
|
354
|
+
correlation_id=correlation_id,
|
|
355
|
+
handler_id=HANDLER_ID_MCP,
|
|
356
|
+
result={
|
|
357
|
+
"status": "success",
|
|
358
|
+
"payload": {"tools": tool_list},
|
|
359
|
+
"correlation_id": str(correlation_id),
|
|
360
|
+
},
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
async def _handle_call_tool(
|
|
364
|
+
self,
|
|
365
|
+
payload: dict[str, object],
|
|
366
|
+
correlation_id: UUID,
|
|
367
|
+
input_envelope_id: UUID,
|
|
368
|
+
) -> ModelHandlerOutput[dict[str, object]]:
|
|
369
|
+
"""Handle mcp.call_tool operation.
|
|
370
|
+
|
|
371
|
+
Invokes the specified tool with provided arguments.
|
|
372
|
+
"""
|
|
373
|
+
# Parse tool call request
|
|
374
|
+
tool_name = payload.get("tool_name")
|
|
375
|
+
if not isinstance(tool_name, str):
|
|
376
|
+
ctx = ModelInfraErrorContext(
|
|
377
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
378
|
+
operation="mcp.call_tool",
|
|
379
|
+
target_name="mcp_handler",
|
|
380
|
+
correlation_id=correlation_id,
|
|
381
|
+
)
|
|
382
|
+
raise ProtocolConfigurationError(
|
|
383
|
+
"Missing or invalid 'tool_name' in payload", context=ctx
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
arguments = payload.get("arguments", {})
|
|
387
|
+
if not isinstance(arguments, dict):
|
|
388
|
+
arguments = {}
|
|
389
|
+
|
|
390
|
+
# Check if tool exists
|
|
391
|
+
if tool_name not in self._tool_registry:
|
|
392
|
+
ctx = ModelInfraErrorContext(
|
|
393
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
394
|
+
operation="mcp.call_tool",
|
|
395
|
+
target_name=tool_name,
|
|
396
|
+
correlation_id=correlation_id,
|
|
397
|
+
)
|
|
398
|
+
raise InfraUnavailableError(
|
|
399
|
+
f"Tool '{tool_name}' not found in registry", context=ctx
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
# Execute tool (placeholder - actual execution delegates to ONEX node)
|
|
403
|
+
start_time = time.perf_counter()
|
|
404
|
+
|
|
405
|
+
try:
|
|
406
|
+
result = await self._execute_tool(tool_name, arguments, correlation_id)
|
|
407
|
+
execution_time_ms = (time.perf_counter() - start_time) * 1000
|
|
408
|
+
|
|
409
|
+
tool_result = ModelMcpToolResult(
|
|
410
|
+
success=True,
|
|
411
|
+
content=result,
|
|
412
|
+
is_error=False,
|
|
413
|
+
correlation_id=correlation_id,
|
|
414
|
+
execution_time_ms=execution_time_ms,
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
except InfraUnavailableError as e:
|
|
418
|
+
# Circuit breaker open or tool unavailable
|
|
419
|
+
execution_time_ms = (time.perf_counter() - start_time) * 1000
|
|
420
|
+
logger.warning(
|
|
421
|
+
"Tool execution failed: infrastructure unavailable",
|
|
422
|
+
extra={
|
|
423
|
+
"tool_name": tool_name,
|
|
424
|
+
"error": str(e),
|
|
425
|
+
"error_type": "InfraUnavailableError",
|
|
426
|
+
"correlation_id": str(correlation_id),
|
|
427
|
+
"execution_time_ms": execution_time_ms,
|
|
428
|
+
},
|
|
429
|
+
)
|
|
430
|
+
tool_result = ModelMcpToolResult(
|
|
431
|
+
success=False,
|
|
432
|
+
content=str(e),
|
|
433
|
+
is_error=True,
|
|
434
|
+
error_message=str(e),
|
|
435
|
+
correlation_id=correlation_id,
|
|
436
|
+
execution_time_ms=execution_time_ms,
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
except (RuntimeHostError, ProtocolConfigurationError) as e:
|
|
440
|
+
# Handler or configuration errors
|
|
441
|
+
execution_time_ms = (time.perf_counter() - start_time) * 1000
|
|
442
|
+
logger.warning(
|
|
443
|
+
"Tool execution failed: runtime or configuration error",
|
|
444
|
+
extra={
|
|
445
|
+
"tool_name": tool_name,
|
|
446
|
+
"error": str(e),
|
|
447
|
+
"error_type": type(e).__name__,
|
|
448
|
+
"correlation_id": str(correlation_id),
|
|
449
|
+
"execution_time_ms": execution_time_ms,
|
|
450
|
+
},
|
|
451
|
+
)
|
|
452
|
+
tool_result = ModelMcpToolResult(
|
|
453
|
+
success=False,
|
|
454
|
+
content=str(e),
|
|
455
|
+
is_error=True,
|
|
456
|
+
error_message=str(e),
|
|
457
|
+
correlation_id=correlation_id,
|
|
458
|
+
execution_time_ms=execution_time_ms,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
except (TimeoutError, OSError) as e:
|
|
462
|
+
# Network/IO errors during tool execution
|
|
463
|
+
execution_time_ms = (time.perf_counter() - start_time) * 1000
|
|
464
|
+
logger.exception(
|
|
465
|
+
"Tool execution failed: network or timeout error",
|
|
466
|
+
extra={
|
|
467
|
+
"tool_name": tool_name,
|
|
468
|
+
"error": str(e),
|
|
469
|
+
"error_type": type(e).__name__,
|
|
470
|
+
"correlation_id": str(correlation_id),
|
|
471
|
+
"execution_time_ms": execution_time_ms,
|
|
472
|
+
},
|
|
473
|
+
)
|
|
474
|
+
tool_result = ModelMcpToolResult(
|
|
475
|
+
success=False,
|
|
476
|
+
content=str(e),
|
|
477
|
+
is_error=True,
|
|
478
|
+
error_message=str(e),
|
|
479
|
+
correlation_id=correlation_id,
|
|
480
|
+
execution_time_ms=execution_time_ms,
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
except (ValueError, TypeError, KeyError) as e:
|
|
484
|
+
# Data validation or type errors
|
|
485
|
+
execution_time_ms = (time.perf_counter() - start_time) * 1000
|
|
486
|
+
logger.warning(
|
|
487
|
+
"Tool execution failed: data validation error",
|
|
488
|
+
extra={
|
|
489
|
+
"tool_name": tool_name,
|
|
490
|
+
"error": str(e),
|
|
491
|
+
"error_type": type(e).__name__,
|
|
492
|
+
"correlation_id": str(correlation_id),
|
|
493
|
+
"execution_time_ms": execution_time_ms,
|
|
494
|
+
},
|
|
495
|
+
)
|
|
496
|
+
tool_result = ModelMcpToolResult(
|
|
497
|
+
success=False,
|
|
498
|
+
content=str(e),
|
|
499
|
+
is_error=True,
|
|
500
|
+
error_message=str(e),
|
|
501
|
+
correlation_id=correlation_id,
|
|
502
|
+
execution_time_ms=execution_time_ms,
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
return ModelHandlerOutput.for_compute(
|
|
506
|
+
input_envelope_id=input_envelope_id,
|
|
507
|
+
correlation_id=correlation_id,
|
|
508
|
+
handler_id=HANDLER_ID_MCP,
|
|
509
|
+
result={
|
|
510
|
+
"status": "success" if tool_result.success else "error",
|
|
511
|
+
"payload": tool_result.model_dump(),
|
|
512
|
+
"correlation_id": str(correlation_id),
|
|
513
|
+
},
|
|
514
|
+
)
|
|
515
|
+
|
|
516
|
+
async def _handle_describe(
|
|
517
|
+
self,
|
|
518
|
+
correlation_id: UUID,
|
|
519
|
+
input_envelope_id: UUID,
|
|
520
|
+
) -> ModelHandlerOutput[dict[str, object]]:
|
|
521
|
+
"""Handle mcp.describe operation."""
|
|
522
|
+
return ModelHandlerOutput.for_compute(
|
|
523
|
+
input_envelope_id=input_envelope_id,
|
|
524
|
+
correlation_id=correlation_id,
|
|
525
|
+
handler_id=HANDLER_ID_MCP,
|
|
526
|
+
result={
|
|
527
|
+
"status": "success",
|
|
528
|
+
"payload": self.describe(),
|
|
529
|
+
"correlation_id": str(correlation_id),
|
|
530
|
+
},
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
def _get_tool_definitions(self) -> Sequence[ProtocolMCPToolDefinition]:
|
|
534
|
+
"""Get all registered tool definitions."""
|
|
535
|
+
return list(self._tool_registry.values())
|
|
536
|
+
|
|
537
|
+
def _build_input_schema(self, tool: ProtocolMCPToolDefinition) -> dict[str, object]:
|
|
538
|
+
"""Build JSON Schema for tool input from MCP tool definition."""
|
|
539
|
+
properties: dict[str, object] = {}
|
|
540
|
+
required: list[str] = []
|
|
541
|
+
|
|
542
|
+
for param in tool.parameters:
|
|
543
|
+
param_schema: dict[str, object] = {
|
|
544
|
+
"type": param.parameter_type,
|
|
545
|
+
"description": param.description,
|
|
546
|
+
}
|
|
547
|
+
if param.schema:
|
|
548
|
+
param_schema.update(param.schema)
|
|
549
|
+
|
|
550
|
+
properties[param.name] = param_schema
|
|
551
|
+
|
|
552
|
+
if param.required:
|
|
553
|
+
required.append(param.name)
|
|
554
|
+
|
|
555
|
+
return {
|
|
556
|
+
"type": "object",
|
|
557
|
+
"properties": properties,
|
|
558
|
+
"required": required,
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
async def _execute_tool(
|
|
562
|
+
self,
|
|
563
|
+
tool_name: str,
|
|
564
|
+
arguments: dict[str, object],
|
|
565
|
+
correlation_id: UUID,
|
|
566
|
+
) -> dict[str, object]:
|
|
567
|
+
"""Execute a registered tool.
|
|
568
|
+
|
|
569
|
+
This method delegates to the ONEX node that provides this tool.
|
|
570
|
+
The actual implementation will route through the ONEX dispatcher.
|
|
571
|
+
|
|
572
|
+
Circuit breaker protection is applied to prevent cascading failures
|
|
573
|
+
when tool execution repeatedly fails.
|
|
574
|
+
|
|
575
|
+
Timeout Enforcement:
|
|
576
|
+
The tool execution timeout (config.timeout_seconds, default: 30.0s)
|
|
577
|
+
will be enforced when dispatcher integration is complete. The timeout
|
|
578
|
+
will be applied using asyncio.wait_for() around the dispatcher call.
|
|
579
|
+
|
|
580
|
+
Currently, timeout enforcement is handled at the protocol level by:
|
|
581
|
+
- uvicorn request timeout settings
|
|
582
|
+
- MCP SDK's internal timeout handling
|
|
583
|
+
- HTTP client timeouts on the caller side
|
|
584
|
+
|
|
585
|
+
See: TODO(OMN-1288) for dispatcher timeout integration
|
|
586
|
+
|
|
587
|
+
Args:
|
|
588
|
+
tool_name: Name of the tool to execute.
|
|
589
|
+
arguments: Tool arguments.
|
|
590
|
+
correlation_id: Correlation ID for tracing.
|
|
591
|
+
|
|
592
|
+
Returns:
|
|
593
|
+
Tool execution result.
|
|
594
|
+
|
|
595
|
+
Raises:
|
|
596
|
+
InfraUnavailableError: If tool execution fails or circuit is open.
|
|
597
|
+
"""
|
|
598
|
+
# Check circuit breaker before tool execution
|
|
599
|
+
async with self._circuit_breaker_lock:
|
|
600
|
+
await self._check_circuit_breaker("execute_tool", correlation_id)
|
|
601
|
+
|
|
602
|
+
try:
|
|
603
|
+
# TODO(OMN-1288): Implement actual tool execution via ONEX dispatcher
|
|
604
|
+
# Integration plan:
|
|
605
|
+
# 1. Look up the ONEX node that provides this tool from container registry
|
|
606
|
+
# 2. Build a ModelEventEnvelope for the node with proper correlation ID
|
|
607
|
+
# 3. Dispatch to the node via the ONEX runtime dispatcher
|
|
608
|
+
# 4. Apply timeout enforcement via asyncio.wait_for(dispatch(), timeout)
|
|
609
|
+
# using self._config.timeout_seconds (default: 30.0s)
|
|
610
|
+
# 5. Transform the node response to MCP-compatible format
|
|
611
|
+
# 6. Handle dispatcher errors (timeout, node not found, execution failure)
|
|
612
|
+
#
|
|
613
|
+
# For now, return a placeholder response
|
|
614
|
+
logger.info(
|
|
615
|
+
"Tool execution requested",
|
|
616
|
+
extra={
|
|
617
|
+
"tool_name": tool_name,
|
|
618
|
+
"argument_count": len(arguments),
|
|
619
|
+
"correlation_id": str(correlation_id),
|
|
620
|
+
},
|
|
621
|
+
)
|
|
622
|
+
|
|
623
|
+
result: dict[str, object] = {
|
|
624
|
+
"message": f"Tool '{tool_name}' executed successfully",
|
|
625
|
+
"arguments_received": list(arguments.keys()),
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
# Reset circuit breaker on success
|
|
629
|
+
async with self._circuit_breaker_lock:
|
|
630
|
+
await self._reset_circuit_breaker()
|
|
631
|
+
|
|
632
|
+
return result
|
|
633
|
+
|
|
634
|
+
except Exception:
|
|
635
|
+
# Record failure in circuit breaker
|
|
636
|
+
async with self._circuit_breaker_lock:
|
|
637
|
+
await self._record_circuit_failure("execute_tool", correlation_id)
|
|
638
|
+
raise
|
|
639
|
+
|
|
640
|
+
def register_tool(self, tool: ProtocolMCPToolDefinition) -> bool:
|
|
641
|
+
"""Register an MCP tool definition.
|
|
642
|
+
|
|
643
|
+
Args:
|
|
644
|
+
tool: Tool definition to register.
|
|
645
|
+
|
|
646
|
+
Returns:
|
|
647
|
+
True if tool was registered successfully, False if max tool limit exceeded.
|
|
648
|
+
|
|
649
|
+
Note:
|
|
650
|
+
Callers MUST check the return value. If False, the tool was NOT registered
|
|
651
|
+
due to the max_tools limit being reached. Silently ignoring a False return
|
|
652
|
+
will lead to tools being unavailable without any error being raised.
|
|
653
|
+
|
|
654
|
+
The tool registry is a simple dict and is NOT thread-safe. If concurrent
|
|
655
|
+
registration is required, external synchronization must be provided by
|
|
656
|
+
the caller.
|
|
657
|
+
|
|
658
|
+
Example:
|
|
659
|
+
if not handler.register_tool(my_tool):
|
|
660
|
+
ctx = ModelInfraErrorContext(
|
|
661
|
+
transport_type=EnumInfraTransportType.MCP,
|
|
662
|
+
operation="register_tool",
|
|
663
|
+
target_name=my_tool.name,
|
|
664
|
+
correlation_id=uuid4(),
|
|
665
|
+
)
|
|
666
|
+
raise ProtocolConfigurationError(
|
|
667
|
+
f"Failed to register tool: {my_tool.name}",
|
|
668
|
+
context=ctx,
|
|
669
|
+
)
|
|
670
|
+
"""
|
|
671
|
+
if self._config and len(self._tool_registry) >= self._config.max_tools:
|
|
672
|
+
logger.warning(
|
|
673
|
+
"Maximum tool limit reached, tool not registered",
|
|
674
|
+
extra={"tool_name": tool.name, "max_tools": self._config.max_tools},
|
|
675
|
+
)
|
|
676
|
+
return False
|
|
677
|
+
|
|
678
|
+
self._tool_registry[tool.name] = tool
|
|
679
|
+
logger.info(
|
|
680
|
+
"Tool registered",
|
|
681
|
+
extra={
|
|
682
|
+
"tool_name": tool.name,
|
|
683
|
+
"tool_type": tool.tool_type,
|
|
684
|
+
"parameter_count": len(tool.parameters),
|
|
685
|
+
},
|
|
686
|
+
)
|
|
687
|
+
return True
|
|
688
|
+
|
|
689
|
+
def unregister_tool(self, tool_name: str) -> bool:
|
|
690
|
+
"""Unregister an MCP tool.
|
|
691
|
+
|
|
692
|
+
Args:
|
|
693
|
+
tool_name: Name of the tool to unregister.
|
|
694
|
+
|
|
695
|
+
Returns:
|
|
696
|
+
True if tool was unregistered, False if not found.
|
|
697
|
+
"""
|
|
698
|
+
if tool_name in self._tool_registry:
|
|
699
|
+
del self._tool_registry[tool_name]
|
|
700
|
+
logger.info("Tool unregistered", extra={"tool_name": tool_name})
|
|
701
|
+
return True
|
|
702
|
+
return False
|
|
703
|
+
|
|
704
|
+
def describe(self) -> dict[str, object]:
|
|
705
|
+
"""Return handler metadata and capabilities.
|
|
706
|
+
|
|
707
|
+
Returns:
|
|
708
|
+
dict containing handler type, category, transport type,
|
|
709
|
+
supported operations, configuration, and tool count.
|
|
710
|
+
"""
|
|
711
|
+
config_dict: dict[str, object] = {}
|
|
712
|
+
if self._config:
|
|
713
|
+
config_dict = {
|
|
714
|
+
"host": self._config.host,
|
|
715
|
+
"port": self._config.port,
|
|
716
|
+
"path": self._config.path,
|
|
717
|
+
"stateless": self._config.stateless,
|
|
718
|
+
"json_response": self._config.json_response,
|
|
719
|
+
"timeout_seconds": self._config.timeout_seconds,
|
|
720
|
+
"max_tools": self._config.max_tools,
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
return {
|
|
724
|
+
"handler_type": self.handler_type.value,
|
|
725
|
+
"handler_category": self.handler_category.value,
|
|
726
|
+
"transport_type": self.transport_type.value,
|
|
727
|
+
"supported_operations": sorted(_SUPPORTED_OPERATIONS),
|
|
728
|
+
"tool_count": len(self._tool_registry),
|
|
729
|
+
"config": config_dict,
|
|
730
|
+
"initialized": self._initialized,
|
|
731
|
+
"version": "0.1.0-mvp",
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
async def health_check(self) -> dict[str, object]:
|
|
735
|
+
"""Check handler health and connectivity.
|
|
736
|
+
|
|
737
|
+
Returns:
|
|
738
|
+
Health status including initialization state and tool count.
|
|
739
|
+
"""
|
|
740
|
+
return {
|
|
741
|
+
"healthy": self._initialized,
|
|
742
|
+
"initialized": self._initialized,
|
|
743
|
+
"tool_count": len(self._tool_registry),
|
|
744
|
+
"transport_type": self.transport_type.value,
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
__all__: list[str] = ["HandlerMCP", "HANDLER_ID_MCP"]
|