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,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
|
+
]
|