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
|
+
# Handler ID follows convention: {node_type}.{domain}.handler
|
|
2
|
+
handler_id: effect.mcp.handler
|
|
3
|
+
name: MCP Handler
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
description: >
|
|
6
|
+
Effect handler for Model Context Protocol (MCP) integration. Exposes ONEX nodes as MCP tools for AI agent integration via streamable HTTP transport.
|
|
7
|
+
|
|
8
|
+
descriptor:
|
|
9
|
+
handler_kind: effect
|
|
10
|
+
purity: side_effecting
|
|
11
|
+
# Idempotent: true for list_tools/describe, false for call_tool (depends on target)
|
|
12
|
+
# Overall handler is marked non-idempotent since tool execution may have side effects.
|
|
13
|
+
idempotent: false
|
|
14
|
+
# TIMEOUT CONFIGURATION (30 seconds)
|
|
15
|
+
# ---------------------------------
|
|
16
|
+
# MCP tool execution timeout. This is the default timeout for tool calls.
|
|
17
|
+
# Individual tools may have their own timeout configurations.
|
|
18
|
+
#
|
|
19
|
+
# OVERRIDE GUIDANCE:
|
|
20
|
+
# - Reduce for latency-sensitive deployments
|
|
21
|
+
# - Increase for tools with known long execution times
|
|
22
|
+
# - Consider per-tool timeout configuration for fine-grained control
|
|
23
|
+
timeout_ms: 30000
|
|
24
|
+
retry_policy:
|
|
25
|
+
enabled: true
|
|
26
|
+
max_retries: 3
|
|
27
|
+
backoff_strategy: exponential
|
|
28
|
+
base_delay_ms: 500
|
|
29
|
+
max_delay_ms: 10000
|
|
30
|
+
circuit_breaker:
|
|
31
|
+
enabled: true
|
|
32
|
+
failure_threshold: 5
|
|
33
|
+
# Reset timeout: 60s = 2x handler timeout_ms
|
|
34
|
+
timeout_ms: 60000
|
|
35
|
+
# Concurrent: MCP supports multiple simultaneous tool calls
|
|
36
|
+
concurrency_policy: parallel_ok
|
|
37
|
+
isolation_policy: none
|
|
38
|
+
observability_level: standard
|
|
39
|
+
capability_outputs:
|
|
40
|
+
- mcp.list_tools
|
|
41
|
+
- mcp.call_tool
|
|
42
|
+
- mcp.describe
|
|
43
|
+
# NOTE: Models defined in OMN-1288 (MCP Handler)
|
|
44
|
+
input_model: omnibase_infra.handlers.models.mcp.ModelMcpToolCall
|
|
45
|
+
output_model: omnibase_infra.handlers.models.mcp.ModelMcpToolResult
|
|
46
|
+
supports_lifecycle: true
|
|
47
|
+
supports_health_check: true
|
|
48
|
+
supports_provisioning: false
|
|
49
|
+
tags:
|
|
50
|
+
- mcp
|
|
51
|
+
- effect
|
|
52
|
+
- infrastructure
|
|
53
|
+
- ai-agent
|
|
54
|
+
- tool-interface
|
|
55
|
+
metadata:
|
|
56
|
+
author: OmniNode Team
|
|
57
|
+
ticket: OMN-1288
|
|
58
|
+
transport:
|
|
59
|
+
# =========================================================================
|
|
60
|
+
# TRANSPORT CONFIGURATION
|
|
61
|
+
# =========================================================================
|
|
62
|
+
# MCP transport layer configuration for streamable HTTP.
|
|
63
|
+
# =========================================================================
|
|
64
|
+
type: streamable_http
|
|
65
|
+
default_host: "0.0.0.0"
|
|
66
|
+
default_port: 8090
|
|
67
|
+
default_path: "/mcp"
|
|
68
|
+
# Stateless mode for horizontal scaling (recommended for production)
|
|
69
|
+
stateless: true
|
|
70
|
+
# JSON response mode for compatibility (recommended)
|
|
71
|
+
json_response: true
|
|
72
|
+
security:
|
|
73
|
+
# =========================================================================
|
|
74
|
+
# SECURITY CONFIGURATION
|
|
75
|
+
# =========================================================================
|
|
76
|
+
# Security constraints for MCP operations.
|
|
77
|
+
# =========================================================================
|
|
78
|
+
|
|
79
|
+
# -------------------------------------------------------------------------
|
|
80
|
+
# AUTHENTICATION
|
|
81
|
+
# -------------------------------------------------------------------------
|
|
82
|
+
# MCP protocol supports API key authentication.
|
|
83
|
+
authentication:
|
|
84
|
+
# Whether authentication is required for tool access
|
|
85
|
+
required: false
|
|
86
|
+
# Authentication methods supported
|
|
87
|
+
methods:
|
|
88
|
+
- api_key_header
|
|
89
|
+
# Header name for API key authentication
|
|
90
|
+
api_key_header: "X-MCP-API-Key"
|
|
91
|
+
# -------------------------------------------------------------------------
|
|
92
|
+
# TOOL ACCESS CONTROL
|
|
93
|
+
# -------------------------------------------------------------------------
|
|
94
|
+
# Controls which tools can be exposed via MCP.
|
|
95
|
+
tool_access:
|
|
96
|
+
# Maximum number of tools that can be exposed
|
|
97
|
+
max_tools: 100
|
|
98
|
+
# Tags required for a node to be exposed as MCP tool
|
|
99
|
+
required_tags: []
|
|
100
|
+
# Tags that exclude a node from MCP exposure
|
|
101
|
+
excluded_tags:
|
|
102
|
+
- internal
|
|
103
|
+
- deprecated
|
|
104
|
+
- unsafe
|
|
105
|
+
# -------------------------------------------------------------------------
|
|
106
|
+
# RATE LIMITING
|
|
107
|
+
# -------------------------------------------------------------------------
|
|
108
|
+
rate_limiting:
|
|
109
|
+
enabled: false
|
|
110
|
+
deferred_to: orchestration_layer
|
|
111
|
+
future_considerations:
|
|
112
|
+
- per_tool_limits: "Different limits per tool based on complexity"
|
|
113
|
+
- burst_allowance: "Token bucket with configurable burst"
|
|
114
|
+
- client_tracking: "Rate limit by API key or client ID"
|
|
115
|
+
# -------------------------------------------------------------------------
|
|
116
|
+
# INPUT VALIDATION
|
|
117
|
+
# -------------------------------------------------------------------------
|
|
118
|
+
input_validation:
|
|
119
|
+
# Maximum size of tool arguments (in bytes)
|
|
120
|
+
max_arguments_size: 1048576 # 1 MB
|
|
121
|
+
# Maximum depth of nested objects in arguments
|
|
122
|
+
max_nesting_depth: 10
|
|
123
|
+
# Validate arguments against tool schema
|
|
124
|
+
validate_schema: true
|
|
125
|
+
# -------------------------------------------------------------------------
|
|
126
|
+
# AUDIT AND LOGGING
|
|
127
|
+
# -------------------------------------------------------------------------
|
|
128
|
+
audit_logging:
|
|
129
|
+
required_events:
|
|
130
|
+
- tool_invocation
|
|
131
|
+
- authentication_failure
|
|
132
|
+
- rate_limit_exceeded
|
|
133
|
+
- tool_execution_error
|
|
134
|
+
security_event_level: warning
|
|
135
|
+
include_correlation_id: true
|
|
136
|
+
never_log:
|
|
137
|
+
- api_keys
|
|
138
|
+
- sensitive_arguments
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure Decorators.
|
|
4
|
+
|
|
5
|
+
This module provides decorators for ONEX infrastructure patterns.
|
|
6
|
+
|
|
7
|
+
Decorators
|
|
8
|
+
----------
|
|
9
|
+
allow_any
|
|
10
|
+
Exempt functions/classes from Any type validation. Used as a marker
|
|
11
|
+
for the AST-based validator in ``omnibase_infra.validation.any_type_validator``.
|
|
12
|
+
|
|
13
|
+
Example Usage
|
|
14
|
+
-------------
|
|
15
|
+
>>> from omnibase_infra.decorators import allow_any
|
|
16
|
+
>>>
|
|
17
|
+
>>> @allow_any("Required for legacy API - see OMN-1234")
|
|
18
|
+
... def legacy_handler(data: Any) -> Any:
|
|
19
|
+
... return process_legacy(data)
|
|
20
|
+
|
|
21
|
+
See Also
|
|
22
|
+
--------
|
|
23
|
+
- ``omnibase_infra.validation.any_type_validator``: Recognizes ``@allow_any``
|
|
24
|
+
- CLAUDE.md: Any type policy documentation
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from omnibase_infra.decorators.allow_any import allow_any
|
|
28
|
+
|
|
29
|
+
__all__: list[str] = ["allow_any"]
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Decorator to exempt functions/classes from Any type validation.
|
|
4
|
+
|
|
5
|
+
This decorator is recognized by the ``any_type_validator.py`` AST-based validator.
|
|
6
|
+
It marks functions or classes as intentionally using Any types with a documented
|
|
7
|
+
reason, allowing the validator to skip checking those definitions.
|
|
8
|
+
|
|
9
|
+
The decorator is a **no-op at runtime** - it simply returns the original function
|
|
10
|
+
or class unchanged. Its sole purpose is to serve as a marker that the AST validator
|
|
11
|
+
can detect and use to exempt the decorated entity from Any type violations.
|
|
12
|
+
|
|
13
|
+
Usage
|
|
14
|
+
-----
|
|
15
|
+
Apply the decorator to functions or classes that intentionally use Any types:
|
|
16
|
+
|
|
17
|
+
@allow_any("Required for legacy API compatibility - see OMN-1234")
|
|
18
|
+
def legacy_handler(data: Any) -> Any:
|
|
19
|
+
return process_legacy(data)
|
|
20
|
+
|
|
21
|
+
@allow_any("Dynamic plugin dispatch requires Any for flexibility")
|
|
22
|
+
class PluginDispatcher:
|
|
23
|
+
def dispatch(self, payload: Any) -> Any:
|
|
24
|
+
return self._route(payload)
|
|
25
|
+
|
|
26
|
+
The reason argument is optional but strongly recommended for code review
|
|
27
|
+
and maintainability:
|
|
28
|
+
|
|
29
|
+
@allow_any()
|
|
30
|
+
def another_handler(data: Any) -> None:
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
See Also
|
|
34
|
+
--------
|
|
35
|
+
- ``omnibase_infra.validation.any_type_validator``: The AST validator that
|
|
36
|
+
recognizes this decorator
|
|
37
|
+
- CLAUDE.md: Documentation of Any type policy and enforcement levels
|
|
38
|
+
- ``docs/decisions/adr-any-type-pydantic-workaround.md``: ADR for Pydantic Any usage
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
from __future__ import annotations
|
|
42
|
+
|
|
43
|
+
from collections.abc import Callable
|
|
44
|
+
from typing import TypeVar
|
|
45
|
+
|
|
46
|
+
# Type variable for functions and classes
|
|
47
|
+
# Using 'object' as the bound per ONEX strong typing policy (no 'Any')
|
|
48
|
+
F = TypeVar("F", bound=Callable[..., object])
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def allow_any(reason: str = "") -> Callable[[F], F]:
|
|
52
|
+
"""Mark a function or class as exempt from Any type validation.
|
|
53
|
+
|
|
54
|
+
This decorator is recognized by the AST-based Any type validator and
|
|
55
|
+
causes it to skip checking the decorated function or class for Any
|
|
56
|
+
type violations.
|
|
57
|
+
|
|
58
|
+
The decorator is a no-op at runtime - it returns the original function
|
|
59
|
+
or class unchanged.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
reason: Documentation of why Any type usage is necessary. While
|
|
63
|
+
optional, providing a reason is strongly recommended for code
|
|
64
|
+
review and future maintainability. The reason is not used at
|
|
65
|
+
runtime but serves as documentation for reviewers.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
A decorator function that returns its input unchanged.
|
|
69
|
+
|
|
70
|
+
Examples:
|
|
71
|
+
Basic usage with reason (recommended):
|
|
72
|
+
|
|
73
|
+
>>> @allow_any("Required for JSON API responses - see OMN-1234")
|
|
74
|
+
... def process_json(data: Any) -> Any:
|
|
75
|
+
... return transform(data)
|
|
76
|
+
|
|
77
|
+
Usage without reason (discouraged but valid):
|
|
78
|
+
|
|
79
|
+
>>> @allow_any()
|
|
80
|
+
... def legacy_function(data: Any) -> None:
|
|
81
|
+
... handle(data)
|
|
82
|
+
|
|
83
|
+
Class-level exemption:
|
|
84
|
+
|
|
85
|
+
>>> @allow_any("Plugin system requires dynamic typing")
|
|
86
|
+
... class DynamicPlugin:
|
|
87
|
+
... def execute(self, payload: Any) -> Any:
|
|
88
|
+
... return self._run(payload)
|
|
89
|
+
|
|
90
|
+
Note:
|
|
91
|
+
The ``reason`` parameter is purely for documentation. It is not
|
|
92
|
+
stored, logged, or validated at runtime. The validator extracts
|
|
93
|
+
the decorator presence from the AST without evaluating the
|
|
94
|
+
decorator's arguments.
|
|
95
|
+
"""
|
|
96
|
+
# The reason parameter is intentionally unused at runtime.
|
|
97
|
+
# It exists solely for documentation purposes in the source code.
|
|
98
|
+
# The AST validator only checks for the decorator's presence,
|
|
99
|
+
# not its arguments.
|
|
100
|
+
_ = reason # Explicitly mark as intentionally unused
|
|
101
|
+
|
|
102
|
+
def decorator(func: F) -> F:
|
|
103
|
+
"""Return the function unchanged (no-op decorator)."""
|
|
104
|
+
return func
|
|
105
|
+
|
|
106
|
+
return decorator
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
__all__: list[str] = ["allow_any"]
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure DLQ (Dead Letter Queue) System.
|
|
4
|
+
|
|
5
|
+
This module provides DLQ replay tracking capabilities for message
|
|
6
|
+
processing in distributed systems. It enables persistent tracking
|
|
7
|
+
of replay attempts through PostgreSQL.
|
|
8
|
+
|
|
9
|
+
Components:
|
|
10
|
+
- Constants: Shared validation patterns (constants_dlq.py)
|
|
11
|
+
- Models: Pydantic models for DLQ tracking configuration and records
|
|
12
|
+
- Tracker: PostgreSQL-based tracker for replay history persistence
|
|
13
|
+
|
|
14
|
+
Constants:
|
|
15
|
+
- PATTERN_TABLE_NAME: Regex pattern string for PostgreSQL table name validation
|
|
16
|
+
- REGEX_TABLE_NAME: Pre-compiled regex for runtime validation
|
|
17
|
+
|
|
18
|
+
Models:
|
|
19
|
+
- ModelDlqTrackingConfig: Configuration for PostgreSQL-based tracking
|
|
20
|
+
- ModelDlqReplayRecord: Record of a DLQ message replay attempt
|
|
21
|
+
- EnumReplayStatus: Status enum for replay operations
|
|
22
|
+
|
|
23
|
+
Tracker:
|
|
24
|
+
- ServiceDlqTracking: PostgreSQL tracker for replay history
|
|
25
|
+
|
|
26
|
+
Example - Recording Replay Attempts:
|
|
27
|
+
>>> from omnibase_infra.dlq import (
|
|
28
|
+
... ServiceDlqTracking,
|
|
29
|
+
... ModelDlqTrackingConfig,
|
|
30
|
+
... ModelDlqReplayRecord,
|
|
31
|
+
... EnumReplayStatus,
|
|
32
|
+
... )
|
|
33
|
+
>>> from uuid import uuid4
|
|
34
|
+
>>> from datetime import datetime, timezone
|
|
35
|
+
>>>
|
|
36
|
+
>>> # Configure the tracker
|
|
37
|
+
>>> config = ModelDlqTrackingConfig(
|
|
38
|
+
... dsn="postgresql://user:pass@localhost:5432/mydb",
|
|
39
|
+
... storage_table="dlq_replay_history",
|
|
40
|
+
... )
|
|
41
|
+
>>>
|
|
42
|
+
>>> # Initialize and use
|
|
43
|
+
>>> tracker = ServiceDlqTracking(config)
|
|
44
|
+
>>> await tracker.initialize()
|
|
45
|
+
>>> try:
|
|
46
|
+
... record = ModelDlqReplayRecord(
|
|
47
|
+
... id=uuid4(),
|
|
48
|
+
... original_message_id=uuid4(),
|
|
49
|
+
... replay_correlation_id=uuid4(),
|
|
50
|
+
... original_topic="dev.orders.command.v1",
|
|
51
|
+
... target_topic="dev.orders.command.v1",
|
|
52
|
+
... replay_status=EnumReplayStatus.COMPLETED,
|
|
53
|
+
... replay_timestamp=datetime.now(timezone.utc),
|
|
54
|
+
... success=True,
|
|
55
|
+
... dlq_offset=12345,
|
|
56
|
+
... dlq_partition=0,
|
|
57
|
+
... retry_count=1,
|
|
58
|
+
... )
|
|
59
|
+
... await tracker.record_replay_attempt(record)
|
|
60
|
+
...
|
|
61
|
+
... # Query replay history
|
|
62
|
+
... history = await tracker.get_replay_history(record.original_message_id)
|
|
63
|
+
... finally:
|
|
64
|
+
... await tracker.shutdown()
|
|
65
|
+
|
|
66
|
+
Related:
|
|
67
|
+
- scripts/dlq_replay.py - CLI tool for DLQ replay operations
|
|
68
|
+
- OMN-1032 - PostgreSQL tracking integration ticket
|
|
69
|
+
- OMN-949 - DLQ configuration ticket
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
from omnibase_infra.dlq.constants_dlq import PATTERN_TABLE_NAME, REGEX_TABLE_NAME
|
|
73
|
+
from omnibase_infra.dlq.models import (
|
|
74
|
+
EnumReplayStatus,
|
|
75
|
+
ModelDlqReplayRecord,
|
|
76
|
+
ModelDlqTrackingConfig,
|
|
77
|
+
)
|
|
78
|
+
from omnibase_infra.dlq.service_dlq_tracking import ServiceDlqTracking
|
|
79
|
+
|
|
80
|
+
__all__: list[str] = [
|
|
81
|
+
# Constants
|
|
82
|
+
"PATTERN_TABLE_NAME", # Regex pattern string for table name validation
|
|
83
|
+
"REGEX_TABLE_NAME", # Pre-compiled regex for runtime validation
|
|
84
|
+
# Tracker
|
|
85
|
+
"ServiceDlqTracking",
|
|
86
|
+
# Models
|
|
87
|
+
"EnumReplayStatus",
|
|
88
|
+
"ModelDlqReplayRecord",
|
|
89
|
+
"ModelDlqTrackingConfig",
|
|
90
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""DLQ Constants and Shared Validation Patterns.
|
|
4
|
+
|
|
5
|
+
This module provides shared constants for the DLQ subsystem, ensuring
|
|
6
|
+
consistent validation patterns across models and services.
|
|
7
|
+
|
|
8
|
+
Defense-in-Depth Note:
|
|
9
|
+
The PATTERN_TABLE_NAME constant is intentionally used in BOTH:
|
|
10
|
+
1. Pydantic model validation (ModelDlqTrackingConfig.storage_table field)
|
|
11
|
+
2. Runtime validation (ServiceDlqTracking._validate_storage_table method)
|
|
12
|
+
|
|
13
|
+
This defense-in-depth approach ensures SQL injection prevention even if:
|
|
14
|
+
- Direct attribute assignment bypasses Pydantic validation
|
|
15
|
+
- Deserialization from untrusted sources bypasses model validation
|
|
16
|
+
- Future code changes inadvertently bypass config validation
|
|
17
|
+
|
|
18
|
+
DO NOT remove either validation layer. Both are intentional and required.
|
|
19
|
+
|
|
20
|
+
Related:
|
|
21
|
+
- model_dlq_tracking_config.py - Pydantic field pattern validation
|
|
22
|
+
- service_dlq_tracking.py - ServiceDlqTracking runtime defense-in-depth validation
|
|
23
|
+
- OMN-1032 - PostgreSQL tracking integration ticket
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import re
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# TABLE NAME VALIDATION
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
# Regex pattern string for valid PostgreSQL table names
|
|
35
|
+
# Must start with letter or underscore, followed by letters, digits, or underscores
|
|
36
|
+
# This matches PostgreSQL's identifier naming rules for unquoted identifiers
|
|
37
|
+
#
|
|
38
|
+
# Used in:
|
|
39
|
+
# - ModelDlqTrackingConfig: Pydantic field pattern constraint
|
|
40
|
+
# - ServiceDlqTracking: Runtime defense-in-depth validation
|
|
41
|
+
#
|
|
42
|
+
# Pattern explanation:
|
|
43
|
+
# ^ - Start of string
|
|
44
|
+
# [a-zA-Z_] - First character must be letter (a-z, A-Z) or underscore
|
|
45
|
+
# [a-zA-Z0-9_]* - Subsequent characters can be letters, digits, or underscores
|
|
46
|
+
# $ - End of string
|
|
47
|
+
PATTERN_TABLE_NAME = r"^[a-zA-Z_][a-zA-Z0-9_]*$"
|
|
48
|
+
|
|
49
|
+
# Pre-compiled regex for runtime validation (avoids recompilation overhead)
|
|
50
|
+
# This is the compiled version of PATTERN_TABLE_NAME for use in service code
|
|
51
|
+
REGEX_TABLE_NAME = re.compile(PATTERN_TABLE_NAME)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
__all__: list[str] = [
|
|
55
|
+
"PATTERN_TABLE_NAME",
|
|
56
|
+
"REGEX_TABLE_NAME",
|
|
57
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure DLQ Models.
|
|
4
|
+
|
|
5
|
+
This module provides Pydantic models for the DLQ replay tracking system,
|
|
6
|
+
including configuration and replay record models.
|
|
7
|
+
|
|
8
|
+
Exports:
|
|
9
|
+
ModelDlqTrackingConfig: Configuration for PostgreSQL-based DLQ tracking service
|
|
10
|
+
ModelDlqReplayRecord: Record of a DLQ message replay attempt
|
|
11
|
+
EnumReplayStatus: Status enum for replay operations
|
|
12
|
+
|
|
13
|
+
Related:
|
|
14
|
+
- scripts/dlq_replay.py - CLI tool for DLQ replay operations
|
|
15
|
+
- OMN-1032 - PostgreSQL tracking integration ticket
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from omnibase_infra.dlq.models.enum_replay_status import EnumReplayStatus
|
|
19
|
+
from omnibase_infra.dlq.models.model_dlq_replay_record import ModelDlqReplayRecord
|
|
20
|
+
from omnibase_infra.dlq.models.model_dlq_tracking_config import ModelDlqTrackingConfig
|
|
21
|
+
|
|
22
|
+
__all__: list[str] = [
|
|
23
|
+
"EnumReplayStatus",
|
|
24
|
+
"ModelDlqReplayRecord",
|
|
25
|
+
"ModelDlqTrackingConfig",
|
|
26
|
+
]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""DLQ Replay Status Enum.
|
|
4
|
+
|
|
5
|
+
This module provides the status enum for DLQ replay operations.
|
|
6
|
+
|
|
7
|
+
Related:
|
|
8
|
+
- scripts/dlq_replay.py - CLI tool that uses this enum
|
|
9
|
+
- OMN-1032 - PostgreSQL tracking integration ticket
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from enum import Enum
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class EnumReplayStatus(str, Enum):
|
|
18
|
+
"""Status of a DLQ replay operation.
|
|
19
|
+
|
|
20
|
+
This enum tracks the lifecycle of a replay attempt:
|
|
21
|
+
- PENDING: Replay has been initiated but not yet completed
|
|
22
|
+
- COMPLETED: Message was successfully replayed to target topic
|
|
23
|
+
- FAILED: Replay attempt failed (will be recorded with error_message)
|
|
24
|
+
- SKIPPED: Message was intentionally not replayed (e.g., non-retryable error)
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
This enum is the canonical definition for replay status tracking.
|
|
28
|
+
It is imported by scripts/dlq_replay.py for CLI usage.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
PENDING = "pending"
|
|
32
|
+
COMPLETED = "completed"
|
|
33
|
+
FAILED = "failed"
|
|
34
|
+
SKIPPED = "skipped"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
__all__: list[str] = ["EnumReplayStatus"]
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""DLQ Replay Record Model.
|
|
4
|
+
|
|
5
|
+
This module provides the Pydantic model for DLQ replay records,
|
|
6
|
+
representing the state of a message replay operation stored in PostgreSQL.
|
|
7
|
+
|
|
8
|
+
Related:
|
|
9
|
+
- scripts/dlq_replay.py - CLI tool that uses this model
|
|
10
|
+
- OMN-1032 - PostgreSQL tracking integration ticket
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
from omnibase_infra.dlq.models.enum_replay_status import EnumReplayStatus
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelDlqReplayRecord(BaseModel):
|
|
24
|
+
"""Record of a DLQ message replay attempt.
|
|
25
|
+
|
|
26
|
+
This model represents a single replay attempt stored in PostgreSQL,
|
|
27
|
+
tracking both the original message context and the replay outcome.
|
|
28
|
+
|
|
29
|
+
Table Schema:
|
|
30
|
+
CREATE TABLE IF NOT EXISTS dlq_replay_history (
|
|
31
|
+
id UUID PRIMARY KEY,
|
|
32
|
+
original_message_id UUID NOT NULL,
|
|
33
|
+
replay_correlation_id UUID NOT NULL,
|
|
34
|
+
original_topic VARCHAR(255) NOT NULL,
|
|
35
|
+
target_topic VARCHAR(255) NOT NULL,
|
|
36
|
+
replay_status VARCHAR(50) NOT NULL,
|
|
37
|
+
replay_timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
|
38
|
+
success BOOLEAN NOT NULL,
|
|
39
|
+
error_message TEXT,
|
|
40
|
+
dlq_offset BIGINT NOT NULL,
|
|
41
|
+
dlq_partition INTEGER NOT NULL,
|
|
42
|
+
retry_count INTEGER NOT NULL DEFAULT 0
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
id: Unique identifier for this replay record (primary key).
|
|
47
|
+
original_message_id: Correlation ID from the original DLQ message.
|
|
48
|
+
This links the replay to the original failed message.
|
|
49
|
+
replay_correlation_id: New correlation ID assigned during replay.
|
|
50
|
+
Used for tracing the replayed message through the system.
|
|
51
|
+
original_topic: The Kafka topic where the message originally failed.
|
|
52
|
+
target_topic: The topic where the message was replayed to.
|
|
53
|
+
Usually same as original_topic, but may differ for rerouting.
|
|
54
|
+
replay_status: Current status of the replay operation.
|
|
55
|
+
replay_timestamp: When the replay was attempted (UTC).
|
|
56
|
+
success: Whether the replay was successful.
|
|
57
|
+
True for COMPLETED status, False for FAILED/SKIPPED.
|
|
58
|
+
error_message: Error details if replay failed. None for success.
|
|
59
|
+
dlq_offset: Kafka offset of the message in the DLQ topic.
|
|
60
|
+
dlq_partition: Kafka partition of the message in the DLQ topic.
|
|
61
|
+
retry_count: Number of times this message has been retried.
|
|
62
|
+
Includes previous attempts before this replay.
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
>>> from uuid import uuid4
|
|
66
|
+
>>> from datetime import datetime, timezone
|
|
67
|
+
>>> record = ModelDlqReplayRecord(
|
|
68
|
+
... id=uuid4(),
|
|
69
|
+
... original_message_id=uuid4(),
|
|
70
|
+
... replay_correlation_id=uuid4(),
|
|
71
|
+
... original_topic="dev.orders.command.v1",
|
|
72
|
+
... target_topic="dev.orders.command.v1",
|
|
73
|
+
... replay_status=EnumReplayStatus.COMPLETED,
|
|
74
|
+
... replay_timestamp=datetime.now(timezone.utc),
|
|
75
|
+
... success=True,
|
|
76
|
+
... dlq_offset=12345,
|
|
77
|
+
... dlq_partition=0,
|
|
78
|
+
... retry_count=1,
|
|
79
|
+
... )
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
model_config = ConfigDict(
|
|
83
|
+
frozen=True,
|
|
84
|
+
extra="forbid",
|
|
85
|
+
from_attributes=True,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
id: UUID = Field(
|
|
89
|
+
description="Unique identifier for this replay record (primary key)",
|
|
90
|
+
)
|
|
91
|
+
original_message_id: UUID = Field(
|
|
92
|
+
description="Correlation ID from the original DLQ message",
|
|
93
|
+
)
|
|
94
|
+
replay_correlation_id: UUID = Field(
|
|
95
|
+
description="New correlation ID assigned during replay",
|
|
96
|
+
)
|
|
97
|
+
original_topic: str = Field(
|
|
98
|
+
description="The Kafka topic where the message originally failed",
|
|
99
|
+
min_length=1,
|
|
100
|
+
max_length=255,
|
|
101
|
+
)
|
|
102
|
+
target_topic: str = Field(
|
|
103
|
+
description="The topic where the message was replayed to",
|
|
104
|
+
min_length=1,
|
|
105
|
+
max_length=255,
|
|
106
|
+
)
|
|
107
|
+
replay_status: EnumReplayStatus = Field(
|
|
108
|
+
description="Current status of the replay operation",
|
|
109
|
+
)
|
|
110
|
+
replay_timestamp: datetime = Field(
|
|
111
|
+
description="When the replay was attempted (UTC)",
|
|
112
|
+
)
|
|
113
|
+
success: bool = Field(
|
|
114
|
+
description="Whether the replay was successful",
|
|
115
|
+
)
|
|
116
|
+
error_message: str | None = Field(
|
|
117
|
+
default=None,
|
|
118
|
+
description="Error details if replay failed, None for success",
|
|
119
|
+
)
|
|
120
|
+
dlq_offset: int = Field(
|
|
121
|
+
description="Kafka offset of the message in the DLQ topic",
|
|
122
|
+
ge=0,
|
|
123
|
+
)
|
|
124
|
+
dlq_partition: int = Field(
|
|
125
|
+
description="Kafka partition of the message in the DLQ topic",
|
|
126
|
+
ge=0,
|
|
127
|
+
)
|
|
128
|
+
retry_count: int = Field(
|
|
129
|
+
default=0,
|
|
130
|
+
description="Number of times this message has been retried",
|
|
131
|
+
ge=0,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
__all__: list[str] = ["ModelDlqReplayRecord"]
|