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,415 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Projector Schema Model.
|
|
4
|
+
|
|
5
|
+
Defines the complete schema for a projection table, including columns,
|
|
6
|
+
indexes, and constraints. Used by ProjectorSchemaValidator for schema
|
|
7
|
+
validation and migration SQL generation.
|
|
8
|
+
|
|
9
|
+
NOTE: This model is temporarily defined in omnibase_infra until omnibase_core
|
|
10
|
+
provides it at omnibase_core.models.projectors. Once available, this should
|
|
11
|
+
be moved there and re-exported from this module.
|
|
12
|
+
|
|
13
|
+
Related Tickets:
|
|
14
|
+
- OMN-1168: ProjectorPluginLoader contract discovery loading
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
from collections import Counter
|
|
21
|
+
from typing import Literal
|
|
22
|
+
|
|
23
|
+
from pydantic import BaseModel, Field, field_validator, model_validator
|
|
24
|
+
|
|
25
|
+
from omnibase_infra.models.projectors.model_projector_column import (
|
|
26
|
+
ModelProjectorColumn,
|
|
27
|
+
)
|
|
28
|
+
from omnibase_infra.models.projectors.model_projector_index import ModelProjectorIndex
|
|
29
|
+
from omnibase_infra.models.projectors.util_sql_identifiers import (
|
|
30
|
+
IDENT_PATTERN,
|
|
31
|
+
escape_sql_string,
|
|
32
|
+
quote_identifier,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ModelProjectorSchema(BaseModel):
|
|
37
|
+
"""Complete schema definition for a projection table.
|
|
38
|
+
|
|
39
|
+
Describes the table name, columns, indexes, and constraints for a
|
|
40
|
+
projection table. Used by ProjectorSchemaValidator for schema validation
|
|
41
|
+
and migration SQL generation.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
table_name: Name of the projection table (snake_case by convention).
|
|
45
|
+
schema_name: PostgreSQL schema name (currently only 'public' supported).
|
|
46
|
+
columns: List of column definitions.
|
|
47
|
+
indexes: List of index definitions (optional).
|
|
48
|
+
schema_version: Schema version string (semver format).
|
|
49
|
+
|
|
50
|
+
Schema Limitation:
|
|
51
|
+
Currently only the 'public' schema is supported. This is because:
|
|
52
|
+
1. Most ONEX projections use the default public schema
|
|
53
|
+
2. Multi-schema support requires additional migration complexity
|
|
54
|
+
3. Schema-qualified identifiers need additional SQL generation changes
|
|
55
|
+
|
|
56
|
+
Future versions may support custom schemas (see ticket backlog).
|
|
57
|
+
|
|
58
|
+
Example:
|
|
59
|
+
>>> from omnibase_infra.models.projectors import (
|
|
60
|
+
... ModelProjectorSchema,
|
|
61
|
+
... ModelProjectorColumn,
|
|
62
|
+
... ModelProjectorIndex,
|
|
63
|
+
... )
|
|
64
|
+
>>> schema = ModelProjectorSchema(
|
|
65
|
+
... table_name="registration_projections",
|
|
66
|
+
... columns=[
|
|
67
|
+
... ModelProjectorColumn(
|
|
68
|
+
... name="entity_id",
|
|
69
|
+
... column_type="uuid",
|
|
70
|
+
... nullable=False,
|
|
71
|
+
... primary_key=True,
|
|
72
|
+
... ),
|
|
73
|
+
... ModelProjectorColumn(
|
|
74
|
+
... name="current_state",
|
|
75
|
+
... column_type="varchar",
|
|
76
|
+
... length=64,
|
|
77
|
+
... nullable=False,
|
|
78
|
+
... ),
|
|
79
|
+
... ],
|
|
80
|
+
... indexes=[
|
|
81
|
+
... ModelProjectorIndex(
|
|
82
|
+
... name="idx_registration_state",
|
|
83
|
+
... columns=["current_state"],
|
|
84
|
+
... ),
|
|
85
|
+
... ],
|
|
86
|
+
... schema_version="1.0.0",
|
|
87
|
+
... )
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
table_name: str = Field(
|
|
91
|
+
...,
|
|
92
|
+
description="Name of the projection table (snake_case by convention)",
|
|
93
|
+
min_length=1,
|
|
94
|
+
max_length=128,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
schema_name: Literal["public"] = Field(
|
|
98
|
+
default="public",
|
|
99
|
+
description=(
|
|
100
|
+
"PostgreSQL schema name. Currently only 'public' is supported. "
|
|
101
|
+
"This limitation exists because multi-schema support requires "
|
|
102
|
+
"additional migration tooling and schema-qualified SQL generation."
|
|
103
|
+
),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
columns: list[ModelProjectorColumn] = Field(
|
|
107
|
+
...,
|
|
108
|
+
description="List of column definitions",
|
|
109
|
+
min_length=1,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
indexes: list[ModelProjectorIndex] = Field(
|
|
113
|
+
default_factory=list,
|
|
114
|
+
description="List of index definitions",
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
schema_version: str = Field(
|
|
118
|
+
default="1.0.0",
|
|
119
|
+
description="Schema version string (semver format)",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
description: str | None = Field(
|
|
123
|
+
default=None,
|
|
124
|
+
description="Optional human-readable description for SQL COMMENT ON TABLE",
|
|
125
|
+
max_length=1024,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
model_config = {
|
|
129
|
+
"extra": "forbid",
|
|
130
|
+
# NOTE: frozen=True provides shallow immutability only. The `columns` and
|
|
131
|
+
# `indexes` fields are lists which are protected from reassignment, but list
|
|
132
|
+
# contents could theoretically be modified via index access. However, since
|
|
133
|
+
# the contained objects (ModelProjectorColumn, ModelProjectorIndex) are
|
|
134
|
+
# themselves frozen, practical deep immutability is achieved. For strict
|
|
135
|
+
# deep immutability, consider using tuple[ModelProjectorColumn, ...] instead.
|
|
136
|
+
"frozen": True,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@field_validator("table_name")
|
|
140
|
+
@classmethod
|
|
141
|
+
def validate_table_name_identifier(cls, v: str) -> str:
|
|
142
|
+
"""Validate that the table name is a valid PostgreSQL identifier.
|
|
143
|
+
|
|
144
|
+
Prevents SQL injection by ensuring the name matches the safe identifier
|
|
145
|
+
pattern (letters, digits, underscores, starting with letter or underscore).
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
v: Table name to validate.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Validated table name.
|
|
152
|
+
|
|
153
|
+
Raises:
|
|
154
|
+
ValueError: If the name contains invalid characters.
|
|
155
|
+
"""
|
|
156
|
+
if not IDENT_PATTERN.match(v):
|
|
157
|
+
raise ValueError(
|
|
158
|
+
f"Invalid table name '{v}': must match pattern "
|
|
159
|
+
"[A-Za-z_][A-Za-z0-9_]* (letters, digits, underscores only, "
|
|
160
|
+
"starting with letter or underscore)"
|
|
161
|
+
)
|
|
162
|
+
return v
|
|
163
|
+
|
|
164
|
+
@field_validator("schema_version")
|
|
165
|
+
@classmethod
|
|
166
|
+
def validate_schema_version(cls, v: str) -> str:
|
|
167
|
+
"""Validate schema_version format and reject line breaks.
|
|
168
|
+
|
|
169
|
+
Prevents SQL comment injection by rejecting line breaks and ensures
|
|
170
|
+
the version follows semantic versioning format.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
v: Schema version to validate.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Validated schema version.
|
|
177
|
+
|
|
178
|
+
Raises:
|
|
179
|
+
ValueError: If the version contains line breaks or invalid format.
|
|
180
|
+
"""
|
|
181
|
+
if "\n" in v or "\r" in v:
|
|
182
|
+
raise ValueError("schema_version must not contain line breaks")
|
|
183
|
+
if not re.fullmatch(r"\d+\.\d+\.\d+", v):
|
|
184
|
+
raise ValueError("schema_version must match semver 'MAJOR.MINOR.PATCH'")
|
|
185
|
+
return v
|
|
186
|
+
|
|
187
|
+
@field_validator("description")
|
|
188
|
+
@classmethod
|
|
189
|
+
def validate_description(cls, v: str | None) -> str | None:
|
|
190
|
+
"""Validate description for SQL safety.
|
|
191
|
+
|
|
192
|
+
Prevents SQL injection by rejecting line breaks in description values.
|
|
193
|
+
Descriptions are used in SQL COMMENT statements.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
v: Description value to validate.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Validated description value.
|
|
200
|
+
|
|
201
|
+
Raises:
|
|
202
|
+
ValueError: If the description contains line breaks.
|
|
203
|
+
"""
|
|
204
|
+
if v is None:
|
|
205
|
+
return v
|
|
206
|
+
if "\n" in v or "\r" in v:
|
|
207
|
+
raise ValueError("description must not contain line breaks")
|
|
208
|
+
return v
|
|
209
|
+
|
|
210
|
+
@field_validator("columns")
|
|
211
|
+
@classmethod
|
|
212
|
+
def validate_columns_not_empty(
|
|
213
|
+
cls, v: list[ModelProjectorColumn]
|
|
214
|
+
) -> list[ModelProjectorColumn]:
|
|
215
|
+
"""Validate that columns list is not empty."""
|
|
216
|
+
if not v:
|
|
217
|
+
raise ValueError("Schema must have at least one column")
|
|
218
|
+
return v
|
|
219
|
+
|
|
220
|
+
@model_validator(mode="after")
|
|
221
|
+
def validate_primary_key_exists(self) -> ModelProjectorSchema:
|
|
222
|
+
"""Validate that at least one column is marked as primary key."""
|
|
223
|
+
primary_keys = [col for col in self.columns if col.primary_key]
|
|
224
|
+
if not primary_keys:
|
|
225
|
+
raise ValueError("Schema must have at least one primary key column")
|
|
226
|
+
return self
|
|
227
|
+
|
|
228
|
+
@model_validator(mode="after")
|
|
229
|
+
def validate_column_names_unique(self) -> ModelProjectorSchema:
|
|
230
|
+
"""Validate that column names are unique within the schema.
|
|
231
|
+
|
|
232
|
+
Uses Counter for O(n) duplicate detection instead of O(n^2) list.count().
|
|
233
|
+
"""
|
|
234
|
+
names = [col.name for col in self.columns]
|
|
235
|
+
name_counts = Counter(names)
|
|
236
|
+
duplicates = [name for name, count in name_counts.items() if count > 1]
|
|
237
|
+
if duplicates:
|
|
238
|
+
raise ValueError(f"Duplicate column names: {set(duplicates)}")
|
|
239
|
+
return self
|
|
240
|
+
|
|
241
|
+
@model_validator(mode="after")
|
|
242
|
+
def validate_index_columns_exist(self) -> ModelProjectorSchema:
|
|
243
|
+
"""Validate that all index columns reference existing column names."""
|
|
244
|
+
column_names = {col.name for col in self.columns}
|
|
245
|
+
for idx in self.indexes:
|
|
246
|
+
for col in idx.columns:
|
|
247
|
+
if col not in column_names:
|
|
248
|
+
raise ValueError(
|
|
249
|
+
f"Index '{idx.name}' references non-existent column: {col}"
|
|
250
|
+
)
|
|
251
|
+
return self
|
|
252
|
+
|
|
253
|
+
def get_primary_key_columns(self) -> list[str]:
|
|
254
|
+
"""Get list of primary key column names.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
List of column names that form the primary key.
|
|
258
|
+
"""
|
|
259
|
+
return [col.name for col in self.columns if col.primary_key]
|
|
260
|
+
|
|
261
|
+
def get_column_names(self) -> list[str]:
|
|
262
|
+
"""Get list of all column names.
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
List of all column names in the schema.
|
|
266
|
+
"""
|
|
267
|
+
return [col.name for col in self.columns]
|
|
268
|
+
|
|
269
|
+
def to_create_table_sql(self) -> str:
|
|
270
|
+
"""Generate CREATE TABLE SQL statement.
|
|
271
|
+
|
|
272
|
+
Uses quoted identifiers for table name and column names in the
|
|
273
|
+
primary key constraint to prevent SQL injection.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
SQL CREATE TABLE statement including columns and primary key.
|
|
277
|
+
|
|
278
|
+
Example:
|
|
279
|
+
>>> schema.to_create_table_sql()
|
|
280
|
+
'CREATE TABLE IF NOT EXISTS "registration_projections" (...)'
|
|
281
|
+
"""
|
|
282
|
+
column_defs = [col.to_sql_definition() for col in self.columns]
|
|
283
|
+
|
|
284
|
+
# Add primary key constraint with quoted column names
|
|
285
|
+
pk_columns = self.get_primary_key_columns()
|
|
286
|
+
if pk_columns:
|
|
287
|
+
quoted_pk_columns = ", ".join(quote_identifier(col) for col in pk_columns)
|
|
288
|
+
pk_clause = f"PRIMARY KEY ({quoted_pk_columns})"
|
|
289
|
+
column_defs.append(pk_clause)
|
|
290
|
+
|
|
291
|
+
columns_sql = ",\n ".join(column_defs)
|
|
292
|
+
|
|
293
|
+
# Quote table name to prevent SQL injection
|
|
294
|
+
quoted_table_name = quote_identifier(self.table_name)
|
|
295
|
+
|
|
296
|
+
return f"CREATE TABLE IF NOT EXISTS {quoted_table_name} (\n {columns_sql}\n)"
|
|
297
|
+
|
|
298
|
+
def to_create_indexes_sql(self) -> list[str]:
|
|
299
|
+
"""Generate CREATE INDEX SQL statements for all indexes.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
List of SQL CREATE INDEX statements.
|
|
303
|
+
"""
|
|
304
|
+
return [idx.to_sql_definition(self.table_name) for idx in self.indexes]
|
|
305
|
+
|
|
306
|
+
def to_comment_statements_sql(self) -> list[str]:
|
|
307
|
+
"""Generate SQL COMMENT statements for table and columns.
|
|
308
|
+
|
|
309
|
+
Generates COMMENT ON TABLE if the schema has a description,
|
|
310
|
+
and COMMENT ON COLUMN for each column that has a description.
|
|
311
|
+
Uses proper SQL escaping to prevent injection.
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
List of SQL COMMENT statements.
|
|
315
|
+
|
|
316
|
+
Example:
|
|
317
|
+
>>> schema = ModelProjectorSchema(
|
|
318
|
+
... table_name="users",
|
|
319
|
+
... description="Stores user data",
|
|
320
|
+
... columns=[
|
|
321
|
+
... ModelProjectorColumn(
|
|
322
|
+
... name="id", column_type="uuid",
|
|
323
|
+
... primary_key=True, nullable=False,
|
|
324
|
+
... description="Unique identifier",
|
|
325
|
+
... ),
|
|
326
|
+
... ],
|
|
327
|
+
... )
|
|
328
|
+
>>> schema.to_comment_statements_sql()
|
|
329
|
+
['COMMENT ON TABLE "users" IS \\'Stores user data\\'',
|
|
330
|
+
'COMMENT ON COLUMN "users"."id" IS \\'Unique identifier\\'']
|
|
331
|
+
"""
|
|
332
|
+
statements: list[str] = []
|
|
333
|
+
quoted_table = quote_identifier(self.table_name)
|
|
334
|
+
|
|
335
|
+
# Add table comment if description exists
|
|
336
|
+
if self.description:
|
|
337
|
+
escaped_desc = escape_sql_string(self.description)
|
|
338
|
+
statements.append(f"COMMENT ON TABLE {quoted_table} IS '{escaped_desc}'")
|
|
339
|
+
|
|
340
|
+
# Add column comments for columns with descriptions
|
|
341
|
+
for col in self.columns:
|
|
342
|
+
if col.description:
|
|
343
|
+
quoted_col = quote_identifier(col.name)
|
|
344
|
+
escaped_desc = escape_sql_string(col.description)
|
|
345
|
+
statements.append(
|
|
346
|
+
f"COMMENT ON COLUMN {quoted_table}.{quoted_col} IS '{escaped_desc}'"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
return statements
|
|
350
|
+
|
|
351
|
+
def to_full_migration_sql(self) -> str:
|
|
352
|
+
"""Generate complete migration SQL including table, indexes, and comments.
|
|
353
|
+
|
|
354
|
+
Generates a complete migration script including:
|
|
355
|
+
1. CREATE TABLE statement with all columns (inline comments if descriptions)
|
|
356
|
+
2. CREATE INDEX statements for all defined indexes
|
|
357
|
+
3. COMMENT ON TABLE/COLUMN statements for documentation
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
Complete SQL migration script.
|
|
361
|
+
|
|
362
|
+
Example:
|
|
363
|
+
>>> schema = ModelProjectorSchema(
|
|
364
|
+
... table_name="users",
|
|
365
|
+
... description="Stores user projection data",
|
|
366
|
+
... columns=[
|
|
367
|
+
... ModelProjectorColumn(
|
|
368
|
+
... name="id", column_type="uuid",
|
|
369
|
+
... primary_key=True, nullable=False,
|
|
370
|
+
... description="Unique user identifier",
|
|
371
|
+
... ),
|
|
372
|
+
... ],
|
|
373
|
+
... )
|
|
374
|
+
>>> print(schema.to_full_migration_sql())
|
|
375
|
+
-- Migration for users (version 1.0.0)
|
|
376
|
+
-- Generated by ProjectorSchemaValidator
|
|
377
|
+
...
|
|
378
|
+
COMMENT ON TABLE "users" IS 'Stores user projection data';
|
|
379
|
+
COMMENT ON COLUMN "users"."id" IS 'Unique user identifier';
|
|
380
|
+
|
|
381
|
+
Security Notes:
|
|
382
|
+
- All identifiers (table name, column names, index names) are validated
|
|
383
|
+
during model construction and quoted in SQL output.
|
|
384
|
+
- schema_version is validated to semver format and must not contain line
|
|
385
|
+
breaks (prevents SQL comment injection).
|
|
386
|
+
- description fields are validated to reject line breaks and are properly
|
|
387
|
+
escaped for SQL string literals.
|
|
388
|
+
- TRUST BOUNDARIES exist for: column default values, index where_clause.
|
|
389
|
+
These accept raw SQL and must only come from trusted contract.yaml sources.
|
|
390
|
+
"""
|
|
391
|
+
parts = [
|
|
392
|
+
f"-- Migration for {self.table_name} (version {self.schema_version})",
|
|
393
|
+
"-- Generated by ProjectorSchemaValidator",
|
|
394
|
+
"",
|
|
395
|
+
self.to_create_table_sql() + ";",
|
|
396
|
+
"",
|
|
397
|
+
]
|
|
398
|
+
|
|
399
|
+
index_statements = self.to_create_indexes_sql()
|
|
400
|
+
if index_statements:
|
|
401
|
+
parts.append("-- Indexes")
|
|
402
|
+
for stmt in index_statements:
|
|
403
|
+
parts.append(stmt + ";")
|
|
404
|
+
parts.append("")
|
|
405
|
+
|
|
406
|
+
comment_statements = self.to_comment_statements_sql()
|
|
407
|
+
if comment_statements:
|
|
408
|
+
parts.append("-- Comments")
|
|
409
|
+
for stmt in comment_statements:
|
|
410
|
+
parts.append(stmt + ";")
|
|
411
|
+
|
|
412
|
+
return "\n".join(parts)
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
__all__ = ["ModelProjectorSchema"]
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Projector validation error model.
|
|
4
|
+
|
|
5
|
+
Provides structured error information for projector contract parsing
|
|
6
|
+
and validation failures.
|
|
7
|
+
|
|
8
|
+
Part of OMN-1168: ProjectorPluginLoader contract discovery loading.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from uuid import UUID
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelProjectorValidationError:
|
|
17
|
+
"""Structured error for projector validation failures.
|
|
18
|
+
|
|
19
|
+
Captures detailed information about contract parsing and validation
|
|
20
|
+
errors to support graceful mode error collection.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
error_type: Category of error (parse, validation, io, size).
|
|
24
|
+
contract_path: Path to the failing contract file.
|
|
25
|
+
message: Human-readable error message.
|
|
26
|
+
remediation_hint: Suggested fix for the error.
|
|
27
|
+
correlation_id: Request correlation ID for distributed tracing.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
error_type: str,
|
|
33
|
+
contract_path: str,
|
|
34
|
+
message: str,
|
|
35
|
+
remediation_hint: str | None = None,
|
|
36
|
+
correlation_id: UUID | None = None,
|
|
37
|
+
) -> None:
|
|
38
|
+
"""Initialize validation error.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
error_type: Category of error (parse, validation, io, size).
|
|
42
|
+
contract_path: Path to the failing contract file.
|
|
43
|
+
message: Human-readable error message.
|
|
44
|
+
remediation_hint: Suggested fix for the error.
|
|
45
|
+
correlation_id: Request correlation ID for distributed tracing.
|
|
46
|
+
"""
|
|
47
|
+
self.error_type = error_type
|
|
48
|
+
self.contract_path = contract_path
|
|
49
|
+
self.message = message
|
|
50
|
+
self.remediation_hint = remediation_hint
|
|
51
|
+
self.correlation_id = correlation_id
|
|
52
|
+
|
|
53
|
+
def __repr__(self) -> str:
|
|
54
|
+
"""Return string representation."""
|
|
55
|
+
return (
|
|
56
|
+
f"ModelProjectorValidationError("
|
|
57
|
+
f"type={self.error_type!r}, "
|
|
58
|
+
f"path={self.contract_path!r}, "
|
|
59
|
+
f"correlation_id={self.correlation_id})"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
__all__ = ["ModelProjectorValidationError"]
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""SQL Identifier Utilities for Projector Models.
|
|
4
|
+
|
|
5
|
+
Provides shared utilities for validating and quoting PostgreSQL identifiers
|
|
6
|
+
used across projector model classes. Centralizes SQL safety logic to prevent
|
|
7
|
+
injection vulnerabilities.
|
|
8
|
+
|
|
9
|
+
Related Tickets:
|
|
10
|
+
- OMN-1168: ProjectorPluginLoader contract discovery loading
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import re
|
|
16
|
+
from uuid import uuid4
|
|
17
|
+
|
|
18
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
19
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
20
|
+
|
|
21
|
+
# Valid PostgreSQL identifier pattern: starts with letter or underscore,
|
|
22
|
+
# followed by letters, digits, or underscores
|
|
23
|
+
IDENT_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def is_valid_identifier(name: str) -> bool:
|
|
27
|
+
"""Check if a name is a valid PostgreSQL identifier.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
name: Identifier to validate.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
True if the identifier matches the safe pattern, False otherwise.
|
|
34
|
+
"""
|
|
35
|
+
return bool(IDENT_PATTERN.match(name))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def quote_identifier(ident: str) -> str:
|
|
39
|
+
"""Quote a PostgreSQL identifier safely.
|
|
40
|
+
|
|
41
|
+
Escapes embedded double quotes by doubling them and wraps the
|
|
42
|
+
identifier in double quotes.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
ident: Identifier to quote.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Safely quoted identifier.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
>>> quote_identifier("entity_id")
|
|
52
|
+
'"entity_id"'
|
|
53
|
+
>>> quote_identifier('weird"name')
|
|
54
|
+
'"weird""name"'
|
|
55
|
+
"""
|
|
56
|
+
escaped = ident.replace('"', '""')
|
|
57
|
+
return f'"{escaped}"'
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def validate_identifier(name: str, context_name: str = "identifier") -> str:
|
|
61
|
+
"""Validate that a name is a valid PostgreSQL identifier.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
name: Identifier to validate.
|
|
65
|
+
context_name: Description of what's being validated (for error messages).
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The validated identifier.
|
|
69
|
+
|
|
70
|
+
Raises:
|
|
71
|
+
ProtocolConfigurationError: If the identifier contains invalid characters.
|
|
72
|
+
"""
|
|
73
|
+
if not IDENT_PATTERN.match(name):
|
|
74
|
+
error_context = ModelInfraErrorContext(
|
|
75
|
+
transport_type=EnumInfraTransportType.DATABASE,
|
|
76
|
+
operation="validate_identifier",
|
|
77
|
+
correlation_id=uuid4(),
|
|
78
|
+
)
|
|
79
|
+
raise ProtocolConfigurationError(
|
|
80
|
+
f"Invalid {context_name} '{name}': must match pattern "
|
|
81
|
+
"[A-Za-z_][A-Za-z0-9_]* (letters, digits, underscores only, "
|
|
82
|
+
"starting with letter or underscore)",
|
|
83
|
+
context=error_context,
|
|
84
|
+
)
|
|
85
|
+
return name
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def escape_sql_string(value: str) -> str:
|
|
89
|
+
"""Escape a string for use in SQL string literals.
|
|
90
|
+
|
|
91
|
+
Escapes single quotes by doubling them for safe use in SQL
|
|
92
|
+
string contexts (e.g., COMMENT ON statements).
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
value: String value to escape.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Escaped string suitable for SQL string literal.
|
|
99
|
+
|
|
100
|
+
Example:
|
|
101
|
+
>>> escape_sql_string("User's name")
|
|
102
|
+
"User''s name"
|
|
103
|
+
>>> escape_sql_string("normal text")
|
|
104
|
+
"normal text"
|
|
105
|
+
"""
|
|
106
|
+
return value.replace("'", "''")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
__all__ = [
|
|
110
|
+
"IDENT_PATTERN",
|
|
111
|
+
"escape_sql_string",
|
|
112
|
+
"is_valid_identifier",
|
|
113
|
+
"quote_identifier",
|
|
114
|
+
"validate_identifier",
|
|
115
|
+
]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration models for ONEX 2-way registration pattern.
|
|
4
|
+
|
|
5
|
+
This module provides models for the ONEX 2-way registration workflow,
|
|
6
|
+
including introspection events, heartbeats, and orchestrator decision events.
|
|
7
|
+
|
|
8
|
+
Submodules:
|
|
9
|
+
events: Registration decision events emitted by the C1 Orchestrator
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from omnibase_infra.models.registration.events import (
|
|
13
|
+
ModelNodeBecameActive,
|
|
14
|
+
ModelNodeLivenessExpired,
|
|
15
|
+
ModelNodeRegistrationAccepted,
|
|
16
|
+
ModelNodeRegistrationAckReceived,
|
|
17
|
+
ModelNodeRegistrationAckTimedOut,
|
|
18
|
+
ModelNodeRegistrationInitiated,
|
|
19
|
+
ModelNodeRegistrationRejected,
|
|
20
|
+
)
|
|
21
|
+
from omnibase_infra.models.registration.model_introspection_metrics import (
|
|
22
|
+
ModelIntrospectionMetrics,
|
|
23
|
+
)
|
|
24
|
+
from omnibase_infra.models.registration.model_node_capabilities import (
|
|
25
|
+
ModelNodeCapabilities,
|
|
26
|
+
)
|
|
27
|
+
from omnibase_infra.models.registration.model_node_heartbeat_event import (
|
|
28
|
+
ModelNodeHeartbeatEvent,
|
|
29
|
+
)
|
|
30
|
+
from omnibase_infra.models.registration.model_node_introspection_event import (
|
|
31
|
+
ModelNodeIntrospectionEvent,
|
|
32
|
+
)
|
|
33
|
+
from omnibase_infra.models.registration.model_node_metadata import ModelNodeMetadata
|
|
34
|
+
from omnibase_infra.models.registration.model_node_registration import (
|
|
35
|
+
ModelNodeRegistration,
|
|
36
|
+
)
|
|
37
|
+
from omnibase_infra.models.registration.model_node_registration_record import (
|
|
38
|
+
ModelNodeRegistrationRecord,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
# Metrics
|
|
43
|
+
"ModelIntrospectionMetrics",
|
|
44
|
+
# Decision events (C1 Orchestrator output)
|
|
45
|
+
"ModelNodeBecameActive",
|
|
46
|
+
# Core registration models
|
|
47
|
+
"ModelNodeCapabilities",
|
|
48
|
+
"ModelNodeHeartbeatEvent",
|
|
49
|
+
"ModelNodeIntrospectionEvent",
|
|
50
|
+
"ModelNodeLivenessExpired",
|
|
51
|
+
"ModelNodeMetadata",
|
|
52
|
+
"ModelNodeRegistration",
|
|
53
|
+
"ModelNodeRegistrationAccepted",
|
|
54
|
+
"ModelNodeRegistrationAckReceived",
|
|
55
|
+
"ModelNodeRegistrationAckTimedOut",
|
|
56
|
+
"ModelNodeRegistrationInitiated",
|
|
57
|
+
"ModelNodeRegistrationRecord",
|
|
58
|
+
"ModelNodeRegistrationRejected",
|
|
59
|
+
]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration command models for ONEX 2-way registration pattern.
|
|
4
|
+
|
|
5
|
+
Commands are imperative requests from external sources (nodes) that
|
|
6
|
+
orchestrators process to make decisions and emit events.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from omnibase_infra.models.registration.commands.model_node_registration_acked import (
|
|
10
|
+
ModelNodeRegistrationAcked,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__: list[str] = [
|
|
14
|
+
"ModelNodeRegistrationAcked",
|
|
15
|
+
]
|