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,78 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Retry Error Classification Model.
4
+
5
+ This module provides a Pydantic model for encapsulating the result of error
6
+ classification during retry handling in infrastructure handlers.
7
+
8
+ The model determines:
9
+ - Whether to retry the operation
10
+ - Whether to record circuit breaker failure
11
+ - The appropriate error type to raise after retries exhausted
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from pydantic import BaseModel, ConfigDict, Field
17
+
18
+ from omnibase_infra.enums.enum_retry_error_category import EnumRetryErrorCategory
19
+
20
+
21
+ class ModelRetryErrorClassification(BaseModel):
22
+ """Result of error classification for retry handling.
23
+
24
+ This model encapsulates the decision-making result when classifying
25
+ exceptions during retry loops in infrastructure handlers.
26
+
27
+ Attributes:
28
+ category: The error category for retry decision making.
29
+ should_retry: Whether the error is eligible for retry.
30
+ record_circuit_failure: Whether to record circuit breaker failure.
31
+ error_message: Sanitized error message for logging and retry state.
32
+
33
+ Example:
34
+ >>> from omnibase_infra.enums import EnumRetryErrorCategory
35
+ >>> classification = ModelRetryErrorClassification(
36
+ ... category=EnumRetryErrorCategory.TIMEOUT,
37
+ ... should_retry=True,
38
+ ... record_circuit_failure=True,
39
+ ... error_message="Operation timed out after 30s",
40
+ ... )
41
+ >>> classification.should_retry
42
+ True
43
+
44
+ The model is immutable (frozen=True) - attempting to modify raises an error:
45
+
46
+ >>> classification.should_retry = False # doctest: +SKIP
47
+ Traceback (most recent call last):
48
+ ...
49
+ pydantic_core._pydantic_core.ValidationError: ...
50
+
51
+ Note:
52
+ The error_message field should contain SANITIZED error descriptions only.
53
+ Never include credentials, tokens, or other sensitive data in this field.
54
+ See CLAUDE.md "Error Sanitization Guidelines" for the security policy.
55
+ """
56
+
57
+ model_config = ConfigDict(
58
+ strict=True,
59
+ frozen=True,
60
+ extra="forbid",
61
+ from_attributes=True,
62
+ )
63
+
64
+ category: EnumRetryErrorCategory = Field(
65
+ description="The error category for retry decision making",
66
+ )
67
+ should_retry: bool = Field(
68
+ description="Whether the error is eligible for retry",
69
+ )
70
+ record_circuit_failure: bool = Field(
71
+ description="Whether to record circuit breaker failure",
72
+ )
73
+ error_message: str = Field(
74
+ description="Sanitized error message for logging and retry state",
75
+ )
76
+
77
+
78
+ __all__: list[str] = ["ModelRetryErrorClassification"]
@@ -0,0 +1,43 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """ONEX Projection Models Module.
4
+
5
+ Provides Pydantic models for projection storage, ordering, and snapshot
6
+ topic configuration. Used by projectors to persist materialized state and
7
+ by orchestrators to query current entity state.
8
+
9
+ Exports:
10
+ ModelCapabilityFields: Container for capability fields in projection persistence
11
+ ModelRegistrationProjection: Registration projection for orchestrator state queries
12
+ ModelRegistrationSnapshot: Compacted snapshot for read optimization
13
+ ModelSequenceInfo: Sequence information for projection ordering and idempotency
14
+ ModelSnapshotTopicConfig: Kafka topic configuration for snapshot publishing
15
+
16
+ Related Tickets:
17
+ - OMN-1134: Registry Projection Extensions for Capabilities
18
+ - OMN-947 (F2): Snapshot Publishing
19
+ - OMN-944 (F1): Implement Registration Projection Schema
20
+ - OMN-940 (F0): Define Projector Execution Model
21
+ """
22
+
23
+ from omnibase_infra.models.projection.model_capability_fields import (
24
+ ModelCapabilityFields,
25
+ )
26
+ from omnibase_infra.models.projection.model_registration_projection import (
27
+ ModelRegistrationProjection,
28
+ )
29
+ from omnibase_infra.models.projection.model_registration_snapshot import (
30
+ ModelRegistrationSnapshot,
31
+ )
32
+ from omnibase_infra.models.projection.model_sequence_info import ModelSequenceInfo
33
+ from omnibase_infra.models.projection.model_snapshot_topic_config import (
34
+ ModelSnapshotTopicConfig,
35
+ )
36
+
37
+ __all__ = [
38
+ "ModelCapabilityFields",
39
+ "ModelRegistrationProjection",
40
+ "ModelRegistrationSnapshot",
41
+ "ModelSequenceInfo",
42
+ "ModelSnapshotTopicConfig",
43
+ ]
@@ -0,0 +1,112 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Capability Fields Model.
4
+
5
+ Provides a structured container for capability-related fields used in
6
+ projection persistence. Consolidates denormalized capability data that
7
+ enables fast discovery queries via GIN-indexed columns.
8
+
9
+ Related Tickets:
10
+ - OMN-1134: Registry Projection Extensions for Capabilities
11
+ - OMN-944 (F1): Implement Registration Projection Schema
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
17
+
18
+ from omnibase_infra.models.projection.model_registration_projection import (
19
+ ContractTypeWithUnknown,
20
+ )
21
+ from omnibase_infra.utils import validate_contract_type_value
22
+
23
+
24
+ class ModelCapabilityFields(BaseModel):
25
+ """Container for capability fields used in projection persistence.
26
+
27
+ Consolidates the denormalized capability fields that are stored in
28
+ registration projections for fast discovery queries. These fields
29
+ are indexed with GIN indexes for efficient containment queries.
30
+
31
+ Use Cases:
32
+ - Pass to persist_state_transition() for consolidated capability data
33
+ - Extract from ModelNodeIntrospectionEvent for persistence
34
+ - Build from ModelNodeCapabilities for denormalization
35
+
36
+ Design Notes:
37
+ - All fields are optional to support partial updates
38
+ - Lists default to None (not empty list) to distinguish "not set"
39
+ from "explicitly empty" in persistence logic
40
+ - contract_type is validated to be a valid node contract type
41
+
42
+ Attributes:
43
+ contract_type: Node contract type (effect, compute, reducer, orchestrator)
44
+ intent_types: List of intent types this node handles
45
+ protocols: List of protocols this node implements
46
+ capability_tags: Tags for capability-based discovery
47
+ contract_version: Semantic version of the node contract
48
+
49
+ Example:
50
+ >>> fields = ModelCapabilityFields(
51
+ ... contract_type="effect",
52
+ ... intent_types=["postgres.upsert", "postgres.query"],
53
+ ... protocols=["ProtocolDatabaseAdapter"],
54
+ ... capability_tags=["postgres.storage"],
55
+ ... contract_version="1.0.0",
56
+ ... )
57
+ >>> await projector.persist_state_transition(
58
+ ... entity_id=node_id,
59
+ ... capability_fields=fields,
60
+ ... ...
61
+ ... )
62
+ """
63
+
64
+ model_config = ConfigDict(
65
+ frozen=True, # Immutable for safe passing
66
+ extra="forbid",
67
+ from_attributes=True,
68
+ )
69
+
70
+ contract_type: ContractTypeWithUnknown | None = Field(
71
+ default=None,
72
+ description=(
73
+ "Contract type for the node. Valid values: 'effect', 'compute', "
74
+ "'reducer', 'orchestrator'. 'unknown' is allowed for backfill but "
75
+ "rejected at persistence unless explicitly permitted. None indicates "
76
+ "unspecified (never processed)."
77
+ ),
78
+ )
79
+
80
+ @field_validator("contract_type", mode="before")
81
+ @classmethod
82
+ def validate_contract_type(cls, v: str | None) -> str | None:
83
+ """Validate contract_type is a valid node contract type.
84
+
85
+ Delegates to shared utility for consistent validation across all models.
86
+
87
+ Note:
88
+ The 'unknown' value is accepted here to allow model construction for
89
+ backfill scenarios. However, `persist_state_transition()` will reject
90
+ 'unknown' unless `allow_unknown_backfill=True` is explicitly passed.
91
+ """
92
+ return validate_contract_type_value(v)
93
+
94
+ intent_types: list[str] | None = Field(
95
+ default=None,
96
+ description="Intent types this node handles (None = not specified)",
97
+ )
98
+ protocols: list[str] | None = Field(
99
+ default=None,
100
+ description="Protocols this node implements (None = not specified)",
101
+ )
102
+ capability_tags: list[str] | None = Field(
103
+ default=None,
104
+ description="Capability tags for discovery (None = not specified)",
105
+ )
106
+ contract_version: str | None = Field(
107
+ default=None,
108
+ description="Contract version string",
109
+ )
110
+
111
+
112
+ __all__: list[str] = ["ModelCapabilityFields"]
@@ -0,0 +1,434 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Registration Projection Model.
4
+
5
+ Provides the Pydantic model for registration projections stored in PostgreSQL.
6
+ Used by orchestrators to query current registration state and make workflow
7
+ decisions without scanning Kafka topics.
8
+
9
+ Concurrency Safety:
10
+ This model is mutable (frozen=False) to allow updates during projection
11
+ persistence. Callers should ensure safe concurrent access when updating
12
+ (e.g., using asyncio.Lock for coroutine-safety or threading.Lock for
13
+ thread-safety, depending on the execution context).
14
+
15
+ Related Tickets:
16
+ - OMN-1006: Add last_heartbeat_at for liveness expired event reporting
17
+ - OMN-944 (F1): Implement Registration Projection Schema
18
+ - OMN-940 (F0): Define Projector Execution Model
19
+ - OMN-932 (C2): Durable Timeout Handling
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ from datetime import datetime
25
+ from typing import Literal
26
+ from uuid import UUID
27
+
28
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
29
+
30
+ from omnibase_core.enums import EnumNodeKind
31
+ from omnibase_core.models.primitives.model_semver import ModelSemVer
32
+ from omnibase_infra.enums import EnumContractType, EnumRegistrationState
33
+ from omnibase_infra.models.projection.model_sequence_info import ModelSequenceInfo
34
+ from omnibase_infra.models.registration.model_node_capabilities import (
35
+ ModelNodeCapabilities,
36
+ )
37
+ from omnibase_infra.utils import validate_contract_type_value
38
+
39
+ # Valid contract types for nodes (excludes runtime_host which is not a contract type)
40
+ # Derived from EnumContractType.valid_type_values() for type consistency
41
+ ContractType = Literal["effect", "compute", "reducer", "orchestrator"]
42
+ VALID_CONTRACT_TYPES: tuple[str, ...] = EnumContractType.valid_type_values()
43
+
44
+ # Contract type including 'unknown' for backfill/migration scenarios.
45
+ # The 'unknown' value is allowed at the model layer but rejected at the persistence
46
+ # layer unless allow_unknown_backfill=True is explicitly passed.
47
+ # See: EnumContractType.UNKNOWN documentation and persist_state_transition()
48
+ ContractTypeWithUnknown = Literal[
49
+ "effect", "compute", "reducer", "orchestrator", "unknown"
50
+ ]
51
+
52
+
53
+ class ModelRegistrationProjection(BaseModel):
54
+ """Registration projection for orchestrator state queries.
55
+
56
+ Stores materialized registration state that orchestrators read to make
57
+ workflow decisions. This is the canonical read model for registration state.
58
+
59
+ Design Notes (per F1 requirements):
60
+ - current_state: FSM state for workflow decisions
61
+ - ack_deadline/liveness_deadline: Timeout deadlines for C2 (durable timeout)
62
+ - last_applied_event_id: message_id for idempotency (B3)
63
+ - last_applied_offset: Kafka offset for ordering (canonical)
64
+ - last_applied_sequence: Generic sequence (non-Kafka transports)
65
+
66
+ Primary Key:
67
+ (entity_id, domain) - composite key for multi-domain support
68
+
69
+ Ordering Invariant:
70
+ Per-entity monotonic ordering based on (partition, offset) or sequence.
71
+ Projector rejects stale updates where incoming sequence <= current.
72
+
73
+ Attributes:
74
+ entity_id: Node UUID (partition key, registration identity)
75
+ domain: Domain namespace for multi-domain support (default: "registration")
76
+ current_state: Current FSM state for workflow decisions
77
+ node_type: ONEX node type (effect, compute, reducer, orchestrator)
78
+ node_version: Semantic version of the registered node
79
+ capabilities: Node capabilities snapshot at registration time
80
+ ack_deadline: Deadline for node acknowledgment (nullable)
81
+ liveness_deadline: Deadline for next heartbeat (nullable)
82
+ last_heartbeat_at: Timestamp of last received heartbeat (nullable)
83
+ ack_timeout_emitted_at: Marker for ack timeout event deduplication (C2)
84
+ liveness_timeout_emitted_at: Marker for liveness timeout deduplication (C2)
85
+ last_applied_event_id: message_id of last applied event (idempotency)
86
+ last_applied_offset: Kafka offset of last applied event (ordering)
87
+ last_applied_sequence: Sequence of last applied event (non-Kafka)
88
+ last_applied_partition: Kafka partition of last applied event
89
+ registered_at: Timestamp of initial registration
90
+ updated_at: Timestamp of last projection update
91
+ correlation_id: Correlation ID for distributed tracing
92
+
93
+ Example:
94
+ >>> from datetime import datetime, UTC
95
+ >>> from uuid import uuid4
96
+ >>> from omnibase_core.enums import EnumNodeKind
97
+ >>> now = datetime.now(UTC)
98
+ >>> projection = ModelRegistrationProjection(
99
+ ... entity_id=uuid4(),
100
+ ... current_state=EnumRegistrationState.ACTIVE,
101
+ ... node_type=EnumNodeKind.EFFECT,
102
+ ... last_applied_event_id=uuid4(),
103
+ ... last_applied_offset=12345,
104
+ ... registered_at=now,
105
+ ... updated_at=now,
106
+ ... )
107
+
108
+ Note:
109
+ When serialized to JSON via ``model_dump(mode="json")``, the ``node_type``
110
+ field is serialized as its string value (e.g., ``"effect"``), not the
111
+ enum member name. This is Pydantic's default enum serialization behavior.
112
+ When deserializing, both ``EnumNodeKind.EFFECT`` and ``"effect"`` are
113
+ accepted due to Pydantic's automatic coercion.
114
+ """
115
+
116
+ model_config = ConfigDict(
117
+ frozen=False, # Mutable for updates during projection persistence
118
+ extra="forbid",
119
+ from_attributes=True,
120
+ )
121
+
122
+ # Identity (composite primary key: entity_id + domain)
123
+ entity_id: UUID = Field(
124
+ ...,
125
+ description="Node UUID (partition key for per-entity ordering)",
126
+ )
127
+ domain: str = Field(
128
+ default="registration",
129
+ min_length=1,
130
+ max_length=128,
131
+ description="Domain namespace for multi-domain support",
132
+ )
133
+
134
+ # FSM State
135
+ current_state: EnumRegistrationState = Field(
136
+ ...,
137
+ description="Current FSM state for workflow decisions",
138
+ )
139
+
140
+ # Node Information (snapshot at registration time)
141
+ node_type: EnumNodeKind = Field(
142
+ ...,
143
+ description="ONEX node type",
144
+ )
145
+ node_version: ModelSemVer = Field(
146
+ default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
147
+ description="Semantic version of the registered node",
148
+ )
149
+
150
+ @field_validator("node_version", mode="before")
151
+ @classmethod
152
+ def parse_node_version(cls, v: ModelSemVer | str) -> ModelSemVer:
153
+ """Parse node_version from string or ModelSemVer.
154
+
155
+ Args:
156
+ v: Either a ModelSemVer instance or a semver string.
157
+
158
+ Returns:
159
+ Validated ModelSemVer instance.
160
+
161
+ Raises:
162
+ ValueError: If the string is not a valid semantic version.
163
+ """
164
+ if isinstance(v, str):
165
+ try:
166
+ return ModelSemVer.parse(v)
167
+ except Exception as e:
168
+ raise ValueError(f"node_version: {e!s}") from e
169
+ return v
170
+
171
+ capabilities: ModelNodeCapabilities = Field(
172
+ default_factory=ModelNodeCapabilities,
173
+ description="Node capabilities snapshot at registration",
174
+ )
175
+
176
+ # Capability fields for fast discovery queries (OMN-1134)
177
+ # These are denormalized from capabilities for GIN-indexed queries
178
+ # Uses ContractTypeWithUnknown to allow 'unknown' for backfill scenarios.
179
+ # The 'unknown' value is accepted here but rejected at persistence layer
180
+ # unless allow_unknown_backfill=True is explicitly passed.
181
+ contract_type: ContractTypeWithUnknown | None = Field(
182
+ default=None,
183
+ description=(
184
+ "Contract type for the node. Valid values: 'effect', 'compute', "
185
+ "'reducer', 'orchestrator'. 'unknown' is allowed for backfill but "
186
+ "rejected at persistence unless explicitly permitted. None indicates "
187
+ "unspecified (never processed)."
188
+ ),
189
+ )
190
+
191
+ @field_validator("contract_type", mode="before")
192
+ @classmethod
193
+ def validate_contract_type(cls, v: str | None) -> str | None:
194
+ """Validate contract_type is a valid node contract type.
195
+
196
+ Delegates to shared utility for consistent validation across all models.
197
+
198
+ Note:
199
+ The 'unknown' value is accepted here to allow model construction for
200
+ backfill scenarios. However, `persist_state_transition()` will reject
201
+ 'unknown' unless `allow_unknown_backfill=True` is explicitly passed.
202
+ """
203
+ return validate_contract_type_value(v)
204
+
205
+ intent_types: list[str] = Field(
206
+ default_factory=list,
207
+ description="Intent types this node handles",
208
+ )
209
+ protocols: list[str] = Field(
210
+ default_factory=list,
211
+ description="Protocols this node implements",
212
+ )
213
+ capability_tags: list[str] = Field(
214
+ default_factory=list,
215
+ description="Capability tags for discovery",
216
+ )
217
+ contract_version: str | None = Field(
218
+ default=None,
219
+ description="Contract version string",
220
+ )
221
+
222
+ # Timeout Deadlines (for C2 durable timeout handling)
223
+ ack_deadline: datetime | None = Field(
224
+ default=None,
225
+ description="Deadline for node acknowledgment (nullable)",
226
+ )
227
+ liveness_deadline: datetime | None = Field(
228
+ default=None,
229
+ description="Deadline for next heartbeat (nullable)",
230
+ )
231
+ last_heartbeat_at: datetime | None = Field(
232
+ default=None,
233
+ description="Timestamp of last received heartbeat (nullable)",
234
+ )
235
+
236
+ # Timeout Emission Markers (for C2 deduplication)
237
+ # These prevent emitting duplicate timeout events during replay
238
+ ack_timeout_emitted_at: datetime | None = Field(
239
+ default=None,
240
+ description="Marker: ack timeout event already emitted at this time",
241
+ )
242
+ liveness_timeout_emitted_at: datetime | None = Field(
243
+ default=None,
244
+ description="Marker: liveness timeout event already emitted at this time",
245
+ )
246
+
247
+ # Idempotency and Ordering (per F1 requirements)
248
+ last_applied_event_id: UUID = Field(
249
+ ...,
250
+ description="message_id of last applied event (idempotency)",
251
+ )
252
+ last_applied_offset: int = Field(
253
+ default=0,
254
+ ge=0,
255
+ description="Kafka offset of last applied event (canonical ordering)",
256
+ )
257
+ last_applied_sequence: int | None = Field(
258
+ default=None,
259
+ ge=0,
260
+ description="Sequence number for non-Kafka transports",
261
+ )
262
+ last_applied_partition: str | None = Field(
263
+ default=None,
264
+ description="Kafka partition of last applied event",
265
+ )
266
+
267
+ # Timestamps
268
+ registered_at: datetime = Field(
269
+ ...,
270
+ description="Timestamp of initial registration",
271
+ )
272
+ updated_at: datetime = Field(
273
+ ...,
274
+ description="Timestamp of last projection update",
275
+ )
276
+
277
+ # Tracing
278
+ correlation_id: UUID | None = Field(
279
+ default=None,
280
+ description="Correlation ID for distributed tracing",
281
+ )
282
+
283
+ def get_sequence_info(self) -> ModelSequenceInfo:
284
+ """Build sequence info from projection fields.
285
+
286
+ Constructs a ModelSequenceInfo from the idempotency tracking fields
287
+ for use in staleness comparisons.
288
+
289
+ Returns:
290
+ ModelSequenceInfo with sequence/partition/offset from projection
291
+
292
+ Example:
293
+ >>> proj = ModelRegistrationProjection(...)
294
+ >>> seq_info = proj.get_sequence_info()
295
+ >>> seq_info.sequence
296
+ 12345
297
+ """
298
+ # Sequence selection: prefer last_applied_sequence when explicitly set,
299
+ # otherwise fall back to last_applied_offset for Kafka-based ordering.
300
+ # Note: sequence=0 is valid; we check "is not None" not truthiness.
301
+ sequence = (
302
+ self.last_applied_sequence
303
+ if self.last_applied_sequence is not None
304
+ else self.last_applied_offset
305
+ )
306
+
307
+ # Offset is only meaningful when partition is present (Kafka-based mode).
308
+ # For non-Kafka transports, partition is None and offset should also be None
309
+ # to signal that ordering uses the generic sequence field instead.
310
+ offset = self.last_applied_offset if self.last_applied_partition else None
311
+
312
+ return ModelSequenceInfo(
313
+ sequence=sequence,
314
+ partition=self.last_applied_partition,
315
+ offset=offset,
316
+ )
317
+
318
+ def is_stale(self, incoming_sequence: ModelSequenceInfo) -> bool:
319
+ """Check if incoming event is stale compared to current projection state.
320
+
321
+ An incoming event is stale if its sequence is older than or equal to
322
+ the current projection's sequence. Stale updates should be rejected
323
+ by the projector to maintain ordering correctness.
324
+
325
+ Args:
326
+ incoming_sequence: Sequence info from the incoming event
327
+
328
+ Returns:
329
+ True if incoming sequence is stale, False if it should be applied
330
+
331
+ Example:
332
+ >>> proj = ModelRegistrationProjection(last_applied_offset=100, ...)
333
+ >>> old_seq = ModelSequenceInfo(sequence=50)
334
+ >>> proj.is_stale(old_seq)
335
+ True
336
+ >>> new_seq = ModelSequenceInfo(sequence=150)
337
+ >>> proj.is_stale(new_seq)
338
+ False
339
+ """
340
+ current = self.get_sequence_info()
341
+ return incoming_sequence.is_stale_compared_to(current)
342
+
343
+ def has_ack_deadline_passed(self, now: datetime) -> bool:
344
+ """Check if ack deadline has passed.
345
+
346
+ Used by orchestrators during timeout scans (C2) to find
347
+ registrations that need ack timeout events emitted.
348
+
349
+ Args:
350
+ now: Current time (injected by runtime)
351
+
352
+ Returns:
353
+ True if ack_deadline exists and has passed, False otherwise
354
+
355
+ Example:
356
+ >>> from datetime import datetime, UTC, timedelta
357
+ >>> proj = ModelRegistrationProjection(
358
+ ... ack_deadline=datetime.now(UTC) - timedelta(minutes=5),
359
+ ... ...
360
+ ... )
361
+ >>> proj.has_ack_deadline_passed(datetime.now(UTC))
362
+ True
363
+ """
364
+ if self.ack_deadline is None:
365
+ return False
366
+ return now > self.ack_deadline
367
+
368
+ def has_liveness_deadline_passed(self, now: datetime) -> bool:
369
+ """Check if liveness deadline has passed.
370
+
371
+ Used by orchestrators during timeout scans (C2) to find
372
+ active registrations that need liveness timeout events emitted.
373
+
374
+ Args:
375
+ now: Current time (injected by runtime)
376
+
377
+ Returns:
378
+ True if liveness_deadline exists and has passed, False otherwise
379
+ """
380
+ if self.liveness_deadline is None:
381
+ return False
382
+ return now > self.liveness_deadline
383
+
384
+ def needs_ack_timeout_event(self, now: datetime) -> bool:
385
+ """Check if ack timeout event should be emitted.
386
+
387
+ Returns True if:
388
+ - ack_deadline has passed
389
+ - ack_timeout_emitted_at is None (not yet emitted)
390
+ - current_state requires ack (ACCEPTED or AWAITING_ACK)
391
+
392
+ Used by orchestrators during RuntimeTick processing (C2).
393
+
394
+ Args:
395
+ now: Current time (injected by runtime)
396
+
397
+ Returns:
398
+ True if ack timeout event should be emitted, False otherwise
399
+ """
400
+ if not self.has_ack_deadline_passed(now):
401
+ return False
402
+ if self.ack_timeout_emitted_at is not None:
403
+ return False
404
+ return self.current_state.requires_ack()
405
+
406
+ def needs_liveness_timeout_event(self, now: datetime) -> bool:
407
+ """Check if liveness timeout event should be emitted.
408
+
409
+ Returns True if:
410
+ - liveness_deadline has passed
411
+ - liveness_timeout_emitted_at is None (not yet emitted)
412
+ - current_state is ACTIVE
413
+
414
+ Used by orchestrators during RuntimeTick processing (C2).
415
+
416
+ Args:
417
+ now: Current time (injected by runtime)
418
+
419
+ Returns:
420
+ True if liveness timeout event should be emitted, False otherwise
421
+ """
422
+ if not self.has_liveness_deadline_passed(now):
423
+ return False
424
+ if self.liveness_timeout_emitted_at is not None:
425
+ return False
426
+ return self.current_state.is_active()
427
+
428
+
429
+ __all__: list[str] = [
430
+ "ContractType",
431
+ "ContractTypeWithUnknown",
432
+ "ModelRegistrationProjection",
433
+ "VALID_CONTRACT_TYPES",
434
+ ]