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,477 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Shared Pydantic field validator utilities.
4
+
5
+ This module provides reusable validation functions that can be called from
6
+ Pydantic field validators. These utilities consolidate duplicate validation
7
+ logic that was previously scattered across multiple model files.
8
+
9
+ Usage Pattern:
10
+ Pydantic validators must be methods of the model class, but they can
11
+ delegate to shared utility functions for the actual validation logic.
12
+
13
+ Example:
14
+ from pydantic import field_validator
15
+ from omnibase_infra.utils import validate_timezone_aware_datetime
16
+
17
+ class MyModel(BaseModel):
18
+ timestamp: datetime
19
+
20
+ @field_validator("timestamp")
21
+ @classmethod
22
+ def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
23
+ return validate_timezone_aware_datetime(v)
24
+
25
+ Related Tickets:
26
+ - OMN-1181: Replace RuntimeError with structured errors
27
+ - PR #158: Validation function consolidation
28
+
29
+ .. versionadded:: 0.9.1
30
+ Created to consolidate duplicate validation functions.
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import re
36
+ from datetime import datetime
37
+ from typing import TYPE_CHECKING, Literal, overload
38
+ from urllib.parse import ParseResult, urlparse
39
+
40
+ from omnibase_infra.utils.util_datetime import is_timezone_aware
41
+
42
+ if TYPE_CHECKING:
43
+ from omnibase_infra.enums import EnumPolicyType
44
+
45
+
46
+ @overload
47
+ def validate_timezone_aware_datetime(
48
+ dt: datetime,
49
+ *,
50
+ allow_none: Literal[False] = ...,
51
+ ) -> datetime: ...
52
+
53
+
54
+ @overload
55
+ def validate_timezone_aware_datetime(
56
+ dt: datetime | None,
57
+ *,
58
+ allow_none: Literal[True],
59
+ ) -> datetime | None: ...
60
+
61
+
62
+ def validate_timezone_aware_datetime(
63
+ dt: datetime | None,
64
+ *,
65
+ allow_none: bool = False,
66
+ ) -> datetime | None:
67
+ """Validate that a datetime is timezone-aware.
68
+
69
+ This is the SINGLE SOURCE OF TRUTH for timezone-aware datetime validation
70
+ in Pydantic field validators. Use this instead of duplicating the validation
71
+ logic in each model.
72
+
73
+ For optional datetime fields, use ``allow_none=True`` parameter.
74
+
75
+ Args:
76
+ dt: The datetime value to validate (or None if allow_none=True).
77
+ allow_none: If True, None is a valid value. If False (default), None
78
+ raises ValueError.
79
+
80
+ Returns:
81
+ The validated datetime (unchanged if valid), or None if allow_none=True
82
+ and dt is None.
83
+
84
+ Raises:
85
+ ValueError: If datetime is naive (no timezone info), or if dt is None
86
+ and allow_none=False.
87
+
88
+ Example:
89
+ >>> from datetime import datetime, UTC
90
+ >>> from omnibase_infra.utils import validate_timezone_aware_datetime
91
+ >>>
92
+ >>> # Valid: timezone-aware datetime
93
+ >>> aware = datetime.now(UTC)
94
+ >>> validate_timezone_aware_datetime(aware) == aware
95
+ True
96
+ >>>
97
+ >>> # Invalid: naive datetime
98
+ >>> naive = datetime.now()
99
+ >>> validate_timezone_aware_datetime(naive) # doctest: +ELLIPSIS
100
+ Traceback (most recent call last):
101
+ ...
102
+ ValueError: timestamp must be timezone-aware...
103
+ >>>
104
+ >>> # Optional datetime with allow_none=True
105
+ >>> validate_timezone_aware_datetime(None, allow_none=True) is None
106
+ True
107
+
108
+ Usage in Pydantic model:
109
+ @field_validator("timestamp")
110
+ @classmethod
111
+ def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
112
+ return validate_timezone_aware_datetime(v)
113
+
114
+ @field_validator("created_at", "updated_at")
115
+ @classmethod
116
+ def validate_optional_timestamps(
117
+ cls, v: datetime | None
118
+ ) -> datetime | None:
119
+ return validate_timezone_aware_datetime(v, allow_none=True)
120
+ """
121
+ if dt is None:
122
+ if not allow_none:
123
+ raise ValueError(
124
+ "timestamp is required and cannot be None. "
125
+ "Use allow_none=True if None is a valid value."
126
+ )
127
+ return None
128
+
129
+ if not is_timezone_aware(dt):
130
+ raise ValueError(
131
+ "timestamp must be timezone-aware. Use datetime.now(UTC) or "
132
+ "datetime(..., tzinfo=timezone.utc) instead of naive datetime."
133
+ )
134
+ return dt
135
+
136
+
137
+ def validate_timezone_aware_datetime_optional(
138
+ dt: datetime | None,
139
+ ) -> datetime | None:
140
+ """Validate that an optional datetime is timezone-aware when provided.
141
+
142
+ Convenience wrapper around validate_timezone_aware_datetime for optional
143
+ datetime fields. Equivalent to ``validate_timezone_aware_datetime(dt, allow_none=True)``.
144
+
145
+ Args:
146
+ dt: The datetime value to validate (or None).
147
+
148
+ Returns:
149
+ The validated datetime or None.
150
+
151
+ Raises:
152
+ ValueError: If datetime is naive (no timezone info).
153
+
154
+ Example:
155
+ >>> from datetime import datetime, UTC
156
+ >>> from omnibase_infra.utils import validate_timezone_aware_datetime_optional
157
+ >>>
158
+ >>> # None passes through
159
+ >>> validate_timezone_aware_datetime_optional(None) is None
160
+ True
161
+ >>>
162
+ >>> # Valid: timezone-aware datetime
163
+ >>> aware = datetime.now(UTC)
164
+ >>> validate_timezone_aware_datetime_optional(aware) == aware
165
+ True
166
+
167
+ Usage in Pydantic model:
168
+ @field_validator("created_at", "updated_at")
169
+ @classmethod
170
+ def validate_timestamps(cls, v: datetime | None) -> datetime | None:
171
+ return validate_timezone_aware_datetime_optional(v)
172
+ """
173
+ return validate_timezone_aware_datetime(dt, allow_none=True)
174
+
175
+
176
+ def _sanitize_url_for_logging(url: str, parsed: ParseResult | None = None) -> str:
177
+ """Redact password from URL for safe logging.
178
+
179
+ This prevents credential exposure in error messages and logs.
180
+ Handles both well-formed URLs (http://user:pass@host) and malformed
181
+ URLs (user:pass@host) that may contain credentials.
182
+
183
+ Args:
184
+ url: The URL to sanitize.
185
+ parsed: Optional pre-parsed URL result to avoid re-parsing.
186
+
187
+ Returns:
188
+ URL with password redacted (if present), or original URL if no password.
189
+
190
+ Example:
191
+ >>> _sanitize_url_for_logging("http://user:secret@localhost:8080/path")
192
+ 'http://user:****@localhost:8080/path'
193
+ >>> _sanitize_url_for_logging("http://localhost:8080/path")
194
+ 'http://localhost:8080/path'
195
+ >>> _sanitize_url_for_logging("user:secret@localhost:5432")
196
+ 'user:****@localhost:5432'
197
+ """
198
+ if parsed is None:
199
+ parsed = urlparse(url)
200
+
201
+ # If urlparse detected a password, use structured reconstruction
202
+ if parsed.password:
203
+ # Reconstruct URL with redacted password
204
+ # netloc format: [user[:password]@]host[:port]
205
+ user_part = parsed.username or ""
206
+ user_part += ":****@"
207
+
208
+ # Extract host:port from netloc (everything after @)
209
+ host_port = (
210
+ parsed.netloc.split("@")[-1] if "@" in parsed.netloc else parsed.netloc
211
+ )
212
+
213
+ # Reconstruct the sanitized URL
214
+ sanitized = f"{parsed.scheme}://{user_part}{host_port}"
215
+ if parsed.path:
216
+ sanitized += parsed.path
217
+ if parsed.query:
218
+ sanitized += f"?{parsed.query}"
219
+ if parsed.fragment:
220
+ sanitized += f"#{parsed.fragment}"
221
+
222
+ return sanitized
223
+
224
+ # Fallback: handle malformed URLs where urlparse doesn't detect credentials
225
+ # Pattern matches: anything:something@host (credential-like patterns)
226
+ # This catches cases like "user:password@host" without a scheme
227
+ if "@" in url:
228
+ # Look for pattern: word:word@ at the START of the string (likely credentials)
229
+ # Exclude URLs with schemes (scheme://...) by requiring no "/" before the ":"
230
+ # Pattern: starts with non-slash chars, then colon, then non-@/slash chars, then @
231
+ credential_pattern = re.compile(r"^([^/:]+):([^@/]+)@")
232
+ match = credential_pattern.match(url)
233
+ if match:
234
+ # Redact the password part (group 2)
235
+ return url[: match.start(2)] + "****" + url[match.end(2) :]
236
+
237
+ return url
238
+
239
+
240
+ def validate_endpoint_urls_dict(endpoints: dict[str, str]) -> dict[str, str]:
241
+ """Validate that all endpoint values are valid URLs.
242
+
243
+ This is the SINGLE SOURCE OF TRUTH for endpoint URL validation in
244
+ Pydantic field validators.
245
+
246
+ Args:
247
+ endpoints: Dictionary of endpoint names to URL strings.
248
+
249
+ Returns:
250
+ The validated endpoints dictionary (unchanged if valid).
251
+
252
+ Raises:
253
+ ValueError: If any endpoint URL is invalid (missing scheme or netloc).
254
+
255
+ Example:
256
+ >>> from omnibase_infra.utils import validate_endpoint_urls_dict
257
+ >>>
258
+ >>> # Valid endpoints
259
+ >>> endpoints = {"api": "http://localhost:8080", "grpc": "grpc://localhost:9090"}
260
+ >>> validate_endpoint_urls_dict(endpoints) == endpoints
261
+ True
262
+ >>>
263
+ >>> # Invalid: missing scheme
264
+ >>> validate_endpoint_urls_dict({"api": "localhost:8080"}) # doctest: +ELLIPSIS
265
+ Traceback (most recent call last):
266
+ ...
267
+ ValueError: Invalid URL for endpoint 'api': localhost:8080
268
+
269
+ Usage in Pydantic model:
270
+ @field_validator("endpoints")
271
+ @classmethod
272
+ def validate_endpoint_urls(cls, v: dict[str, str]) -> dict[str, str]:
273
+ return validate_endpoint_urls_dict(v)
274
+ """
275
+ for name, url in endpoints.items():
276
+ parsed = urlparse(url)
277
+ if not parsed.scheme or not parsed.netloc:
278
+ # Sanitize URL to prevent credential exposure in error messages
279
+ safe_url = _sanitize_url_for_logging(url, parsed)
280
+ raise ValueError(f"Invalid URL for endpoint '{name}': {safe_url}")
281
+ return endpoints
282
+
283
+
284
+ def validate_pool_sizes_constraint(
285
+ pool_max_size: int,
286
+ pool_min_size: int,
287
+ *,
288
+ target_name: str = "connection_pool",
289
+ ) -> int:
290
+ """Validate that pool_max_size >= pool_min_size.
291
+
292
+ This is the SINGLE SOURCE OF TRUTH for connection pool size validation
293
+ in Pydantic field validators.
294
+
295
+ Args:
296
+ pool_max_size: The maximum pool size to validate.
297
+ pool_min_size: The minimum pool size for comparison.
298
+ target_name: Service/component name for error context.
299
+
300
+ Returns:
301
+ The validated pool_max_size (unchanged if valid).
302
+
303
+ Raises:
304
+ ProtocolConfigurationError: If pool_max_size < pool_min_size.
305
+
306
+ Example:
307
+ >>> from omnibase_infra.utils import validate_pool_sizes_constraint
308
+ >>>
309
+ >>> # Valid: max >= min
310
+ >>> validate_pool_sizes_constraint(10, 5)
311
+ 10
312
+ >>>
313
+ >>> # Invalid: max < min
314
+ >>> validate_pool_sizes_constraint(5, 10) # doctest: +ELLIPSIS
315
+ Traceback (most recent call last):
316
+ ...
317
+ omnibase_infra.errors...ProtocolConfigurationError: ...pool_max_size (5) must be >= pool_min_size (10)
318
+
319
+ Usage in Pydantic model:
320
+ @field_validator("pool_max_size", mode="after")
321
+ @classmethod
322
+ def validate_pool_sizes(cls, v: int, info: ValidationInfo) -> int:
323
+ if info.data:
324
+ pool_min_size = info.data.get("pool_min_size", 1)
325
+ return validate_pool_sizes_constraint(
326
+ v, pool_min_size, target_name="my_service"
327
+ )
328
+ return v
329
+ """
330
+ if pool_max_size < pool_min_size:
331
+ # Lazy imports to avoid circular dependency
332
+ from omnibase_infra.enums import EnumInfraTransportType
333
+ from omnibase_infra.errors import (
334
+ ModelInfraErrorContext,
335
+ ProtocolConfigurationError,
336
+ )
337
+
338
+ context = ModelInfraErrorContext.with_correlation(
339
+ transport_type=EnumInfraTransportType.DATABASE,
340
+ operation="validate_config",
341
+ target_name=target_name,
342
+ )
343
+ raise ProtocolConfigurationError(
344
+ f"pool_max_size ({pool_max_size}) must be >= pool_min_size ({pool_min_size})",
345
+ context=context,
346
+ parameter="pool_max_size",
347
+ )
348
+ return pool_max_size
349
+
350
+
351
+ def validate_policy_type_value(
352
+ value: str | EnumPolicyType,
353
+ ) -> EnumPolicyType:
354
+ """Validate and coerce a value to EnumPolicyType.
355
+
356
+ This is the SINGLE SOURCE OF TRUTH for policy type validation in
357
+ Pydantic field validators. String values are COERCED to the enum type,
358
+ ensuring type-safe access after validation.
359
+
360
+ Args:
361
+ value: The policy_type value to validate (string or enum).
362
+
363
+ Returns:
364
+ The validated policy_type as EnumPolicyType (strings are coerced).
365
+
366
+ Raises:
367
+ ValueError: If value is not a valid EnumPolicyType value.
368
+
369
+ Example:
370
+ >>> from omnibase_infra.utils import validate_policy_type_value
371
+ >>> from omnibase_infra.enums import EnumPolicyType
372
+ >>>
373
+ >>> # Valid: enum value returns as-is
374
+ >>> validate_policy_type_value(EnumPolicyType.ORCHESTRATOR)
375
+ <EnumPolicyType.ORCHESTRATOR: 'orchestrator'>
376
+ >>>
377
+ >>> # Valid: string value COERCED to enum
378
+ >>> validate_policy_type_value("reducer")
379
+ <EnumPolicyType.REDUCER: 'reducer'>
380
+ >>>
381
+ >>> # Invalid: unknown value
382
+ >>> validate_policy_type_value("invalid") # doctest: +ELLIPSIS
383
+ Traceback (most recent call last):
384
+ ...
385
+ ValueError: policy_type must be one of ...
386
+
387
+ Usage in Pydantic model:
388
+ @field_validator("policy_type")
389
+ @classmethod
390
+ def validate_policy_type(cls, v: PolicyTypeInput) -> EnumPolicyType:
391
+ return validate_policy_type_value(v)
392
+ """
393
+ from omnibase_infra.enums import EnumPolicyType
394
+
395
+ if isinstance(value, EnumPolicyType):
396
+ return value
397
+ # If it's a string, validate it's a valid EnumPolicyType value and coerce
398
+ valid_values = {e.value for e in EnumPolicyType}
399
+ if value not in valid_values:
400
+ raise ValueError(f"policy_type must be one of {valid_values}, got '{value}'")
401
+ return EnumPolicyType(value)
402
+
403
+
404
+ def validate_contract_type_value(
405
+ value: str | None,
406
+ ) -> str | None:
407
+ """Validate that a value is a valid contract type.
408
+
409
+ This is the SINGLE SOURCE OF TRUTH for contract type validation in
410
+ Pydantic field validators.
411
+
412
+ The special value 'unknown' is accepted for backfill scenarios but will
413
+ be rejected at persistence time unless explicitly permitted via the
414
+ `allow_unknown_backfill` flag.
415
+
416
+ Args:
417
+ value: The contract_type value to validate (or None).
418
+
419
+ Returns:
420
+ The validated value (unchanged if valid).
421
+
422
+ Raises:
423
+ ValueError: If value is not None and not a valid contract type or 'unknown'.
424
+
425
+ Example:
426
+ >>> from omnibase_infra.utils import validate_contract_type_value
427
+ >>>
428
+ >>> # Valid: standard contract types
429
+ >>> validate_contract_type_value("effect")
430
+ 'effect'
431
+ >>> validate_contract_type_value("compute")
432
+ 'compute'
433
+ >>>
434
+ >>> # Valid: None
435
+ >>> validate_contract_type_value(None) is None
436
+ True
437
+ >>>
438
+ >>> # Valid: 'unknown' for backfill
439
+ >>> validate_contract_type_value("unknown")
440
+ 'unknown'
441
+ >>>
442
+ >>> # Invalid: unknown value
443
+ >>> validate_contract_type_value("invalid") # doctest: +ELLIPSIS
444
+ Traceback (most recent call last):
445
+ ...
446
+ ValueError: contract_type must be one of ...
447
+
448
+ Usage in Pydantic model:
449
+ @field_validator("contract_type", mode="before")
450
+ @classmethod
451
+ def validate_contract_type(cls, v: str | None) -> str | None:
452
+ return validate_contract_type_value(v)
453
+ """
454
+ if value is None:
455
+ return value
456
+
457
+ from omnibase_infra.enums import EnumContractType
458
+
459
+ # Allow 'unknown' for backfill scenarios (validated at persistence layer)
460
+ if value == EnumContractType.UNKNOWN.value:
461
+ return value
462
+ if value not in EnumContractType.valid_type_values():
463
+ raise ValueError(
464
+ f"contract_type must be one of {EnumContractType.valid_type_values()}, "
465
+ f"got: {value!r}"
466
+ )
467
+ return value
468
+
469
+
470
+ __all__: list[str] = [
471
+ "validate_contract_type_value",
472
+ "validate_endpoint_urls_dict",
473
+ "validate_policy_type_value",
474
+ "validate_pool_sizes_constraint",
475
+ "validate_timezone_aware_datetime",
476
+ "validate_timezone_aware_datetime_optional",
477
+ ]
@@ -0,0 +1,233 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Semantic versioning validation utilities.
4
+
5
+ Provides reusable semver pattern and validators for ONEX models.
6
+
7
+ This module provides two validation approaches:
8
+ - validate_semver: Strict validation requiring full MAJOR.MINOR.PATCH format
9
+ - validate_version_lenient: Lenient validation accepting partial versions (1, 1.0, 1.0.0)
10
+
11
+ IMPORTANT: normalize_version() and normalize_version_cached() have been REMOVED.
12
+ Use ModelSemVer directly for all version handling:
13
+
14
+ from omnibase_core.models import ModelSemVer
15
+
16
+ # For structured creation:
17
+ version = ModelSemVer(major=1, minor=0, patch=0)
18
+ version_str = version.to_string() # "1.0.0"
19
+
20
+ # For parsing external input:
21
+ version = ModelSemVer.parse("1.0.0")
22
+ version_str = version.to_string()
23
+
24
+ Database Persistence (asyncpg):
25
+ When storing ModelSemVer values in databases (PostgreSQL via asyncpg), convert
26
+ to string using the built-in str() function or the to_string() method:
27
+
28
+ from omnibase_core.models import ModelSemVer
29
+
30
+ # Both of these produce "1.2.3":
31
+ version = ModelSemVer(major=1, minor=2, patch=3)
32
+ db_value = str(version) # Using str()
33
+ db_value = version.to_string() # Using method
34
+
35
+ # For asyncpg parameterized queries:
36
+ await conn.execute(
37
+ "INSERT INTO nodes (version) VALUES ($1)",
38
+ str(node_version), # Explicit string conversion required
39
+ )
40
+
41
+ # When reading back from database:
42
+ version = ModelSemVer.parse(row["version"])
43
+
44
+ Note: asyncpg requires explicit string conversion for custom types like
45
+ ModelSemVer. Always use str() when passing ModelSemVer to database queries.
46
+ See ProjectorRegistration.persist() and ProjectionReaderRegistration for
47
+ the canonical write/read patterns.
48
+ """
49
+
50
+ from __future__ import annotations
51
+
52
+ import re
53
+
54
+ # Semantic versioning pattern: MAJOR.MINOR.PATCH[-prerelease][+build]
55
+ # See: https://semver.org/
56
+ SEMVER_PATTERN = re.compile(r"^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$")
57
+
58
+
59
+ def validate_semver(v: str, field_name: str = "version") -> str:
60
+ """Validate that a string follows strict semantic versioning format.
61
+
62
+ Requires full MAJOR.MINOR.PATCH format with optional prerelease and build metadata.
63
+
64
+ Args:
65
+ v: The version string to validate.
66
+ field_name: Name of the field for error messages (default: "version").
67
+
68
+ Returns:
69
+ The validated version string.
70
+
71
+ Raises:
72
+ ValueError: If the version string is not valid semver format.
73
+
74
+ Example:
75
+ >>> validate_semver("1.0.0")
76
+ '1.0.0'
77
+ >>> validate_semver("1.2.3-alpha")
78
+ '1.2.3-alpha'
79
+ >>> validate_semver("1.0") # Raises ValueError - too few components
80
+ """
81
+ if not SEMVER_PATTERN.match(v):
82
+ raise ValueError(
83
+ f"Invalid semantic version '{v}'. "
84
+ "Expected format: MAJOR.MINOR.PATCH[-prerelease][+build]"
85
+ )
86
+ return v
87
+
88
+
89
+ def validate_version_lenient(v: str) -> str:
90
+ """Validate version format with lenient parsing.
91
+
92
+ Accepts flexible version formats including partial versions.
93
+
94
+ Accepted formats:
95
+ - "1" (major only)
96
+ - "1.0" (major.minor)
97
+ - "1.0.0" (major.minor.patch)
98
+ - "1.2.3-alpha" (with prerelease suffix)
99
+ - "1.2.3-beta.1" (with prerelease segments)
100
+
101
+ Args:
102
+ v: The version string to validate.
103
+
104
+ Returns:
105
+ The validated and stripped version string.
106
+
107
+ Raises:
108
+ ValueError: If version format is invalid:
109
+ - Empty or whitespace-only string
110
+ - Empty prerelease suffix after '-'
111
+ - More than 3 numeric components
112
+ - Empty component between dots
113
+ - Non-integer component
114
+ - Negative component value
115
+
116
+ Example:
117
+ >>> validate_version_lenient("1.0.0")
118
+ '1.0.0'
119
+ >>> validate_version_lenient("1.0")
120
+ '1.0'
121
+ >>> validate_version_lenient("1")
122
+ '1'
123
+ >>> validate_version_lenient("2.1.0-beta")
124
+ '2.1.0-beta'
125
+ >>> validate_version_lenient("") # Raises ValueError
126
+ >>> validate_version_lenient("1.2.3.4") # Raises ValueError - too many components
127
+ """
128
+ if not v or not v.strip():
129
+ raise ValueError("Version cannot be empty")
130
+
131
+ v = v.strip()
132
+
133
+ # Split off prerelease suffix (e.g., "1.2.3-alpha" -> "1.2.3", "alpha")
134
+ version_part = v
135
+ if "-" in v:
136
+ version_part, prerelease = v.split("-", 1)
137
+ if not prerelease:
138
+ raise ValueError(
139
+ f"Invalid version '{v}': prerelease cannot be empty after '-'"
140
+ )
141
+
142
+ # Parse major.minor.patch components
143
+ parts = version_part.split(".")
144
+ if len(parts) < 1 or len(parts) > 3:
145
+ raise ValueError(f"Invalid version '{v}': expected format 'major.minor.patch'")
146
+
147
+ for part in parts:
148
+ if not part:
149
+ raise ValueError(f"Invalid version '{v}': empty component")
150
+ try:
151
+ num = int(part)
152
+ if num < 0:
153
+ raise ValueError(f"Invalid version '{v}': negative component")
154
+ except ValueError as e:
155
+ if "negative component" in str(e):
156
+ raise
157
+ raise ValueError(
158
+ f"Invalid version '{v}': non-integer component '{part}'"
159
+ ) from None
160
+
161
+ return v
162
+
163
+
164
+ def normalize_version(version: str, *, _emit_warning: bool = True) -> str:
165
+ """REMOVED: String version normalization is no longer supported.
166
+
167
+ This function has been removed. Use ModelSemVer directly for all version handling.
168
+
169
+ Migration:
170
+ # Instead of:
171
+ version_str = normalize_version("1.0.0")
172
+
173
+ # Use ModelSemVer directly:
174
+ from omnibase_core.models import ModelSemVer
175
+ version = ModelSemVer(major=1, minor=0, patch=0)
176
+ version_str = version.to_string() # "1.0.0"
177
+
178
+ # Or for parsing external input:
179
+ version = ModelSemVer.parse("1.0.0")
180
+ version_str = version.to_string()
181
+
182
+ Args:
183
+ version: Not used - will raise TypeError immediately.
184
+ _emit_warning: Not used - will raise TypeError immediately.
185
+
186
+ Raises:
187
+ TypeError: Always raised. String version input is not allowed.
188
+ """
189
+ raise TypeError(
190
+ "String version input is not allowed. "
191
+ "Use ModelSemVer(major=X, minor=Y, patch=Z) for structured version handling, "
192
+ "or ModelSemVer.parse() for external input."
193
+ )
194
+
195
+
196
+ def normalize_version_cached(version: str) -> str:
197
+ """REMOVED: String version normalization is no longer supported.
198
+
199
+ This function has been removed. Use ModelSemVer directly for all version handling.
200
+
201
+ Migration:
202
+ # Instead of:
203
+ version_str = normalize_version_cached("1.0.0")
204
+
205
+ # Use ModelSemVer directly:
206
+ from omnibase_core.models import ModelSemVer
207
+ version = ModelSemVer(major=1, minor=0, patch=0)
208
+ version_str = version.to_string() # "1.0.0"
209
+
210
+ # Or for parsing external input:
211
+ version = ModelSemVer.parse("1.0.0")
212
+ version_str = version.to_string()
213
+
214
+ Args:
215
+ version: Not used - will raise TypeError immediately.
216
+
217
+ Raises:
218
+ TypeError: Always raised. String version input is not allowed.
219
+ """
220
+ raise TypeError(
221
+ "String version input is not allowed. "
222
+ "Use ModelSemVer(major=X, minor=Y, patch=Z) for structured version handling, "
223
+ "or ModelSemVer.parse() for external input."
224
+ )
225
+
226
+
227
+ __all__: list[str] = [
228
+ "SEMVER_PATTERN",
229
+ "normalize_version",
230
+ "normalize_version_cached",
231
+ "validate_semver",
232
+ "validate_version_lenient",
233
+ ]