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,567 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Protocol definition for snapshot storage backends.
|
|
4
|
+
|
|
5
|
+
This module defines the ProtocolSnapshotStore interface for backends that
|
|
6
|
+
provide persistent storage for snapshots. Implementations may use PostgreSQL,
|
|
7
|
+
in-memory stores, or other storage mechanisms.
|
|
8
|
+
|
|
9
|
+
Architecture Context:
|
|
10
|
+
In the ONEX snapshot system:
|
|
11
|
+
- ServiceSnapshot handles business logic (idempotency, sequencing)
|
|
12
|
+
- ProtocolSnapshotStore defines the storage contract
|
|
13
|
+
- Concrete implementations (PostgreSQL, in-memory) provide persistence
|
|
14
|
+
|
|
15
|
+
This separation enables:
|
|
16
|
+
- Testing with in-memory stores
|
|
17
|
+
- Swapping storage backends without changing service logic
|
|
18
|
+
- Clear boundaries for error handling and retry logic
|
|
19
|
+
|
|
20
|
+
Ordering Guarantees:
|
|
21
|
+
Snapshots maintain ordering via sequence_number (not created_at):
|
|
22
|
+
- sequence_number is monotonically increasing per subject
|
|
23
|
+
- get_next_sequence_number provides atomic sequence generation
|
|
24
|
+
- load_latest returns highest sequence_number, not most recent time
|
|
25
|
+
|
|
26
|
+
Idempotency:
|
|
27
|
+
Implementations should handle duplicate saves via content_hash:
|
|
28
|
+
- If a snapshot with matching content_hash exists, return existing ID
|
|
29
|
+
- This enables safe retries without creating duplicates
|
|
30
|
+
|
|
31
|
+
Example Usage:
|
|
32
|
+
```python
|
|
33
|
+
from omnibase_infra.protocols import ProtocolSnapshotStore
|
|
34
|
+
from omnibase_infra.models.snapshot import ModelSnapshot, ModelSubjectRef
|
|
35
|
+
|
|
36
|
+
class PostgresSnapshotStore:
|
|
37
|
+
'''Concrete implementation using PostgreSQL.'''
|
|
38
|
+
|
|
39
|
+
async def save(self, snapshot: ModelSnapshot) -> UUID:
|
|
40
|
+
'''Persist snapshot to PostgreSQL.'''
|
|
41
|
+
# Check for duplicate via content_hash
|
|
42
|
+
existing = await self._find_by_hash(snapshot.content_hash)
|
|
43
|
+
if existing:
|
|
44
|
+
return existing.id
|
|
45
|
+
|
|
46
|
+
# Insert with next sequence number
|
|
47
|
+
return await self._insert(snapshot)
|
|
48
|
+
|
|
49
|
+
async def load(self, snapshot_id: UUID) -> ModelSnapshot | None:
|
|
50
|
+
'''Load snapshot by ID.'''
|
|
51
|
+
row = await self._db.fetchrow(
|
|
52
|
+
"SELECT * FROM snapshots WHERE id = $1",
|
|
53
|
+
snapshot_id,
|
|
54
|
+
)
|
|
55
|
+
return ModelSnapshot.model_validate(row) if row else None
|
|
56
|
+
|
|
57
|
+
# Protocol conformance check via duck typing (per ONEX conventions)
|
|
58
|
+
store = PostgresSnapshotStore()
|
|
59
|
+
assert hasattr(store, 'save') and callable(store.save)
|
|
60
|
+
assert hasattr(store, 'load') and callable(store.load)
|
|
61
|
+
assert hasattr(store, 'load_latest') and callable(store.load_latest)
|
|
62
|
+
assert hasattr(store, 'query') and callable(store.query)
|
|
63
|
+
assert hasattr(store, 'delete') and callable(store.delete)
|
|
64
|
+
assert hasattr(store, 'get_next_sequence_number') and callable(
|
|
65
|
+
store.get_next_sequence_number
|
|
66
|
+
)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Error Handling:
|
|
70
|
+
All methods should raise OnexError subclasses on failure:
|
|
71
|
+
- InfraConnectionError: Database/storage unavailable
|
|
72
|
+
- InfraTimeoutError: Operation timed out
|
|
73
|
+
- ProtocolConfigurationError: Invalid configuration
|
|
74
|
+
|
|
75
|
+
See Also:
|
|
76
|
+
- OMN-1246: ServiceSnapshot implementation
|
|
77
|
+
- omnibase_infra.models.snapshot for model definitions
|
|
78
|
+
- omnibase_infra.services.snapshot for repository logic
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
from __future__ import annotations
|
|
82
|
+
|
|
83
|
+
from datetime import datetime
|
|
84
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
85
|
+
from uuid import UUID
|
|
86
|
+
|
|
87
|
+
if TYPE_CHECKING:
|
|
88
|
+
from omnibase_infra.models.snapshot import ModelSnapshot, ModelSubjectRef
|
|
89
|
+
|
|
90
|
+
__all__ = [
|
|
91
|
+
"ProtocolSnapshotStore",
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@runtime_checkable
|
|
96
|
+
class ProtocolSnapshotStore(Protocol):
|
|
97
|
+
"""Backend persistence protocol for snapshot storage.
|
|
98
|
+
|
|
99
|
+
Implementations provide concrete storage (PostgreSQL, in-memory, etc.)
|
|
100
|
+
while ServiceSnapshot handles business logic.
|
|
101
|
+
|
|
102
|
+
Ordering Guarantees:
|
|
103
|
+
- sequence_number is the canonical ordering field
|
|
104
|
+
- load_latest returns highest sequence_number, not created_at
|
|
105
|
+
- get_next_sequence_number provides atomic sequence generation
|
|
106
|
+
|
|
107
|
+
Idempotency:
|
|
108
|
+
- save() should deduplicate via content_hash if provided
|
|
109
|
+
- Return existing ID when duplicate detected
|
|
110
|
+
|
|
111
|
+
Concurrency Safety:
|
|
112
|
+
Implementations must be coroutine-safe for concurrent async operations.
|
|
113
|
+
Multiple coroutines may invoke methods concurrently. Use asyncio.Lock
|
|
114
|
+
for shared mutable state (coroutine-safe, not thread-safe).
|
|
115
|
+
|
|
116
|
+
Error Handling:
|
|
117
|
+
All methods should raise OnexError subclasses on failure:
|
|
118
|
+
- InfraConnectionError: Storage unavailable
|
|
119
|
+
- InfraTimeoutError: Operation timed out
|
|
120
|
+
- ProtocolConfigurationError: Invalid configuration
|
|
121
|
+
|
|
122
|
+
Example Implementation:
|
|
123
|
+
```python
|
|
124
|
+
class InMemorySnapshotStore:
|
|
125
|
+
def __init__(self) -> None:
|
|
126
|
+
self._snapshots: dict[UUID, ModelSnapshot] = {}
|
|
127
|
+
self._sequences: dict[str, int] = {}
|
|
128
|
+
self._lock = asyncio.Lock()
|
|
129
|
+
|
|
130
|
+
async def save(self, snapshot: ModelSnapshot) -> UUID:
|
|
131
|
+
async with self._lock:
|
|
132
|
+
# Check for duplicate via content_hash
|
|
133
|
+
for existing in self._snapshots.values():
|
|
134
|
+
if existing.content_hash == snapshot.content_hash:
|
|
135
|
+
return existing.id
|
|
136
|
+
self._snapshots[snapshot.id] = snapshot
|
|
137
|
+
return snapshot.id
|
|
138
|
+
|
|
139
|
+
async def load(self, snapshot_id: UUID) -> ModelSnapshot | None:
|
|
140
|
+
return self._snapshots.get(snapshot_id)
|
|
141
|
+
|
|
142
|
+
async def get_next_sequence_number(
|
|
143
|
+
self, subject: ModelSubjectRef
|
|
144
|
+
) -> int:
|
|
145
|
+
async with self._lock:
|
|
146
|
+
key = f"{subject.subject_type}:{subject.subject_id}"
|
|
147
|
+
seq = self._sequences.get(key, 0) + 1
|
|
148
|
+
self._sequences[key] = seq
|
|
149
|
+
return seq
|
|
150
|
+
```
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
async def save(self, snapshot: ModelSnapshot) -> UUID:
|
|
154
|
+
"""Persist a snapshot. Returns snapshot ID.
|
|
155
|
+
|
|
156
|
+
Implementations should:
|
|
157
|
+
- Handle idempotency via content_hash if provided
|
|
158
|
+
- Enforce sequence_number ordering per subject
|
|
159
|
+
- Return existing ID if duplicate detected
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
snapshot: The snapshot to persist. Must have a valid ID.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
The snapshot ID (either newly saved or existing duplicate).
|
|
166
|
+
|
|
167
|
+
Raises:
|
|
168
|
+
InfraConnectionError: If storage is unavailable
|
|
169
|
+
InfraTimeoutError: If operation times out
|
|
170
|
+
OnexError: For configuration or serialization errors
|
|
171
|
+
|
|
172
|
+
Example:
|
|
173
|
+
```python
|
|
174
|
+
from uuid import uuid4, UUID
|
|
175
|
+
|
|
176
|
+
# subject_id must be a UUID (not str)
|
|
177
|
+
node_id: UUID = uuid4()
|
|
178
|
+
state_dict: dict = {"status": "active", "version": "1.0.0"}
|
|
179
|
+
|
|
180
|
+
snapshot = ModelSnapshot(
|
|
181
|
+
id=uuid4(),
|
|
182
|
+
subject=ModelSubjectRef(
|
|
183
|
+
subject_type="node_registration",
|
|
184
|
+
subject_id=node_id, # Must be UUID, not str
|
|
185
|
+
),
|
|
186
|
+
data=state_dict,
|
|
187
|
+
sequence_number=42,
|
|
188
|
+
# content_hash is computed automatically from data
|
|
189
|
+
)
|
|
190
|
+
saved_id = await store.save(snapshot)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Implementation Notes:
|
|
194
|
+
- Check content_hash for duplicates before insert
|
|
195
|
+
- Use database constraints for sequence ordering
|
|
196
|
+
- Include correlation_id in logs for tracing
|
|
197
|
+
"""
|
|
198
|
+
...
|
|
199
|
+
|
|
200
|
+
async def load(self, snapshot_id: UUID) -> ModelSnapshot | None:
|
|
201
|
+
"""Load a snapshot by ID. Returns None if not found.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
snapshot_id: The unique identifier of the snapshot.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
The snapshot if found, None otherwise.
|
|
208
|
+
|
|
209
|
+
Raises:
|
|
210
|
+
InfraConnectionError: If storage is unavailable
|
|
211
|
+
InfraTimeoutError: If operation times out
|
|
212
|
+
|
|
213
|
+
Example:
|
|
214
|
+
```python
|
|
215
|
+
snapshot = await store.load(snapshot_id)
|
|
216
|
+
if snapshot is None:
|
|
217
|
+
logger.warning(f"Snapshot {snapshot_id} not found")
|
|
218
|
+
return None
|
|
219
|
+
return snapshot.data
|
|
220
|
+
```
|
|
221
|
+
"""
|
|
222
|
+
...
|
|
223
|
+
|
|
224
|
+
async def load_many(self, snapshot_ids: list[UUID]) -> dict[UUID, ModelSnapshot]:
|
|
225
|
+
"""Load multiple snapshots by ID in a single query.
|
|
226
|
+
|
|
227
|
+
Uses batch loading for efficient multi-row fetch, avoiding N+1
|
|
228
|
+
query patterns when loading multiple snapshots.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
snapshot_ids: List of snapshot UUIDs to load.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Dictionary mapping snapshot ID to ModelSnapshot for found
|
|
235
|
+
snapshots. Missing IDs are not included in the result.
|
|
236
|
+
|
|
237
|
+
Raises:
|
|
238
|
+
InfraConnectionError: If storage is unavailable
|
|
239
|
+
InfraTimeoutError: If operation times out
|
|
240
|
+
|
|
241
|
+
Example:
|
|
242
|
+
```python
|
|
243
|
+
snapshots = await store.load_many([id1, id2, id3])
|
|
244
|
+
for sid, snap in snapshots.items():
|
|
245
|
+
print(f"{sid}: seq={snap.sequence_number}")
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Implementation Notes:
|
|
249
|
+
- Use batch query (e.g., WHERE id = ANY($1))
|
|
250
|
+
- Avoid N separate queries
|
|
251
|
+
- Return dict for O(1) lookup by ID
|
|
252
|
+
"""
|
|
253
|
+
...
|
|
254
|
+
|
|
255
|
+
async def load_latest(
|
|
256
|
+
self,
|
|
257
|
+
subject: ModelSubjectRef | None = None,
|
|
258
|
+
) -> ModelSnapshot | None:
|
|
259
|
+
"""Load most recent snapshot, optionally filtered by subject.
|
|
260
|
+
|
|
261
|
+
"Most recent" is determined by sequence_number (not created_at).
|
|
262
|
+
This ensures consistent ordering even with clock skew.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
subject: Optional filter by subject reference.
|
|
266
|
+
|
|
267
|
+
- If provided: Returns the latest snapshot for that specific
|
|
268
|
+
subject (highest sequence_number within that subject).
|
|
269
|
+
- If None: Returns the globally latest snapshot across ALL
|
|
270
|
+
subjects (highest sequence_number in the entire store).
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
The most recent snapshot matching criteria, or None if no
|
|
274
|
+
snapshots exist.
|
|
275
|
+
|
|
276
|
+
Raises:
|
|
277
|
+
InfraConnectionError: If storage is unavailable
|
|
278
|
+
InfraTimeoutError: If operation times out
|
|
279
|
+
|
|
280
|
+
Note:
|
|
281
|
+
When ``subject=None``, "globally latest" means the snapshot with
|
|
282
|
+
the highest sequence_number across all subjects. Since sequence
|
|
283
|
+
numbers are per-subject (each subject starts at 1), this may NOT
|
|
284
|
+
correspond to the most recently created snapshot by wall-clock
|
|
285
|
+
time. Use ``query(after=timestamp)`` if you need time-based
|
|
286
|
+
ordering across subjects.
|
|
287
|
+
|
|
288
|
+
Warning:
|
|
289
|
+
The ``subject=None`` behavior returns a snapshot based on
|
|
290
|
+
sequence_number comparison across different subjects. This is
|
|
291
|
+
useful for "get any recent snapshot" scenarios but NOT for
|
|
292
|
+
"get the most recently saved snapshot" which requires time-based
|
|
293
|
+
queries. Example of potentially surprising behavior:
|
|
294
|
+
|
|
295
|
+
- Subject A has snapshots with sequence_number 1, 2, 3
|
|
296
|
+
- Subject B has a single snapshot with sequence_number 1
|
|
297
|
+
- Subject B's snapshot was saved 1 minute ago
|
|
298
|
+
- Subject A's latest (seq=3) was saved 1 hour ago
|
|
299
|
+
- ``load_latest(subject=None)`` returns Subject A's snapshot (seq=3)
|
|
300
|
+
- To get Subject B's snapshot (most recent by time), use:
|
|
301
|
+
``query(after=one_minute_ago, limit=1)``
|
|
302
|
+
|
|
303
|
+
Examples:
|
|
304
|
+
```python
|
|
305
|
+
from uuid import uuid4, UUID
|
|
306
|
+
from datetime import datetime, timedelta, UTC
|
|
307
|
+
|
|
308
|
+
# Get latest snapshot for a specific node
|
|
309
|
+
node_id: UUID = uuid4() # subject_id must be UUID, not str
|
|
310
|
+
subject = ModelSubjectRef(
|
|
311
|
+
subject_type="node_registration",
|
|
312
|
+
subject_id=node_id, # Must be UUID, not str
|
|
313
|
+
)
|
|
314
|
+
latest = await store.load_latest(subject=subject)
|
|
315
|
+
# Returns snapshot with highest sequence_number for this subject
|
|
316
|
+
|
|
317
|
+
# Get globally latest snapshot across ALL subjects
|
|
318
|
+
global_latest = await store.load_latest(subject=None)
|
|
319
|
+
# Returns snapshot with highest sequence_number in entire store
|
|
320
|
+
# Note: This is NOT necessarily the most recent by created_at
|
|
321
|
+
# because sequence_number is per-subject (each subject starts at 1)
|
|
322
|
+
|
|
323
|
+
# Alternative: Get most recent by wall-clock time
|
|
324
|
+
one_second_ago = datetime.now(UTC) - timedelta(seconds=1)
|
|
325
|
+
recent = await store.query(after=one_second_ago, limit=1)
|
|
326
|
+
time_based_latest = recent[0] if recent else None
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Implementation Notes:
|
|
330
|
+
- Order by sequence_number DESC, not created_at
|
|
331
|
+
- Use index on (subject_type, subject_id, sequence_number)
|
|
332
|
+
- LIMIT 1 for efficiency
|
|
333
|
+
"""
|
|
334
|
+
...
|
|
335
|
+
|
|
336
|
+
async def load_latest_many(
|
|
337
|
+
self,
|
|
338
|
+
subjects: list[ModelSubjectRef],
|
|
339
|
+
) -> dict[tuple[str, UUID], ModelSnapshot]:
|
|
340
|
+
"""Load the latest snapshot for multiple subjects in a single query.
|
|
341
|
+
|
|
342
|
+
Uses batch loading to efficiently fetch the latest snapshot per
|
|
343
|
+
subject in one database round-trip, avoiding N+1 query patterns.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
subjects: List of subject references to load latest snapshots for.
|
|
347
|
+
|
|
348
|
+
Returns:
|
|
349
|
+
Dictionary mapping (subject_type, subject_id) tuple to the latest
|
|
350
|
+
ModelSnapshot for that subject. Subjects with no snapshots are
|
|
351
|
+
not included in the result.
|
|
352
|
+
|
|
353
|
+
Raises:
|
|
354
|
+
InfraConnectionError: If storage is unavailable
|
|
355
|
+
InfraTimeoutError: If operation times out
|
|
356
|
+
|
|
357
|
+
Example:
|
|
358
|
+
```python
|
|
359
|
+
subjects = [
|
|
360
|
+
ModelSubjectRef(subject_type="agent", subject_id=agent_id),
|
|
361
|
+
ModelSubjectRef(subject_type="workflow", subject_id=wf_id),
|
|
362
|
+
]
|
|
363
|
+
latest = await store.load_latest_many(subjects)
|
|
364
|
+
for (stype, sid), snap in latest.items():
|
|
365
|
+
print(f"{stype}/{sid}: seq={snap.sequence_number}")
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Implementation Notes:
|
|
369
|
+
- Use window function to get latest per subject in one query
|
|
370
|
+
- Avoid N separate queries
|
|
371
|
+
- Return dict keyed by (subject_type, subject_id) tuple
|
|
372
|
+
"""
|
|
373
|
+
...
|
|
374
|
+
|
|
375
|
+
async def query(
|
|
376
|
+
self,
|
|
377
|
+
subject: ModelSubjectRef | None = None,
|
|
378
|
+
limit: int = 50,
|
|
379
|
+
after: datetime | None = None,
|
|
380
|
+
) -> list[ModelSnapshot]:
|
|
381
|
+
"""Query snapshots with optional filtering.
|
|
382
|
+
|
|
383
|
+
Returns snapshots ordered by sequence_number descending (most
|
|
384
|
+
recent first).
|
|
385
|
+
|
|
386
|
+
Args:
|
|
387
|
+
subject: Optional filter by subject reference.
|
|
388
|
+
limit: Maximum results to return (default 50).
|
|
389
|
+
after: Only return snapshots created after this time.
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
List of snapshots ordered by sequence_number descending.
|
|
393
|
+
Empty list if no snapshots match criteria.
|
|
394
|
+
|
|
395
|
+
Raises:
|
|
396
|
+
InfraConnectionError: If storage is unavailable
|
|
397
|
+
InfraTimeoutError: If operation times out
|
|
398
|
+
|
|
399
|
+
Example:
|
|
400
|
+
```python
|
|
401
|
+
from uuid import uuid4, UUID
|
|
402
|
+
from datetime import datetime, timedelta, UTC
|
|
403
|
+
|
|
404
|
+
# Get last 10 snapshots for a subject
|
|
405
|
+
node_id: UUID = uuid4() # subject_id must be UUID, not str
|
|
406
|
+
subject = ModelSubjectRef(
|
|
407
|
+
subject_type="node_registration",
|
|
408
|
+
subject_id=node_id, # Must be UUID, not str
|
|
409
|
+
)
|
|
410
|
+
snapshots = await store.query(subject=subject, limit=10)
|
|
411
|
+
|
|
412
|
+
# Get snapshots created in the last hour
|
|
413
|
+
one_hour_ago = datetime.now(UTC) - timedelta(hours=1)
|
|
414
|
+
recent = await store.query(after=one_hour_ago, limit=100)
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Implementation Notes:
|
|
418
|
+
- Always order by sequence_number DESC
|
|
419
|
+
- Apply subject filter before limit
|
|
420
|
+
- Use pagination for large result sets
|
|
421
|
+
"""
|
|
422
|
+
...
|
|
423
|
+
|
|
424
|
+
async def delete(self, snapshot_id: UUID) -> bool:
|
|
425
|
+
"""Delete a snapshot by ID. Returns True if deleted, False if not found.
|
|
426
|
+
|
|
427
|
+
Use Case: Clean up old snapshots for data retention or when a
|
|
428
|
+
snapshot is superseded and no longer needed.
|
|
429
|
+
|
|
430
|
+
Args:
|
|
431
|
+
snapshot_id: The unique identifier of the snapshot to delete.
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
True if the snapshot was deleted, False if not found.
|
|
435
|
+
|
|
436
|
+
Raises:
|
|
437
|
+
InfraConnectionError: If storage is unavailable
|
|
438
|
+
InfraTimeoutError: If operation times out
|
|
439
|
+
|
|
440
|
+
Example:
|
|
441
|
+
```python
|
|
442
|
+
deleted = await store.delete(old_snapshot_id)
|
|
443
|
+
if deleted:
|
|
444
|
+
logger.info(f"Deleted snapshot {old_snapshot_id}")
|
|
445
|
+
else:
|
|
446
|
+
logger.warning(f"Snapshot {old_snapshot_id} not found")
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Implementation Notes:
|
|
450
|
+
- Use soft delete if audit trail is required
|
|
451
|
+
- Consider cascade behavior for related data
|
|
452
|
+
- Include correlation_id in logs for tracing
|
|
453
|
+
"""
|
|
454
|
+
...
|
|
455
|
+
|
|
456
|
+
async def get_next_sequence_number(self, subject: ModelSubjectRef) -> int:
|
|
457
|
+
"""Get the next sequence number for a subject.
|
|
458
|
+
|
|
459
|
+
Used to maintain ordering guarantees. Sequence numbers are
|
|
460
|
+
monotonically increasing per subject.
|
|
461
|
+
|
|
462
|
+
Args:
|
|
463
|
+
subject: The subject reference for which to get the next
|
|
464
|
+
sequence number.
|
|
465
|
+
|
|
466
|
+
Returns:
|
|
467
|
+
The next sequence number (starts at 1 for new subjects).
|
|
468
|
+
|
|
469
|
+
Raises:
|
|
470
|
+
InfraConnectionError: If storage is unavailable
|
|
471
|
+
InfraTimeoutError: If operation times out
|
|
472
|
+
|
|
473
|
+
Example:
|
|
474
|
+
```python
|
|
475
|
+
from uuid import uuid4, UUID
|
|
476
|
+
|
|
477
|
+
node_id: UUID = uuid4() # subject_id must be UUID, not str
|
|
478
|
+
subject = ModelSubjectRef(
|
|
479
|
+
subject_type="node_registration",
|
|
480
|
+
subject_id=node_id, # Must be UUID, not str
|
|
481
|
+
)
|
|
482
|
+
seq = await store.get_next_sequence_number(subject)
|
|
483
|
+
# seq is guaranteed to be greater than any existing
|
|
484
|
+
# sequence_number for this subject
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Implementation Notes:
|
|
488
|
+
- Must be atomic (no gaps, no duplicates)
|
|
489
|
+
- Use database sequences or SELECT MAX + 1 with locking
|
|
490
|
+
- Consider high-concurrency scenarios
|
|
491
|
+
"""
|
|
492
|
+
...
|
|
493
|
+
|
|
494
|
+
async def cleanup_expired(
|
|
495
|
+
self,
|
|
496
|
+
*,
|
|
497
|
+
max_age_seconds: int | None = None,
|
|
498
|
+
keep_latest_n: int | None = None,
|
|
499
|
+
subject: ModelSubjectRef | None = None,
|
|
500
|
+
) -> int:
|
|
501
|
+
"""Remove expired snapshots based on retention policy.
|
|
502
|
+
|
|
503
|
+
Supports multiple retention strategies that can be combined:
|
|
504
|
+
- Time-based: Delete snapshots older than max_age_seconds
|
|
505
|
+
- Count-based: Keep only the N most recent per subject
|
|
506
|
+
- Subject-scoped: Apply policy only to a specific subject
|
|
507
|
+
|
|
508
|
+
When both max_age_seconds and keep_latest_n are provided, snapshots
|
|
509
|
+
must satisfy BOTH conditions to be deleted (i.e., be older than
|
|
510
|
+
max_age AND not in the latest N).
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
max_age_seconds: Delete snapshots with created_at older than
|
|
514
|
+
this many seconds ago. If None, no age-based filtering.
|
|
515
|
+
keep_latest_n: Always retain the N most recent snapshots per
|
|
516
|
+
subject (by sequence_number). If None, no count-based
|
|
517
|
+
retention. Must be >= 1 if provided.
|
|
518
|
+
subject: If provided, apply cleanup only to this subject.
|
|
519
|
+
If None, apply cleanup globally across all subjects.
|
|
520
|
+
|
|
521
|
+
Returns:
|
|
522
|
+
Number of snapshots deleted.
|
|
523
|
+
|
|
524
|
+
Raises:
|
|
525
|
+
InfraConnectionError: If storage is unavailable
|
|
526
|
+
InfraTimeoutError: If operation times out
|
|
527
|
+
ProtocolConfigurationError: If keep_latest_n is provided but < 1
|
|
528
|
+
|
|
529
|
+
Example:
|
|
530
|
+
```python
|
|
531
|
+
# Delete snapshots older than 30 days
|
|
532
|
+
deleted = await store.cleanup_expired(
|
|
533
|
+
max_age_seconds=30 * 24 * 60 * 60,
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
# Keep only last 10 snapshots per subject
|
|
537
|
+
deleted = await store.cleanup_expired(
|
|
538
|
+
keep_latest_n=10,
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
# Combined: Delete if older than 7 days AND not in latest 5
|
|
542
|
+
deleted = await store.cleanup_expired(
|
|
543
|
+
max_age_seconds=7 * 24 * 60 * 60,
|
|
544
|
+
keep_latest_n=5,
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
# Cleanup only for a specific subject
|
|
548
|
+
from uuid import uuid4, UUID
|
|
549
|
+
agent_id: UUID = uuid4() # subject_id must be UUID, not str
|
|
550
|
+
subject = ModelSubjectRef(
|
|
551
|
+
subject_type="agent",
|
|
552
|
+
subject_id=agent_id, # Must be UUID, not str
|
|
553
|
+
)
|
|
554
|
+
deleted = await store.cleanup_expired(
|
|
555
|
+
max_age_seconds=60 * 60, # 1 hour
|
|
556
|
+
subject=subject,
|
|
557
|
+
)
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
Implementation Notes:
|
|
561
|
+
- At least one of max_age_seconds or keep_latest_n should be provided
|
|
562
|
+
- If neither is provided, return 0 (no-op)
|
|
563
|
+
- For keep_latest_n, order by sequence_number (not created_at)
|
|
564
|
+
- Use batch deletes for efficiency in large datasets
|
|
565
|
+
- Consider adding index on created_at for time-based queries
|
|
566
|
+
"""
|
|
567
|
+
...
|