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,82 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Projector schema validator protocol.
|
|
4
|
+
|
|
5
|
+
Provides the protocol definition for schema validators that validate
|
|
6
|
+
projection table schemas exist and are correctly structured.
|
|
7
|
+
|
|
8
|
+
Part of OMN-1168: ProjectorPluginLoader contract discovery loading.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
14
|
+
from uuid import UUID
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from omnibase_infra.models.projectors import ModelProjectorSchema
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@runtime_checkable
|
|
21
|
+
class ProtocolProjectorSchemaValidator(Protocol):
|
|
22
|
+
"""Protocol for projector schema validation.
|
|
23
|
+
|
|
24
|
+
Defines the interface that schema validators must implement to validate
|
|
25
|
+
projection table schemas exist and are correctly structured.
|
|
26
|
+
|
|
27
|
+
See: tests/unit/runtime/test_projector_schema_validator.py for TDD tests.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
async def ensure_schema_exists(
|
|
31
|
+
self,
|
|
32
|
+
schema: ModelProjectorSchema,
|
|
33
|
+
correlation_id: UUID,
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Ensure the schema table exists with required columns.
|
|
36
|
+
|
|
37
|
+
Verifies that the projection table exists in the database and has
|
|
38
|
+
all required columns. Does NOT auto-create missing schemas.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
schema: Projector schema to validate.
|
|
42
|
+
correlation_id: Correlation ID for distributed tracing. Required
|
|
43
|
+
to ensure proper observability across service boundaries.
|
|
44
|
+
|
|
45
|
+
Raises:
|
|
46
|
+
ProjectorSchemaError: If table does not exist or required columns
|
|
47
|
+
are missing.
|
|
48
|
+
InfraConnectionError: If database connection fails.
|
|
49
|
+
InfraTimeoutError: If validation query times out.
|
|
50
|
+
"""
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
async def table_exists(
|
|
54
|
+
self,
|
|
55
|
+
table_name: str,
|
|
56
|
+
correlation_id: UUID,
|
|
57
|
+
schema_name: str | None = None,
|
|
58
|
+
) -> bool:
|
|
59
|
+
"""Check if a table exists in the database.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
table_name: Name of the table to check.
|
|
63
|
+
correlation_id: Correlation ID for distributed tracing. Required
|
|
64
|
+
to ensure proper observability across service boundaries.
|
|
65
|
+
schema_name: Optional database schema name. Defaults to 'public'.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
True if table exists, False otherwise.
|
|
69
|
+
|
|
70
|
+
Raises:
|
|
71
|
+
InfraConnectionError: If database connection fails.
|
|
72
|
+
InfraTimeoutError: If query times out.
|
|
73
|
+
|
|
74
|
+
Note:
|
|
75
|
+
Currently defaults to 'public' schema.
|
|
76
|
+
"""
|
|
77
|
+
...
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
__all__ = [
|
|
81
|
+
"ProtocolProjectorSchemaValidator",
|
|
82
|
+
]
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Protocol for registry metrics collection.
|
|
4
|
+
|
|
5
|
+
Defines the interface for optional metrics hooks that can be plugged
|
|
6
|
+
into RegistryCompute for production monitoring.
|
|
7
|
+
|
|
8
|
+
This protocol enables observability for compute plugin registries without
|
|
9
|
+
requiring any specific metrics backend. Implementations can integrate with:
|
|
10
|
+
- Prometheus/OpenMetrics
|
|
11
|
+
- StatsD/Datadog
|
|
12
|
+
- OpenTelemetry
|
|
13
|
+
- Custom monitoring solutions
|
|
14
|
+
|
|
15
|
+
Design Philosophy:
|
|
16
|
+
All methods are optional (duck-typed). If a method is not implemented,
|
|
17
|
+
the metric simply won't be recorded. This allows for partial implementations
|
|
18
|
+
and gradual adoption of metrics collection.
|
|
19
|
+
|
|
20
|
+
Metrics Categories:
|
|
21
|
+
- Latency: Operation timing for get(), register(), unregister()
|
|
22
|
+
- Cache: Semver cache hit/miss rates for performance tuning
|
|
23
|
+
- Size: Registry growth over time for capacity planning
|
|
24
|
+
- Errors: Error frequency by type for alerting and debugging
|
|
25
|
+
|
|
26
|
+
Thread Safety:
|
|
27
|
+
Implementations must be thread-safe as metrics may be recorded from
|
|
28
|
+
concurrent registry operations.
|
|
29
|
+
|
|
30
|
+
Example Implementation:
|
|
31
|
+
```python
|
|
32
|
+
from omnibase_infra.protocols import ProtocolRegistryMetrics
|
|
33
|
+
from prometheus_client import Counter, Histogram, Gauge
|
|
34
|
+
|
|
35
|
+
class PrometheusRegistryMetrics:
|
|
36
|
+
'''Prometheus metrics collector for RegistryCompute.'''
|
|
37
|
+
|
|
38
|
+
def __init__(self) -> None:
|
|
39
|
+
self._get_latency = Histogram(
|
|
40
|
+
'registry_compute_get_latency_ms',
|
|
41
|
+
'Latency of get() operations in milliseconds',
|
|
42
|
+
['plugin_id', 'version_filter'],
|
|
43
|
+
)
|
|
44
|
+
self._cache_hits = Counter(
|
|
45
|
+
'registry_compute_cache_hits_total',
|
|
46
|
+
'Total semver cache hits',
|
|
47
|
+
)
|
|
48
|
+
self._cache_misses = Counter(
|
|
49
|
+
'registry_compute_cache_misses_total',
|
|
50
|
+
'Total semver cache misses',
|
|
51
|
+
)
|
|
52
|
+
self._registry_size = Gauge(
|
|
53
|
+
'registry_compute_size',
|
|
54
|
+
'Current number of registered plugins',
|
|
55
|
+
)
|
|
56
|
+
self._errors = Counter(
|
|
57
|
+
'registry_compute_errors_total',
|
|
58
|
+
'Total errors by type',
|
|
59
|
+
['error_type', 'plugin_id'],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def record_get_latency(
|
|
63
|
+
self, plugin_id: str, version: str | None, latency_ms: float
|
|
64
|
+
) -> None:
|
|
65
|
+
version_label = version if version else "latest"
|
|
66
|
+
self._get_latency.labels(
|
|
67
|
+
plugin_id=plugin_id, version_filter=version_label
|
|
68
|
+
).observe(latency_ms)
|
|
69
|
+
|
|
70
|
+
def record_cache_hit(self) -> None:
|
|
71
|
+
self._cache_hits.inc()
|
|
72
|
+
|
|
73
|
+
def record_cache_miss(self) -> None:
|
|
74
|
+
self._cache_misses.inc()
|
|
75
|
+
|
|
76
|
+
def record_registry_size(self, size: int) -> None:
|
|
77
|
+
self._registry_size.set(size)
|
|
78
|
+
|
|
79
|
+
def record_error(
|
|
80
|
+
self, error_type: str, plugin_id: str | None = None
|
|
81
|
+
) -> None:
|
|
82
|
+
self._errors.labels(
|
|
83
|
+
error_type=error_type, plugin_id=plugin_id or "unknown"
|
|
84
|
+
).inc()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Integration with RegistryCompute:
|
|
88
|
+
```python
|
|
89
|
+
from omnibase_infra.runtime.registry_compute import RegistryCompute
|
|
90
|
+
|
|
91
|
+
# Create registry with metrics
|
|
92
|
+
metrics = PrometheusRegistryMetrics()
|
|
93
|
+
registry = RegistryCompute(metrics_collector=metrics)
|
|
94
|
+
|
|
95
|
+
# Or set after creation
|
|
96
|
+
registry = RegistryCompute()
|
|
97
|
+
registry.set_metrics_collector(metrics)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
See Also:
|
|
101
|
+
- src/omnibase_infra/runtime/registry_compute.py for integration
|
|
102
|
+
- docs/patterns/observability_patterns.md for monitoring guidelines
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
from __future__ import annotations
|
|
106
|
+
|
|
107
|
+
from typing import Protocol, runtime_checkable
|
|
108
|
+
|
|
109
|
+
__all__ = [
|
|
110
|
+
"ProtocolRegistryMetrics",
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@runtime_checkable
|
|
115
|
+
class ProtocolRegistryMetrics(Protocol):
|
|
116
|
+
"""Protocol for registry metrics collection.
|
|
117
|
+
|
|
118
|
+
Implementations can hook into registry operations to collect:
|
|
119
|
+
- Operation latency (get, register, unregister)
|
|
120
|
+
- Cache hit/miss rates
|
|
121
|
+
- Registry size over time
|
|
122
|
+
- Error frequency by type
|
|
123
|
+
|
|
124
|
+
All methods are optional (duck-typed). If a method is not implemented,
|
|
125
|
+
the metric simply won't be recorded.
|
|
126
|
+
|
|
127
|
+
Thread Safety:
|
|
128
|
+
Implementations MUST be thread-safe. Metrics may be recorded from
|
|
129
|
+
concurrent registry operations protected by the registry's lock.
|
|
130
|
+
|
|
131
|
+
Performance:
|
|
132
|
+
Metrics recording should be lightweight (<1ms) to avoid impacting
|
|
133
|
+
registry performance. Consider async or buffered recording for
|
|
134
|
+
high-throughput scenarios.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def record_get_latency(
|
|
138
|
+
self, plugin_id: str, version: str | None, latency_ms: float
|
|
139
|
+
) -> None:
|
|
140
|
+
"""Record latency for a get() operation.
|
|
141
|
+
|
|
142
|
+
Called after each get() operation completes, regardless of success
|
|
143
|
+
or failure. The latency includes the full operation time including
|
|
144
|
+
any semver parsing and comparison.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
plugin_id: The plugin ID that was looked up
|
|
148
|
+
version: The version filter (None if latest version requested)
|
|
149
|
+
latency_ms: Time in milliseconds for the operation
|
|
150
|
+
|
|
151
|
+
Example:
|
|
152
|
+
>>> # After a get() call taking 0.5ms
|
|
153
|
+
>>> metrics.record_get_latency("json_normalizer", "1.0.0", 0.5)
|
|
154
|
+
>>> # After a latest version lookup taking 1.2ms
|
|
155
|
+
>>> metrics.record_get_latency("json_normalizer", None, 1.2)
|
|
156
|
+
"""
|
|
157
|
+
...
|
|
158
|
+
|
|
159
|
+
def record_cache_hit(self) -> None:
|
|
160
|
+
"""Record a semver cache hit.
|
|
161
|
+
|
|
162
|
+
Called when the semver parser finds a version string in the LRU cache.
|
|
163
|
+
Useful for tuning cache size (SEMVER_CACHE_SIZE).
|
|
164
|
+
|
|
165
|
+
High cache hit rates (>95%) indicate good cache sizing.
|
|
166
|
+
Low hit rates may indicate cache is too small for the workload.
|
|
167
|
+
"""
|
|
168
|
+
...
|
|
169
|
+
|
|
170
|
+
def record_cache_miss(self) -> None:
|
|
171
|
+
"""Record a semver cache miss.
|
|
172
|
+
|
|
173
|
+
Called when the semver parser must parse a new version string
|
|
174
|
+
not found in the LRU cache.
|
|
175
|
+
"""
|
|
176
|
+
...
|
|
177
|
+
|
|
178
|
+
def record_registry_size(self, size: int) -> None:
|
|
179
|
+
"""Record current registry size.
|
|
180
|
+
|
|
181
|
+
Called after registration and unregistration operations to track
|
|
182
|
+
registry growth over time. Useful for capacity planning.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
size: Number of registered plugins (plugin_id, version pairs)
|
|
186
|
+
|
|
187
|
+
Example:
|
|
188
|
+
>>> # After registering a new plugin
|
|
189
|
+
>>> metrics.record_registry_size(42)
|
|
190
|
+
"""
|
|
191
|
+
...
|
|
192
|
+
|
|
193
|
+
def record_error(self, error_type: str, plugin_id: str | None = None) -> None:
|
|
194
|
+
"""Record an error occurrence.
|
|
195
|
+
|
|
196
|
+
Called when registry operations fail. Error types are standardized
|
|
197
|
+
strings that can be used for alerting and debugging.
|
|
198
|
+
|
|
199
|
+
Standard Error Types:
|
|
200
|
+
- "not_found": Plugin ID not found in registry
|
|
201
|
+
- "version_not_found": Specific version not found
|
|
202
|
+
- "invalid_version": Invalid semver format during registration
|
|
203
|
+
- "async_not_flagged": Async plugin without deterministic_async=True
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
error_type: Type of error (standardized string)
|
|
207
|
+
plugin_id: Optional plugin ID associated with error
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
>>> # Plugin not found
|
|
211
|
+
>>> metrics.record_error("not_found", "unknown_plugin")
|
|
212
|
+
>>> # Invalid version format
|
|
213
|
+
>>> metrics.record_error("invalid_version", "json_normalizer")
|
|
214
|
+
"""
|
|
215
|
+
...
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Protocol definition for snapshot publishing services.
|
|
4
|
+
|
|
5
|
+
This module defines the ProtocolSnapshotPublisher interface for services that
|
|
6
|
+
publish materialized projection snapshots to Kafka compacted topics. Snapshots
|
|
7
|
+
provide an optimized read path for entity state queries.
|
|
8
|
+
|
|
9
|
+
CRITICAL DESIGN PRINCIPLE - Snapshots vs Event Log:
|
|
10
|
+
Snapshots are an optional READ OPTIMIZATION and NEVER replace the immutable
|
|
11
|
+
event log which remains the absolute source of truth.
|
|
12
|
+
|
|
13
|
+
Event Log (Source of Truth):
|
|
14
|
+
- Immutable append-only log of all events
|
|
15
|
+
- Complete audit trail with full history
|
|
16
|
+
- Replayed to rebuild any state from scratch
|
|
17
|
+
- Never modified, only appended
|
|
18
|
+
- Used for: Compliance, debugging, state recovery
|
|
19
|
+
|
|
20
|
+
Snapshots (Read Optimization):
|
|
21
|
+
- Point-in-time materialized views of projections
|
|
22
|
+
- Optimized for fast reads without log replay
|
|
23
|
+
- Published to Kafka compacted topics (latest by key wins)
|
|
24
|
+
- Can be regenerated from event log at any time
|
|
25
|
+
- Used for: Query optimization, fast state access
|
|
26
|
+
|
|
27
|
+
Architecture Context:
|
|
28
|
+
In the ONEX registration domain:
|
|
29
|
+
- Projectors (F1) maintain real-time materialized views in PostgreSQL
|
|
30
|
+
- Snapshot publishers (F2) periodically compact projections to Kafka
|
|
31
|
+
- Orchestrators read snapshots for fast state queries
|
|
32
|
+
- Full event log is preserved for replay, audit, and recovery
|
|
33
|
+
|
|
34
|
+
Compaction Semantics:
|
|
35
|
+
Kafka compacted topics retain only the latest value per key:
|
|
36
|
+
- Key: (entity_id, domain) composite key as string
|
|
37
|
+
- Value: Serialized snapshot (JSON or Avro)
|
|
38
|
+
- Tombstones: null value deletes the key (entity deletion)
|
|
39
|
+
|
|
40
|
+
This means consumers reading the compacted topic get:
|
|
41
|
+
- Latest snapshot for each entity
|
|
42
|
+
- No historical versions (use event log for history)
|
|
43
|
+
- Efficient bootstrap for new consumers
|
|
44
|
+
|
|
45
|
+
Example Usage:
|
|
46
|
+
```python
|
|
47
|
+
from omnibase_infra.protocols import ProtocolSnapshotPublisher
|
|
48
|
+
from omnibase_infra.models.projection import ModelRegistrationProjection
|
|
49
|
+
|
|
50
|
+
class KafkaSnapshotPublisher:
|
|
51
|
+
'''Concrete implementation publishing to Kafka compacted topic.'''
|
|
52
|
+
|
|
53
|
+
async def publish_snapshot(
|
|
54
|
+
self,
|
|
55
|
+
snapshot: ModelRegistrationProjection,
|
|
56
|
+
) -> None:
|
|
57
|
+
'''Publish snapshot to Kafka compacted topic.'''
|
|
58
|
+
key = f"{snapshot.domain}:{snapshot.entity_id}"
|
|
59
|
+
await self._kafka_producer.send(
|
|
60
|
+
topic="registration.snapshots",
|
|
61
|
+
key=key,
|
|
62
|
+
value=snapshot.model_dump_json(),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
async def delete_snapshot(
|
|
66
|
+
self,
|
|
67
|
+
entity_id: str,
|
|
68
|
+
domain: str,
|
|
69
|
+
) -> bool:
|
|
70
|
+
'''Publish tombstone to delete snapshot.'''
|
|
71
|
+
key = f"{domain}:{entity_id}"
|
|
72
|
+
await self._kafka_producer.send(
|
|
73
|
+
topic="registration.snapshots",
|
|
74
|
+
key=key,
|
|
75
|
+
value=None, # Tombstone
|
|
76
|
+
)
|
|
77
|
+
return True
|
|
78
|
+
|
|
79
|
+
# Protocol conformance check via duck typing (per ONEX conventions)
|
|
80
|
+
publisher = KafkaSnapshotPublisher()
|
|
81
|
+
|
|
82
|
+
# Verify required methods exist and are callable
|
|
83
|
+
assert hasattr(publisher, 'publish_snapshot') and callable(publisher.publish_snapshot)
|
|
84
|
+
assert hasattr(publisher, 'delete_snapshot') and callable(publisher.delete_snapshot)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Performance Considerations:
|
|
88
|
+
- Batch publishing recommended for high-volume updates
|
|
89
|
+
- Consider snapshot frequency vs freshness trade-offs
|
|
90
|
+
- Compacted topics have lower storage than full event log
|
|
91
|
+
- Use get_latest_snapshot for read optimization, not reconstruction
|
|
92
|
+
|
|
93
|
+
See Also:
|
|
94
|
+
- OMN-947 (F2): Snapshot Publishing
|
|
95
|
+
- OMN-944 (F1): Implement Registration Projection Schema
|
|
96
|
+
- omnibase_infra.models.projection for model definitions
|
|
97
|
+
- ONEX event sourcing architecture documentation
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
from __future__ import annotations
|
|
101
|
+
|
|
102
|
+
from typing import Protocol, runtime_checkable
|
|
103
|
+
|
|
104
|
+
from omnibase_infra.models.projection import ModelRegistrationProjection
|
|
105
|
+
|
|
106
|
+
__all__ = [
|
|
107
|
+
"ProtocolSnapshotPublisher",
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@runtime_checkable
|
|
112
|
+
class ProtocolSnapshotPublisher(Protocol):
|
|
113
|
+
"""Protocol for snapshot publishing services.
|
|
114
|
+
|
|
115
|
+
Snapshot publishers periodically compact projections into optimized read
|
|
116
|
+
snapshots. Snapshots are published to compacted Kafka topics for efficient
|
|
117
|
+
state queries by orchestrators and other consumers.
|
|
118
|
+
|
|
119
|
+
IMPORTANT: Snapshots are for READ OPTIMIZATION ONLY and NEVER replace the
|
|
120
|
+
immutable event log which remains the source of truth.
|
|
121
|
+
|
|
122
|
+
Why Snapshots?
|
|
123
|
+
Without snapshots, querying current entity state requires:
|
|
124
|
+
1. Reading the entire event log from the beginning
|
|
125
|
+
2. Replaying all events to compute current state
|
|
126
|
+
3. O(n) complexity where n = number of events
|
|
127
|
+
|
|
128
|
+
With snapshots:
|
|
129
|
+
1. Read latest snapshot from compacted topic
|
|
130
|
+
2. O(1) lookup for current state
|
|
131
|
+
3. Optional: apply any events since snapshot for freshness
|
|
132
|
+
|
|
133
|
+
Compaction Semantics:
|
|
134
|
+
- Key: Composite of (entity_id, domain) as string
|
|
135
|
+
- Value: Serialized snapshot (latest wins per key)
|
|
136
|
+
- Tombstone: null value indicates entity deletion
|
|
137
|
+
- Consumers see: only latest snapshot per entity
|
|
138
|
+
|
|
139
|
+
Concurrency Safety:
|
|
140
|
+
Implementations must be coroutine-safe for concurrent async publishing.
|
|
141
|
+
Multiple coroutines may invoke publish_snapshot concurrently. Use
|
|
142
|
+
asyncio.Lock for shared mutable state (coroutine-safe, not thread-safe).
|
|
143
|
+
|
|
144
|
+
Error Handling:
|
|
145
|
+
All methods should raise OnexError subclasses on failure:
|
|
146
|
+
- InfraConnectionError: Kafka/transport unavailable
|
|
147
|
+
- InfraTimeoutError: Publish operation timed out
|
|
148
|
+
- ProtocolConfigurationError: Invalid topic/serialization config
|
|
149
|
+
|
|
150
|
+
Example Implementation:
|
|
151
|
+
```python
|
|
152
|
+
class KafkaSnapshotPublisher:
|
|
153
|
+
def __init__(self, producer: KafkaProducer, topic: str):
|
|
154
|
+
self._producer = producer
|
|
155
|
+
self._topic = topic
|
|
156
|
+
|
|
157
|
+
async def publish_snapshot(
|
|
158
|
+
self,
|
|
159
|
+
snapshot: ModelRegistrationProjection,
|
|
160
|
+
) -> None:
|
|
161
|
+
key = self._build_key(snapshot.entity_id, snapshot.domain)
|
|
162
|
+
value = snapshot.model_dump_json()
|
|
163
|
+
await self._producer.send(self._topic, key=key, value=value)
|
|
164
|
+
|
|
165
|
+
async def publish_batch(
|
|
166
|
+
self,
|
|
167
|
+
snapshots: list[ModelRegistrationProjection],
|
|
168
|
+
) -> int:
|
|
169
|
+
count = 0
|
|
170
|
+
for snapshot in snapshots:
|
|
171
|
+
try:
|
|
172
|
+
await self.publish_snapshot(snapshot)
|
|
173
|
+
count += 1
|
|
174
|
+
except Exception: # noqa: BLE001 - batch continues on single failure
|
|
175
|
+
# Log and continue with batch
|
|
176
|
+
pass
|
|
177
|
+
return count
|
|
178
|
+
|
|
179
|
+
async def get_latest_snapshot(
|
|
180
|
+
self,
|
|
181
|
+
entity_id: str,
|
|
182
|
+
domain: str,
|
|
183
|
+
) -> ModelRegistrationProjection | None:
|
|
184
|
+
key = self._build_key(entity_id, domain)
|
|
185
|
+
value = await self._consumer.get_latest(self._topic, key)
|
|
186
|
+
if value is None:
|
|
187
|
+
return None
|
|
188
|
+
return ModelRegistrationProjection.model_validate_json(value)
|
|
189
|
+
|
|
190
|
+
async def delete_snapshot(
|
|
191
|
+
self,
|
|
192
|
+
entity_id: str,
|
|
193
|
+
domain: str,
|
|
194
|
+
) -> bool:
|
|
195
|
+
key = self._build_key(entity_id, domain)
|
|
196
|
+
await self._producer.send(self._topic, key=key, value=None)
|
|
197
|
+
return True
|
|
198
|
+
|
|
199
|
+
def _build_key(self, entity_id: str, domain: str) -> str:
|
|
200
|
+
return f"{domain}:{entity_id}"
|
|
201
|
+
```
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
async def publish_snapshot(
|
|
205
|
+
self,
|
|
206
|
+
snapshot: ModelRegistrationProjection,
|
|
207
|
+
) -> None:
|
|
208
|
+
"""Publish a single snapshot to the snapshot topic.
|
|
209
|
+
|
|
210
|
+
Publishes a materialized projection snapshot to the compacted Kafka topic.
|
|
211
|
+
The snapshot key is derived from (entity_id, domain) for proper compaction.
|
|
212
|
+
|
|
213
|
+
NOTE: This is a READ OPTIMIZATION. The event log remains source of truth.
|
|
214
|
+
Snapshots can be regenerated from the event log at any time.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
snapshot: The projection snapshot to publish. Must contain valid
|
|
218
|
+
entity_id and domain for key construction.
|
|
219
|
+
|
|
220
|
+
Raises:
|
|
221
|
+
InfraConnectionError: If Kafka/transport is unavailable
|
|
222
|
+
InfraTimeoutError: If publish operation times out
|
|
223
|
+
OnexError: For serialization or configuration errors
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
```python
|
|
227
|
+
from omnibase_core.enums import EnumNodeKind
|
|
228
|
+
|
|
229
|
+
snapshot = ModelRegistrationProjection(
|
|
230
|
+
entity_id=uuid4(),
|
|
231
|
+
domain="registration",
|
|
232
|
+
current_state=EnumRegistrationState.ACTIVE,
|
|
233
|
+
node_type=EnumNodeKind.EFFECT,
|
|
234
|
+
last_applied_event_id=uuid4(),
|
|
235
|
+
registered_at=datetime.now(UTC),
|
|
236
|
+
updated_at=datetime.now(UTC),
|
|
237
|
+
)
|
|
238
|
+
await publisher.publish_snapshot(snapshot)
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Implementation Notes:
|
|
242
|
+
- Key should be deterministic: f"{domain}:{entity_id}"
|
|
243
|
+
- Value should be serialized consistently (JSON or Avro)
|
|
244
|
+
- Include correlation_id in publish context for tracing
|
|
245
|
+
- Consider batching for high-volume scenarios
|
|
246
|
+
"""
|
|
247
|
+
...
|
|
248
|
+
|
|
249
|
+
async def publish_batch(
|
|
250
|
+
self,
|
|
251
|
+
snapshots: list[ModelRegistrationProjection],
|
|
252
|
+
) -> int:
|
|
253
|
+
"""Publish multiple snapshots in a batch operation.
|
|
254
|
+
|
|
255
|
+
Batch publishing is recommended for periodic snapshot jobs that
|
|
256
|
+
publish many entities at once. Implementations should optimize
|
|
257
|
+
for throughput while handling individual failures gracefully.
|
|
258
|
+
|
|
259
|
+
NOTE: This is a READ OPTIMIZATION. The event log remains source of truth.
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
snapshots: List of projection snapshots to publish.
|
|
263
|
+
Each must contain valid entity_id and domain.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Count of successfully published snapshots.
|
|
267
|
+
May be less than len(snapshots) if some fail.
|
|
268
|
+
|
|
269
|
+
Raises:
|
|
270
|
+
InfraConnectionError: If Kafka/transport is unavailable
|
|
271
|
+
(before any publishing starts)
|
|
272
|
+
OnexError: For configuration errors
|
|
273
|
+
|
|
274
|
+
Example:
|
|
275
|
+
```python
|
|
276
|
+
# Periodic snapshot job
|
|
277
|
+
projections = await projection_store.get_all()
|
|
278
|
+
published = await publisher.publish_batch(projections)
|
|
279
|
+
logger.info(f"Published {published}/{len(projections)} snapshots")
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Implementation Notes:
|
|
283
|
+
- Continue publishing on individual failures (best-effort)
|
|
284
|
+
- Log failures for operational visibility
|
|
285
|
+
- Consider parallel publishing for large batches
|
|
286
|
+
- Return accurate count of successes
|
|
287
|
+
- Use transactional producers if exactly-once needed
|
|
288
|
+
"""
|
|
289
|
+
...
|
|
290
|
+
|
|
291
|
+
async def get_latest_snapshot(
|
|
292
|
+
self,
|
|
293
|
+
entity_id: str,
|
|
294
|
+
domain: str,
|
|
295
|
+
) -> ModelRegistrationProjection | None:
|
|
296
|
+
"""Retrieve the latest snapshot for an entity.
|
|
297
|
+
|
|
298
|
+
Reads the latest snapshot from the compacted topic. This is the
|
|
299
|
+
primary read path for state queries, providing O(1) access to
|
|
300
|
+
current entity state without replaying the event log.
|
|
301
|
+
|
|
302
|
+
IMPORTANT: Snapshot may be slightly stale. For guaranteed freshness,
|
|
303
|
+
combine with event log events since snapshot.updated_at.
|
|
304
|
+
|
|
305
|
+
NOTE: This is a READ OPTIMIZATION. For state recovery or audit,
|
|
306
|
+
replay from the immutable event log instead.
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
entity_id: The entity identifier (UUID as string)
|
|
310
|
+
domain: The domain namespace (e.g., "registration")
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
The latest snapshot if exists, None if no snapshot found
|
|
314
|
+
(entity never existed or was deleted via tombstone).
|
|
315
|
+
|
|
316
|
+
Raises:
|
|
317
|
+
InfraConnectionError: If Kafka/transport is unavailable
|
|
318
|
+
InfraTimeoutError: If read operation times out
|
|
319
|
+
OnexError: For deserialization errors
|
|
320
|
+
|
|
321
|
+
Example:
|
|
322
|
+
```python
|
|
323
|
+
snapshot = await publisher.get_latest_snapshot(
|
|
324
|
+
entity_id=str(node_id),
|
|
325
|
+
domain="registration",
|
|
326
|
+
)
|
|
327
|
+
if snapshot is None:
|
|
328
|
+
# Entity not found - check event log or treat as new
|
|
329
|
+
return None
|
|
330
|
+
|
|
331
|
+
if snapshot.current_state.is_active():
|
|
332
|
+
# Node is registered and active
|
|
333
|
+
return snapshot.capabilities
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Freshness Considerations:
|
|
337
|
+
- Snapshot represents state at snapshot.updated_at
|
|
338
|
+
- Events may have occurred since snapshot was published
|
|
339
|
+
- For real-time accuracy, query projection store directly
|
|
340
|
+
- Snapshots are best for read-heavy, eventually-consistent queries
|
|
341
|
+
"""
|
|
342
|
+
...
|
|
343
|
+
|
|
344
|
+
async def delete_snapshot(
|
|
345
|
+
self,
|
|
346
|
+
entity_id: str,
|
|
347
|
+
domain: str,
|
|
348
|
+
) -> bool:
|
|
349
|
+
"""Publish a tombstone to remove a snapshot.
|
|
350
|
+
|
|
351
|
+
Publishes a null value (tombstone) to the compacted topic for the
|
|
352
|
+
given entity key. After compaction, consumers will no longer see
|
|
353
|
+
this entity's snapshot.
|
|
354
|
+
|
|
355
|
+
Use Case: When an entity is permanently deleted and should no longer
|
|
356
|
+
appear in snapshot queries. Common scenarios:
|
|
357
|
+
- Node deregistration (permanent removal)
|
|
358
|
+
- Entity lifecycle completion
|
|
359
|
+
- Data retention cleanup
|
|
360
|
+
|
|
361
|
+
NOTE: This does NOT delete events from the event log. The event log
|
|
362
|
+
is immutable and retains full history. Tombstones only affect the
|
|
363
|
+
snapshot read path.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
entity_id: The entity identifier (UUID as string)
|
|
367
|
+
domain: The domain namespace (e.g., "registration")
|
|
368
|
+
|
|
369
|
+
Returns:
|
|
370
|
+
True if tombstone was published successfully.
|
|
371
|
+
False if publish failed (caller should retry or handle).
|
|
372
|
+
|
|
373
|
+
Raises:
|
|
374
|
+
InfraConnectionError: If Kafka/transport is unavailable
|
|
375
|
+
InfraTimeoutError: If publish operation times out
|
|
376
|
+
|
|
377
|
+
Example:
|
|
378
|
+
```python
|
|
379
|
+
# Handle node deregistration
|
|
380
|
+
async def handle_node_deregistered(event: NodeDeregisteredEvent):
|
|
381
|
+
# Publish tombstone to remove from snapshot queries
|
|
382
|
+
deleted = await publisher.delete_snapshot(
|
|
383
|
+
entity_id=str(event.node_id),
|
|
384
|
+
domain="registration",
|
|
385
|
+
)
|
|
386
|
+
if not deleted:
|
|
387
|
+
logger.warning(f"Failed to delete snapshot for {event.node_id}")
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Compaction Behavior:
|
|
391
|
+
- Tombstone is published immediately
|
|
392
|
+
- Compaction runs periodically (Kafka config)
|
|
393
|
+
- Until compaction, consumers may still see old snapshot
|
|
394
|
+
- After compaction, key is removed from topic
|
|
395
|
+
"""
|
|
396
|
+
...
|