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,138 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Compute Registry Key Model.
|
|
4
|
+
|
|
5
|
+
Strongly-typed key for RegistryCompute dict operations.
|
|
6
|
+
Replaces primitive tuple[str, str] pattern.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
12
|
+
|
|
13
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
14
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
15
|
+
from omnibase_infra.utils import validate_version_lenient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelComputeKey(BaseModel):
|
|
19
|
+
"""Strongly-typed compute registry key.
|
|
20
|
+
|
|
21
|
+
Replaces tuple[str, str] pattern with named fields,
|
|
22
|
+
validation, and self-documenting structure.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
plugin_id: Unique identifier for the compute plugin (e.g., 'json_normalizer')
|
|
26
|
+
version: Semantic version string (e.g., '1.0.0')
|
|
27
|
+
|
|
28
|
+
Example:
|
|
29
|
+
>>> key = ModelComputeKey(plugin_id="json_normalizer", version="1.0.0")
|
|
30
|
+
>>> print(key.to_tuple())
|
|
31
|
+
('json_normalizer', '1.0.0')
|
|
32
|
+
>>> # Create from tuple
|
|
33
|
+
>>> key2 = ModelComputeKey.from_tuple(("xml_parser", "2.1.0"))
|
|
34
|
+
>>> print(key2.plugin_id)
|
|
35
|
+
'xml_parser'
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
plugin_id: str = Field(
|
|
39
|
+
...,
|
|
40
|
+
min_length=1,
|
|
41
|
+
description="Unique compute plugin identifier",
|
|
42
|
+
)
|
|
43
|
+
version: str = Field(
|
|
44
|
+
default="1.0.0",
|
|
45
|
+
description="Semantic version string",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
model_config = ConfigDict(
|
|
49
|
+
frozen=True, # Make hashable for dict keys
|
|
50
|
+
str_strip_whitespace=True,
|
|
51
|
+
from_attributes=True, # pytest-xdist compatibility
|
|
52
|
+
extra="forbid",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
@field_validator("version")
|
|
56
|
+
@classmethod
|
|
57
|
+
def validate_semver(cls, v: str) -> str:
|
|
58
|
+
"""Validate semantic version format.
|
|
59
|
+
|
|
60
|
+
Accepts formats like:
|
|
61
|
+
- "1.0.0" (major.minor.patch)
|
|
62
|
+
- "1.0" (major.minor)
|
|
63
|
+
- "1" (major only)
|
|
64
|
+
- "1.2.3-alpha" (with prerelease)
|
|
65
|
+
- "1.2.3-beta.1" (with prerelease segments)
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
v: The version string to validate
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The validated version string
|
|
72
|
+
|
|
73
|
+
Raises:
|
|
74
|
+
ValueError: If version format is invalid
|
|
75
|
+
"""
|
|
76
|
+
return validate_version_lenient(v)
|
|
77
|
+
|
|
78
|
+
def to_tuple(self) -> tuple[str, str]:
|
|
79
|
+
"""Convert to tuple representation.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Tuple of (plugin_id, version)
|
|
83
|
+
"""
|
|
84
|
+
return (self.plugin_id, self.version)
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def from_tuple(cls, key_tuple: tuple[str, str]) -> ModelComputeKey:
|
|
88
|
+
"""Create from tuple representation.
|
|
89
|
+
|
|
90
|
+
Validates the input tuple before creating the key instance.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
key_tuple: Tuple of (plugin_id, version). Must be a tuple
|
|
94
|
+
with exactly 2 string elements.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
ModelComputeKey instance
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
ValueError: If key_tuple is not a tuple, doesn't have exactly
|
|
101
|
+
2 elements, or contains non-string values.
|
|
102
|
+
"""
|
|
103
|
+
# Validate tuple type and length
|
|
104
|
+
context = ModelInfraErrorContext(
|
|
105
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
106
|
+
operation="from_tuple",
|
|
107
|
+
)
|
|
108
|
+
if not isinstance(key_tuple, tuple):
|
|
109
|
+
raise ProtocolConfigurationError(
|
|
110
|
+
f"Expected tuple[str, str], got {type(key_tuple).__name__}",
|
|
111
|
+
context=context,
|
|
112
|
+
)
|
|
113
|
+
if len(key_tuple) != 2:
|
|
114
|
+
raise ProtocolConfigurationError(
|
|
115
|
+
f"Expected tuple with 2 elements, got {len(key_tuple)}",
|
|
116
|
+
context=context,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Validate element types
|
|
120
|
+
plugin_id, version = key_tuple
|
|
121
|
+
if not isinstance(plugin_id, str):
|
|
122
|
+
raise ProtocolConfigurationError(
|
|
123
|
+
f"plugin_id must be a string, got {type(plugin_id).__name__}",
|
|
124
|
+
context=context,
|
|
125
|
+
)
|
|
126
|
+
if not isinstance(version, str):
|
|
127
|
+
raise ProtocolConfigurationError(
|
|
128
|
+
f"version must be a string, got {type(version).__name__}",
|
|
129
|
+
context=context,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return cls(
|
|
133
|
+
plugin_id=plugin_id,
|
|
134
|
+
version=version,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
__all__ = ["ModelComputeKey"]
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Compute Registration Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for compute plugin registration parameters,
|
|
6
|
+
used to register compute plugins with the RegistryCompute.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
14
|
+
|
|
15
|
+
from omnibase_infra.utils import validate_version_lenient
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from omnibase_infra.protocols import ProtocolPluginCompute
|
|
19
|
+
|
|
20
|
+
ComputePluginClass = type[ProtocolPluginCompute]
|
|
21
|
+
else:
|
|
22
|
+
# NOTE: At runtime we use generic type to avoid circular import.
|
|
23
|
+
# Type checkers see proper protocol type via TYPE_CHECKING block.
|
|
24
|
+
ComputePluginClass = type # type: ignore[assignment,misc]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ModelComputeRegistration(BaseModel):
|
|
28
|
+
"""Model for compute plugin registration parameters.
|
|
29
|
+
|
|
30
|
+
Encapsulates all parameters needed to register a compute plugin with
|
|
31
|
+
the RegistryCompute.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
plugin_id: Unique identifier for the plugin (e.g., 'json_normalizer')
|
|
35
|
+
plugin_class: Plugin implementation class
|
|
36
|
+
version: Semantic version string (default: "1.0.0")
|
|
37
|
+
description: Human-readable description of the plugin
|
|
38
|
+
deterministic_async: If True, allows async interface (MUST be explicitly flagged)
|
|
39
|
+
|
|
40
|
+
Example:
|
|
41
|
+
>>> from omnibase_infra.runtime.models import ModelComputeRegistration
|
|
42
|
+
>>> registration = ModelComputeRegistration(
|
|
43
|
+
... plugin_id="json_normalizer",
|
|
44
|
+
... plugin_class=JsonNormalizerPlugin,
|
|
45
|
+
... version="1.0.0",
|
|
46
|
+
... description="Normalizes JSON for deterministic comparison",
|
|
47
|
+
... )
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(
|
|
51
|
+
strict=False,
|
|
52
|
+
frozen=True,
|
|
53
|
+
extra="forbid",
|
|
54
|
+
arbitrary_types_allowed=True, # Required for type[ProtocolPluginCompute]
|
|
55
|
+
from_attributes=True, # pytest-xdist compatibility
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
plugin_id: str = Field(
|
|
59
|
+
...,
|
|
60
|
+
min_length=1,
|
|
61
|
+
description="Unique compute plugin identifier (e.g., 'json_normalizer')",
|
|
62
|
+
)
|
|
63
|
+
plugin_class: ComputePluginClass = Field(
|
|
64
|
+
...,
|
|
65
|
+
description="Compute plugin implementation class",
|
|
66
|
+
)
|
|
67
|
+
version: str = Field(
|
|
68
|
+
default="1.0.0",
|
|
69
|
+
description="Semantic version string",
|
|
70
|
+
)
|
|
71
|
+
description: str = Field(
|
|
72
|
+
default="",
|
|
73
|
+
description="Human-readable description of the plugin",
|
|
74
|
+
)
|
|
75
|
+
deterministic_async: bool = Field(
|
|
76
|
+
default=False,
|
|
77
|
+
description="If True, allows async interface. MUST be explicitly flagged for async plugins.",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
@field_validator("version")
|
|
81
|
+
@classmethod
|
|
82
|
+
def validate_version(cls, v: str) -> str:
|
|
83
|
+
"""Validate semantic version format.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
v: The version string to validate
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
The validated version string
|
|
90
|
+
|
|
91
|
+
Raises:
|
|
92
|
+
ValueError: If version format is invalid
|
|
93
|
+
"""
|
|
94
|
+
return validate_version_lenient(v)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
__all__: list[str] = ["ModelComputeRegistration"]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Configuration cache entry model.
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 0.8.0
|
|
6
|
+
Initial implementation for OMN-765.
|
|
7
|
+
|
|
8
|
+
This module provides the ModelConfigCacheEntry for internal cache entries
|
|
9
|
+
in the BindingConfigResolver.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from datetime import UTC, datetime
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
17
|
+
|
|
18
|
+
from omnibase_infra.runtime.models.model_binding_config import ModelBindingConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelConfigCacheEntry(BaseModel):
|
|
22
|
+
"""Internal cache entry for resolved configurations.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
config: The resolved binding configuration.
|
|
26
|
+
expires_at: When this cache entry expires.
|
|
27
|
+
source: Description of the configuration source (for debugging).
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
model_config = ConfigDict(
|
|
31
|
+
strict=True,
|
|
32
|
+
frozen=True,
|
|
33
|
+
extra="forbid",
|
|
34
|
+
from_attributes=True,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
config: ModelBindingConfig = Field(
|
|
38
|
+
...,
|
|
39
|
+
description="The resolved binding configuration.",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
expires_at: datetime = Field(
|
|
43
|
+
...,
|
|
44
|
+
description="When this cache entry expires.",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
source: str = Field(
|
|
48
|
+
...,
|
|
49
|
+
description="Description of the configuration source (for debugging).",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def is_expired(self) -> bool:
|
|
53
|
+
"""Check if this cache entry has expired.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
True if expired, False otherwise.
|
|
57
|
+
"""
|
|
58
|
+
return datetime.now(UTC) > self.expires_at
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
__all__: list[str] = ["ModelConfigCacheEntry"]
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Configuration reference parsing model.
|
|
4
|
+
|
|
5
|
+
This module provides the ModelConfigRef model for parsing and validating
|
|
6
|
+
configuration references that point to external configuration sources.
|
|
7
|
+
Handler configs can reference external configuration via the `config_ref` field.
|
|
8
|
+
|
|
9
|
+
Supported Reference Formats:
|
|
10
|
+
File references (preferred shorthand format)::
|
|
11
|
+
|
|
12
|
+
file:configs/handler.yaml # Relative path (preferred)
|
|
13
|
+
file:/absolute/path/to/config.yaml # Absolute path
|
|
14
|
+
file://relative/path/config.yaml # Also supported (backwards compat)
|
|
15
|
+
|
|
16
|
+
Environment variable references::
|
|
17
|
+
|
|
18
|
+
env:HANDLER_CONFIG_JSON # JSON config in env var
|
|
19
|
+
env:DATABASE_CONFIG_YAML # YAML config in env var
|
|
20
|
+
|
|
21
|
+
Vault secret references::
|
|
22
|
+
|
|
23
|
+
vault:secret/data/handlers/db#config # Specific field from secret
|
|
24
|
+
vault:secret/data/handlers/db # Whole secret as JSON/YAML
|
|
25
|
+
|
|
26
|
+
Security:
|
|
27
|
+
File paths are validated to block dangerous path traversal patterns (multiple
|
|
28
|
+
consecutive ../ sequences). Single parent directory references (../) are allowed
|
|
29
|
+
as legitimate use cases. Full security enforcement happens at the resolution layer
|
|
30
|
+
where resolved paths are validated against the config_dir boundary.
|
|
31
|
+
All schemes are validated against the allowed set.
|
|
32
|
+
|
|
33
|
+
Design Pattern:
|
|
34
|
+
ModelConfigRefParseResult implements a result pattern where parsing
|
|
35
|
+
never throws exceptions for invalid input. Use the boolean context
|
|
36
|
+
or check `success` to determine if parsing succeeded.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
>>> from omnibase_infra.runtime.models import ModelConfigRef
|
|
40
|
+
>>>
|
|
41
|
+
>>> # Parse a file reference
|
|
42
|
+
>>> result = ModelConfigRef.parse("file:configs/db.yaml")
|
|
43
|
+
>>> if result:
|
|
44
|
+
... print(f"Scheme: {result.config_ref.scheme}")
|
|
45
|
+
... print(f"Path: {result.config_ref.path}")
|
|
46
|
+
Scheme: EnumConfigRefScheme.FILE
|
|
47
|
+
Path: configs/db.yaml
|
|
48
|
+
>>>
|
|
49
|
+
>>> # Parse a vault reference with fragment
|
|
50
|
+
>>> result = ModelConfigRef.parse("vault:secret/db#password")
|
|
51
|
+
>>> if result:
|
|
52
|
+
... print(f"Fragment: {result.config_ref.fragment}")
|
|
53
|
+
Fragment: password
|
|
54
|
+
>>>
|
|
55
|
+
>>> # Handle invalid input
|
|
56
|
+
>>> result = ModelConfigRef.parse("unknown:path")
|
|
57
|
+
>>> if not result:
|
|
58
|
+
... print(f"Error: {result.error_message}")
|
|
59
|
+
Error: Unknown scheme 'unknown'. Supported: file, env, vault
|
|
60
|
+
|
|
61
|
+
.. versionadded:: 0.8.0
|
|
62
|
+
Initial implementation for OMN-765.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
from __future__ import annotations
|
|
66
|
+
|
|
67
|
+
import re
|
|
68
|
+
|
|
69
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
70
|
+
|
|
71
|
+
from omnibase_infra.runtime.enums.enum_config_ref_scheme import EnumConfigRefScheme
|
|
72
|
+
from omnibase_infra.runtime.models.model_config_ref_parse_result import (
|
|
73
|
+
ModelConfigRefParseResult,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Pattern to detect dangerous path traversal attempts (multiple consecutive ../)
|
|
77
|
+
# Single parent directory references like ../config.yaml are allowed as legitimate use cases.
|
|
78
|
+
# Security enforcement happens at the resolution layer where resolved paths are validated
|
|
79
|
+
# against the config_dir boundary.
|
|
80
|
+
_DANGEROUS_TRAVERSAL_PATTERN = re.compile(r"(\.\.([/\\])\.\.)|(\.\.[/\\]){3,}")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class ModelConfigRef(BaseModel):
|
|
84
|
+
"""Parsed configuration reference.
|
|
85
|
+
|
|
86
|
+
Represents a structured form of a config_ref string after parsing.
|
|
87
|
+
Use the `parse()` classmethod to create instances from raw strings.
|
|
88
|
+
|
|
89
|
+
Attributes:
|
|
90
|
+
scheme: The configuration source type (file, env, vault).
|
|
91
|
+
path: The path portion after the scheme (file path, env var name, or vault path).
|
|
92
|
+
fragment: Optional fragment identifier (for vault:path#field references).
|
|
93
|
+
|
|
94
|
+
Examples:
|
|
95
|
+
>>> ref = ModelConfigRef(
|
|
96
|
+
... scheme=EnumConfigRefScheme.FILE,
|
|
97
|
+
... path="configs/db.yaml"
|
|
98
|
+
... )
|
|
99
|
+
>>> ref.to_uri()
|
|
100
|
+
'file:configs/db.yaml'
|
|
101
|
+
>>>
|
|
102
|
+
>>> ref = ModelConfigRef(
|
|
103
|
+
... scheme=EnumConfigRefScheme.VAULT,
|
|
104
|
+
... path="secret/data/db",
|
|
105
|
+
... fragment="password"
|
|
106
|
+
... )
|
|
107
|
+
>>> ref.to_uri()
|
|
108
|
+
'vault:secret/data/db#password'
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
model_config = ConfigDict(
|
|
112
|
+
strict=True,
|
|
113
|
+
frozen=True,
|
|
114
|
+
extra="forbid",
|
|
115
|
+
from_attributes=True,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
scheme: EnumConfigRefScheme = Field(
|
|
119
|
+
...,
|
|
120
|
+
description="The configuration source type (file, env, vault).",
|
|
121
|
+
)
|
|
122
|
+
path: str = Field(
|
|
123
|
+
...,
|
|
124
|
+
min_length=1,
|
|
125
|
+
description="The path portion after the scheme. For file: a filesystem path, "
|
|
126
|
+
"for env: an environment variable name, for vault: a vault path.",
|
|
127
|
+
)
|
|
128
|
+
fragment: str | None = Field(
|
|
129
|
+
default=None,
|
|
130
|
+
description="Optional fragment identifier for vault references (vault:path#field). "
|
|
131
|
+
"Used to extract a specific field from a vault secret.",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
@field_validator("path")
|
|
135
|
+
@classmethod
|
|
136
|
+
def validate_path_no_dangerous_traversal(cls, v: str) -> str:
|
|
137
|
+
"""Validate that file paths do not contain dangerous path traversal sequences.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
v: The path value to validate.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
The validated path.
|
|
144
|
+
|
|
145
|
+
Raises:
|
|
146
|
+
ValueError: If the path contains dangerous path traversal patterns.
|
|
147
|
+
|
|
148
|
+
Note:
|
|
149
|
+
Single parent directory references (../) are allowed as legitimate use cases
|
|
150
|
+
for referencing config files in parent directories (e.g., file:../config.yaml).
|
|
151
|
+
Only patterns that could indicate directory escape attacks are blocked
|
|
152
|
+
(e.g., multiple consecutive ../ sequences).
|
|
153
|
+
|
|
154
|
+
Full security enforcement happens at the resolution layer where resolved
|
|
155
|
+
paths are validated against the config_dir boundary.
|
|
156
|
+
"""
|
|
157
|
+
if _DANGEROUS_TRAVERSAL_PATTERN.search(v):
|
|
158
|
+
raise ValueError(
|
|
159
|
+
f"Dangerous path traversal patterns are not allowed in config paths: {v}"
|
|
160
|
+
)
|
|
161
|
+
return v
|
|
162
|
+
|
|
163
|
+
@classmethod
|
|
164
|
+
def parse(cls, config_ref: str) -> ModelConfigRefParseResult:
|
|
165
|
+
"""Parse a config_ref string into a structured ModelConfigRef.
|
|
166
|
+
|
|
167
|
+
This method never raises exceptions for invalid input. Instead, it returns
|
|
168
|
+
a ModelConfigRefParseResult that can be checked for success.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
config_ref: The raw config_ref string to parse. Supported formats:
|
|
172
|
+
- file:path/to/config.yaml (relative path - preferred)
|
|
173
|
+
- file:/absolute/path (absolute path)
|
|
174
|
+
- file://path (also supported for backwards compatibility)
|
|
175
|
+
- env:VAR_NAME (environment variable)
|
|
176
|
+
- vault:path/to/secret (whole vault secret)
|
|
177
|
+
- vault:path/to/secret#field (specific vault field)
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
ModelConfigRefParseResult with success=True and config_ref set on success,
|
|
181
|
+
or success=False and error_message set on failure.
|
|
182
|
+
|
|
183
|
+
Examples:
|
|
184
|
+
>>> result = ModelConfigRef.parse("file:configs/db.yaml")
|
|
185
|
+
>>> result.success
|
|
186
|
+
True
|
|
187
|
+
>>> result.config_ref.path
|
|
188
|
+
'configs/db.yaml'
|
|
189
|
+
>>>
|
|
190
|
+
>>> result = ModelConfigRef.parse("")
|
|
191
|
+
>>> result.success
|
|
192
|
+
False
|
|
193
|
+
>>> result.error_message
|
|
194
|
+
'Config reference cannot be empty'
|
|
195
|
+
"""
|
|
196
|
+
# Handle empty input
|
|
197
|
+
if not config_ref:
|
|
198
|
+
return ModelConfigRefParseResult(
|
|
199
|
+
success=False,
|
|
200
|
+
error_message="Config reference cannot be empty",
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
config_ref = config_ref.strip()
|
|
204
|
+
if not config_ref:
|
|
205
|
+
return ModelConfigRefParseResult(
|
|
206
|
+
success=False,
|
|
207
|
+
error_message="Config reference cannot be empty",
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Find scheme separator
|
|
211
|
+
colon_idx = config_ref.find(":")
|
|
212
|
+
if colon_idx == -1:
|
|
213
|
+
return ModelConfigRefParseResult(
|
|
214
|
+
success=False,
|
|
215
|
+
error_message=f"Invalid config reference format: missing scheme separator ':' in '{config_ref}'",
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
scheme_str = config_ref[:colon_idx].lower()
|
|
219
|
+
path_part = config_ref[colon_idx + 1 :]
|
|
220
|
+
|
|
221
|
+
# Validate scheme
|
|
222
|
+
try:
|
|
223
|
+
scheme = EnumConfigRefScheme(scheme_str)
|
|
224
|
+
except ValueError:
|
|
225
|
+
valid_schemes = ", ".join(s.value for s in EnumConfigRefScheme)
|
|
226
|
+
return ModelConfigRefParseResult(
|
|
227
|
+
success=False,
|
|
228
|
+
error_message=f"Unknown scheme '{scheme_str}'. Supported: {valid_schemes}",
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Handle file:// with multiple slashes
|
|
232
|
+
if scheme == EnumConfigRefScheme.FILE:
|
|
233
|
+
# file:///absolute/path -> /absolute/path
|
|
234
|
+
# file://relative/path -> relative/path
|
|
235
|
+
# file:path -> path
|
|
236
|
+
if path_part.startswith("//"):
|
|
237
|
+
# file:// prefix - strip the //
|
|
238
|
+
path_part = path_part[2:]
|
|
239
|
+
elif scheme == EnumConfigRefScheme.ENV:
|
|
240
|
+
# env:VAR_NAME - no special handling needed
|
|
241
|
+
pass
|
|
242
|
+
elif scheme == EnumConfigRefScheme.VAULT:
|
|
243
|
+
# vault:path#fragment - handled below
|
|
244
|
+
pass
|
|
245
|
+
|
|
246
|
+
# Handle empty path after scheme
|
|
247
|
+
if not path_part:
|
|
248
|
+
return ModelConfigRefParseResult(
|
|
249
|
+
success=False,
|
|
250
|
+
error_message=f"Missing path after scheme '{scheme_str}:'",
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
# Extract fragment for vault references
|
|
254
|
+
fragment: str | None = None
|
|
255
|
+
if scheme == EnumConfigRefScheme.VAULT and "#" in path_part:
|
|
256
|
+
hash_idx = path_part.rfind("#")
|
|
257
|
+
fragment = path_part[hash_idx + 1 :]
|
|
258
|
+
path_part = path_part[:hash_idx]
|
|
259
|
+
|
|
260
|
+
if not fragment:
|
|
261
|
+
return ModelConfigRefParseResult(
|
|
262
|
+
success=False,
|
|
263
|
+
error_message="Empty fragment after '#' in vault reference",
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
if not path_part:
|
|
267
|
+
return ModelConfigRefParseResult(
|
|
268
|
+
success=False,
|
|
269
|
+
error_message="Missing vault path before '#' fragment",
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
# Validate path for dangerous traversal patterns
|
|
273
|
+
if _DANGEROUS_TRAVERSAL_PATTERN.search(path_part):
|
|
274
|
+
return ModelConfigRefParseResult(
|
|
275
|
+
success=False,
|
|
276
|
+
error_message=f"Dangerous path traversal patterns are not allowed: {path_part}",
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
# Create the config ref
|
|
280
|
+
try:
|
|
281
|
+
ref = cls(
|
|
282
|
+
scheme=scheme,
|
|
283
|
+
path=path_part,
|
|
284
|
+
fragment=fragment,
|
|
285
|
+
)
|
|
286
|
+
return ModelConfigRefParseResult(
|
|
287
|
+
success=True,
|
|
288
|
+
config_ref=ref,
|
|
289
|
+
)
|
|
290
|
+
except ValueError as e:
|
|
291
|
+
return ModelConfigRefParseResult(
|
|
292
|
+
success=False,
|
|
293
|
+
error_message=str(e),
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
def to_uri(self) -> str:
|
|
297
|
+
"""Reconstruct the URI string from the parsed components.
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
The config reference as a URI string.
|
|
301
|
+
|
|
302
|
+
Examples:
|
|
303
|
+
>>> ref = ModelConfigRef(
|
|
304
|
+
... scheme=EnumConfigRefScheme.FILE,
|
|
305
|
+
... path="configs/db.yaml"
|
|
306
|
+
... )
|
|
307
|
+
>>> ref.to_uri()
|
|
308
|
+
'file:configs/db.yaml'
|
|
309
|
+
>>>
|
|
310
|
+
>>> ref = ModelConfigRef(
|
|
311
|
+
... scheme=EnumConfigRefScheme.VAULT,
|
|
312
|
+
... path="secret/db",
|
|
313
|
+
... fragment="password"
|
|
314
|
+
... )
|
|
315
|
+
>>> ref.to_uri()
|
|
316
|
+
'vault:secret/db#password'
|
|
317
|
+
"""
|
|
318
|
+
uri = f"{self.scheme.value}:{self.path}"
|
|
319
|
+
if self.fragment is not None:
|
|
320
|
+
uri = f"{uri}#{self.fragment}"
|
|
321
|
+
return uri
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# Rebuild models to resolve forward references from __future__ annotations
|
|
325
|
+
ModelConfigRef.model_rebuild()
|
|
326
|
+
ModelConfigRefParseResult.model_rebuild()
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
__all__: list[str] = [
|
|
330
|
+
"ModelConfigRef",
|
|
331
|
+
]
|