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.
Files changed (675) hide show
  1. omnibase_infra/__init__.py +101 -0
  2. omnibase_infra/cli/__init__.py +1 -0
  3. omnibase_infra/cli/commands.py +216 -0
  4. omnibase_infra/clients/__init__.py +0 -0
  5. omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
  6. omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
  7. omnibase_infra/decorators/__init__.py +29 -0
  8. omnibase_infra/decorators/allow_any.py +109 -0
  9. omnibase_infra/dlq/__init__.py +90 -0
  10. omnibase_infra/dlq/constants_dlq.py +57 -0
  11. omnibase_infra/dlq/models/__init__.py +26 -0
  12. omnibase_infra/dlq/models/enum_replay_status.py +37 -0
  13. omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
  14. omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
  15. omnibase_infra/dlq/service_dlq_tracking.py +611 -0
  16. omnibase_infra/enums/__init__.py +123 -0
  17. omnibase_infra/enums/enum_any_type_violation.py +104 -0
  18. omnibase_infra/enums/enum_backend_type.py +27 -0
  19. omnibase_infra/enums/enum_capture_outcome.py +42 -0
  20. omnibase_infra/enums/enum_capture_state.py +88 -0
  21. omnibase_infra/enums/enum_chain_violation_type.py +119 -0
  22. omnibase_infra/enums/enum_circuit_state.py +51 -0
  23. omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
  24. omnibase_infra/enums/enum_contract_type.py +84 -0
  25. omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
  26. omnibase_infra/enums/enum_dispatch_status.py +191 -0
  27. omnibase_infra/enums/enum_environment.py +46 -0
  28. omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
  29. omnibase_infra/enums/enum_handler_error_type.py +101 -0
  30. omnibase_infra/enums/enum_handler_loader_error.py +178 -0
  31. omnibase_infra/enums/enum_handler_source_type.py +87 -0
  32. omnibase_infra/enums/enum_handler_type.py +77 -0
  33. omnibase_infra/enums/enum_handler_type_category.py +61 -0
  34. omnibase_infra/enums/enum_infra_transport_type.py +73 -0
  35. omnibase_infra/enums/enum_introspection_reason.py +154 -0
  36. omnibase_infra/enums/enum_message_category.py +213 -0
  37. omnibase_infra/enums/enum_node_archetype.py +74 -0
  38. omnibase_infra/enums/enum_node_output_type.py +185 -0
  39. omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
  40. omnibase_infra/enums/enum_policy_type.py +32 -0
  41. omnibase_infra/enums/enum_registration_state.py +261 -0
  42. omnibase_infra/enums/enum_registration_status.py +33 -0
  43. omnibase_infra/enums/enum_registry_response_status.py +28 -0
  44. omnibase_infra/enums/enum_response_status.py +26 -0
  45. omnibase_infra/enums/enum_retry_error_category.py +98 -0
  46. omnibase_infra/enums/enum_security_rule_id.py +103 -0
  47. omnibase_infra/enums/enum_selection_strategy.py +91 -0
  48. omnibase_infra/enums/enum_topic_standard.py +42 -0
  49. omnibase_infra/enums/enum_validation_severity.py +78 -0
  50. omnibase_infra/errors/__init__.py +156 -0
  51. omnibase_infra/errors/error_architecture_violation.py +152 -0
  52. omnibase_infra/errors/error_chain_propagation.py +188 -0
  53. omnibase_infra/errors/error_compute_registry.py +92 -0
  54. omnibase_infra/errors/error_consul.py +132 -0
  55. omnibase_infra/errors/error_container_wiring.py +243 -0
  56. omnibase_infra/errors/error_event_bus_registry.py +102 -0
  57. omnibase_infra/errors/error_infra.py +608 -0
  58. omnibase_infra/errors/error_message_type_registry.py +101 -0
  59. omnibase_infra/errors/error_policy_registry.py +112 -0
  60. omnibase_infra/errors/error_vault.py +123 -0
  61. omnibase_infra/event_bus/__init__.py +72 -0
  62. omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
  63. omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
  64. omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
  65. omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
  66. omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
  67. omnibase_infra/event_bus/models/__init__.py +29 -0
  68. omnibase_infra/event_bus/models/config/__init__.py +20 -0
  69. omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
  70. omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
  71. omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
  72. omnibase_infra/event_bus/models/model_event_headers.py +115 -0
  73. omnibase_infra/event_bus/models/model_event_message.py +60 -0
  74. omnibase_infra/event_bus/topic_constants.py +376 -0
  75. omnibase_infra/handlers/__init__.py +75 -0
  76. omnibase_infra/handlers/filesystem/__init__.py +48 -0
  77. omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
  78. omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
  79. omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
  80. omnibase_infra/handlers/handler_consul.py +787 -0
  81. omnibase_infra/handlers/handler_db.py +1039 -0
  82. omnibase_infra/handlers/handler_filesystem.py +1478 -0
  83. omnibase_infra/handlers/handler_graph.py +1154 -0
  84. omnibase_infra/handlers/handler_http.py +920 -0
  85. omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
  86. omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
  87. omnibase_infra/handlers/handler_mcp.py +748 -0
  88. omnibase_infra/handlers/handler_qdrant.py +1076 -0
  89. omnibase_infra/handlers/handler_vault.py +422 -0
  90. omnibase_infra/handlers/mcp/__init__.py +19 -0
  91. omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
  92. omnibase_infra/handlers/mcp/protocols.py +178 -0
  93. omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
  94. omnibase_infra/handlers/mixins/__init__.py +42 -0
  95. omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
  96. omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
  97. omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
  98. omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
  99. omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
  100. omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
  101. omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
  102. omnibase_infra/handlers/models/__init__.py +286 -0
  103. omnibase_infra/handlers/models/consul/__init__.py +81 -0
  104. omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
  105. omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
  106. omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
  107. omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
  108. omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
  109. omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
  110. omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
  111. omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
  112. omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
  113. omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
  114. omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
  115. omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
  116. omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
  117. omnibase_infra/handlers/models/graph/__init__.py +35 -0
  118. omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
  119. omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
  120. omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
  121. omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
  122. omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
  123. omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
  124. omnibase_infra/handlers/models/http/__init__.py +50 -0
  125. omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
  126. omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
  127. omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
  128. omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
  129. omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
  130. omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
  131. omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
  132. omnibase_infra/handlers/models/mcp/__init__.py +23 -0
  133. omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
  134. omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
  135. omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
  136. omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
  137. omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
  138. omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
  139. omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
  140. omnibase_infra/handlers/models/model_db_query_response.py +60 -0
  141. omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
  142. omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
  143. omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
  144. omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
  145. omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
  146. omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
  147. omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
  148. omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
  149. omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
  150. omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
  151. omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
  152. omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
  153. omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
  154. omnibase_infra/handlers/models/model_handler_response.py +103 -0
  155. omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
  156. omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
  157. omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
  158. omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
  159. omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
  160. omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
  161. omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
  162. omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
  163. omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
  164. omnibase_infra/handlers/models/model_operation_context.py +187 -0
  165. omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
  166. omnibase_infra/handlers/models/model_retry_state.py +162 -0
  167. omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
  168. omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
  169. omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
  170. omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
  171. omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
  172. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
  173. omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
  174. omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
  175. omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
  176. omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
  177. omnibase_infra/handlers/models/vault/__init__.py +69 -0
  178. omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
  179. omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
  180. omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
  181. omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
  182. omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
  183. omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
  184. omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
  185. omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
  186. omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
  187. omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
  188. omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
  189. omnibase_infra/handlers/registration_storage/__init__.py +43 -0
  190. omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
  191. omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
  192. omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
  193. omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
  194. omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
  195. omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
  196. omnibase_infra/handlers/service_discovery/__init__.py +43 -0
  197. omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
  198. omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
  199. omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
  200. omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
  201. omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
  202. omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
  203. omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
  204. omnibase_infra/idempotency/__init__.py +94 -0
  205. omnibase_infra/idempotency/models/__init__.py +43 -0
  206. omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
  207. omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
  208. omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
  209. omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
  210. omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
  211. omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
  212. omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
  213. omnibase_infra/idempotency/store_inmemory.py +265 -0
  214. omnibase_infra/idempotency/store_postgres.py +923 -0
  215. omnibase_infra/infrastructure/__init__.py +0 -0
  216. omnibase_infra/mixins/__init__.py +71 -0
  217. omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
  218. omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
  219. omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
  220. omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
  221. omnibase_infra/mixins/mixin_retry_execution.py +386 -0
  222. omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
  223. omnibase_infra/models/__init__.py +136 -0
  224. omnibase_infra/models/corpus/__init__.py +17 -0
  225. omnibase_infra/models/corpus/model_capture_config.py +133 -0
  226. omnibase_infra/models/corpus/model_capture_result.py +86 -0
  227. omnibase_infra/models/discovery/__init__.py +42 -0
  228. omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
  229. omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
  230. omnibase_infra/models/discovery/model_introspection_config.py +311 -0
  231. omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
  232. omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
  233. omnibase_infra/models/dispatch/__init__.py +147 -0
  234. omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
  235. omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
  236. omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
  237. omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
  238. omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
  239. omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
  240. omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
  241. omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
  242. omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
  243. omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
  244. omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
  245. omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
  246. omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
  247. omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
  248. omnibase_infra/models/errors/__init__.py +45 -0
  249. omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
  250. omnibase_infra/models/errors/model_infra_error_context.py +99 -0
  251. omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
  252. omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
  253. omnibase_infra/models/handlers/__init__.py +37 -0
  254. omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
  255. omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
  256. omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
  257. omnibase_infra/models/health/__init__.py +9 -0
  258. omnibase_infra/models/health/model_health_check_result.py +40 -0
  259. omnibase_infra/models/lifecycle/__init__.py +39 -0
  260. omnibase_infra/models/logging/__init__.py +51 -0
  261. omnibase_infra/models/logging/model_log_context.py +756 -0
  262. omnibase_infra/models/model_retry_error_classification.py +78 -0
  263. omnibase_infra/models/projection/__init__.py +43 -0
  264. omnibase_infra/models/projection/model_capability_fields.py +112 -0
  265. omnibase_infra/models/projection/model_registration_projection.py +434 -0
  266. omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
  267. omnibase_infra/models/projection/model_sequence_info.py +182 -0
  268. omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
  269. omnibase_infra/models/projectors/__init__.py +41 -0
  270. omnibase_infra/models/projectors/model_projector_column.py +289 -0
  271. omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
  272. omnibase_infra/models/projectors/model_projector_index.py +270 -0
  273. omnibase_infra/models/projectors/model_projector_schema.py +415 -0
  274. omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
  275. omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
  276. omnibase_infra/models/registration/__init__.py +59 -0
  277. omnibase_infra/models/registration/commands/__init__.py +15 -0
  278. omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
  279. omnibase_infra/models/registration/events/__init__.py +56 -0
  280. omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
  281. omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
  282. omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
  283. omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
  284. omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
  285. omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
  286. omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
  287. omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
  288. omnibase_infra/models/registration/model_node_capabilities.py +179 -0
  289. omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
  290. omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
  291. omnibase_infra/models/registration/model_node_metadata.py +79 -0
  292. omnibase_infra/models/registration/model_node_registration.py +162 -0
  293. omnibase_infra/models/registration/model_node_registration_record.py +162 -0
  294. omnibase_infra/models/registry/__init__.py +29 -0
  295. omnibase_infra/models/registry/model_domain_constraint.py +202 -0
  296. omnibase_infra/models/registry/model_message_type_entry.py +271 -0
  297. omnibase_infra/models/resilience/__init__.py +9 -0
  298. omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
  299. omnibase_infra/models/routing/__init__.py +25 -0
  300. omnibase_infra/models/routing/model_routing_entry.py +52 -0
  301. omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
  302. omnibase_infra/models/runtime/__init__.py +40 -0
  303. omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
  304. omnibase_infra/models/runtime/model_discovery_error.py +81 -0
  305. omnibase_infra/models/runtime/model_discovery_result.py +162 -0
  306. omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
  307. omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
  308. omnibase_infra/models/runtime/model_handler_contract.py +280 -0
  309. omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
  310. omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
  311. omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
  312. omnibase_infra/models/security/__init__.py +50 -0
  313. omnibase_infra/models/security/classification_levels.py +99 -0
  314. omnibase_infra/models/security/model_environment_policy.py +145 -0
  315. omnibase_infra/models/security/model_handler_security_policy.py +107 -0
  316. omnibase_infra/models/security/model_security_error.py +81 -0
  317. omnibase_infra/models/security/model_security_validation_result.py +328 -0
  318. omnibase_infra/models/security/model_security_warning.py +67 -0
  319. omnibase_infra/models/snapshot/__init__.py +27 -0
  320. omnibase_infra/models/snapshot/model_field_change.py +65 -0
  321. omnibase_infra/models/snapshot/model_snapshot.py +270 -0
  322. omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
  323. omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
  324. omnibase_infra/models/types/__init__.py +71 -0
  325. omnibase_infra/models/validation/__init__.py +89 -0
  326. omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
  327. omnibase_infra/models/validation/model_any_type_violation.py +141 -0
  328. omnibase_infra/models/validation/model_category_match_result.py +345 -0
  329. omnibase_infra/models/validation/model_chain_violation.py +166 -0
  330. omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
  331. omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
  332. omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
  333. omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
  334. omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
  335. omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
  336. omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
  337. omnibase_infra/models/validation/model_output_validation_params.py +74 -0
  338. omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
  339. omnibase_infra/models/validation/model_validation_error_params.py +84 -0
  340. omnibase_infra/models/validation/model_validation_outcome.py +287 -0
  341. omnibase_infra/nodes/__init__.py +48 -0
  342. omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
  343. omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
  344. omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
  345. omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
  346. omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
  347. omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
  348. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
  349. omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
  350. omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
  351. omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
  352. omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
  353. omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
  354. omnibase_infra/nodes/architecture_validator/node.py +262 -0
  355. omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
  356. omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
  357. omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
  358. omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
  359. omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
  360. omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
  361. omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
  362. omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
  363. omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
  364. omnibase_infra/nodes/effects/README.md +358 -0
  365. omnibase_infra/nodes/effects/__init__.py +26 -0
  366. omnibase_infra/nodes/effects/contract.yaml +172 -0
  367. omnibase_infra/nodes/effects/models/__init__.py +32 -0
  368. omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
  369. omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
  370. omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
  371. omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
  372. omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
  373. omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
  374. omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
  375. omnibase_infra/nodes/effects/registry_effect.py +525 -0
  376. omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
  377. omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
  378. omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
  379. omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
  380. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
  381. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
  382. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
  383. omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
  384. omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
  385. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
  386. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
  387. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
  388. omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
  389. omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
  390. omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
  391. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
  392. omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
  393. omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
  394. omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
  395. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
  396. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
  397. omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
  398. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
  399. omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
  400. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
  401. omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
  402. omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
  403. omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
  404. omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
  405. omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
  406. omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
  407. omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
  408. omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
  409. omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
  410. omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
  411. omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
  412. omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
  413. omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
  414. omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
  415. omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
  416. omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
  417. omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
  418. omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
  419. omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
  420. omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
  421. omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
  422. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
  423. omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
  424. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
  425. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
  426. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
  427. omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
  428. omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
  429. omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
  430. omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
  431. omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
  432. omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
  433. omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
  434. omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
  435. omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
  436. omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
  437. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
  438. omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
  439. omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
  440. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
  441. omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
  442. omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
  443. omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
  444. omnibase_infra/nodes/node_registry_effect/node.py +165 -0
  445. omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
  446. omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
  447. omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
  448. omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
  449. omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
  450. omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
  451. omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
  452. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
  453. omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
  454. omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
  455. omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
  456. omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
  457. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
  458. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
  459. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
  460. omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
  461. omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
  462. omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
  463. omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
  464. omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
  465. omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
  466. omnibase_infra/nodes/reducers/__init__.py +30 -0
  467. omnibase_infra/nodes/reducers/models/__init__.py +32 -0
  468. omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
  469. omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
  470. omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
  471. omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
  472. omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
  473. omnibase_infra/observability/__init__.py +143 -0
  474. omnibase_infra/observability/constants_metrics.py +91 -0
  475. omnibase_infra/observability/factory_observability_sink.py +525 -0
  476. omnibase_infra/observability/handlers/__init__.py +118 -0
  477. omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
  478. omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
  479. omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
  480. omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
  481. omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
  482. omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
  483. omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
  484. omnibase_infra/observability/hooks/__init__.py +74 -0
  485. omnibase_infra/observability/hooks/hook_observability.py +1223 -0
  486. omnibase_infra/observability/models/__init__.py +30 -0
  487. omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
  488. omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
  489. omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
  490. omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
  491. omnibase_infra/observability/sinks/__init__.py +69 -0
  492. omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
  493. omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
  494. omnibase_infra/plugins/__init__.py +27 -0
  495. omnibase_infra/plugins/examples/__init__.py +28 -0
  496. omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
  497. omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
  498. omnibase_infra/plugins/models/__init__.py +21 -0
  499. omnibase_infra/plugins/models/model_plugin_context.py +76 -0
  500. omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
  501. omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
  502. omnibase_infra/plugins/plugin_compute_base.py +435 -0
  503. omnibase_infra/projectors/__init__.py +30 -0
  504. omnibase_infra/projectors/contracts/__init__.py +63 -0
  505. omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
  506. omnibase_infra/projectors/projection_reader_registration.py +1559 -0
  507. omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
  508. omnibase_infra/protocols/__init__.py +99 -0
  509. omnibase_infra/protocols/protocol_capability_projection.py +253 -0
  510. omnibase_infra/protocols/protocol_capability_query.py +251 -0
  511. omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
  512. omnibase_infra/protocols/protocol_event_projector.py +96 -0
  513. omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
  514. omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
  515. omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
  516. omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
  517. omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
  518. omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
  519. omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
  520. omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
  521. omnibase_infra/runtime/__init__.py +296 -0
  522. omnibase_infra/runtime/binding_config_resolver.py +2706 -0
  523. omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
  524. omnibase_infra/runtime/contract_handler_discovery.py +582 -0
  525. omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
  526. omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
  527. omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
  528. omnibase_infra/runtime/enums/__init__.py +18 -0
  529. omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
  530. omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
  531. omnibase_infra/runtime/envelope_validator.py +179 -0
  532. omnibase_infra/runtime/handler_contract_source.py +669 -0
  533. omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
  534. omnibase_infra/runtime/handler_registry.py +321 -0
  535. omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
  536. omnibase_infra/runtime/kernel.py +40 -0
  537. omnibase_infra/runtime/mixin_policy_validation.py +522 -0
  538. omnibase_infra/runtime/mixin_semver_cache.py +378 -0
  539. omnibase_infra/runtime/mixins/__init__.py +17 -0
  540. omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
  541. omnibase_infra/runtime/models/__init__.py +192 -0
  542. omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
  543. omnibase_infra/runtime/models/model_binding_config.py +168 -0
  544. omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
  545. omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
  546. omnibase_infra/runtime/models/model_cached_secret.py +138 -0
  547. omnibase_infra/runtime/models/model_compute_key.py +138 -0
  548. omnibase_infra/runtime/models/model_compute_registration.py +97 -0
  549. omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
  550. omnibase_infra/runtime/models/model_config_ref.py +331 -0
  551. omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
  552. omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
  553. omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
  554. omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
  555. omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
  556. omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
  557. omnibase_infra/runtime/models/model_failed_component.py +55 -0
  558. omnibase_infra/runtime/models/model_health_check_response.py +168 -0
  559. omnibase_infra/runtime/models/model_health_check_result.py +228 -0
  560. omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
  561. omnibase_infra/runtime/models/model_logging_config.py +42 -0
  562. omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
  563. omnibase_infra/runtime/models/model_optional_string.py +94 -0
  564. omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
  565. omnibase_infra/runtime/models/model_policy_context.py +100 -0
  566. omnibase_infra/runtime/models/model_policy_key.py +138 -0
  567. omnibase_infra/runtime/models/model_policy_registration.py +139 -0
  568. omnibase_infra/runtime/models/model_policy_result.py +103 -0
  569. omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
  570. omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
  571. omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
  572. omnibase_infra/runtime/models/model_retry_policy.py +105 -0
  573. omnibase_infra/runtime/models/model_runtime_config.py +150 -0
  574. omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
  575. omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
  576. omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
  577. omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
  578. omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
  579. omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
  580. omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
  581. omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
  582. omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
  583. omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
  584. omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
  585. omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
  586. omnibase_infra/runtime/projector_schema_manager.py +565 -0
  587. omnibase_infra/runtime/projector_shell.py +1102 -0
  588. omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
  589. omnibase_infra/runtime/protocol_contract_source.py +92 -0
  590. omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
  591. omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
  592. omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
  593. omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
  594. omnibase_infra/runtime/protocol_policy.py +366 -0
  595. omnibase_infra/runtime/protocols/__init__.py +27 -0
  596. omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
  597. omnibase_infra/runtime/registry/__init__.py +93 -0
  598. omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
  599. omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
  600. omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
  601. omnibase_infra/runtime/registry/registry_message_type.py +542 -0
  602. omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
  603. omnibase_infra/runtime/registry_compute.py +1143 -0
  604. omnibase_infra/runtime/registry_dispatcher.py +678 -0
  605. omnibase_infra/runtime/registry_policy.py +1502 -0
  606. omnibase_infra/runtime/runtime_scheduler.py +1070 -0
  607. omnibase_infra/runtime/secret_resolver.py +2110 -0
  608. omnibase_infra/runtime/security_metadata_validator.py +776 -0
  609. omnibase_infra/runtime/service_kernel.py +1573 -0
  610. omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
  611. omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
  612. omnibase_infra/runtime/util_container_wiring.py +1123 -0
  613. omnibase_infra/runtime/util_validation.py +314 -0
  614. omnibase_infra/runtime/util_version.py +98 -0
  615. omnibase_infra/runtime/util_wiring.py +566 -0
  616. omnibase_infra/schemas/schema_registration_projection.sql +320 -0
  617. omnibase_infra/services/__init__.py +68 -0
  618. omnibase_infra/services/corpus_capture.py +678 -0
  619. omnibase_infra/services/service_capability_query.py +945 -0
  620. omnibase_infra/services/service_health.py +897 -0
  621. omnibase_infra/services/service_node_selector.py +530 -0
  622. omnibase_infra/services/service_timeout_emitter.py +682 -0
  623. omnibase_infra/services/service_timeout_scanner.py +390 -0
  624. omnibase_infra/services/snapshot/__init__.py +31 -0
  625. omnibase_infra/services/snapshot/service_snapshot.py +647 -0
  626. omnibase_infra/services/snapshot/store_inmemory.py +637 -0
  627. omnibase_infra/services/snapshot/store_postgres.py +1279 -0
  628. omnibase_infra/shared/__init__.py +8 -0
  629. omnibase_infra/testing/__init__.py +10 -0
  630. omnibase_infra/testing/utils.py +23 -0
  631. omnibase_infra/types/__init__.py +48 -0
  632. omnibase_infra/types/type_cache_info.py +49 -0
  633. omnibase_infra/types/type_dsn.py +173 -0
  634. omnibase_infra/types/type_infra_aliases.py +60 -0
  635. omnibase_infra/types/typed_dict/__init__.py +21 -0
  636. omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
  637. omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
  638. omnibase_infra/types/typed_dict_capabilities.py +64 -0
  639. omnibase_infra/utils/__init__.py +89 -0
  640. omnibase_infra/utils/correlation.py +208 -0
  641. omnibase_infra/utils/util_datetime.py +372 -0
  642. omnibase_infra/utils/util_dsn_validation.py +333 -0
  643. omnibase_infra/utils/util_env_parsing.py +264 -0
  644. omnibase_infra/utils/util_error_sanitization.py +457 -0
  645. omnibase_infra/utils/util_pydantic_validators.py +477 -0
  646. omnibase_infra/utils/util_semver.py +233 -0
  647. omnibase_infra/validation/__init__.py +307 -0
  648. omnibase_infra/validation/enums/__init__.py +11 -0
  649. omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
  650. omnibase_infra/validation/infra_validators.py +1486 -0
  651. omnibase_infra/validation/linter_contract.py +907 -0
  652. omnibase_infra/validation/mixin_any_type_classification.py +120 -0
  653. omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
  654. omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
  655. omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
  656. omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
  657. omnibase_infra/validation/models/__init__.py +15 -0
  658. omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
  659. omnibase_infra/validation/models/model_contract_violation.py +41 -0
  660. omnibase_infra/validation/service_validation_aggregator.py +395 -0
  661. omnibase_infra/validation/validation_exemptions.yaml +1710 -0
  662. omnibase_infra/validation/validator_any_type.py +715 -0
  663. omnibase_infra/validation/validator_chain_propagation.py +839 -0
  664. omnibase_infra/validation/validator_execution_shape.py +465 -0
  665. omnibase_infra/validation/validator_localhandler.py +261 -0
  666. omnibase_infra/validation/validator_registration_security.py +410 -0
  667. omnibase_infra/validation/validator_routing_coverage.py +1020 -0
  668. omnibase_infra/validation/validator_runtime_shape.py +915 -0
  669. omnibase_infra/validation/validator_security.py +410 -0
  670. omnibase_infra/validation/validator_topic_category.py +1152 -0
  671. omnibase_infra-0.2.1.dist-info/METADATA +197 -0
  672. omnibase_infra-0.2.1.dist-info/RECORD +675 -0
  673. omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
  674. omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
  675. 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"]