omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Acknowledged Command Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationAcked, a command sent by nodes
|
|
6
|
+
to acknowledge their registration in the ONEX 2-way registration pattern.
|
|
7
|
+
|
|
8
|
+
Command vs Event Distinction:
|
|
9
|
+
- COMMANDS are imperative requests from external sources
|
|
10
|
+
- EVENTS are facts about things that have happened
|
|
11
|
+
- NodeRegistrationAcked is a COMMAND because it's the node requesting
|
|
12
|
+
acknowledgment of its registration (imperative)
|
|
13
|
+
- NodeRegistrationAckReceived is the EVENT emitted when the orchestrator
|
|
14
|
+
processes this command successfully (fact)
|
|
15
|
+
|
|
16
|
+
Related Tickets:
|
|
17
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
18
|
+
- OMN-889 (D1): Registration Reducer
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from datetime import datetime
|
|
24
|
+
from uuid import UUID, uuid4
|
|
25
|
+
|
|
26
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ModelNodeRegistrationAcked(BaseModel):
|
|
30
|
+
"""Command: Node acknowledges its registration.
|
|
31
|
+
|
|
32
|
+
This is a COMMAND, not an event. Commands are imperative requests
|
|
33
|
+
from external sources (the node itself in this case) that orchestrators
|
|
34
|
+
process to make decisions and emit events.
|
|
35
|
+
|
|
36
|
+
The orchestrator receives this command and, if valid:
|
|
37
|
+
1. Emits NodeRegistrationAckReceived event
|
|
38
|
+
2. Emits NodeBecameActive event (if transitioning to active state)
|
|
39
|
+
|
|
40
|
+
Validity Conditions:
|
|
41
|
+
- Node must be in AWAITING_ACK state (queried from projection)
|
|
42
|
+
- If node is already ACTIVE, this is a duplicate ack (no-op)
|
|
43
|
+
- If node is in terminal state, this ack is too late (rejected)
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
command_id: Unique identifier for this command instance.
|
|
47
|
+
node_id: The UUID of the node sending the acknowledgment.
|
|
48
|
+
correlation_id: Correlation ID for distributed tracing, linking
|
|
49
|
+
this command to the original registration flow.
|
|
50
|
+
timestamp: When the node sent the acknowledgment.
|
|
51
|
+
|
|
52
|
+
Time Injection:
|
|
53
|
+
The `timestamp` field must be explicitly provided by the caller
|
|
54
|
+
using an injected `now` parameter. Do NOT use datetime.now() directly.
|
|
55
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
>>> from datetime import UTC, datetime
|
|
59
|
+
>>> from uuid import uuid4
|
|
60
|
+
>>> ack = ModelNodeRegistrationAcked(
|
|
61
|
+
... node_id=uuid4(),
|
|
62
|
+
... correlation_id=uuid4(),
|
|
63
|
+
... timestamp=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
64
|
+
... )
|
|
65
|
+
>>> assert ack.command_id is not None
|
|
66
|
+
>>> assert ack.timestamp.tzinfo is not None
|
|
67
|
+
|
|
68
|
+
See Also:
|
|
69
|
+
- ModelNodeRegistrationAckReceived: Event emitted when ack is processed
|
|
70
|
+
- ModelNodeBecameActive: Event emitted when node becomes active
|
|
71
|
+
- HandlerNodeRegistrationAcked: Handler that processes this command
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
model_config = ConfigDict(
|
|
75
|
+
frozen=True,
|
|
76
|
+
extra="forbid",
|
|
77
|
+
from_attributes=True,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Command identification
|
|
81
|
+
command_id: UUID = Field(
|
|
82
|
+
default_factory=uuid4,
|
|
83
|
+
description="Unique identifier for this command instance.",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Node identification
|
|
87
|
+
node_id: UUID = Field(
|
|
88
|
+
...,
|
|
89
|
+
description="The UUID of the node sending the acknowledgment.",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Tracing
|
|
93
|
+
correlation_id: UUID = Field(
|
|
94
|
+
...,
|
|
95
|
+
description=(
|
|
96
|
+
"Correlation ID for distributed tracing, linking this command "
|
|
97
|
+
"to the original registration flow."
|
|
98
|
+
),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Timestamp - MUST be explicitly injected (no default_factory for testability)
|
|
102
|
+
timestamp: datetime = Field(
|
|
103
|
+
...,
|
|
104
|
+
description="When the node sent the acknowledgment.",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
__all__: list[str] = ["ModelNodeRegistrationAcked"]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration decision events for C1 Registration Orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides event models emitted by the Registration Orchestrator
|
|
6
|
+
during the ONEX 2-way registration workflow. These events represent
|
|
7
|
+
orchestrator decisions and are consumed by the Registration Reducer.
|
|
8
|
+
|
|
9
|
+
Event Flow:
|
|
10
|
+
NodeIntrospected (input) -> Orchestrator -> Decision Events (output)
|
|
11
|
+
|
|
12
|
+
Decision Events:
|
|
13
|
+
- ModelNodeRegistrationInitiated: Registration attempt started
|
|
14
|
+
- ModelNodeRegistrationAccepted: Registration accepted by orchestrator
|
|
15
|
+
- ModelNodeRegistrationRejected: Registration rejected by orchestrator
|
|
16
|
+
- ModelNodeRegistrationAckTimedOut: Ack deadline passed without acknowledgment
|
|
17
|
+
- ModelNodeRegistrationAckReceived: Node acknowledged registration
|
|
18
|
+
- ModelNodeBecameActive: Node transitioned to active state
|
|
19
|
+
- ModelNodeLivenessExpired: Liveness deadline passed without heartbeat
|
|
20
|
+
|
|
21
|
+
See Also:
|
|
22
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
23
|
+
- DESIGN_TWO_WAY_REGISTRATION_ARCHITECTURE.md
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from omnibase_infra.models.registration.events.model_node_became_active import (
|
|
27
|
+
ModelNodeBecameActive,
|
|
28
|
+
)
|
|
29
|
+
from omnibase_infra.models.registration.events.model_node_liveness_expired import (
|
|
30
|
+
ModelNodeLivenessExpired,
|
|
31
|
+
)
|
|
32
|
+
from omnibase_infra.models.registration.events.model_node_registration_accepted import (
|
|
33
|
+
ModelNodeRegistrationAccepted,
|
|
34
|
+
)
|
|
35
|
+
from omnibase_infra.models.registration.events.model_node_registration_ack_received import (
|
|
36
|
+
ModelNodeRegistrationAckReceived,
|
|
37
|
+
)
|
|
38
|
+
from omnibase_infra.models.registration.events.model_node_registration_ack_timed_out import (
|
|
39
|
+
ModelNodeRegistrationAckTimedOut,
|
|
40
|
+
)
|
|
41
|
+
from omnibase_infra.models.registration.events.model_node_registration_initiated import (
|
|
42
|
+
ModelNodeRegistrationInitiated,
|
|
43
|
+
)
|
|
44
|
+
from omnibase_infra.models.registration.events.model_node_registration_rejected import (
|
|
45
|
+
ModelNodeRegistrationRejected,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
__all__ = [
|
|
49
|
+
"ModelNodeBecameActive",
|
|
50
|
+
"ModelNodeLivenessExpired",
|
|
51
|
+
"ModelNodeRegistrationAccepted",
|
|
52
|
+
"ModelNodeRegistrationAckReceived",
|
|
53
|
+
"ModelNodeRegistrationAckTimedOut",
|
|
54
|
+
"ModelNodeRegistrationInitiated",
|
|
55
|
+
"ModelNodeRegistrationRejected",
|
|
56
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Became Active Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeBecameActive for the ONEX 2-way registration
|
|
6
|
+
pattern. Emitted by the Registration Orchestrator when a node transitions
|
|
7
|
+
to the active state.
|
|
8
|
+
|
|
9
|
+
See Also:
|
|
10
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
from omnibase_infra.models.registration.model_node_capabilities import (
|
|
21
|
+
ModelNodeCapabilities,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ModelNodeBecameActive(BaseModel):
|
|
26
|
+
"""Event model for node activation.
|
|
27
|
+
|
|
28
|
+
Emitted when the orchestrator transitions a node to the active state.
|
|
29
|
+
This typically occurs after the node has successfully acknowledged
|
|
30
|
+
registration and is ready to participate in the cluster.
|
|
31
|
+
|
|
32
|
+
The capabilities field captures the node's advertised capabilities
|
|
33
|
+
at the time of activation, enabling routing and discovery decisions.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
entity_id: The entity identifier (equals node_id for registration domain).
|
|
37
|
+
Used as partition key for ordering guarantees.
|
|
38
|
+
node_id: Unique identifier of the activated node.
|
|
39
|
+
correlation_id: Correlation ID for distributed tracing across the workflow.
|
|
40
|
+
causation_id: Message ID of the event that triggered activation.
|
|
41
|
+
emitted_at: Timestamp when the orchestrator emitted this event (UTC).
|
|
42
|
+
capabilities: The node's capabilities at activation time.
|
|
43
|
+
Used for routing and service discovery decisions.
|
|
44
|
+
|
|
45
|
+
Time Injection:
|
|
46
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
47
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
48
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
>>> from datetime import UTC, datetime
|
|
52
|
+
>>> from uuid import uuid4
|
|
53
|
+
>>> from omnibase_infra.models.registration import ModelNodeCapabilities
|
|
54
|
+
>>> event = ModelNodeBecameActive(
|
|
55
|
+
... entity_id=uuid4(),
|
|
56
|
+
... node_id=uuid4(),
|
|
57
|
+
... correlation_id=uuid4(),
|
|
58
|
+
... causation_id=uuid4(),
|
|
59
|
+
... emitted_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
60
|
+
... capabilities=ModelNodeCapabilities(postgres=True, read=True),
|
|
61
|
+
... )
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
model_config = ConfigDict(
|
|
65
|
+
frozen=True,
|
|
66
|
+
extra="forbid",
|
|
67
|
+
from_attributes=True,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Entity and node identification
|
|
71
|
+
entity_id: UUID = Field(
|
|
72
|
+
...,
|
|
73
|
+
description="Entity identifier (equals node_id for registration domain)",
|
|
74
|
+
)
|
|
75
|
+
node_id: UUID = Field(
|
|
76
|
+
...,
|
|
77
|
+
description="Unique identifier of the activated node",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Tracing and causation
|
|
81
|
+
correlation_id: UUID = Field(
|
|
82
|
+
...,
|
|
83
|
+
description="Correlation ID for distributed tracing",
|
|
84
|
+
)
|
|
85
|
+
causation_id: UUID = Field(
|
|
86
|
+
...,
|
|
87
|
+
description="Message ID of the event that triggered activation",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
91
|
+
emitted_at: datetime = Field(
|
|
92
|
+
...,
|
|
93
|
+
description="Timestamp when the orchestrator emitted this event (UTC)",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Activation-specific
|
|
97
|
+
capabilities: ModelNodeCapabilities = Field(
|
|
98
|
+
...,
|
|
99
|
+
description="The node's capabilities at activation time",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
__all__ = ["ModelNodeBecameActive"]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Liveness Expired Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides the event model emitted when an active node fails to
|
|
6
|
+
send heartbeats within the configured liveness deadline.
|
|
7
|
+
|
|
8
|
+
Related Tickets:
|
|
9
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
10
|
+
- OMN-932 (C2): Durable Timeout Handling
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelNodeLivenessExpired(BaseModel):
|
|
22
|
+
"""Event emitted when an active node's liveness deadline has passed.
|
|
23
|
+
|
|
24
|
+
This event is produced by the registration orchestrator during RuntimeTick
|
|
25
|
+
processing when it detects that an ACTIVE node has exceeded its
|
|
26
|
+
liveness_deadline without sending a heartbeat.
|
|
27
|
+
|
|
28
|
+
Event Semantics (per C2 Durable Timeout Handling):
|
|
29
|
+
- Emitted once per entity per timeout occurrence
|
|
30
|
+
- Uses emission markers in projection for deduplication
|
|
31
|
+
- Links to triggering tick via causation_id
|
|
32
|
+
- Survives orchestrator restarts (deadline stored in projection)
|
|
33
|
+
|
|
34
|
+
FSM Impact:
|
|
35
|
+
This event triggers the FSM transition:
|
|
36
|
+
ACTIVE -> LIVENESS_EXPIRED (terminal state)
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
entity_id: The registration entity identifier (same as node_id)
|
|
40
|
+
node_id: The node UUID that failed liveness check
|
|
41
|
+
correlation_id: Correlation ID for distributed tracing
|
|
42
|
+
causation_id: UUID of the RuntimeTick that triggered this event
|
|
43
|
+
emitted_at: When the liveness expiry was detected (from tick.now)
|
|
44
|
+
last_heartbeat_at: The timestamp of the last received heartbeat
|
|
45
|
+
|
|
46
|
+
Time Injection:
|
|
47
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
48
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
49
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
>>> from datetime import datetime, UTC, timedelta
|
|
53
|
+
>>> from uuid import uuid4
|
|
54
|
+
>>> # Use explicit timestamps (time injection pattern) - not datetime.now()
|
|
55
|
+
>>> now = datetime(2025, 1, 15, 12, 10, 0, tzinfo=UTC)
|
|
56
|
+
>>> event = ModelNodeLivenessExpired(
|
|
57
|
+
... entity_id=uuid4(),
|
|
58
|
+
... node_id=uuid4(),
|
|
59
|
+
... correlation_id=uuid4(),
|
|
60
|
+
... causation_id=uuid4(),
|
|
61
|
+
... emitted_at=now,
|
|
62
|
+
... last_heartbeat_at=now - timedelta(minutes=10),
|
|
63
|
+
... )
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
model_config = ConfigDict(
|
|
67
|
+
frozen=True,
|
|
68
|
+
extra="forbid",
|
|
69
|
+
from_attributes=True,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Entity identification
|
|
73
|
+
entity_id: UUID = Field(
|
|
74
|
+
...,
|
|
75
|
+
description="The registration entity identifier (same as node_id)",
|
|
76
|
+
)
|
|
77
|
+
node_id: UUID = Field(
|
|
78
|
+
...,
|
|
79
|
+
description="The node UUID that failed liveness check",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Tracing
|
|
83
|
+
correlation_id: UUID = Field(
|
|
84
|
+
...,
|
|
85
|
+
description="Correlation ID for distributed tracing",
|
|
86
|
+
)
|
|
87
|
+
causation_id: UUID = Field(
|
|
88
|
+
...,
|
|
89
|
+
description="UUID of the RuntimeTick that triggered this liveness expired event",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Timing - MUST be explicitly injected (no default_factory for testability)
|
|
93
|
+
emitted_at: datetime = Field(
|
|
94
|
+
...,
|
|
95
|
+
description="When the liveness expiry was detected (from RuntimeTick.now)",
|
|
96
|
+
)
|
|
97
|
+
last_heartbeat_at: datetime | None = Field(
|
|
98
|
+
...,
|
|
99
|
+
description="The timestamp of the last received heartbeat (None if never received)",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
__all__: list[str] = ["ModelNodeLivenessExpired"]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Accepted Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationAccepted for the ONEX 2-way
|
|
6
|
+
registration pattern. Emitted by the Registration Orchestrator when it
|
|
7
|
+
accepts a node's registration request.
|
|
8
|
+
|
|
9
|
+
See Also:
|
|
10
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelNodeRegistrationAccepted(BaseModel):
|
|
22
|
+
"""Event model for registration acceptance by the orchestrator.
|
|
23
|
+
|
|
24
|
+
Emitted when the orchestrator decides to accept a node's registration.
|
|
25
|
+
The node must acknowledge this acceptance within the ack_deadline to
|
|
26
|
+
complete the registration handshake.
|
|
27
|
+
|
|
28
|
+
This event triggers the reducer to emit intents for persisting the
|
|
29
|
+
registration to Consul and PostgreSQL.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
entity_id: The entity identifier (equals node_id for registration domain).
|
|
33
|
+
Used as partition key for ordering guarantees.
|
|
34
|
+
node_id: Unique identifier of the node being registered.
|
|
35
|
+
correlation_id: Correlation ID for distributed tracing across the workflow.
|
|
36
|
+
causation_id: Message ID of the event that triggered this decision.
|
|
37
|
+
emitted_at: Timestamp when the orchestrator emitted this event (UTC).
|
|
38
|
+
ack_deadline: Deadline by which the node must acknowledge registration.
|
|
39
|
+
If not acknowledged by this time, NodeRegistrationAckTimedOut is emitted.
|
|
40
|
+
|
|
41
|
+
Time Injection:
|
|
42
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
43
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
44
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
>>> from datetime import UTC, datetime, timedelta
|
|
48
|
+
>>> from uuid import uuid4
|
|
49
|
+
>>> event = ModelNodeRegistrationAccepted(
|
|
50
|
+
... entity_id=uuid4(),
|
|
51
|
+
... node_id=uuid4(),
|
|
52
|
+
... correlation_id=uuid4(),
|
|
53
|
+
... causation_id=uuid4(),
|
|
54
|
+
... emitted_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
55
|
+
... ack_deadline=datetime(2025, 1, 15, 12, 0, 30, tzinfo=UTC),
|
|
56
|
+
... )
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
model_config = ConfigDict(
|
|
60
|
+
frozen=True,
|
|
61
|
+
extra="forbid",
|
|
62
|
+
from_attributes=True,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Entity and node identification
|
|
66
|
+
entity_id: UUID = Field(
|
|
67
|
+
...,
|
|
68
|
+
description="Entity identifier (equals node_id for registration domain)",
|
|
69
|
+
)
|
|
70
|
+
node_id: UUID = Field(
|
|
71
|
+
...,
|
|
72
|
+
description="Unique identifier of the node being registered",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Tracing and causation
|
|
76
|
+
correlation_id: UUID = Field(
|
|
77
|
+
...,
|
|
78
|
+
description="Correlation ID for distributed tracing",
|
|
79
|
+
)
|
|
80
|
+
causation_id: UUID = Field(
|
|
81
|
+
...,
|
|
82
|
+
description="Message ID of the event that triggered this decision",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
86
|
+
emitted_at: datetime = Field(
|
|
87
|
+
...,
|
|
88
|
+
description="Timestamp when the orchestrator emitted this event (UTC)",
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Registration-specific
|
|
92
|
+
ack_deadline: datetime = Field(
|
|
93
|
+
...,
|
|
94
|
+
description="Deadline by which the node must acknowledge registration (UTC)",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
__all__ = ["ModelNodeRegistrationAccepted"]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Ack Received Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationAckReceived for the ONEX 2-way
|
|
6
|
+
registration pattern. Emitted by the Registration Orchestrator when it
|
|
7
|
+
receives acknowledgment from the node within the ack_deadline.
|
|
8
|
+
|
|
9
|
+
See Also:
|
|
10
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelNodeRegistrationAckReceived(BaseModel):
|
|
22
|
+
"""Event model for registration acknowledgment received.
|
|
23
|
+
|
|
24
|
+
Emitted when the orchestrator processes a NodeRegistrationAcked command
|
|
25
|
+
from the node within the ack_deadline. This completes the handshake and
|
|
26
|
+
starts the liveness monitoring phase.
|
|
27
|
+
|
|
28
|
+
After this event, the node enters a monitored state where it must send
|
|
29
|
+
heartbeats before the liveness_deadline expires.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
entity_id: The entity identifier (equals node_id for registration domain).
|
|
33
|
+
Used as partition key for ordering guarantees.
|
|
34
|
+
node_id: Unique identifier of the node that acknowledged registration.
|
|
35
|
+
correlation_id: Correlation ID for distributed tracing across the workflow.
|
|
36
|
+
causation_id: Message ID of the NodeRegistrationAcked command.
|
|
37
|
+
emitted_at: Timestamp when the orchestrator emitted this event (UTC).
|
|
38
|
+
liveness_deadline: Deadline for the next heartbeat from the node.
|
|
39
|
+
If no heartbeat is received by this time, NodeLivenessExpired is emitted.
|
|
40
|
+
|
|
41
|
+
Time Injection:
|
|
42
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
43
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
44
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
>>> from datetime import UTC, datetime, timedelta
|
|
48
|
+
>>> from uuid import uuid4
|
|
49
|
+
>>> event = ModelNodeRegistrationAckReceived(
|
|
50
|
+
... entity_id=uuid4(),
|
|
51
|
+
... node_id=uuid4(),
|
|
52
|
+
... correlation_id=uuid4(),
|
|
53
|
+
... causation_id=uuid4(),
|
|
54
|
+
... emitted_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
55
|
+
... liveness_deadline=datetime(2025, 1, 15, 12, 1, 0, tzinfo=UTC),
|
|
56
|
+
... )
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
model_config = ConfigDict(
|
|
60
|
+
frozen=True,
|
|
61
|
+
extra="forbid",
|
|
62
|
+
from_attributes=True,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Entity and node identification
|
|
66
|
+
entity_id: UUID = Field(
|
|
67
|
+
...,
|
|
68
|
+
description="Entity identifier (equals node_id for registration domain)",
|
|
69
|
+
)
|
|
70
|
+
node_id: UUID = Field(
|
|
71
|
+
...,
|
|
72
|
+
description="Unique identifier of the node that acknowledged registration",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Tracing and causation
|
|
76
|
+
correlation_id: UUID = Field(
|
|
77
|
+
...,
|
|
78
|
+
description="Correlation ID for distributed tracing",
|
|
79
|
+
)
|
|
80
|
+
causation_id: UUID = Field(
|
|
81
|
+
...,
|
|
82
|
+
description="Message ID of the NodeRegistrationAcked command",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
86
|
+
emitted_at: datetime = Field(
|
|
87
|
+
...,
|
|
88
|
+
description="Timestamp when the orchestrator emitted this event (UTC)",
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Liveness-specific
|
|
92
|
+
liveness_deadline: datetime = Field(
|
|
93
|
+
...,
|
|
94
|
+
description="Deadline for the next heartbeat from the node (UTC)",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
__all__ = ["ModelNodeRegistrationAckReceived"]
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Ack Timeout Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides the event model emitted when a node fails to acknowledge
|
|
6
|
+
its registration within the configured deadline.
|
|
7
|
+
|
|
8
|
+
Related Tickets:
|
|
9
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
10
|
+
- OMN-932 (C2): Durable Timeout Handling
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
from omnibase_infra.enums import EnumRegistrationState
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelNodeRegistrationAckTimedOut(BaseModel):
|
|
24
|
+
"""Event emitted when a node's registration ack deadline has passed.
|
|
25
|
+
|
|
26
|
+
This event is produced by the registration orchestrator during RuntimeTick
|
|
27
|
+
processing when it detects that a node in ACCEPTED or AWAITING_ACK state
|
|
28
|
+
has exceeded its ack_deadline.
|
|
29
|
+
|
|
30
|
+
Event Semantics (per C2 Durable Timeout Handling):
|
|
31
|
+
- Emitted once per entity per timeout occurrence
|
|
32
|
+
- Uses emission markers in projection for deduplication
|
|
33
|
+
- Links to triggering tick via causation_id
|
|
34
|
+
- Survives orchestrator restarts (deadline stored in projection)
|
|
35
|
+
|
|
36
|
+
FSM Impact:
|
|
37
|
+
This event triggers the FSM transition:
|
|
38
|
+
AWAITING_ACK -> ACK_TIMED_OUT
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
entity_id: The registration entity identifier (same as node_id)
|
|
42
|
+
node_id: The node UUID that failed to acknowledge
|
|
43
|
+
correlation_id: Correlation ID for distributed tracing
|
|
44
|
+
causation_id: UUID of the RuntimeTick that triggered this event
|
|
45
|
+
emitted_at: When the timeout was detected (from tick.now)
|
|
46
|
+
deadline_at: The original ack deadline that was exceeded
|
|
47
|
+
previous_state: State before timeout (ACCEPTED or AWAITING_ACK), optional
|
|
48
|
+
|
|
49
|
+
Time Injection:
|
|
50
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
51
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
52
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
>>> from datetime import datetime, UTC, timedelta
|
|
56
|
+
>>> from uuid import uuid4
|
|
57
|
+
>>> # Use explicit timestamps (time injection pattern) - not datetime.now()
|
|
58
|
+
>>> now = datetime(2025, 1, 15, 12, 5, 0, tzinfo=UTC)
|
|
59
|
+
>>> event = ModelNodeRegistrationAckTimedOut(
|
|
60
|
+
... entity_id=uuid4(),
|
|
61
|
+
... node_id=uuid4(),
|
|
62
|
+
... correlation_id=uuid4(),
|
|
63
|
+
... causation_id=uuid4(),
|
|
64
|
+
... emitted_at=now,
|
|
65
|
+
... deadline_at=now - timedelta(minutes=5),
|
|
66
|
+
... )
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
model_config = ConfigDict(
|
|
70
|
+
frozen=True,
|
|
71
|
+
extra="forbid",
|
|
72
|
+
from_attributes=True,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Entity identification
|
|
76
|
+
entity_id: UUID = Field(
|
|
77
|
+
...,
|
|
78
|
+
description="The registration entity identifier (same as node_id)",
|
|
79
|
+
)
|
|
80
|
+
node_id: UUID = Field(
|
|
81
|
+
...,
|
|
82
|
+
description="The node UUID that failed to acknowledge registration",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Tracing
|
|
86
|
+
correlation_id: UUID = Field(
|
|
87
|
+
...,
|
|
88
|
+
description="Correlation ID for distributed tracing",
|
|
89
|
+
)
|
|
90
|
+
causation_id: UUID = Field(
|
|
91
|
+
...,
|
|
92
|
+
description="UUID of the RuntimeTick that triggered this timeout event",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Timing - MUST be explicitly injected (no default_factory for testability)
|
|
96
|
+
emitted_at: datetime = Field(
|
|
97
|
+
...,
|
|
98
|
+
description="When the timeout was detected (from RuntimeTick.now)",
|
|
99
|
+
)
|
|
100
|
+
deadline_at: datetime = Field(
|
|
101
|
+
...,
|
|
102
|
+
description="The original ack deadline that was exceeded",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# State context (optional - provides additional context for FSM processing)
|
|
106
|
+
previous_state: EnumRegistrationState | None = Field(
|
|
107
|
+
default=None,
|
|
108
|
+
description="State before timeout (ACCEPTED or AWAITING_ACK)",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
__all__: list[str] = ["ModelNodeRegistrationAckTimedOut"]
|