omnibase_infra 0.2.6__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/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -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 +132 -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_consumer_group_purpose.py +92 -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 +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -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_kafka_acks.py +99 -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 +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -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 +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -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 +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -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 +693 -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/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -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 +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -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 +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -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 +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -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 +922 -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 +1051 -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 +109 -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/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -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 +2670 -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 +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -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 +330 -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 +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -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_materialized_dispatch.py +141 -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 +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -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/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -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 +591 -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 +68 -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_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -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 +49 -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 +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -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 +57 -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 +203 -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 +106 -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/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -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/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -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 +482 -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 +694 -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 +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -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 +220 -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 +112 -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 +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -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 +417 -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 +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -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 +1138 -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 +449 -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 +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -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 +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -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/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -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_contract_load_result.py +224 -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 +229 -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_notification_config.py +171 -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_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -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_security_config.py +109 -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/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -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 +1330 -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 +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -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 +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -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/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -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 +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -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 +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -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_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -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 +1514 -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 +2033 -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 +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""PostgreSQL DSN validation utility.
|
|
4
|
+
|
|
5
|
+
This module provides robust DSN validation using urllib.parse instead of regex.
|
|
6
|
+
It handles edge cases like IPv6 addresses, URL-encoded passwords, query parameters,
|
|
7
|
+
and validates DSN structure comprehensively.
|
|
8
|
+
|
|
9
|
+
Security:
|
|
10
|
+
- Never logs credentials in error messages
|
|
11
|
+
- Returns [REDACTED] in error messages for sensitive values
|
|
12
|
+
- Validates structure without exposing DSN contents
|
|
13
|
+
|
|
14
|
+
Edge Cases Handled:
|
|
15
|
+
- IPv6 addresses: postgresql://user:pass@[::1]:5432/db
|
|
16
|
+
- URL-encoded passwords: user:p%40ssword@host (p@ssword)
|
|
17
|
+
- Missing components: postgresql://localhost/db (no user/pass/port)
|
|
18
|
+
- Query parameters: postgresql://host/db?sslmode=require
|
|
19
|
+
- Unix sockets: postgresql:///db?host=/var/run/postgresql
|
|
20
|
+
- Empty password: user:@host (different from no password)
|
|
21
|
+
|
|
22
|
+
Limitations:
|
|
23
|
+
- Multiple hosts (host1:5432,host2:5433) are not validated
|
|
24
|
+
(urllib.parse treats them as a single hostname)
|
|
25
|
+
- If multi-host support is needed, use a PostgreSQL-specific parser
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from typing import Literal, cast
|
|
31
|
+
from urllib.parse import parse_qs, unquote, urlparse
|
|
32
|
+
from uuid import uuid4
|
|
33
|
+
|
|
34
|
+
from omnibase_infra.types import ModelParsedDSN
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _assert_postgres_scheme(scheme: str) -> Literal["postgresql", "postgres"]:
|
|
38
|
+
"""Type-safe scheme assertion for PostgreSQL DSN schemes.
|
|
39
|
+
|
|
40
|
+
This helper enables proper type narrowing for the Literal type
|
|
41
|
+
using typing.cast for explicit type assertion.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
scheme: The scheme string to validate
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
The scheme cast to the appropriate Literal type
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
ProtocolConfigurationError: If scheme is not 'postgresql' or 'postgres'.
|
|
51
|
+
|
|
52
|
+
Note:
|
|
53
|
+
This function should only be called AFTER validating
|
|
54
|
+
that scheme is one of the valid values.
|
|
55
|
+
"""
|
|
56
|
+
if scheme not in ("postgresql", "postgres"):
|
|
57
|
+
# Lazy imports to avoid circular dependency (utils -> errors -> models -> utils)
|
|
58
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
59
|
+
from omnibase_infra.errors import (
|
|
60
|
+
ModelInfraErrorContext,
|
|
61
|
+
ProtocolConfigurationError,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
context = ModelInfraErrorContext(
|
|
65
|
+
transport_type=EnumInfraTransportType.DATABASE,
|
|
66
|
+
operation="validate_dsn_scheme",
|
|
67
|
+
target_name="dsn_validator",
|
|
68
|
+
correlation_id=uuid4(),
|
|
69
|
+
)
|
|
70
|
+
raise ProtocolConfigurationError(
|
|
71
|
+
f"Invalid scheme: expected 'postgresql' or 'postgres', got '{scheme}'",
|
|
72
|
+
context=context,
|
|
73
|
+
parameter="scheme",
|
|
74
|
+
value=scheme,
|
|
75
|
+
)
|
|
76
|
+
return cast("Literal['postgresql', 'postgres']", scheme)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def parse_and_validate_dsn(dsn: object) -> ModelParsedDSN:
|
|
80
|
+
"""Parse and validate PostgreSQL DSN format using urllib.parse.
|
|
81
|
+
|
|
82
|
+
This function provides comprehensive DSN validation that handles edge cases
|
|
83
|
+
like IPv6 addresses, URL-encoded passwords, and query parameters. It uses
|
|
84
|
+
urllib.parse for robust parsing instead of fragile regex patterns.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
dsn: PostgreSQL connection string (any type - validated)
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
ModelParsedDSN with parsed components:
|
|
91
|
+
- scheme: "postgresql" or "postgres" (Literal type)
|
|
92
|
+
- username: Username or None
|
|
93
|
+
- password: Password (URL-decoded) or None
|
|
94
|
+
- hostname: Hostname or IP address or None
|
|
95
|
+
- port: Port number or None
|
|
96
|
+
- database: Database name
|
|
97
|
+
- query: Dict of query parameters (str keys, str | list[str] values)
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
ProtocolConfigurationError: If DSN format is invalid
|
|
101
|
+
|
|
102
|
+
Example:
|
|
103
|
+
>>> result = parse_and_validate_dsn("postgresql://user:pass@localhost:5432/mydb")
|
|
104
|
+
>>> assert result.hostname == "localhost"
|
|
105
|
+
>>> assert result.database == "mydb"
|
|
106
|
+
|
|
107
|
+
Security Note:
|
|
108
|
+
Error messages never contain the actual DSN value. Sensitive information
|
|
109
|
+
is replaced with [REDACTED] to prevent credential leakage in logs.
|
|
110
|
+
"""
|
|
111
|
+
# Lazy imports to avoid circular dependency (utils → errors → models → utils)
|
|
112
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
113
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
114
|
+
|
|
115
|
+
context = ModelInfraErrorContext(
|
|
116
|
+
transport_type=EnumInfraTransportType.DATABASE,
|
|
117
|
+
operation="validate_dsn",
|
|
118
|
+
target_name="dsn_validator",
|
|
119
|
+
correlation_id=uuid4(),
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Type validation
|
|
123
|
+
if dsn is None:
|
|
124
|
+
raise ProtocolConfigurationError(
|
|
125
|
+
"Invalid dsn: expected a string, got None",
|
|
126
|
+
context=context,
|
|
127
|
+
parameter="dsn",
|
|
128
|
+
value=None,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if not isinstance(dsn, str):
|
|
132
|
+
raise ProtocolConfigurationError(
|
|
133
|
+
f"Invalid dsn type: expected str, got {type(dsn).__name__}",
|
|
134
|
+
context=context,
|
|
135
|
+
parameter="dsn",
|
|
136
|
+
value=type(dsn).__name__,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
# Empty string validation
|
|
140
|
+
if not dsn.strip():
|
|
141
|
+
raise ProtocolConfigurationError(
|
|
142
|
+
"Invalid dsn: expected a non-empty string, got empty string",
|
|
143
|
+
context=context,
|
|
144
|
+
parameter="dsn",
|
|
145
|
+
value="",
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
dsn_str = dsn.strip()
|
|
149
|
+
|
|
150
|
+
# Scheme validation (before parsing to provide clear error)
|
|
151
|
+
valid_prefixes = ("postgresql://", "postgres://")
|
|
152
|
+
if not dsn_str.startswith(valid_prefixes):
|
|
153
|
+
raise ProtocolConfigurationError(
|
|
154
|
+
f"dsn must start with one of {valid_prefixes}",
|
|
155
|
+
context=context,
|
|
156
|
+
parameter="dsn",
|
|
157
|
+
value="[REDACTED]", # Never log DSN contents
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Check for multi-host DSN format (not supported)
|
|
161
|
+
# Multi-host format: postgresql://host1:port1,host2:port2/db
|
|
162
|
+
# We check for comma after :// and before / (in the host portion)
|
|
163
|
+
scheme_end = dsn_str.index("://") + 3
|
|
164
|
+
path_start = dsn_str.find("/", scheme_end)
|
|
165
|
+
host_portion = (
|
|
166
|
+
dsn_str[scheme_end:path_start] if path_start != -1 else dsn_str[scheme_end:]
|
|
167
|
+
)
|
|
168
|
+
if "," in host_portion:
|
|
169
|
+
raise ProtocolConfigurationError(
|
|
170
|
+
"Multi-host DSNs are not supported. Use a single host or consider "
|
|
171
|
+
"psycopg2.conninfo_to_dict for multi-host parsing.",
|
|
172
|
+
context=context,
|
|
173
|
+
parameter="dsn",
|
|
174
|
+
value="[REDACTED]",
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Parse DSN using urllib.parse
|
|
178
|
+
try:
|
|
179
|
+
parsed = urlparse(dsn_str)
|
|
180
|
+
except ValueError as e:
|
|
181
|
+
# urlparse can raise ValueError for invalid ports, etc.
|
|
182
|
+
raise ProtocolConfigurationError(
|
|
183
|
+
f"Invalid DSN format: {e}",
|
|
184
|
+
context=context,
|
|
185
|
+
parameter="dsn",
|
|
186
|
+
value="[REDACTED]",
|
|
187
|
+
) from e
|
|
188
|
+
|
|
189
|
+
# Validate scheme (redundant but explicit)
|
|
190
|
+
if parsed.scheme not in ("postgresql", "postgres"):
|
|
191
|
+
raise ProtocolConfigurationError(
|
|
192
|
+
f"Invalid scheme: expected 'postgresql' or 'postgres', got '{parsed.scheme}'",
|
|
193
|
+
context=context,
|
|
194
|
+
parameter="dsn",
|
|
195
|
+
value="[REDACTED]",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Validate port if present
|
|
199
|
+
# Note: Accessing parsed.port can raise ValueError if port is invalid
|
|
200
|
+
try:
|
|
201
|
+
port = parsed.port
|
|
202
|
+
if port is not None:
|
|
203
|
+
if port < 1 or port > 65535:
|
|
204
|
+
raise ProtocolConfigurationError(
|
|
205
|
+
f"Port must be between 1 and 65535, got {port}",
|
|
206
|
+
context=context,
|
|
207
|
+
parameter="dsn.port",
|
|
208
|
+
value=port,
|
|
209
|
+
)
|
|
210
|
+
except ValueError as e:
|
|
211
|
+
# urlparse raises ValueError for invalid ports (non-numeric, out of range)
|
|
212
|
+
raise ProtocolConfigurationError(
|
|
213
|
+
f"Invalid port in DSN: {e}",
|
|
214
|
+
context=context,
|
|
215
|
+
parameter="dsn.port",
|
|
216
|
+
value="[REDACTED]",
|
|
217
|
+
) from e
|
|
218
|
+
|
|
219
|
+
# Validate database name
|
|
220
|
+
# Path is "/dbname" or "///dbname" for Unix socket
|
|
221
|
+
# Strip leading slashes to get database name
|
|
222
|
+
database = parsed.path.lstrip("/") if parsed.path else ""
|
|
223
|
+
|
|
224
|
+
# Database name is required (unless using Unix socket with query param)
|
|
225
|
+
# For Unix sockets: postgresql:///dbname?host=/var/run/postgresql
|
|
226
|
+
# For network: postgresql://host/dbname
|
|
227
|
+
if not database:
|
|
228
|
+
# Check if Unix socket is specified in query params
|
|
229
|
+
query_params = parse_qs(parsed.query)
|
|
230
|
+
if "host" not in query_params:
|
|
231
|
+
raise ProtocolConfigurationError(
|
|
232
|
+
"Database name is required in DSN path (e.g., postgresql://host:5432/dbname)",
|
|
233
|
+
context=context,
|
|
234
|
+
parameter="dsn.path",
|
|
235
|
+
value="[REDACTED]",
|
|
236
|
+
)
|
|
237
|
+
# Unix socket case - database might be in query params or path
|
|
238
|
+
# Allow empty database for now (will be validated at connection time)
|
|
239
|
+
|
|
240
|
+
# Parse query parameters
|
|
241
|
+
query_dict = {}
|
|
242
|
+
if parsed.query:
|
|
243
|
+
# parse_qs returns lists, flatten to single values
|
|
244
|
+
parsed_qs = parse_qs(parsed.query)
|
|
245
|
+
query_dict = {k: v[0] if len(v) == 1 else v for k, v in parsed_qs.items()}
|
|
246
|
+
|
|
247
|
+
# Return parsed components
|
|
248
|
+
# Note: urlparse does NOT decode URL-encoded passwords, so we use unquote()
|
|
249
|
+
# Important: Check 'is not None' instead of truthiness to preserve empty strings
|
|
250
|
+
return ModelParsedDSN(
|
|
251
|
+
scheme=_assert_postgres_scheme(parsed.scheme),
|
|
252
|
+
username=unquote(parsed.username) if parsed.username is not None else None,
|
|
253
|
+
password=unquote(parsed.password) if parsed.password is not None else None,
|
|
254
|
+
hostname=parsed.hostname,
|
|
255
|
+
port=port,
|
|
256
|
+
database=database,
|
|
257
|
+
query=query_dict,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def sanitize_dsn(dsn: str) -> str:
|
|
262
|
+
"""Sanitize DSN by removing password for safe logging.
|
|
263
|
+
|
|
264
|
+
SECURITY: This function should ONLY be used for development/debugging.
|
|
265
|
+
Production code should NEVER log DSN values, even sanitized ones.
|
|
266
|
+
|
|
267
|
+
Replaces the password portion of the DSN with asterisks using URL parsing
|
|
268
|
+
instead of regex for robustness.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
dsn: Raw PostgreSQL connection string containing credentials
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Sanitized DSN with password replaced by '***'
|
|
275
|
+
|
|
276
|
+
Example:
|
|
277
|
+
>>> sanitize_dsn("postgresql://user:secret@host:5432/db")
|
|
278
|
+
'postgresql://user:***@host:5432/db'
|
|
279
|
+
|
|
280
|
+
>>> sanitize_dsn("postgresql://user:p%40ss@host/db")
|
|
281
|
+
'postgresql://user:***@host/db'
|
|
282
|
+
|
|
283
|
+
Note:
|
|
284
|
+
This function is intentionally NOT used in production error paths.
|
|
285
|
+
It exists as a utility for development/debugging only.
|
|
286
|
+
"""
|
|
287
|
+
try:
|
|
288
|
+
parsed = urlparse(dsn)
|
|
289
|
+
|
|
290
|
+
# Rebuild DSN with password masked
|
|
291
|
+
# Format: scheme://[user[:password]@]host[:port]/path[?query][#fragment]
|
|
292
|
+
netloc = parsed.hostname or ""
|
|
293
|
+
|
|
294
|
+
# Add port if present (handle ValueError from invalid ports)
|
|
295
|
+
try:
|
|
296
|
+
port = parsed.port
|
|
297
|
+
if port:
|
|
298
|
+
netloc = f"{netloc}:{port}"
|
|
299
|
+
except ValueError:
|
|
300
|
+
# Invalid port - include raw port string from netloc
|
|
301
|
+
# Extract port from raw netloc if present
|
|
302
|
+
if ":" in (parsed.netloc or ""):
|
|
303
|
+
# Keep original port notation even if invalid
|
|
304
|
+
parts = parsed.netloc.split("@")[-1] # Get host:port part
|
|
305
|
+
if ":" in parts:
|
|
306
|
+
netloc = parts
|
|
307
|
+
|
|
308
|
+
# Add username with masked password
|
|
309
|
+
if parsed.username:
|
|
310
|
+
if parsed.password:
|
|
311
|
+
netloc = f"{parsed.username}:***@{netloc}"
|
|
312
|
+
else:
|
|
313
|
+
netloc = f"{parsed.username}@{netloc}"
|
|
314
|
+
|
|
315
|
+
# Reconstruct URL
|
|
316
|
+
sanitized = f"{parsed.scheme}://{netloc}{parsed.path}"
|
|
317
|
+
|
|
318
|
+
# Add query string if present
|
|
319
|
+
if parsed.query:
|
|
320
|
+
sanitized = f"{sanitized}?{parsed.query}"
|
|
321
|
+
|
|
322
|
+
# Add fragment if present
|
|
323
|
+
if parsed.fragment:
|
|
324
|
+
sanitized = f"{sanitized}#{parsed.fragment}"
|
|
325
|
+
|
|
326
|
+
return sanitized
|
|
327
|
+
|
|
328
|
+
except Exception:
|
|
329
|
+
# If parsing fails, return a safe placeholder
|
|
330
|
+
return "[INVALID_DSN]"
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
__all__: list[str] = ["ModelParsedDSN", "parse_and_validate_dsn", "sanitize_dsn"]
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Environment variable parsing utilities for ONEX infrastructure.
|
|
4
|
+
|
|
5
|
+
This module provides type-safe environment variable parsing functions with:
|
|
6
|
+
- Comprehensive error handling using ONEX error patterns
|
|
7
|
+
- Range validation with configurable min/max values
|
|
8
|
+
- Transport-aware error context for debugging
|
|
9
|
+
- Security-conscious value redaction in error messages
|
|
10
|
+
|
|
11
|
+
Environment variable parsing is a common operation across infrastructure handlers
|
|
12
|
+
and configuration models. This module centralizes the parsing logic to reduce
|
|
13
|
+
code duplication and ensure consistent error handling.
|
|
14
|
+
|
|
15
|
+
Security Note:
|
|
16
|
+
Invalid values are always redacted in error messages to prevent potential
|
|
17
|
+
exposure of sensitive configuration values in logs or error outputs.
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
>>> from omnibase_infra.utils import parse_env_int, parse_env_float
|
|
21
|
+
>>> from omnibase_infra.enums import EnumInfraTransportType
|
|
22
|
+
>>>
|
|
23
|
+
>>> # Parse an integer with range validation
|
|
24
|
+
>>> pool_size = parse_env_int(
|
|
25
|
+
... "ONEX_DB_POOL_SIZE",
|
|
26
|
+
... default=5,
|
|
27
|
+
... min_value=1,
|
|
28
|
+
... max_value=100,
|
|
29
|
+
... transport_type=EnumInfraTransportType.DATABASE,
|
|
30
|
+
... service_name="db_handler",
|
|
31
|
+
... )
|
|
32
|
+
>>>
|
|
33
|
+
>>> # Parse a float with range validation
|
|
34
|
+
>>> timeout = parse_env_float(
|
|
35
|
+
... "ONEX_HTTP_TIMEOUT",
|
|
36
|
+
... default=30.0,
|
|
37
|
+
... min_value=0.1,
|
|
38
|
+
... max_value=3600.0,
|
|
39
|
+
... transport_type=EnumInfraTransportType.HTTP,
|
|
40
|
+
... service_name="http_handler",
|
|
41
|
+
... )
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
from __future__ import annotations
|
|
45
|
+
|
|
46
|
+
import logging
|
|
47
|
+
import os
|
|
48
|
+
from typing import TYPE_CHECKING
|
|
49
|
+
from uuid import uuid4
|
|
50
|
+
|
|
51
|
+
if TYPE_CHECKING:
|
|
52
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
53
|
+
|
|
54
|
+
logger = logging.getLogger(__name__)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def parse_env_int(
|
|
58
|
+
env_var: str,
|
|
59
|
+
default: int,
|
|
60
|
+
*,
|
|
61
|
+
min_value: int | None = None,
|
|
62
|
+
max_value: int | None = None,
|
|
63
|
+
transport_type: EnumInfraTransportType,
|
|
64
|
+
service_name: str = "unknown",
|
|
65
|
+
) -> int:
|
|
66
|
+
"""Parse an integer environment variable with validation and error handling.
|
|
67
|
+
|
|
68
|
+
Safely parses an environment variable as an integer, with optional range
|
|
69
|
+
validation and comprehensive error handling following ONEX patterns.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
env_var: Name of the environment variable to parse.
|
|
73
|
+
default: Default value to use if env var is not set or out of range.
|
|
74
|
+
min_value: Optional minimum valid value (inclusive). If the parsed value
|
|
75
|
+
is below this, default is returned with a warning.
|
|
76
|
+
max_value: Optional maximum valid value (inclusive). If the parsed value
|
|
77
|
+
is above this, default is returned with a warning.
|
|
78
|
+
transport_type: Required. Infrastructure transport type for error context.
|
|
79
|
+
service_name: Service name for error context. Defaults to "unknown".
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Parsed integer value if valid and within range, otherwise the default.
|
|
83
|
+
- If env var is not set: returns default
|
|
84
|
+
- If parsed value is below min_value: logs warning, returns default
|
|
85
|
+
- If parsed value is above max_value: logs warning, returns default
|
|
86
|
+
|
|
87
|
+
Raises:
|
|
88
|
+
ProtocolConfigurationError: If the environment variable contains a value
|
|
89
|
+
that cannot be parsed as an integer. The error includes transport-aware
|
|
90
|
+
context for debugging without exposing the actual invalid value.
|
|
91
|
+
|
|
92
|
+
Example:
|
|
93
|
+
>>> import os
|
|
94
|
+
>>> from omnibase_infra.enums import EnumInfraTransportType
|
|
95
|
+
>>> os.environ["MY_POOL_SIZE"] = "10"
|
|
96
|
+
>>> parse_env_int(
|
|
97
|
+
... "MY_POOL_SIZE", 5, min_value=1, max_value=100,
|
|
98
|
+
... transport_type=EnumInfraTransportType.DATABASE,
|
|
99
|
+
... )
|
|
100
|
+
10
|
|
101
|
+
>>> parse_env_int(
|
|
102
|
+
... "UNSET_VAR", 5,
|
|
103
|
+
... transport_type=EnumInfraTransportType.DATABASE,
|
|
104
|
+
... ) # Returns default
|
|
105
|
+
5
|
|
106
|
+
|
|
107
|
+
Note:
|
|
108
|
+
Following ONEX security guidelines, the actual invalid value is never
|
|
109
|
+
exposed in error messages. Only the environment variable name and
|
|
110
|
+
expected type are included.
|
|
111
|
+
"""
|
|
112
|
+
# Lazy imports to avoid circular dependency
|
|
113
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
114
|
+
|
|
115
|
+
raw_value = os.environ.get(env_var)
|
|
116
|
+
if raw_value is None:
|
|
117
|
+
return default
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
parsed = int(raw_value)
|
|
121
|
+
except ValueError:
|
|
122
|
+
context = ModelInfraErrorContext(
|
|
123
|
+
transport_type=transport_type,
|
|
124
|
+
operation="parse_env_config",
|
|
125
|
+
target_name=service_name,
|
|
126
|
+
correlation_id=uuid4(),
|
|
127
|
+
)
|
|
128
|
+
raise ProtocolConfigurationError(
|
|
129
|
+
f"Invalid value for {env_var} environment variable: expected integer",
|
|
130
|
+
context=context,
|
|
131
|
+
parameter=env_var,
|
|
132
|
+
value="[REDACTED]",
|
|
133
|
+
) from None
|
|
134
|
+
|
|
135
|
+
# Range validation with fallback to default
|
|
136
|
+
if min_value is not None and parsed < min_value:
|
|
137
|
+
logger.warning(
|
|
138
|
+
"Environment variable %s value %d is below minimum %d, using default %d",
|
|
139
|
+
env_var,
|
|
140
|
+
parsed,
|
|
141
|
+
min_value,
|
|
142
|
+
default,
|
|
143
|
+
)
|
|
144
|
+
return default
|
|
145
|
+
|
|
146
|
+
if max_value is not None and parsed > max_value:
|
|
147
|
+
logger.warning(
|
|
148
|
+
"Environment variable %s value %d is above maximum %d, using default %d",
|
|
149
|
+
env_var,
|
|
150
|
+
parsed,
|
|
151
|
+
max_value,
|
|
152
|
+
default,
|
|
153
|
+
)
|
|
154
|
+
return default
|
|
155
|
+
|
|
156
|
+
return parsed
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def parse_env_float(
|
|
160
|
+
env_var: str,
|
|
161
|
+
default: float,
|
|
162
|
+
*,
|
|
163
|
+
min_value: float | None = None,
|
|
164
|
+
max_value: float | None = None,
|
|
165
|
+
transport_type: EnumInfraTransportType,
|
|
166
|
+
service_name: str = "unknown",
|
|
167
|
+
) -> float:
|
|
168
|
+
"""Parse a float environment variable with validation and error handling.
|
|
169
|
+
|
|
170
|
+
Safely parses an environment variable as a float, with optional range
|
|
171
|
+
validation and comprehensive error handling following ONEX patterns.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
env_var: Name of the environment variable to parse.
|
|
175
|
+
default: Default value to use if env var is not set or out of range.
|
|
176
|
+
min_value: Optional minimum valid value (inclusive). If the parsed value
|
|
177
|
+
is below this, default is returned with a warning.
|
|
178
|
+
max_value: Optional maximum valid value (inclusive). If the parsed value
|
|
179
|
+
is above this, default is returned with a warning.
|
|
180
|
+
transport_type: Required. Infrastructure transport type for error context.
|
|
181
|
+
service_name: Service name for error context. Defaults to "unknown".
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Parsed float value if valid and within range, otherwise the default.
|
|
185
|
+
- If env var is not set: returns default
|
|
186
|
+
- If parsed value is below min_value: logs warning, returns default
|
|
187
|
+
- If parsed value is above max_value: logs warning, returns default
|
|
188
|
+
|
|
189
|
+
Raises:
|
|
190
|
+
ProtocolConfigurationError: If the environment variable contains a value
|
|
191
|
+
that cannot be parsed as a float. The error includes transport-aware
|
|
192
|
+
context for debugging without exposing the actual invalid value.
|
|
193
|
+
|
|
194
|
+
Example:
|
|
195
|
+
>>> import os
|
|
196
|
+
>>> from omnibase_infra.enums import EnumInfraTransportType
|
|
197
|
+
>>> os.environ["MY_TIMEOUT"] = "30.5"
|
|
198
|
+
>>> parse_env_float(
|
|
199
|
+
... "MY_TIMEOUT", 10.0, min_value=0.1, max_value=3600.0,
|
|
200
|
+
... transport_type=EnumInfraTransportType.HTTP,
|
|
201
|
+
... )
|
|
202
|
+
30.5
|
|
203
|
+
>>> parse_env_float(
|
|
204
|
+
... "UNSET_VAR", 10.0,
|
|
205
|
+
... transport_type=EnumInfraTransportType.HTTP,
|
|
206
|
+
... ) # Returns default
|
|
207
|
+
10.0
|
|
208
|
+
|
|
209
|
+
Note:
|
|
210
|
+
Following ONEX security guidelines, the actual invalid value is never
|
|
211
|
+
exposed in error messages. Only the environment variable name and
|
|
212
|
+
expected type are included.
|
|
213
|
+
"""
|
|
214
|
+
# Lazy imports to avoid circular dependency
|
|
215
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
216
|
+
|
|
217
|
+
raw_value = os.environ.get(env_var)
|
|
218
|
+
if raw_value is None:
|
|
219
|
+
return default
|
|
220
|
+
|
|
221
|
+
try:
|
|
222
|
+
parsed = float(raw_value)
|
|
223
|
+
except ValueError:
|
|
224
|
+
context = ModelInfraErrorContext(
|
|
225
|
+
transport_type=transport_type,
|
|
226
|
+
operation="parse_env_config",
|
|
227
|
+
target_name=service_name,
|
|
228
|
+
correlation_id=uuid4(),
|
|
229
|
+
)
|
|
230
|
+
raise ProtocolConfigurationError(
|
|
231
|
+
f"Invalid value for {env_var} environment variable: expected numeric value",
|
|
232
|
+
context=context,
|
|
233
|
+
parameter=env_var,
|
|
234
|
+
value="[REDACTED]",
|
|
235
|
+
) from None
|
|
236
|
+
|
|
237
|
+
# Range validation with fallback to default
|
|
238
|
+
if min_value is not None and parsed < min_value:
|
|
239
|
+
logger.warning(
|
|
240
|
+
"Environment variable %s value %f is below minimum %f, using default %f",
|
|
241
|
+
env_var,
|
|
242
|
+
parsed,
|
|
243
|
+
min_value,
|
|
244
|
+
default,
|
|
245
|
+
)
|
|
246
|
+
return default
|
|
247
|
+
|
|
248
|
+
if max_value is not None and parsed > max_value:
|
|
249
|
+
logger.warning(
|
|
250
|
+
"Environment variable %s value %f is above maximum %f, using default %f",
|
|
251
|
+
env_var,
|
|
252
|
+
parsed,
|
|
253
|
+
max_value,
|
|
254
|
+
default,
|
|
255
|
+
)
|
|
256
|
+
return default
|
|
257
|
+
|
|
258
|
+
return parsed
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
__all__: list[str] = [
|
|
262
|
+
"parse_env_int",
|
|
263
|
+
"parse_env_float",
|
|
264
|
+
]
|