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,213 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry for Vault payload types with decorator-based registration.
|
|
4
|
+
|
|
5
|
+
This module provides:
|
|
6
|
+
- RegistryPayloadVault: Decorator-based registry for payload type discovery
|
|
7
|
+
|
|
8
|
+
Design Pattern:
|
|
9
|
+
Instead of maintaining explicit union types like:
|
|
10
|
+
VaultPayload = ModelVaultSecretPayload | ModelVaultWritePayload | ...
|
|
11
|
+
|
|
12
|
+
Payload models self-register via decorator:
|
|
13
|
+
@RegistryPayloadVault.register("read_secret")
|
|
14
|
+
class ModelVaultSecretPayload(ModelPayloadVault): ...
|
|
15
|
+
|
|
16
|
+
The registry resolves types dynamically during Pydantic validation,
|
|
17
|
+
enabling new payload types to be added without modifying existing code.
|
|
18
|
+
|
|
19
|
+
Related:
|
|
20
|
+
- ModelPayloadVault: Base model for Vault payloads
|
|
21
|
+
- EnumVaultOperationType: Operation type enum for discriminator
|
|
22
|
+
- OMN-1007: Union reduction refactoring
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import threading
|
|
28
|
+
import warnings
|
|
29
|
+
from collections.abc import Callable
|
|
30
|
+
from typing import TYPE_CHECKING, ClassVar, TypeVar
|
|
31
|
+
|
|
32
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
33
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from omnibase_infra.handlers.models.vault.model_payload_vault import (
|
|
37
|
+
ModelPayloadVault,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# TypeVar bound to ModelPayloadVault to preserve subclass type through decorator
|
|
41
|
+
_VaultPayloadT = TypeVar("_VaultPayloadT", bound="ModelPayloadVault")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class RegistryPayloadVault:
|
|
45
|
+
"""Registry for Vault payload model types with decorator-based registration.
|
|
46
|
+
|
|
47
|
+
This registry enables dynamic type resolution for Pydantic validation
|
|
48
|
+
without requiring explicit union type definitions.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
@RegistryPayloadVault.register("read_secret")
|
|
52
|
+
class ModelVaultSecretPayload(ModelPayloadVault):
|
|
53
|
+
operation_type: Literal[EnumVaultOperationType.READ_SECRET]
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
# Later, resolve type from operation_type
|
|
57
|
+
payload_cls = RegistryPayloadVault.get_type("read_secret")
|
|
58
|
+
payload = payload_cls.model_validate(data)
|
|
59
|
+
|
|
60
|
+
Thread Safety:
|
|
61
|
+
All registration and mutation operations are protected by a class-level
|
|
62
|
+
threading.Lock to ensure thread-safe access. Read operations (get_type,
|
|
63
|
+
get_all_types, is_registered) are atomic dictionary operations and safe
|
|
64
|
+
for concurrent access. The lock ensures that check-and-set operations
|
|
65
|
+
in register() are atomic, preventing race conditions.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
_types: ClassVar[dict[str, type[ModelPayloadVault]]] = {}
|
|
69
|
+
_lock: ClassVar[threading.Lock] = threading.Lock()
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def register(
|
|
73
|
+
cls, operation_type: str
|
|
74
|
+
) -> Callable[[type[_VaultPayloadT]], type[_VaultPayloadT]]:
|
|
75
|
+
"""Decorator to register a Vault payload model type.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
operation_type: The Vault operation type identifier (e.g., "read_secret").
|
|
79
|
+
Must match the model's `operation_type` field value.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Decorator function that registers the class and returns it unchanged.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
ValueError: If operation_type is already registered (prevents duplicates).
|
|
86
|
+
TypeError: If payload_cls is not a subclass of ModelPayloadVault.
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
@RegistryPayloadVault.register("read_secret")
|
|
90
|
+
class ModelVaultSecretPayload(ModelPayloadVault):
|
|
91
|
+
operation_type: Literal[EnumVaultOperationType.READ_SECRET]
|
|
92
|
+
path: str
|
|
93
|
+
...
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
def decorator(
|
|
97
|
+
payload_cls: type[_VaultPayloadT],
|
|
98
|
+
) -> type[_VaultPayloadT]:
|
|
99
|
+
# Runtime type validation (outside lock - class inspection is read-only)
|
|
100
|
+
from omnibase_infra.handlers.models.vault.model_payload_vault import (
|
|
101
|
+
ModelPayloadVault,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
if not issubclass(payload_cls, ModelPayloadVault):
|
|
105
|
+
context = ModelInfraErrorContext(
|
|
106
|
+
transport_type=EnumInfraTransportType.VAULT,
|
|
107
|
+
operation="register_payload_type",
|
|
108
|
+
)
|
|
109
|
+
raise ProtocolConfigurationError(
|
|
110
|
+
f"Registered class {payload_cls.__name__!r} must be a subclass "
|
|
111
|
+
f"of ModelPayloadVault, got {payload_cls.__mro__}",
|
|
112
|
+
context=context,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Thread-safe registration with atomic check-and-set
|
|
116
|
+
with cls._lock:
|
|
117
|
+
if operation_type in cls._types:
|
|
118
|
+
context = ModelInfraErrorContext(
|
|
119
|
+
transport_type=EnumInfraTransportType.VAULT,
|
|
120
|
+
operation="register_payload_type",
|
|
121
|
+
)
|
|
122
|
+
raise ProtocolConfigurationError(
|
|
123
|
+
f"Vault payload operation_type '{operation_type}' already registered "
|
|
124
|
+
f"to {cls._types[operation_type].__name__}. "
|
|
125
|
+
f"Cannot register {payload_cls.__name__}.",
|
|
126
|
+
context=context,
|
|
127
|
+
)
|
|
128
|
+
cls._types[operation_type] = payload_cls
|
|
129
|
+
return payload_cls
|
|
130
|
+
|
|
131
|
+
return decorator
|
|
132
|
+
|
|
133
|
+
@classmethod
|
|
134
|
+
def get_type(cls, operation_type: str) -> type[ModelPayloadVault]:
|
|
135
|
+
"""Get the payload model class for a given operation type.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
operation_type: The Vault operation type identifier.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
The registered payload model class.
|
|
142
|
+
|
|
143
|
+
Raises:
|
|
144
|
+
KeyError: If operation_type is not registered.
|
|
145
|
+
|
|
146
|
+
Example:
|
|
147
|
+
payload_cls = RegistryPayloadVault.get_type("read_secret")
|
|
148
|
+
payload = payload_cls.model_validate({"operation_type": "read_secret", ...})
|
|
149
|
+
"""
|
|
150
|
+
if operation_type not in cls._types:
|
|
151
|
+
registered = ", ".join(sorted(cls._types.keys())) or "(none)"
|
|
152
|
+
raise KeyError(
|
|
153
|
+
f"Unknown Vault operation_type '{operation_type}'. "
|
|
154
|
+
f"Registered types: {registered}"
|
|
155
|
+
)
|
|
156
|
+
return cls._types[operation_type]
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def get_all_types(cls) -> dict[str, type[ModelPayloadVault]]:
|
|
160
|
+
"""Get all registered Vault payload types.
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
Dict mapping operation_type strings to payload model classes.
|
|
164
|
+
|
|
165
|
+
Example:
|
|
166
|
+
all_types = RegistryPayloadVault.get_all_types()
|
|
167
|
+
for op_type, payload_cls in all_types.items():
|
|
168
|
+
print(f"{op_type}: {payload_cls.__name__}")
|
|
169
|
+
"""
|
|
170
|
+
return dict(cls._types)
|
|
171
|
+
|
|
172
|
+
@classmethod
|
|
173
|
+
def is_registered(cls, operation_type: str) -> bool:
|
|
174
|
+
"""Check if an operation type is registered.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
operation_type: The Vault operation type identifier.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
True if registered, False otherwise.
|
|
181
|
+
|
|
182
|
+
Example:
|
|
183
|
+
if RegistryPayloadVault.is_registered("read_secret"):
|
|
184
|
+
payload_cls = RegistryPayloadVault.get_type("read_secret")
|
|
185
|
+
"""
|
|
186
|
+
return operation_type in cls._types
|
|
187
|
+
|
|
188
|
+
@classmethod
|
|
189
|
+
def clear(cls) -> None:
|
|
190
|
+
"""Clear all registered types.
|
|
191
|
+
|
|
192
|
+
Warning:
|
|
193
|
+
This method is intended for **testing purposes only**.
|
|
194
|
+
Calling it in production code will emit a warning.
|
|
195
|
+
It breaks the immutability guarantee after startup.
|
|
196
|
+
|
|
197
|
+
Thread Safety:
|
|
198
|
+
This method is protected by the class-level lock to ensure
|
|
199
|
+
thread-safe clearing of the registry.
|
|
200
|
+
"""
|
|
201
|
+
warnings.warn(
|
|
202
|
+
"RegistryPayloadVault.clear() is intended for testing only. "
|
|
203
|
+
"Do not use in production code.",
|
|
204
|
+
UserWarning,
|
|
205
|
+
stacklevel=2,
|
|
206
|
+
)
|
|
207
|
+
with cls._lock:
|
|
208
|
+
cls._types.clear()
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
__all__ = [
|
|
212
|
+
"RegistryPayloadVault", # Vault payload registry
|
|
213
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration Storage Handlers Module.
|
|
4
|
+
|
|
5
|
+
This module provides pluggable handler implementations for registration
|
|
6
|
+
storage operations, supporting the capability-oriented node architecture.
|
|
7
|
+
|
|
8
|
+
Handlers:
|
|
9
|
+
- HandlerRegistrationStoragePostgres: PostgreSQL-backed storage
|
|
10
|
+
- HandlerRegistrationStorageMock: In-memory mock for testing
|
|
11
|
+
|
|
12
|
+
Models (from omnibase_infra.nodes.node_registration_storage_effect.models):
|
|
13
|
+
- ModelRegistrationRecord: Registration record model
|
|
14
|
+
- ModelUpsertResult: Upsert operation result
|
|
15
|
+
- ModelStorageResult: Storage query result
|
|
16
|
+
|
|
17
|
+
Protocols:
|
|
18
|
+
- ProtocolRegistrationPersistence: Registration persistence protocol definition
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from omnibase_infra.handlers.registration_storage.handler_registration_storage_mock import (
|
|
22
|
+
HandlerRegistrationStorageMock,
|
|
23
|
+
)
|
|
24
|
+
from omnibase_infra.handlers.registration_storage.handler_registration_storage_postgres import (
|
|
25
|
+
HandlerRegistrationStoragePostgres,
|
|
26
|
+
)
|
|
27
|
+
from omnibase_infra.handlers.registration_storage.protocol_registration_persistence import (
|
|
28
|
+
ProtocolRegistrationPersistence,
|
|
29
|
+
)
|
|
30
|
+
from omnibase_infra.nodes.node_registration_storage_effect.models import (
|
|
31
|
+
ModelRegistrationRecord,
|
|
32
|
+
ModelStorageResult,
|
|
33
|
+
ModelUpsertResult,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
__all__: list[str] = [
|
|
37
|
+
"HandlerRegistrationStorageMock",
|
|
38
|
+
"HandlerRegistrationStoragePostgres",
|
|
39
|
+
"ModelRegistrationRecord",
|
|
40
|
+
"ModelStorageResult",
|
|
41
|
+
"ModelUpsertResult",
|
|
42
|
+
"ProtocolRegistrationPersistence",
|
|
43
|
+
]
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Mock Registration Storage Handler.
|
|
4
|
+
|
|
5
|
+
This module provides an in-memory mock implementation of the registration
|
|
6
|
+
storage handler protocol for testing purposes.
|
|
7
|
+
|
|
8
|
+
Thread Safety:
|
|
9
|
+
This handler uses asyncio.Lock for coroutine-safe access to the
|
|
10
|
+
in-memory record store.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import logging
|
|
17
|
+
import time
|
|
18
|
+
from datetime import UTC, datetime
|
|
19
|
+
from uuid import UUID, uuid4
|
|
20
|
+
|
|
21
|
+
from omnibase_infra.handlers.registration_storage.models import (
|
|
22
|
+
ModelDeleteRegistrationRequest,
|
|
23
|
+
ModelUpdateRegistrationRequest,
|
|
24
|
+
)
|
|
25
|
+
from omnibase_infra.nodes.node_registration_storage_effect.models import (
|
|
26
|
+
ModelDeleteResult,
|
|
27
|
+
ModelRegistrationRecord,
|
|
28
|
+
ModelStorageHealthCheckDetails,
|
|
29
|
+
ModelStorageHealthCheckResult,
|
|
30
|
+
ModelStorageQuery,
|
|
31
|
+
ModelStorageResult,
|
|
32
|
+
ModelUpsertResult,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class HandlerRegistrationStorageMock:
|
|
39
|
+
"""In-memory mock for testing registration storage.
|
|
40
|
+
|
|
41
|
+
Provides a simple in-memory implementation of the registration storage
|
|
42
|
+
protocol for unit and integration testing.
|
|
43
|
+
|
|
44
|
+
Thread Safety:
|
|
45
|
+
This handler is coroutine-safe. All operations on the internal
|
|
46
|
+
record store are protected by asyncio.Lock.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
handler_type: Returns "mock" identifier.
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
>>> handler = HandlerRegistrationStorageMock()
|
|
53
|
+
>>> result = await handler.store_registration(record)
|
|
54
|
+
>>> assert result.success
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(self) -> None:
|
|
58
|
+
"""Initialize HandlerRegistrationStorageMock with empty record store."""
|
|
59
|
+
self._records: dict[UUID, ModelRegistrationRecord] = {}
|
|
60
|
+
self._lock = asyncio.Lock()
|
|
61
|
+
|
|
62
|
+
logger.debug("HandlerRegistrationStorageMock initialized")
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def handler_type(self) -> str:
|
|
66
|
+
"""Return the handler type identifier.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
"mock" identifier string.
|
|
70
|
+
"""
|
|
71
|
+
return "mock"
|
|
72
|
+
|
|
73
|
+
async def store_registration(
|
|
74
|
+
self,
|
|
75
|
+
record: ModelRegistrationRecord,
|
|
76
|
+
correlation_id: UUID | None = None,
|
|
77
|
+
) -> ModelUpsertResult:
|
|
78
|
+
"""Store a registration record in the mock store.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
record: Registration record to store.
|
|
82
|
+
correlation_id: Optional correlation ID for tracing.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
ModelUpsertResult with upsert outcome.
|
|
86
|
+
"""
|
|
87
|
+
correlation_id = correlation_id or uuid4()
|
|
88
|
+
start_time = time.monotonic()
|
|
89
|
+
|
|
90
|
+
async with self._lock:
|
|
91
|
+
was_insert = record.node_id not in self._records
|
|
92
|
+
now = datetime.now(UTC)
|
|
93
|
+
|
|
94
|
+
# Update timestamps
|
|
95
|
+
updated_record = ModelRegistrationRecord(
|
|
96
|
+
node_id=record.node_id,
|
|
97
|
+
node_type=record.node_type,
|
|
98
|
+
node_version=record.node_version,
|
|
99
|
+
capabilities=record.capabilities,
|
|
100
|
+
endpoints=record.endpoints,
|
|
101
|
+
metadata=record.metadata,
|
|
102
|
+
created_at=record.created_at or now,
|
|
103
|
+
updated_at=now,
|
|
104
|
+
correlation_id=correlation_id,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
self._records[record.node_id] = updated_record
|
|
108
|
+
|
|
109
|
+
duration_ms = (time.monotonic() - start_time) * 1000
|
|
110
|
+
|
|
111
|
+
logger.debug(
|
|
112
|
+
"Mock registration stored",
|
|
113
|
+
extra={
|
|
114
|
+
"node_id": str(record.node_id),
|
|
115
|
+
"was_insert": was_insert,
|
|
116
|
+
"correlation_id": str(correlation_id),
|
|
117
|
+
},
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return ModelUpsertResult(
|
|
121
|
+
success=True,
|
|
122
|
+
node_id=record.node_id,
|
|
123
|
+
operation="insert" if was_insert else "update",
|
|
124
|
+
duration_ms=duration_ms,
|
|
125
|
+
backend_type=self.handler_type,
|
|
126
|
+
correlation_id=correlation_id,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
async def query_registrations(
|
|
130
|
+
self,
|
|
131
|
+
query: ModelStorageQuery,
|
|
132
|
+
correlation_id: UUID | None = None,
|
|
133
|
+
) -> ModelStorageResult:
|
|
134
|
+
"""Query registration records from the mock store.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
query: Query parameters including filters and pagination.
|
|
138
|
+
correlation_id: Optional correlation ID for tracing.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
ModelStorageResult with list of matching records.
|
|
142
|
+
"""
|
|
143
|
+
correlation_id = correlation_id or uuid4()
|
|
144
|
+
start_time = time.monotonic()
|
|
145
|
+
|
|
146
|
+
async with self._lock:
|
|
147
|
+
matching_records: list[ModelRegistrationRecord] = []
|
|
148
|
+
|
|
149
|
+
for record in self._records.values():
|
|
150
|
+
# Filter by node_id (exact match)
|
|
151
|
+
if query.node_id is not None and record.node_id != query.node_id:
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
# Filter by node type
|
|
155
|
+
if query.node_type is not None and record.node_type != query.node_type:
|
|
156
|
+
continue
|
|
157
|
+
|
|
158
|
+
# Filter by capability (contains match)
|
|
159
|
+
if query.capability_filter is not None:
|
|
160
|
+
if query.capability_filter not in record.capabilities:
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
matching_records.append(record)
|
|
164
|
+
|
|
165
|
+
# Sort by updated_at descending
|
|
166
|
+
matching_records.sort(
|
|
167
|
+
key=lambda r: r.updated_at or datetime.min.replace(tzinfo=UTC),
|
|
168
|
+
reverse=True,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
total_count = len(matching_records)
|
|
172
|
+
|
|
173
|
+
# Apply pagination
|
|
174
|
+
paginated = matching_records[query.offset : query.offset + query.limit]
|
|
175
|
+
|
|
176
|
+
duration_ms = (time.monotonic() - start_time) * 1000
|
|
177
|
+
|
|
178
|
+
logger.debug(
|
|
179
|
+
"Mock registration query completed",
|
|
180
|
+
extra={
|
|
181
|
+
"record_count": len(paginated),
|
|
182
|
+
"total_count": total_count,
|
|
183
|
+
"correlation_id": str(correlation_id),
|
|
184
|
+
},
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return ModelStorageResult(
|
|
188
|
+
success=True,
|
|
189
|
+
records=tuple(paginated),
|
|
190
|
+
total_count=total_count,
|
|
191
|
+
duration_ms=duration_ms,
|
|
192
|
+
backend_type=self.handler_type,
|
|
193
|
+
correlation_id=correlation_id,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
async def update_registration(
|
|
197
|
+
self,
|
|
198
|
+
request: ModelUpdateRegistrationRequest,
|
|
199
|
+
) -> ModelUpsertResult:
|
|
200
|
+
"""Update an existing registration record in the mock store.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
request: ModelUpdateRegistrationRequest containing:
|
|
204
|
+
- node_id: ID of the node to update
|
|
205
|
+
- updates: ModelRegistrationUpdate with fields to update
|
|
206
|
+
- correlation_id: Optional correlation ID for tracing
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
ModelUpsertResult with update outcome.
|
|
210
|
+
"""
|
|
211
|
+
# Extract fields from request model
|
|
212
|
+
node_id = request.node_id
|
|
213
|
+
updates = request.updates
|
|
214
|
+
correlation_id = request.correlation_id or uuid4()
|
|
215
|
+
start_time = time.monotonic()
|
|
216
|
+
|
|
217
|
+
async with self._lock:
|
|
218
|
+
if node_id not in self._records:
|
|
219
|
+
duration_ms = (time.monotonic() - start_time) * 1000
|
|
220
|
+
return ModelUpsertResult(
|
|
221
|
+
success=False,
|
|
222
|
+
node_id=node_id,
|
|
223
|
+
operation="update",
|
|
224
|
+
error="Record not found",
|
|
225
|
+
duration_ms=duration_ms,
|
|
226
|
+
backend_type=self.handler_type,
|
|
227
|
+
correlation_id=correlation_id,
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
existing = self._records[node_id]
|
|
231
|
+
now = datetime.now(UTC)
|
|
232
|
+
|
|
233
|
+
# Update with new values from ModelRegistrationUpdate
|
|
234
|
+
updated_record = ModelRegistrationRecord(
|
|
235
|
+
node_id=existing.node_id,
|
|
236
|
+
node_type=existing.node_type,
|
|
237
|
+
node_version=(
|
|
238
|
+
updates.node_version
|
|
239
|
+
if updates.node_version is not None
|
|
240
|
+
else existing.node_version
|
|
241
|
+
),
|
|
242
|
+
capabilities=(
|
|
243
|
+
updates.capabilities
|
|
244
|
+
if updates.capabilities is not None
|
|
245
|
+
else existing.capabilities
|
|
246
|
+
),
|
|
247
|
+
endpoints=(
|
|
248
|
+
updates.endpoints
|
|
249
|
+
if updates.endpoints is not None
|
|
250
|
+
else existing.endpoints
|
|
251
|
+
),
|
|
252
|
+
metadata=(
|
|
253
|
+
updates.metadata
|
|
254
|
+
if updates.metadata is not None
|
|
255
|
+
else existing.metadata
|
|
256
|
+
),
|
|
257
|
+
created_at=existing.created_at,
|
|
258
|
+
updated_at=now,
|
|
259
|
+
correlation_id=correlation_id,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
self._records[node_id] = updated_record
|
|
263
|
+
|
|
264
|
+
duration_ms = (time.monotonic() - start_time) * 1000
|
|
265
|
+
|
|
266
|
+
logger.debug(
|
|
267
|
+
"Mock registration updated",
|
|
268
|
+
extra={
|
|
269
|
+
"node_id": str(node_id),
|
|
270
|
+
"correlation_id": str(correlation_id),
|
|
271
|
+
},
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
return ModelUpsertResult(
|
|
275
|
+
success=True,
|
|
276
|
+
node_id=node_id,
|
|
277
|
+
operation="update",
|
|
278
|
+
duration_ms=duration_ms,
|
|
279
|
+
backend_type=self.handler_type,
|
|
280
|
+
correlation_id=correlation_id,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
async def delete_registration(
|
|
284
|
+
self,
|
|
285
|
+
request: ModelDeleteRegistrationRequest,
|
|
286
|
+
) -> ModelDeleteResult:
|
|
287
|
+
"""Delete a registration record from the mock store.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
request: ModelDeleteRegistrationRequest containing:
|
|
291
|
+
- node_id: ID of the node to delete
|
|
292
|
+
- correlation_id: Optional correlation ID for tracing
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
ModelDeleteResult with deletion outcome.
|
|
296
|
+
"""
|
|
297
|
+
# Extract fields from request model
|
|
298
|
+
node_id = request.node_id
|
|
299
|
+
correlation_id = request.correlation_id or uuid4()
|
|
300
|
+
start_time = time.monotonic()
|
|
301
|
+
|
|
302
|
+
async with self._lock:
|
|
303
|
+
if node_id in self._records:
|
|
304
|
+
del self._records[node_id]
|
|
305
|
+
deleted = True
|
|
306
|
+
else:
|
|
307
|
+
deleted = False
|
|
308
|
+
|
|
309
|
+
duration_ms = (time.monotonic() - start_time) * 1000
|
|
310
|
+
|
|
311
|
+
logger.debug(
|
|
312
|
+
"Mock registration deletion completed",
|
|
313
|
+
extra={
|
|
314
|
+
"node_id": str(node_id),
|
|
315
|
+
"deleted": deleted,
|
|
316
|
+
"correlation_id": str(correlation_id),
|
|
317
|
+
},
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
return ModelDeleteResult(
|
|
321
|
+
success=True,
|
|
322
|
+
node_id=node_id,
|
|
323
|
+
deleted=deleted,
|
|
324
|
+
duration_ms=duration_ms,
|
|
325
|
+
backend_type=self.handler_type,
|
|
326
|
+
correlation_id=correlation_id,
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
async def health_check(
|
|
330
|
+
self,
|
|
331
|
+
correlation_id: UUID | None = None,
|
|
332
|
+
) -> ModelStorageHealthCheckResult:
|
|
333
|
+
"""Perform a health check on the mock handler.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
correlation_id: Optional correlation ID for tracing.
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
ModelStorageHealthCheckResult with health status information.
|
|
340
|
+
"""
|
|
341
|
+
correlation_id = correlation_id or uuid4()
|
|
342
|
+
start_time = time.monotonic()
|
|
343
|
+
|
|
344
|
+
async with self._lock:
|
|
345
|
+
pass # Lock is acquired here; duration measures acquisition latency
|
|
346
|
+
|
|
347
|
+
latency_ms = (time.monotonic() - start_time) * 1000
|
|
348
|
+
|
|
349
|
+
return ModelStorageHealthCheckResult(
|
|
350
|
+
healthy=True,
|
|
351
|
+
backend_type=self.handler_type,
|
|
352
|
+
latency_ms=latency_ms,
|
|
353
|
+
reason="ok",
|
|
354
|
+
details=ModelStorageHealthCheckDetails(
|
|
355
|
+
server_version="mock-1.0.0",
|
|
356
|
+
),
|
|
357
|
+
correlation_id=correlation_id,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
async def clear(self) -> None:
|
|
361
|
+
"""Clear all records from the mock store.
|
|
362
|
+
|
|
363
|
+
Utility method for test cleanup.
|
|
364
|
+
"""
|
|
365
|
+
async with self._lock:
|
|
366
|
+
self._records.clear()
|
|
367
|
+
|
|
368
|
+
logger.debug("Mock registration store cleared")
|
|
369
|
+
|
|
370
|
+
async def get_record_count(self) -> int:
|
|
371
|
+
"""Get the number of stored records.
|
|
372
|
+
|
|
373
|
+
Returns:
|
|
374
|
+
Number of records in the store.
|
|
375
|
+
"""
|
|
376
|
+
async with self._lock:
|
|
377
|
+
return len(self._records)
|
|
378
|
+
|
|
379
|
+
async def get_record(self, node_id: UUID) -> ModelRegistrationRecord | None:
|
|
380
|
+
"""Get a specific record by node ID.
|
|
381
|
+
|
|
382
|
+
Args:
|
|
383
|
+
node_id: ID of the node to retrieve.
|
|
384
|
+
|
|
385
|
+
Returns:
|
|
386
|
+
The record if found, None otherwise.
|
|
387
|
+
"""
|
|
388
|
+
async with self._lock:
|
|
389
|
+
return self._records.get(node_id)
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
__all__ = ["HandlerRegistrationStorageMock"]
|