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,725 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """
4
+ Topic Parser for ONEX Deterministic Routing.
5
+
6
+ Provides structured parsing of ONEX topic names to support deterministic routing
7
+ based on topic category. Handles both ONEX Kafka format (onex.<domain>.<type>)
8
+ and Environment-Aware format (<env>.<domain>.<category>.<version>).
9
+
10
+ Design Pattern:
11
+ ModelTopicParser is a stateless utility class that provides topic parsing
12
+ and pattern matching capabilities. It extracts structured information from
13
+ topic strings including:
14
+ - Topic standard detection (ONEX Kafka vs Environment-Aware)
15
+ - Domain extraction
16
+ - Message category inference (EVENT, COMMAND, INTENT)
17
+ - Topic type (events, commands, intents, snapshots)
18
+ - Environment and version (for Environment-Aware format)
19
+
20
+ This enables deterministic routing decisions based on topic structure
21
+ without requiring dispatcher registration lookups.
22
+
23
+ Thread Safety:
24
+ ModelTopicParser is safe for concurrent use across threads.
25
+
26
+ - **Module-level parse cache** (``@lru_cache`` on ``_parse_topic_cached``):
27
+ Thread-safe. Python's ``functools.lru_cache`` uses internal locking to
28
+ ensure atomic cache updates, making concurrent parsing of topics safe.
29
+
30
+ - **Instance-level pattern cache** (``_pattern_cache`` dict in ``__init__``):
31
+ Safe but not synchronized. Concurrent calls to ``matches_pattern()`` on
32
+ the same parser instance may compile the same regex pattern multiple times
33
+ (duplicate work), but dict assignment in CPython is atomic so there's no
34
+ risk of data corruption. For single-threaded use or when patterns are
35
+ pre-warmed, this is optimal. For high-concurrency pattern matching on
36
+ shared instances, consider using separate parser instances per thread or
37
+ pre-warming patterns during initialization.
38
+
39
+ Example:
40
+ >>> from omnibase_infra.models.dispatch import ModelTopicParser, ModelParsedTopic
41
+ >>>
42
+ >>> parser = ModelTopicParser()
43
+ >>>
44
+ >>> # Parse ONEX Kafka format
45
+ >>> result = parser.parse("onex.registration.events")
46
+ >>> result.domain
47
+ 'registration'
48
+ >>> result.category
49
+ <EnumMessageCategory.EVENT: 'event'>
50
+ >>>
51
+ >>> # Parse Environment-Aware format
52
+ >>> result = parser.parse("dev.user.events.v1")
53
+ >>> result.environment
54
+ 'dev'
55
+ >>> result.version
56
+ 'v1'
57
+ >>>
58
+ >>> # Get category for routing
59
+ >>> parser.get_category("onex.registration.commands")
60
+ <EnumMessageCategory.COMMAND: 'command'>
61
+ >>>
62
+ >>> # Pattern matching
63
+ >>> parser.matches_pattern("onex.*.events", "onex.registration.events")
64
+ True
65
+
66
+ See Also:
67
+ omnibase_infra.enums.EnumMessageCategory: Message category classification
68
+ (EVENT, COMMAND, INTENT) for routing decisions.
69
+ omnibase_infra.enums.EnumTopicType: Topic type suffix enumeration
70
+ (events, commands, intents, snapshots).
71
+ omnibase_infra.enums.EnumTopicStandard: Topic naming standard detection
72
+ (ONEX_KAFKA, ENVIRONMENT_AWARE, UNKNOWN).
73
+ omnibase_infra.models.dispatch.ModelParsedTopic: Structured parse result
74
+ with extracted components and validation status.
75
+ omnibase_infra.runtime.MessageDispatchEngine: Uses topic parsing for
76
+ deterministic message routing to registered dispatchers.
77
+ CLAUDE.md "Enum Usage: Message Routing vs Node Validation": Project-level
78
+ documentation explaining when to use EnumMessageCategory (for message
79
+ routing, topic parsing, dispatcher selection) vs EnumNodeOutputType
80
+ (for execution shape validation, handler return type validation).
81
+
82
+ Topic Taxonomy Reference:
83
+ The ONEX topic naming taxonomy defines standardized patterns for message
84
+ routing:
85
+
86
+ **ONEX Kafka Format** (canonical):
87
+ Pattern: ``onex.<domain>.<type>``
88
+ - Prefix: Always ``onex`` (fixed namespace identifier)
89
+ - Domain: Bounded context name (e.g., registration, discovery, order)
90
+ - Type: Message category suffix (events, commands, intents, snapshots)
91
+ - Examples:
92
+ - ``onex.registration.events`` - Domain events from registration
93
+ - ``onex.discovery.commands`` - Commands for discovery service
94
+ - ``onex.checkout.intents`` - User intents for checkout workflow
95
+
96
+ **Environment-Aware Format** (deployment-specific):
97
+ Pattern: ``<env>.<domain>.<category>.<version>``
98
+ - Environment: Deployment target (dev, staging, prod, test, local)
99
+ - Domain: Bounded context name
100
+ - Category: Message category suffix (events, commands, intents)
101
+ - Version: API version identifier (v1, v2, etc.)
102
+ - Examples:
103
+ - ``dev.user.events.v1`` - Development user events, version 1
104
+ - ``prod.order.commands.v2`` - Production order commands, version 2
105
+ - ``staging.payment.intents.v1`` - Staging payment intents
106
+
107
+ **Domain Naming Rules**:
108
+ - Lowercase alphanumeric characters with hyphens
109
+ - Must start with a letter
110
+ - Single letter domains are allowed (e.g., ``onex.a.events``)
111
+ - Multi-part domains use hyphens (e.g., ``order-fulfillment``)
112
+
113
+ **Category-Based Routing**:
114
+ Topic category determines the message processing pattern:
115
+ - ``events``: Immutable facts processed by reducers and projections
116
+ - ``commands``: Action instructions processed by command handlers
117
+ - ``intents``: User intentions processed by orchestrators
118
+ - ``snapshots``: State snapshots for materialized views (no category mapping)
119
+ """
120
+
121
+ import re
122
+ from functools import lru_cache
123
+
124
+ from omnibase_core.enums import EnumTopicType
125
+ from omnibase_infra.enums import EnumMessageCategory, EnumTopicStandard
126
+ from omnibase_infra.models.dispatch.model_parsed_topic import ModelParsedTopic
127
+ from omnibase_infra.types import TypeCacheInfo
128
+
129
+ # Module-level LRU cache for topic parsing performance.
130
+ # Since ModelTopicParser is stateless and all class-level attributes are constants,
131
+ # we can safely cache parse results at the module level. This provides significant
132
+ # performance benefits for repeated topic parsing (common in production).
133
+ #
134
+ # Cache size of 1024 is chosen to balance memory usage with hit rate:
135
+ # - Typical production environments have 10-100 unique topics
136
+ # - Cache can hold results for multiple environments/deployments
137
+ # - LRU eviction ensures frequently-used topics stay cached
138
+ _TOPIC_PARSE_CACHE_SIZE = 1024
139
+
140
+
141
+ @lru_cache(maxsize=_TOPIC_PARSE_CACHE_SIZE)
142
+ def _parse_topic_cached(topic: str) -> ModelParsedTopic:
143
+ """
144
+ Module-level cached topic parsing implementation.
145
+
146
+ This function contains the actual parsing logic and is decorated with
147
+ @lru_cache to provide automatic caching with LRU eviction.
148
+
149
+ Args:
150
+ topic: The topic string to parse (must be non-empty, stripped)
151
+
152
+ Returns:
153
+ ModelParsedTopic with extracted components and validation status
154
+
155
+ Note:
156
+ This function is internal to the module. Use ModelTopicParser.parse()
157
+ for the public API, which handles empty/whitespace topics before
158
+ delegating to this cached implementation.
159
+ """
160
+ # Try ONEX Kafka format first (canonical)
161
+ onex_match = ModelTopicParser._ONEX_KAFKA_PATTERN.match(topic)
162
+ if onex_match:
163
+ domain = onex_match.group("domain").lower()
164
+ type_str = onex_match.group("type").lower()
165
+
166
+ topic_type = ModelTopicParser._TOPIC_TYPE_MAP.get(type_str)
167
+ category = ModelTopicParser._CATEGORY_MAP.get(type_str)
168
+
169
+ return ModelParsedTopic(
170
+ raw_topic=topic,
171
+ standard=EnumTopicStandard.ONEX_KAFKA,
172
+ domain=domain,
173
+ category=category,
174
+ topic_type=topic_type,
175
+ is_valid=True,
176
+ )
177
+
178
+ # Try Environment-Aware format
179
+ env_match = ModelTopicParser._ENV_AWARE_PATTERN.match(topic)
180
+ if env_match:
181
+ environment = env_match.group("env").lower()
182
+ domain = env_match.group("domain").lower()
183
+ category_str = env_match.group("category").lower()
184
+ version = env_match.group("version").lower()
185
+
186
+ topic_type = ModelTopicParser._TOPIC_TYPE_MAP.get(category_str)
187
+ category = ModelTopicParser._CATEGORY_MAP.get(category_str)
188
+
189
+ return ModelParsedTopic(
190
+ raw_topic=topic,
191
+ standard=EnumTopicStandard.ENVIRONMENT_AWARE,
192
+ domain=domain,
193
+ category=category,
194
+ topic_type=topic_type,
195
+ environment=environment,
196
+ version=version,
197
+ is_valid=True,
198
+ )
199
+
200
+ # -------------------------------------------------------------------------
201
+ # FALLBACK PARSING LOGIC
202
+ # -------------------------------------------------------------------------
203
+ # Why this fallback exists:
204
+ # The primary patterns (ONEX Kafka and Environment-Aware) are strict and
205
+ # require exact format matches. However, in practice we may encounter:
206
+ #
207
+ # 1. **Legacy topic formats** from older systems that predate ONEX standards
208
+ # (e.g., "myapp.orders.events" without the "onex." prefix)
209
+ #
210
+ # 2. **Partial matches** where the topic contains a valid category suffix
211
+ # (events, commands, intents) but doesn't fully conform to either standard
212
+ # (e.g., "custom-prefix.domain.events.extra-suffix")
213
+ #
214
+ # 3. **Custom deployments** with non-standard environment prefixes or
215
+ # versioning schemes that still use ONEX-style category suffixes
216
+ #
217
+ # The fallback uses EnumMessageCategory.from_topic() which performs a more
218
+ # lenient suffix-based search to find category indicators anywhere in the
219
+ # topic string.
220
+ # -------------------------------------------------------------------------
221
+ category = EnumMessageCategory.from_topic(topic)
222
+ if category is not None:
223
+ # We found a valid category suffix in the topic. Now attempt to extract
224
+ # the domain by locating the category suffix position and taking the
225
+ # segment immediately before it.
226
+ #
227
+ # Domain extraction logic:
228
+ # Given topic "some.prefix.mydomain.events.extra", we:
229
+ # 1. Find ".events" at position X
230
+ # 2. Take everything before that: "some.prefix.mydomain"
231
+ # 3. Split by "." and take the last segment: "mydomain"
232
+ # 4. If there are multiple prefix segments, assume first is environment
233
+ topic_lower = topic.lower()
234
+ category_suffix = f".{category.topic_suffix}"
235
+ if category_suffix in topic_lower:
236
+ # Find the domain: everything before the category suffix
237
+ suffix_idx = topic_lower.find(category_suffix)
238
+ prefix = topic[:suffix_idx]
239
+ # Remove environment prefix if present
240
+ parts = prefix.split(".")
241
+ domain = parts[-1] if parts else None
242
+ env = parts[0] if len(parts) > 1 else None
243
+
244
+ # -------------------------------------------------------------------------
245
+ # is_valid=True semantics for UNKNOWN-standard topics:
246
+ # -------------------------------------------------------------------------
247
+ # A topic parsed with EnumTopicStandard.UNKNOWN and is_valid=True means:
248
+ # - The topic does NOT conform to any recognized naming standard
249
+ # - BUT we successfully extracted a message category (EVENT/COMMAND/INTENT)
250
+ # - This makes the topic "partially valid" for routing purposes
251
+ #
252
+ # The dispatch engine can still route these messages because the category
253
+ # is the primary routing key. However, consumers should be aware that:
254
+ # - Domain extraction is best-effort and may be incorrect
255
+ # - Environment/version fields may be absent or inferred incorrectly
256
+ # - The topic naming doesn't follow ONEX best practices
257
+ #
258
+ # In contrast, is_valid=False (below) means we couldn't extract ANY
259
+ # useful routing information from the topic.
260
+ # -------------------------------------------------------------------------
261
+ return ModelParsedTopic(
262
+ raw_topic=topic,
263
+ standard=EnumTopicStandard.UNKNOWN,
264
+ domain=domain,
265
+ category=category,
266
+ environment=env,
267
+ is_valid=True, # Partially valid - category extracted
268
+ )
269
+
270
+ # Unknown format
271
+ return ModelParsedTopic(
272
+ raw_topic=topic,
273
+ standard=EnumTopicStandard.UNKNOWN,
274
+ is_valid=False,
275
+ validation_error=(
276
+ f"Topic '{topic}' does not match any known format. "
277
+ "Expected: onex.<domain>.<type> or <env>.<domain>.<category>.<version>"
278
+ ),
279
+ )
280
+
281
+
282
+ def get_topic_parse_cache_info() -> TypeCacheInfo:
283
+ """
284
+ Get cache statistics for topic parsing.
285
+
286
+ Returns:
287
+ TypeCacheInfo: A named tuple with hits, misses, maxsize, and currsize.
288
+
289
+ Example:
290
+ >>> from omnibase_infra.models.dispatch import get_topic_parse_cache_info
291
+ >>> info = get_topic_parse_cache_info()
292
+ >>> print(f"Cache hit rate: {info.hits / (info.hits + info.misses):.2%}")
293
+ Cache hit rate: 95.00%
294
+ """
295
+ # Convert from functools._CacheInfo to our typed TypeCacheInfo
296
+ info = _parse_topic_cached.cache_info()
297
+ return TypeCacheInfo(
298
+ hits=info.hits,
299
+ misses=info.misses,
300
+ maxsize=info.maxsize,
301
+ currsize=info.currsize,
302
+ )
303
+
304
+
305
+ def clear_topic_parse_cache() -> None:
306
+ """
307
+ Clear the topic parsing cache.
308
+
309
+ This is useful for testing or when topic patterns change dynamically.
310
+ In production, this should rarely be needed as the LRU eviction
311
+ handles cache management automatically.
312
+ """
313
+ _parse_topic_cached.cache_clear()
314
+
315
+
316
+ class ModelTopicParser:
317
+ """
318
+ Parser for ONEX topic names supporting multiple format standards.
319
+
320
+ Provides structured parsing of topic strings to extract routing-relevant
321
+ information. Supports both ONEX Kafka format (onex.<domain>.<type>) and
322
+ Environment-Aware format (<env>.<domain>.<category>.<version>).
323
+
324
+ The parser is stateless and all methods are pure functions, making it
325
+ safe for concurrent use across threads.
326
+
327
+ Patterns:
328
+ - ONEX Kafka: onex.<domain>.<type>
329
+ Examples: onex.registration.events, onex.discovery.commands
330
+ - Environment-Aware: <env>.<domain>.<category>.<version>
331
+ Examples: dev.user.events.v1, prod.order.commands.v2
332
+
333
+ Example:
334
+ >>> parser = ModelTopicParser()
335
+ >>>
336
+ >>> # Parse and extract category for routing
337
+ >>> category = parser.get_category("onex.registration.events")
338
+ >>> category
339
+ <EnumMessageCategory.EVENT: 'event'>
340
+ >>>
341
+ >>> # Check pattern matching
342
+ >>> parser.matches_pattern("onex.*.events", "onex.registration.events")
343
+ True
344
+ >>> parser.matches_pattern("**.events", "dev.user.events.v1")
345
+ True
346
+
347
+ Attributes:
348
+ _ONEX_KAFKA_PATTERN: Compiled regex for ONEX Kafka format validation.
349
+ _ENV_AWARE_PATTERN: Compiled regex for Environment-Aware format validation.
350
+ _DOMAIN_PATTERN: Compiled regex for domain name validation.
351
+ _VALID_TOPIC_TYPES: Frozenset of valid topic type suffixes.
352
+ _TOPIC_TYPE_MAP: Mapping from suffix to EnumTopicType enum values.
353
+ _CATEGORY_MAP: Mapping from suffix to EnumMessageCategory enum values.
354
+
355
+ See Also:
356
+ omnibase_infra.models.dispatch.ModelParsedTopic: The structured result
357
+ returned by parse(), containing all extracted topic components.
358
+ omnibase_infra.enums.EnumMessageCategory: Message category enum used
359
+ for deterministic routing (EVENT, COMMAND, INTENT).
360
+ omnibase_infra.enums.EnumTopicType: Topic type enum representing the
361
+ valid suffixes (events, commands, intents, snapshots).
362
+ omnibase_infra.enums.EnumTopicStandard: Enum for topic naming standard
363
+ detection (ONEX_KAFKA, ENVIRONMENT_AWARE, UNKNOWN).
364
+ omnibase_infra.runtime.MessageDispatchEngine: The dispatch engine that
365
+ uses this parser for topic-based routing decisions.
366
+ get_topic_parse_cache_info: Function to retrieve LRU cache statistics.
367
+ clear_topic_parse_cache: Function to clear the topic parse cache.
368
+
369
+ Topic Taxonomy:
370
+ See module-level docstring for complete topic taxonomy documentation,
371
+ including format specifications, domain naming rules, and category-based
372
+ routing semantics.
373
+
374
+ External Documentation:
375
+ - ONEX Topic Taxonomy: docs/architecture/TOPIC_TAXONOMY.md (TODO(OMN-981): create)
376
+ - Environment-Aware Topics: docs/patterns/ENVIRONMENT_TOPICS.md (TODO(OMN-982): create)
377
+ - Message Categories: EnumMessageCategory in omnibase_infra.enums
378
+ """
379
+
380
+ # ONEX Kafka format: onex.<domain>.<type>
381
+ # Domain: lowercase alphanumeric with hyphens, starting with letter
382
+ # Type: one of commands, events, intents, snapshots
383
+ _ONEX_KAFKA_PATTERN = re.compile(
384
+ r"^onex\.(?P<domain>[a-z][a-z0-9-]*[a-z0-9]|[a-z])\."
385
+ r"(?P<type>commands|events|intents|snapshots)$",
386
+ re.IGNORECASE,
387
+ )
388
+
389
+ # Environment-Aware format: <env>.<domain>.<category>.<version>
390
+ # Env: dev, prod, staging, test, local (case-insensitive)
391
+ # Domain: alphanumeric with hyphens
392
+ # Category: events, commands, intents (plural form)
393
+ # Version: v followed by digits
394
+ _ENV_AWARE_PATTERN = re.compile(
395
+ r"^(?P<env>dev|prod|staging|test|local)\."
396
+ r"(?P<domain>[a-z][a-z0-9-]*[a-z0-9]|[a-z])\."
397
+ r"(?P<category>commands|events|intents)\."
398
+ r"(?P<version>v\d+)$",
399
+ re.IGNORECASE,
400
+ )
401
+
402
+ # Domain validation pattern (reused from constants_topic_taxonomy)
403
+ _DOMAIN_PATTERN = re.compile(r"^[a-z][a-z0-9-]*[a-z0-9]$|^[a-z]$")
404
+
405
+ # Valid topic types for validation
406
+ _VALID_TOPIC_TYPES = frozenset({"commands", "events", "intents", "snapshots"})
407
+
408
+ # Mapping from topic type suffix to EnumTopicType
409
+ _TOPIC_TYPE_MAP: dict[str, EnumTopicType] = {
410
+ "commands": EnumTopicType.COMMANDS,
411
+ "events": EnumTopicType.EVENTS,
412
+ "intents": EnumTopicType.INTENTS,
413
+ "snapshots": EnumTopicType.SNAPSHOTS,
414
+ }
415
+
416
+ # Mapping from topic type suffix to EnumMessageCategory
417
+ # Note: snapshots don't have a direct category mapping
418
+ _CATEGORY_MAP: dict[str, EnumMessageCategory] = {
419
+ "commands": EnumMessageCategory.COMMAND,
420
+ "events": EnumMessageCategory.EVENT,
421
+ "intents": EnumMessageCategory.INTENT,
422
+ }
423
+
424
+ def parse(self, topic: str) -> ModelParsedTopic:
425
+ """
426
+ Parse a topic string and extract structured information.
427
+
428
+ Attempts to parse the topic against known formats (ONEX Kafka and
429
+ Environment-Aware) and returns a structured result with all extracted
430
+ components.
431
+
432
+ Caching:
433
+ Results are cached with LRU eviction (maxsize=1024) at the module
434
+ level. This provides significant performance benefits for repeated
435
+ topic parsing, which is common in production message dispatch.
436
+ Cache statistics can be monitored via get_topic_parse_cache_info().
437
+
438
+ Args:
439
+ topic: The topic string to parse
440
+
441
+ Returns:
442
+ ModelParsedTopic with extracted components and validation status
443
+
444
+ Example:
445
+ >>> parser = ModelTopicParser()
446
+ >>> result = parser.parse("onex.registration.events")
447
+ >>> result.standard
448
+ <EnumTopicStandard.ONEX_KAFKA: 'onex_kafka'>
449
+ >>> result.domain
450
+ 'registration'
451
+ >>> result.category
452
+ <EnumMessageCategory.EVENT: 'event'>
453
+
454
+ See Also:
455
+ get_topic_parse_cache_info: Get cache statistics (hits, misses, size)
456
+ clear_topic_parse_cache: Clear the parse cache if needed
457
+ """
458
+ # Handle empty/whitespace topics (not cached - edge case)
459
+ if not topic or not topic.strip():
460
+ return ModelParsedTopic(
461
+ raw_topic="<empty>", # Use placeholder to satisfy min_length constraint
462
+ standard=EnumTopicStandard.UNKNOWN,
463
+ is_valid=False,
464
+ validation_error="Topic cannot be empty or whitespace",
465
+ )
466
+
467
+ # Delegate to cached implementation for actual parsing
468
+ return _parse_topic_cached(topic.strip())
469
+
470
+ def get_category(self, topic: str) -> EnumMessageCategory | None:
471
+ """
472
+ Extract the message category from a topic for routing.
473
+
474
+ This is a convenience method that parses the topic and returns
475
+ just the category, which is the primary input for deterministic
476
+ routing decisions.
477
+
478
+ Args:
479
+ topic: The topic string to analyze
480
+
481
+ Returns:
482
+ EnumMessageCategory if detected, None otherwise
483
+
484
+ Example:
485
+ >>> parser = ModelTopicParser()
486
+ >>> parser.get_category("onex.registration.events")
487
+ <EnumMessageCategory.EVENT: 'event'>
488
+ >>> parser.get_category("dev.user.commands.v1")
489
+ <EnumMessageCategory.COMMAND: 'command'>
490
+ >>> parser.get_category("invalid.topic")
491
+ None
492
+
493
+ See Also:
494
+ EnumMessageCategory: The enum type returned, representing message
495
+ categories (EVENT, COMMAND, INTENT) for routing decisions.
496
+ EnumMessageCategory.topic_suffix: Property that returns the plural
497
+ suffix (events, commands, intents) for topic construction.
498
+ MessageDispatchEngine: Uses category for dispatcher selection.
499
+ """
500
+ parsed = self.parse(topic)
501
+ return parsed.category
502
+
503
+ def matches_pattern(self, pattern: str, topic: str) -> bool:
504
+ """
505
+ Check if a topic matches a glob-style pattern.
506
+
507
+ Supports the following wildcards:
508
+ - '*' (single asterisk): Matches any single segment (no dots)
509
+ - '**' (double asterisk): Matches any number of segments (including dots)
510
+
511
+ Pattern matching is case-insensitive.
512
+
513
+ Args:
514
+ pattern: The glob pattern to match against
515
+ topic: The topic to check
516
+
517
+ Returns:
518
+ True if the topic matches the pattern, False otherwise
519
+
520
+ Example:
521
+ >>> parser = ModelTopicParser()
522
+ >>> parser.matches_pattern("onex.*.events", "onex.registration.events")
523
+ True
524
+ >>> parser.matches_pattern("onex.*.events", "onex.discovery.events")
525
+ True
526
+ >>> parser.matches_pattern("onex.*.events", "onex.discovery.commands")
527
+ False
528
+ >>> parser.matches_pattern("**.events", "dev.user.events.v1")
529
+ False # ** matches segments but v1 is after .events
530
+ >>> parser.matches_pattern("**.events.*", "dev.user.events.v1")
531
+ True
532
+ >>> parser.matches_pattern("dev.**", "dev.user.events.v1")
533
+ True
534
+ """
535
+ if not pattern or not topic:
536
+ return False
537
+
538
+ # Compile pattern to regex
539
+ regex_pattern = self._pattern_to_regex(pattern)
540
+ return bool(regex_pattern.match(topic))
541
+
542
+ def __init__(self) -> None:
543
+ """Initialize the topic parser with an empty pattern cache."""
544
+ self._pattern_cache: dict[str, re.Pattern[str]] = {}
545
+
546
+ def _pattern_to_regex(self, pattern: str) -> re.Pattern[str]:
547
+ """Convert a glob-style pattern to a compiled regex.
548
+
549
+ Handles:
550
+ - '*' -> matches any single segment (no dots)
551
+ - '**' -> matches any number of segments (including empty)
552
+
553
+ Uses an instance-level cache to avoid recompiling frequently used patterns.
554
+ """
555
+ # Check cache first
556
+ if pattern in self._pattern_cache:
557
+ return self._pattern_cache[pattern]
558
+
559
+ # Handle ** first (must be done before single *)
560
+ # Use a placeholder to avoid double-processing
561
+ escaped = pattern.replace("**", "__DOUBLE_STAR__")
562
+
563
+ # Escape special regex characters except *
564
+ escaped = re.escape(escaped)
565
+
566
+ # Convert back ** placeholder to multi-segment match
567
+ # ** matches zero or more segments: (?:[^.]+(?:\.[^.]+)*)?
568
+ # This matches: nothing, or one segment, or multiple segments separated by dots
569
+ escaped = escaped.replace("__DOUBLE_STAR__", "(?:[^.]+(?:\\.[^.]+)*)?")
570
+
571
+ # Convert single * to single-segment match (no dots)
572
+ escaped = escaped.replace(r"\*", "[^.]+")
573
+
574
+ # Compile and cache
575
+ compiled = re.compile(f"^{escaped}$", re.IGNORECASE)
576
+ self._pattern_cache[pattern] = compiled
577
+ return compiled
578
+
579
+ def validate_topic(
580
+ self, topic: str, strict: bool = False
581
+ ) -> tuple[bool, str | None]:
582
+ """
583
+ Validate a topic string against ONEX standards.
584
+
585
+ Args:
586
+ topic: The topic string to validate
587
+ strict: If True, requires exact match to ONEX Kafka format.
588
+ If False, accepts any format that yields a valid category.
589
+
590
+ Returns:
591
+ Tuple of (is_valid, error_message).
592
+ - (True, None) if valid
593
+ - (False, error_message) if invalid
594
+
595
+ Example:
596
+ >>> parser = ModelTopicParser()
597
+ >>> parser.validate_topic("onex.registration.events")
598
+ (True, None)
599
+ >>> parser.validate_topic("onex.registration.events", strict=True)
600
+ (True, None)
601
+ >>> parser.validate_topic("dev.user.events.v1")
602
+ (True, None)
603
+ >>> parser.validate_topic("dev.user.events.v1", strict=True)
604
+ (False, "Topic 'dev.user.events.v1' does not match ONEX Kafka format...")
605
+ >>> parser.validate_topic("invalid")
606
+ (False, "Topic 'invalid' does not match any known format...")
607
+
608
+ See Also:
609
+ EnumTopicStandard: Enum used to classify topic naming standards.
610
+ ONEX_KAFKA is the canonical format; ENVIRONMENT_AWARE is for
611
+ deployment-specific topics; UNKNOWN indicates unrecognized format.
612
+ ModelParsedTopic.is_valid: Boolean indicating parse success.
613
+ ModelParsedTopic.validation_error: Error message on parse failure.
614
+ """
615
+ parsed = self.parse(topic)
616
+
617
+ if strict:
618
+ if parsed.standard != EnumTopicStandard.ONEX_KAFKA:
619
+ return (
620
+ False,
621
+ f"Topic '{topic}' does not match ONEX Kafka format "
622
+ f"(onex.<domain>.<type>). Detected standard: {parsed.standard.value}",
623
+ )
624
+ return (True, None)
625
+
626
+ # Non-strict: accept any valid parsed topic
627
+ if parsed.is_valid:
628
+ return (True, None)
629
+
630
+ return (False, parsed.validation_error)
631
+
632
+ def is_onex_kafka_format(self, topic: str) -> bool:
633
+ """
634
+ Check if a topic follows the ONEX Kafka naming standard.
635
+
636
+ Args:
637
+ topic: The topic string to check
638
+
639
+ Returns:
640
+ True if the topic matches onex.<domain>.<type> format
641
+
642
+ Example:
643
+ >>> parser = ModelTopicParser()
644
+ >>> parser.is_onex_kafka_format("onex.registration.events")
645
+ True
646
+ >>> parser.is_onex_kafka_format("dev.user.events.v1")
647
+ False
648
+
649
+ See Also:
650
+ EnumTopicStandard.ONEX_KAFKA: The enum value for this format.
651
+ is_environment_aware_format: Check for the alternate format.
652
+ validate_topic: Validation with strict mode for ONEX Kafka only.
653
+ """
654
+ return bool(self._ONEX_KAFKA_PATTERN.match(topic.strip()))
655
+
656
+ def is_environment_aware_format(self, topic: str) -> bool:
657
+ """
658
+ Check if a topic follows the Environment-Aware naming standard.
659
+
660
+ Args:
661
+ topic: The topic string to check
662
+
663
+ Returns:
664
+ True if the topic matches <env>.<domain>.<category>.<version> format
665
+
666
+ Example:
667
+ >>> parser = ModelTopicParser()
668
+ >>> parser.is_environment_aware_format("dev.user.events.v1")
669
+ True
670
+ >>> parser.is_environment_aware_format("onex.registration.events")
671
+ False
672
+
673
+ Note:
674
+ Environment-Aware format includes additional metadata:
675
+ - Environment prefix (dev, staging, prod, test, local)
676
+ - Version suffix (v1, v2, etc.)
677
+
678
+ These components are extracted via parse() and available in
679
+ ModelParsedTopic.environment and ModelParsedTopic.version.
680
+
681
+ See Also:
682
+ EnumTopicStandard.ENVIRONMENT_AWARE: The enum value for this format.
683
+ is_onex_kafka_format: Check for the canonical ONEX format.
684
+ ModelParsedTopic.environment: Environment extracted from topic.
685
+ ModelParsedTopic.version: Version extracted from topic.
686
+ """
687
+ return bool(self._ENV_AWARE_PATTERN.match(topic.strip()))
688
+
689
+ def extract_domain(self, topic: str) -> str | None:
690
+ """
691
+ Extract the domain from a topic string.
692
+
693
+ Args:
694
+ topic: The topic string to analyze
695
+
696
+ Returns:
697
+ The domain name if extractable, None otherwise
698
+
699
+ Example:
700
+ >>> parser = ModelTopicParser()
701
+ >>> parser.extract_domain("onex.registration.events")
702
+ 'registration'
703
+ >>> parser.extract_domain("dev.user.events.v1")
704
+ 'user'
705
+
706
+ Note:
707
+ Domain naming follows these rules:
708
+ - Lowercase alphanumeric characters with hyphens
709
+ - Must start with a letter
710
+ - Single letter domains are valid (e.g., 'a', 'x')
711
+ - Multi-part domains use hyphens (e.g., 'order-fulfillment')
712
+
713
+ See Also:
714
+ ModelParsedTopic.domain: The domain field in parse results.
715
+ _DOMAIN_PATTERN: Class attribute with domain validation regex.
716
+ """
717
+ parsed = self.parse(topic)
718
+ return parsed.domain
719
+
720
+
721
+ __all__ = [
722
+ "ModelTopicParser",
723
+ "clear_topic_parse_cache",
724
+ "get_topic_parse_cache_info",
725
+ ]