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,98 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Manifest Retrieve Result Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for the manifest.retrieve operation
|
|
6
|
+
result, containing the retrieved manifest or indication of not found.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from uuid import UUID
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelManifestRetrieveResult(BaseModel):
|
|
17
|
+
"""Result from manifest.retrieve operation.
|
|
18
|
+
|
|
19
|
+
Contains the retrieved manifest data and metadata, or indicates that
|
|
20
|
+
the requested manifest was not found.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
manifest_id: The unique identifier of the manifest that was queried.
|
|
24
|
+
manifest: The serialized ModelExecutionManifest as a dictionary,
|
|
25
|
+
or None if the manifest was not found. When present, this can
|
|
26
|
+
be passed to ModelExecutionManifest.model_validate() to
|
|
27
|
+
reconstruct the original manifest object.
|
|
28
|
+
file_path: The absolute path where the manifest was found,
|
|
29
|
+
or None if the manifest was not found.
|
|
30
|
+
found: True if the manifest was found and retrieved, False if
|
|
31
|
+
no manifest exists with the requested ID.
|
|
32
|
+
|
|
33
|
+
Note:
|
|
34
|
+
This model implements custom __bool__ behavior. The boolean value
|
|
35
|
+
of an instance reflects the 'found' status, enabling idiomatic
|
|
36
|
+
conditional checks like:
|
|
37
|
+
|
|
38
|
+
result = handler.retrieve(manifest_id)
|
|
39
|
+
if result: # True only when found=True
|
|
40
|
+
process_manifest(result.manifest)
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
>>> from uuid import UUID
|
|
44
|
+
>>> result = ModelManifestRetrieveResult(
|
|
45
|
+
... manifest_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
|
|
46
|
+
... manifest={"manifest_id": "...", "node_id": "..."},
|
|
47
|
+
... file_path="/data/manifests/2025/01/15/550e8400.json",
|
|
48
|
+
... found=True,
|
|
49
|
+
... )
|
|
50
|
+
>>> print(bool(result))
|
|
51
|
+
True
|
|
52
|
+
|
|
53
|
+
>>> not_found = ModelManifestRetrieveResult(
|
|
54
|
+
... manifest_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
|
|
55
|
+
... manifest=None,
|
|
56
|
+
... file_path=None,
|
|
57
|
+
... found=False,
|
|
58
|
+
... )
|
|
59
|
+
>>> print(bool(not_found))
|
|
60
|
+
False
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
model_config = ConfigDict(
|
|
64
|
+
strict=True,
|
|
65
|
+
frozen=True,
|
|
66
|
+
extra="forbid",
|
|
67
|
+
from_attributes=True,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
manifest_id: UUID = Field(
|
|
71
|
+
description="Unique identifier of the manifest that was queried.",
|
|
72
|
+
)
|
|
73
|
+
manifest: dict[str, object] | None = Field(
|
|
74
|
+
description="Serialized manifest dictionary, or None if not found.",
|
|
75
|
+
)
|
|
76
|
+
file_path: str | None = Field(
|
|
77
|
+
default=None,
|
|
78
|
+
description="Absolute path where manifest was found, or None if not found.",
|
|
79
|
+
)
|
|
80
|
+
found: bool = Field(
|
|
81
|
+
description="True if manifest was found, False otherwise.",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
def __bool__(self) -> bool:
|
|
85
|
+
"""Return True if manifest was found.
|
|
86
|
+
|
|
87
|
+
Warning:
|
|
88
|
+
This differs from standard Pydantic model behavior where
|
|
89
|
+
bool(model) always returns True. This model returns True
|
|
90
|
+
only when found=True, enabling idiomatic conditional checks.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
True if found=True, False otherwise.
|
|
94
|
+
"""
|
|
95
|
+
return self.found
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
__all__: list[str] = ["ModelManifestRetrieveResult"]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Manifest Store Payload Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for the manifest.store operation
|
|
6
|
+
payload, containing the serialized ModelExecutionManifest to persist.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelManifestStorePayload(BaseModel):
|
|
15
|
+
"""Payload for manifest.store operation.
|
|
16
|
+
|
|
17
|
+
Contains the serialized execution manifest to be persisted. The manifest
|
|
18
|
+
is stored as a dictionary to allow flexible schema evolution while
|
|
19
|
+
maintaining the ability to deserialize back to ModelExecutionManifest.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
manifest: The serialized ModelExecutionManifest as a dictionary.
|
|
23
|
+
This should be the result of calling .model_dump() on a
|
|
24
|
+
ModelExecutionManifest instance. The manifest_id field within
|
|
25
|
+
the manifest is used as the storage key.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
>>> from omnibase_core.models import ModelExecutionManifest
|
|
29
|
+
>>> manifest = ModelExecutionManifest(...)
|
|
30
|
+
>>> payload = ModelManifestStorePayload(
|
|
31
|
+
... manifest=manifest.model_dump()
|
|
32
|
+
... )
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
model_config = ConfigDict(
|
|
36
|
+
strict=True,
|
|
37
|
+
frozen=True,
|
|
38
|
+
extra="forbid",
|
|
39
|
+
from_attributes=True,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
manifest: dict[str, object] = Field(
|
|
43
|
+
description="Serialized ModelExecutionManifest dictionary from model_dump().",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
__all__: list[str] = ["ModelManifestStorePayload"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Manifest Store Result Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for the manifest.store operation
|
|
6
|
+
result, containing storage metadata and idempotency status.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from uuid import UUID
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelManifestStoreResult(BaseModel):
|
|
17
|
+
"""Result from manifest.store operation.
|
|
18
|
+
|
|
19
|
+
Contains metadata about the completed store operation, including
|
|
20
|
+
the storage location and whether a new manifest was created.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
manifest_id: The unique identifier of the stored manifest,
|
|
24
|
+
extracted from the input manifest's manifest_id field.
|
|
25
|
+
file_path: The resolved absolute filesystem path where the manifest
|
|
26
|
+
was stored (e.g., /var/lib/onex/manifests/2025/01/14/{id}.json).
|
|
27
|
+
created: True if a new manifest was created, False if a manifest
|
|
28
|
+
with the same ID already existed (idempotent operation).
|
|
29
|
+
When False, the existing manifest is not overwritten.
|
|
30
|
+
bytes_written: Number of bytes written to storage. Zero if the
|
|
31
|
+
manifest already existed (idempotent, no overwrite).
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
>>> result = ModelManifestStoreResult(
|
|
35
|
+
... manifest_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
|
|
36
|
+
... file_path="/var/lib/onex/manifests/2025/01/14/550e8400.json",
|
|
37
|
+
... created=True,
|
|
38
|
+
... bytes_written=4096,
|
|
39
|
+
... )
|
|
40
|
+
>>> print(result.created)
|
|
41
|
+
True
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
model_config = ConfigDict(
|
|
45
|
+
strict=True,
|
|
46
|
+
frozen=True,
|
|
47
|
+
extra="forbid",
|
|
48
|
+
from_attributes=True,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
manifest_id: UUID = Field(
|
|
52
|
+
description="Unique identifier of the stored manifest.",
|
|
53
|
+
)
|
|
54
|
+
file_path: str = Field(
|
|
55
|
+
min_length=1,
|
|
56
|
+
description="Resolved absolute path where the manifest was stored.",
|
|
57
|
+
)
|
|
58
|
+
created: bool = Field(
|
|
59
|
+
description="True if new manifest created, False if already existed (idempotent).",
|
|
60
|
+
)
|
|
61
|
+
bytes_written: int = Field(
|
|
62
|
+
ge=0,
|
|
63
|
+
description="Number of bytes written. Zero if manifest already existed.",
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
__all__: list[str] = ["ModelManifestStoreResult"]
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Operation Context Model for handler tracking.
|
|
4
|
+
|
|
5
|
+
This module provides a Pydantic model for encapsulating operation context
|
|
6
|
+
during handler execution, enabling consistent tracking and tracing.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import time
|
|
12
|
+
from uuid import UUID, uuid4
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ModelOperationContext(BaseModel):
|
|
18
|
+
"""Encapsulates operation context for handler tracking.
|
|
19
|
+
|
|
20
|
+
This model provides a strongly-typed container for operation metadata,
|
|
21
|
+
replacing scattered local variables with a cohesive context object.
|
|
22
|
+
|
|
23
|
+
Attributes:
|
|
24
|
+
correlation_id: UUID for distributed tracing across services
|
|
25
|
+
operation_name: Name of the operation being executed
|
|
26
|
+
started_at: Unix timestamp when the operation started
|
|
27
|
+
timeout_seconds: Maximum allowed execution time
|
|
28
|
+
metadata: Additional key-value pairs for operation-specific context
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
>>> ctx = ModelOperationContext.create("consul.kv_get")
|
|
32
|
+
>>> ctx.operation_name
|
|
33
|
+
'consul.kv_get'
|
|
34
|
+
>>> ctx.is_timed_out()
|
|
35
|
+
False
|
|
36
|
+
|
|
37
|
+
ID Semantics:
|
|
38
|
+
correlation_id: Groups related operations across distributed services.
|
|
39
|
+
Used for filtering logs, tracing request flows, and debugging.
|
|
40
|
+
Propagated from request envelopes for consistent distributed tracing.
|
|
41
|
+
|
|
42
|
+
Security:
|
|
43
|
+
The metadata field should contain SANITIZED values only.
|
|
44
|
+
Never include credentials, tokens, or other sensitive data.
|
|
45
|
+
See CLAUDE.md "Error Sanitization Guidelines" for the security policy.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
model_config = ConfigDict(
|
|
49
|
+
strict=True,
|
|
50
|
+
frozen=True,
|
|
51
|
+
extra="forbid",
|
|
52
|
+
from_attributes=True,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
correlation_id: UUID = Field(
|
|
56
|
+
description="UUID for distributed tracing across services",
|
|
57
|
+
)
|
|
58
|
+
operation_name: str = Field(
|
|
59
|
+
description="Name of the operation being executed",
|
|
60
|
+
)
|
|
61
|
+
started_at: float = Field(
|
|
62
|
+
description="Unix timestamp when the operation started",
|
|
63
|
+
)
|
|
64
|
+
timeout_seconds: float = Field(
|
|
65
|
+
default=30.0,
|
|
66
|
+
ge=0.0,
|
|
67
|
+
le=3600.0,
|
|
68
|
+
description="Maximum allowed execution time in seconds",
|
|
69
|
+
)
|
|
70
|
+
metadata: dict[str, str] = Field(
|
|
71
|
+
default_factory=dict,
|
|
72
|
+
description="Additional key-value pairs for operation-specific context",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def create(
|
|
77
|
+
cls,
|
|
78
|
+
operation_name: str,
|
|
79
|
+
correlation_id: UUID | None = None,
|
|
80
|
+
timeout_seconds: float = 30.0,
|
|
81
|
+
metadata: dict[str, str] | None = None,
|
|
82
|
+
) -> ModelOperationContext:
|
|
83
|
+
"""Create a new operation context with current timestamp.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
operation_name: Name of the operation being executed
|
|
87
|
+
correlation_id: Optional UUID for tracing (auto-generated if None)
|
|
88
|
+
timeout_seconds: Maximum allowed execution time (default: 30.0)
|
|
89
|
+
metadata: Optional additional key-value pairs
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
New ModelOperationContext with current timestamp.
|
|
93
|
+
|
|
94
|
+
Example:
|
|
95
|
+
>>> ctx = ModelOperationContext.create("vault.read_secret")
|
|
96
|
+
>>> ctx.operation_name
|
|
97
|
+
'vault.read_secret'
|
|
98
|
+
"""
|
|
99
|
+
return cls(
|
|
100
|
+
correlation_id=correlation_id if correlation_id is not None else uuid4(),
|
|
101
|
+
operation_name=operation_name,
|
|
102
|
+
started_at=time.time(),
|
|
103
|
+
timeout_seconds=timeout_seconds,
|
|
104
|
+
metadata=metadata if metadata is not None else {},
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def elapsed_seconds(self) -> float:
|
|
108
|
+
"""Calculate elapsed time since operation started.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Elapsed time in seconds since started_at.
|
|
112
|
+
|
|
113
|
+
Note:
|
|
114
|
+
Calls time.time() on each invocation. Multiple calls within
|
|
115
|
+
a tight loop may return slightly different values.
|
|
116
|
+
"""
|
|
117
|
+
return time.time() - self.started_at
|
|
118
|
+
|
|
119
|
+
def remaining_seconds(self) -> float:
|
|
120
|
+
"""Calculate remaining time before timeout.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Remaining time in seconds (can be negative if timed out).
|
|
124
|
+
|
|
125
|
+
Note:
|
|
126
|
+
Calls elapsed_seconds() internally, which uses time.time().
|
|
127
|
+
Multiple calls may return slightly different values.
|
|
128
|
+
"""
|
|
129
|
+
return self.timeout_seconds - self.elapsed_seconds()
|
|
130
|
+
|
|
131
|
+
def is_timed_out(self) -> bool:
|
|
132
|
+
"""Check if the operation has exceeded its timeout.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
True if elapsed time exceeds timeout_seconds, False otherwise.
|
|
136
|
+
|
|
137
|
+
Note:
|
|
138
|
+
Calls elapsed_seconds() internally, which uses time.time().
|
|
139
|
+
Result may change between calls if near the timeout boundary.
|
|
140
|
+
"""
|
|
141
|
+
return self.elapsed_seconds() > self.timeout_seconds
|
|
142
|
+
|
|
143
|
+
def with_metadata(self, key: str, value: str) -> ModelOperationContext:
|
|
144
|
+
"""Create a copy with additional metadata.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
key: Metadata key
|
|
148
|
+
value: Metadata value (must be sanitized)
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
New ModelOperationContext with updated metadata.
|
|
152
|
+
|
|
153
|
+
Note:
|
|
154
|
+
Values should be sanitized before calling this method.
|
|
155
|
+
"""
|
|
156
|
+
new_metadata = dict(self.metadata)
|
|
157
|
+
new_metadata[key] = value
|
|
158
|
+
return ModelOperationContext(
|
|
159
|
+
correlation_id=self.correlation_id,
|
|
160
|
+
operation_name=self.operation_name,
|
|
161
|
+
started_at=self.started_at,
|
|
162
|
+
timeout_seconds=self.timeout_seconds,
|
|
163
|
+
metadata=new_metadata,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def with_operation_name(self, operation_name: str) -> ModelOperationContext:
|
|
167
|
+
"""Create a copy with a different operation name.
|
|
168
|
+
|
|
169
|
+
Useful when a handler routes to sub-operations while preserving
|
|
170
|
+
the correlation_id and timing context.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
operation_name: New operation name
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
New ModelOperationContext with updated operation_name.
|
|
177
|
+
"""
|
|
178
|
+
return ModelOperationContext(
|
|
179
|
+
correlation_id=self.correlation_id,
|
|
180
|
+
operation_name=operation_name,
|
|
181
|
+
started_at=self.started_at,
|
|
182
|
+
timeout_seconds=self.timeout_seconds,
|
|
183
|
+
metadata=self.metadata,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
__all__: list[str] = ["ModelOperationContext"]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Qdrant Handler Response Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for Qdrant handler response envelopes
|
|
6
|
+
used by the HandlerQdrant.
|
|
7
|
+
|
|
8
|
+
This model provides type consistency with ModelDbQueryResponse and
|
|
9
|
+
ModelConsulHandlerResponse, ensuring all handlers return strongly-typed
|
|
10
|
+
Pydantic models with consistent interfaces (status, payload, correlation_id).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from uuid import UUID
|
|
16
|
+
|
|
17
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
18
|
+
|
|
19
|
+
from omnibase_infra.enums import EnumResponseStatus
|
|
20
|
+
from omnibase_infra.handlers.models.qdrant import (
|
|
21
|
+
ModelQdrantHandlerPayload,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ModelQdrantHandlerResponse(BaseModel):
|
|
26
|
+
"""Full Qdrant handler response envelope.
|
|
27
|
+
|
|
28
|
+
Provides a standardized response format for Qdrant vector database
|
|
29
|
+
operations with status, payload, and correlation tracking.
|
|
30
|
+
|
|
31
|
+
This model mirrors ModelConsulHandlerResponse and ModelDbQueryResponse
|
|
32
|
+
to ensure consistent interfaces across infrastructure handlers.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
status: Operation status (EnumResponseStatus.SUCCESS or EnumResponseStatus.ERROR)
|
|
36
|
+
payload: Qdrant operation result payload containing operation-specific data
|
|
37
|
+
correlation_id: UUID for request/response correlation
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
>>> from uuid import uuid4
|
|
41
|
+
>>> from omnibase_infra.enums import EnumResponseStatus
|
|
42
|
+
>>> from omnibase_infra.handlers.models.qdrant import (
|
|
43
|
+
... ModelQdrantHandlerPayload, ModelQdrantSearchPayload,
|
|
44
|
+
... )
|
|
45
|
+
>>> response = ModelQdrantHandlerResponse(
|
|
46
|
+
... status=EnumResponseStatus.SUCCESS,
|
|
47
|
+
... payload=ModelQdrantHandlerPayload(
|
|
48
|
+
... data=ModelQdrantSearchPayload(
|
|
49
|
+
... collection_name="test_collection",
|
|
50
|
+
... results=[],
|
|
51
|
+
... limit=10,
|
|
52
|
+
... ),
|
|
53
|
+
... ),
|
|
54
|
+
... correlation_id=uuid4(),
|
|
55
|
+
... )
|
|
56
|
+
>>> print(response.status)
|
|
57
|
+
<EnumResponseStatus.SUCCESS: 'success'>
|
|
58
|
+
>>> print(response.payload.data.operation_type)
|
|
59
|
+
'qdrant.search'
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
model_config = ConfigDict(
|
|
63
|
+
strict=True,
|
|
64
|
+
frozen=True,
|
|
65
|
+
extra="forbid",
|
|
66
|
+
from_attributes=True, # Support pytest-xdist compatibility
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
status: EnumResponseStatus = Field(
|
|
70
|
+
description="Operation status indicator",
|
|
71
|
+
)
|
|
72
|
+
payload: ModelQdrantHandlerPayload = Field(
|
|
73
|
+
description="Qdrant operation result payload",
|
|
74
|
+
)
|
|
75
|
+
correlation_id: UUID = Field(
|
|
76
|
+
description="UUID for request/response correlation",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def is_success(self) -> bool:
|
|
81
|
+
"""Check if the response indicates a successful operation.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
True if status is SUCCESS, False otherwise.
|
|
85
|
+
"""
|
|
86
|
+
return self.status == EnumResponseStatus.SUCCESS
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def is_error(self) -> bool:
|
|
90
|
+
"""Check if the response indicates an error.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
True if status is ERROR, False otherwise.
|
|
94
|
+
"""
|
|
95
|
+
return self.status == EnumResponseStatus.ERROR
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
__all__: list[str] = ["ModelQdrantHandlerResponse"]
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Retry State Model for handler operations.
|
|
4
|
+
|
|
5
|
+
This module provides a Pydantic model for encapsulating retry state during
|
|
6
|
+
handler operation execution with exponential backoff.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import time
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelRetryState(BaseModel):
|
|
17
|
+
"""Encapsulates retry state for handler operations.
|
|
18
|
+
|
|
19
|
+
This model tracks the runtime state during retry loops, providing
|
|
20
|
+
a strongly-typed alternative to scattered local variables.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
attempt: Current retry attempt number (0-based, starts at 0)
|
|
24
|
+
max_attempts: Maximum number of retry attempts allowed
|
|
25
|
+
delay_seconds: Current delay before next retry (calculated with backoff)
|
|
26
|
+
backoff_multiplier: Exponential backoff multiplier for delay calculation
|
|
27
|
+
last_error: Description of the last error encountered (sanitized)
|
|
28
|
+
last_attempt_at: Unix timestamp of the last attempt (None if not yet attempted)
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
>>> state = ModelRetryState(max_attempts=3)
|
|
32
|
+
>>> state.is_retriable()
|
|
33
|
+
True
|
|
34
|
+
>>> state = state.next_attempt("Connection failed")
|
|
35
|
+
>>> state.attempt
|
|
36
|
+
1
|
|
37
|
+
|
|
38
|
+
Note:
|
|
39
|
+
The last_error field should contain SANITIZED error descriptions only.
|
|
40
|
+
Never include credentials, tokens, or other sensitive data in this field.
|
|
41
|
+
See CLAUDE.md "Error Sanitization Guidelines" for the security policy.
|
|
42
|
+
|
|
43
|
+
Design Rationale:
|
|
44
|
+
This model stores error messages as strings rather than exception objects.
|
|
45
|
+
This trade-off ensures: (1) immutability (frozen=True), (2) serialization
|
|
46
|
+
safety for logging/persistence, and (3) model simplicity. The original
|
|
47
|
+
exception should be handled by the caller if traceback preservation is
|
|
48
|
+
needed (e.g., wrap in try/except and log before calling next_attempt()).
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
model_config = ConfigDict(
|
|
52
|
+
strict=True,
|
|
53
|
+
frozen=True,
|
|
54
|
+
extra="forbid",
|
|
55
|
+
from_attributes=True,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
attempt: int = Field(
|
|
59
|
+
default=0,
|
|
60
|
+
ge=0,
|
|
61
|
+
description="Current retry attempt number (0-based)",
|
|
62
|
+
)
|
|
63
|
+
max_attempts: int = Field(
|
|
64
|
+
default=3,
|
|
65
|
+
ge=1,
|
|
66
|
+
le=100,
|
|
67
|
+
description="Maximum number of retry attempts allowed",
|
|
68
|
+
)
|
|
69
|
+
delay_seconds: float = Field(
|
|
70
|
+
default=1.0,
|
|
71
|
+
ge=0.0,
|
|
72
|
+
description="Current delay in seconds before next retry",
|
|
73
|
+
)
|
|
74
|
+
backoff_multiplier: float = Field(
|
|
75
|
+
default=2.0,
|
|
76
|
+
ge=1.0,
|
|
77
|
+
le=10.0,
|
|
78
|
+
description="Exponential backoff multiplier for delay calculation",
|
|
79
|
+
)
|
|
80
|
+
last_error: str | None = Field(
|
|
81
|
+
default=None,
|
|
82
|
+
description="Sanitized description of the last error encountered",
|
|
83
|
+
)
|
|
84
|
+
last_attempt_at: float | None = Field(
|
|
85
|
+
default=None,
|
|
86
|
+
description="Unix timestamp of the last attempt",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def is_retriable(self) -> bool:
|
|
90
|
+
"""Check if more retry attempts are allowed.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
True if current attempt is less than max_attempts, False otherwise.
|
|
94
|
+
"""
|
|
95
|
+
return self.attempt < self.max_attempts
|
|
96
|
+
|
|
97
|
+
def is_final_attempt(self) -> bool:
|
|
98
|
+
"""Check if this is the final retry attempt.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
True if this is the last allowed attempt, False otherwise.
|
|
102
|
+
"""
|
|
103
|
+
return self.attempt >= self.max_attempts - 1
|
|
104
|
+
|
|
105
|
+
def next_attempt(
|
|
106
|
+
self,
|
|
107
|
+
error_message: str | None = None,
|
|
108
|
+
timestamp: float | None = None,
|
|
109
|
+
max_delay_seconds: float = 300.0,
|
|
110
|
+
) -> ModelRetryState:
|
|
111
|
+
"""Create a new state for the next retry attempt.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
error_message: Sanitized description of the error (optional)
|
|
115
|
+
timestamp: Unix timestamp of this attempt (optional, for testing)
|
|
116
|
+
max_delay_seconds: Maximum delay cap for backoff calculation
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
New ModelRetryState with incremented attempt and calculated delay.
|
|
120
|
+
|
|
121
|
+
Example:
|
|
122
|
+
>>> state = ModelRetryState(delay_seconds=1.0, backoff_multiplier=2.0)
|
|
123
|
+
>>> next_state = state.next_attempt("Connection timeout")
|
|
124
|
+
>>> next_state.attempt
|
|
125
|
+
1
|
|
126
|
+
>>> next_state.delay_seconds # 1.0 * 2.0 = 2.0
|
|
127
|
+
2.0
|
|
128
|
+
"""
|
|
129
|
+
new_delay = min(
|
|
130
|
+
self.delay_seconds * self.backoff_multiplier,
|
|
131
|
+
max_delay_seconds,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
return ModelRetryState(
|
|
135
|
+
attempt=self.attempt + 1,
|
|
136
|
+
max_attempts=self.max_attempts,
|
|
137
|
+
delay_seconds=new_delay,
|
|
138
|
+
backoff_multiplier=self.backoff_multiplier,
|
|
139
|
+
last_error=error_message,
|
|
140
|
+
last_attempt_at=timestamp if timestamp is not None else time.time(),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
def with_initial_delay(self, initial_delay: float) -> ModelRetryState:
|
|
144
|
+
"""Create a copy with a new initial delay value.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
initial_delay: New delay value in seconds
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
New ModelRetryState with updated delay_seconds.
|
|
151
|
+
"""
|
|
152
|
+
return ModelRetryState(
|
|
153
|
+
attempt=self.attempt,
|
|
154
|
+
max_attempts=self.max_attempts,
|
|
155
|
+
delay_seconds=initial_delay,
|
|
156
|
+
backoff_multiplier=self.backoff_multiplier,
|
|
157
|
+
last_error=self.last_error,
|
|
158
|
+
last_attempt_at=self.last_attempt_at,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
__all__: list[str] = ["ModelRetryState"]
|