omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +132 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_kafka_acks.py +99 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +330 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +68 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +49 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +57 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +449 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +229 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1330 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1514 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +2033 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Chain Violation Model.
|
|
4
|
+
|
|
5
|
+
Defines the result structure for detected correlation and causation chain
|
|
6
|
+
violations. Used by the chain validation system to report violations with
|
|
7
|
+
full context for debugging and observability.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from uuid import UUID
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
15
|
+
|
|
16
|
+
from omnibase_infra.enums import EnumChainViolationType, EnumValidationSeverity
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ModelChainViolation(BaseModel):
|
|
20
|
+
"""Result of a correlation or causation chain violation detection.
|
|
21
|
+
|
|
22
|
+
Contains full context about a detected chain violation for debugging,
|
|
23
|
+
structured logging, and observability integration. Each violation includes
|
|
24
|
+
the expected and actual values, message identifiers, and severity.
|
|
25
|
+
|
|
26
|
+
Correlation and causation chains are fundamental to distributed tracing
|
|
27
|
+
and debugging in event-driven systems:
|
|
28
|
+
|
|
29
|
+
- **Correlation Chain**: All messages derived from a single request share
|
|
30
|
+
the same correlation_id, enabling end-to-end trace visibility.
|
|
31
|
+
- **Causation Chain**: Each message's causation_id references its direct
|
|
32
|
+
parent's message_id, forming an unbroken lineage back to the origin.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
violation_type: The specific chain violation detected.
|
|
36
|
+
expected_value: The UUID value that was expected (e.g., parent's
|
|
37
|
+
correlation_id or message_id).
|
|
38
|
+
actual_value: The UUID value that was actually found.
|
|
39
|
+
message_id: The message_id where the violation was detected.
|
|
40
|
+
parent_message_id: The parent message's message_id, if applicable.
|
|
41
|
+
violation_message: Human-readable description of the violation.
|
|
42
|
+
severity: Severity classification (error blocks processing, warning
|
|
43
|
+
is advisory).
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
>>> from uuid import uuid4
|
|
47
|
+
>>> violation = ModelChainViolation(
|
|
48
|
+
... violation_type=EnumChainViolationType.CORRELATION_MISMATCH,
|
|
49
|
+
... expected_value=uuid4(),
|
|
50
|
+
... actual_value=uuid4(),
|
|
51
|
+
... message_id=uuid4(),
|
|
52
|
+
... parent_message_id=uuid4(),
|
|
53
|
+
... violation_message="Child message has different correlation_id than parent",
|
|
54
|
+
... severity=EnumValidationSeverity.ERROR,
|
|
55
|
+
... )
|
|
56
|
+
>>> violation.is_blocking()
|
|
57
|
+
True
|
|
58
|
+
>>> log_line = violation.format_for_logging()
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
violation_type: EnumChainViolationType = Field(
|
|
62
|
+
...,
|
|
63
|
+
description="The specific chain violation type detected",
|
|
64
|
+
)
|
|
65
|
+
expected_value: UUID | None = Field(
|
|
66
|
+
default=None,
|
|
67
|
+
description=(
|
|
68
|
+
"The expected UUID value (e.g., parent's correlation_id or message_id). "
|
|
69
|
+
"None if the expected value cannot be determined."
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
actual_value: UUID | None = Field(
|
|
73
|
+
default=None,
|
|
74
|
+
description=(
|
|
75
|
+
"The actual UUID value found in the message. "
|
|
76
|
+
"None if the value was missing entirely."
|
|
77
|
+
),
|
|
78
|
+
)
|
|
79
|
+
message_id: UUID = Field(
|
|
80
|
+
...,
|
|
81
|
+
description="The message_id of the message where the violation was detected",
|
|
82
|
+
)
|
|
83
|
+
parent_message_id: UUID | None = Field(
|
|
84
|
+
default=None,
|
|
85
|
+
description=(
|
|
86
|
+
"The parent message's message_id, if applicable. "
|
|
87
|
+
"None for root messages or when parent cannot be determined."
|
|
88
|
+
),
|
|
89
|
+
)
|
|
90
|
+
violation_message: str = Field(
|
|
91
|
+
...,
|
|
92
|
+
min_length=1,
|
|
93
|
+
description="Human-readable description of the violation",
|
|
94
|
+
)
|
|
95
|
+
severity: EnumValidationSeverity = Field(
|
|
96
|
+
default=EnumValidationSeverity.ERROR,
|
|
97
|
+
description=(
|
|
98
|
+
"Severity classification: 'error' indicates a critical chain break "
|
|
99
|
+
"that should block processing, 'warning' is advisory for potential issues"
|
|
100
|
+
),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
model_config = ConfigDict(
|
|
104
|
+
frozen=True,
|
|
105
|
+
str_strip_whitespace=True,
|
|
106
|
+
use_enum_values=False, # Keep enum objects for type safety
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def is_blocking(self) -> bool:
|
|
110
|
+
"""Check if this violation should block message processing.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
True if severity is 'error', False for 'warning'.
|
|
114
|
+
|
|
115
|
+
Example:
|
|
116
|
+
>>> violation.is_blocking()
|
|
117
|
+
True
|
|
118
|
+
"""
|
|
119
|
+
return self.severity == EnumValidationSeverity.ERROR
|
|
120
|
+
|
|
121
|
+
def format_for_logging(self) -> str:
|
|
122
|
+
"""Format violation for structured logging output.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Formatted string suitable for structured logging systems.
|
|
126
|
+
Includes all relevant context for debugging chain violations.
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
>>> violation.format_for_logging()
|
|
130
|
+
'[error] CORRELATION_MISMATCH on message=abc123: Child message has...'
|
|
131
|
+
"""
|
|
132
|
+
expected_str = str(self.expected_value) if self.expected_value else "None"
|
|
133
|
+
actual_str = str(self.actual_value) if self.actual_value else "None"
|
|
134
|
+
parent_str = str(self.parent_message_id) if self.parent_message_id else "None"
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
f"[{self.severity}] {self.violation_type.value.upper()} "
|
|
138
|
+
f"on message={self.message_id}: {self.violation_message} "
|
|
139
|
+
f"(expected={expected_str}, actual={actual_str}, parent={parent_str})"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
def to_structured_dict(self) -> dict[str, str | None]:
|
|
143
|
+
"""Convert violation to a dictionary suitable for structured logging.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Dictionary with all violation fields as strings, suitable for
|
|
147
|
+
JSON logging or metrics systems.
|
|
148
|
+
|
|
149
|
+
Example:
|
|
150
|
+
>>> violation.to_structured_dict()
|
|
151
|
+
{'violation_type': 'correlation_mismatch', 'severity': 'error', ...}
|
|
152
|
+
"""
|
|
153
|
+
return {
|
|
154
|
+
"violation_type": self.violation_type.value,
|
|
155
|
+
"severity": self.severity,
|
|
156
|
+
"message_id": str(self.message_id),
|
|
157
|
+
"parent_message_id": (
|
|
158
|
+
str(self.parent_message_id) if self.parent_message_id else None
|
|
159
|
+
),
|
|
160
|
+
"expected_value": str(self.expected_value) if self.expected_value else None,
|
|
161
|
+
"actual_value": str(self.actual_value) if self.actual_value else None,
|
|
162
|
+
"violation_message": self.violation_message,
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
__all__ = ["ModelChainViolation"]
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Coverage metrics model for routing coverage validation.
|
|
4
|
+
|
|
5
|
+
This model replaces the union pattern `dict[str, int | float | list[str]]` that was
|
|
6
|
+
used for coverage report returns. By using a structured model with strongly-typed
|
|
7
|
+
fields, we eliminate the dict+union pattern while providing better type safety
|
|
8
|
+
and IDE support.
|
|
9
|
+
|
|
10
|
+
.. versionadded:: 0.6.0
|
|
11
|
+
Created as part of Union Reduction Phase 2 (OMN-1002).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from collections.abc import Collection, Mapping
|
|
17
|
+
from uuid import uuid4
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
20
|
+
|
|
21
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
22
|
+
from omnibase_infra.errors.error_infra import ProtocolConfigurationError
|
|
23
|
+
from omnibase_infra.models.errors.model_infra_error_context import (
|
|
24
|
+
ModelInfraErrorContext,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ModelCoverageMetrics(BaseModel):
|
|
29
|
+
"""Coverage metrics for routing validation.
|
|
30
|
+
|
|
31
|
+
This model normalizes coverage report results into a consistent structure,
|
|
32
|
+
replacing the `dict[str, int | float | list[str]]` pattern with strongly-typed
|
|
33
|
+
fields that provide better type safety and IDE support.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
total_types: Total number of discovered message types.
|
|
37
|
+
registered_types: Number of types with registered routes.
|
|
38
|
+
unmapped_types: List of type names without routes (sorted alphabetically).
|
|
39
|
+
coverage_percent: Percentage of types with routes (0.0 to 100.0).
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
>>> # Create metrics from validation results
|
|
43
|
+
>>> metrics = ModelCoverageMetrics.from_counts(
|
|
44
|
+
... total=100,
|
|
45
|
+
... registered=95,
|
|
46
|
+
... unmapped=["TypeA", "TypeB", "TypeC", "TypeD", "TypeE"],
|
|
47
|
+
... )
|
|
48
|
+
>>> metrics.total_types
|
|
49
|
+
100
|
|
50
|
+
>>> metrics.coverage_percent
|
|
51
|
+
95.0
|
|
52
|
+
|
|
53
|
+
>>> # Check if coverage meets threshold
|
|
54
|
+
>>> metrics.coverage_percent >= 90.0
|
|
55
|
+
True
|
|
56
|
+
|
|
57
|
+
.. versionadded:: 0.6.0
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
model_config = ConfigDict(
|
|
61
|
+
frozen=True,
|
|
62
|
+
extra="forbid",
|
|
63
|
+
strict=True,
|
|
64
|
+
from_attributes=True,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
total_types: int = Field(
|
|
68
|
+
...,
|
|
69
|
+
ge=0,
|
|
70
|
+
description="Total number of discovered message types.",
|
|
71
|
+
)
|
|
72
|
+
registered_types: int = Field(
|
|
73
|
+
...,
|
|
74
|
+
ge=0,
|
|
75
|
+
description="Number of types with registered routes.",
|
|
76
|
+
)
|
|
77
|
+
unmapped_types: list[str] = Field(
|
|
78
|
+
default_factory=list,
|
|
79
|
+
description="List of type names without routes (sorted alphabetically).",
|
|
80
|
+
)
|
|
81
|
+
coverage_percent: float = Field(
|
|
82
|
+
...,
|
|
83
|
+
ge=0.0,
|
|
84
|
+
le=100.0,
|
|
85
|
+
description="Percentage of types with routes (0.0 to 100.0).",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def from_counts(
|
|
90
|
+
cls,
|
|
91
|
+
total: int,
|
|
92
|
+
registered: int,
|
|
93
|
+
unmapped: Collection[str],
|
|
94
|
+
) -> ModelCoverageMetrics:
|
|
95
|
+
"""Create coverage metrics from raw counts.
|
|
96
|
+
|
|
97
|
+
This factory method calculates the coverage percentage and ensures
|
|
98
|
+
the unmapped types list is sorted for consistent output.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
total: Total number of discovered message types.
|
|
102
|
+
registered: Number of types with registered routes.
|
|
103
|
+
unmapped: Collection of type names without routes.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
ModelCoverageMetrics with calculated coverage percentage.
|
|
107
|
+
|
|
108
|
+
Example:
|
|
109
|
+
>>> metrics = ModelCoverageMetrics.from_counts(
|
|
110
|
+
... total=10,
|
|
111
|
+
... registered=8,
|
|
112
|
+
... unmapped=["ZType", "AType"],
|
|
113
|
+
... )
|
|
114
|
+
>>> metrics.coverage_percent
|
|
115
|
+
80.0
|
|
116
|
+
>>> metrics.unmapped_types
|
|
117
|
+
['AType', 'ZType']
|
|
118
|
+
|
|
119
|
+
.. versionadded:: 0.6.0
|
|
120
|
+
"""
|
|
121
|
+
coverage = (registered / total * 100) if total > 0 else 100.0
|
|
122
|
+
return cls(
|
|
123
|
+
total_types=total,
|
|
124
|
+
registered_types=registered,
|
|
125
|
+
unmapped_types=sorted(unmapped),
|
|
126
|
+
coverage_percent=coverage,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def from_discovery(
|
|
131
|
+
cls,
|
|
132
|
+
discovered_types: Mapping[str, object],
|
|
133
|
+
registered_routes: set[str],
|
|
134
|
+
) -> ModelCoverageMetrics:
|
|
135
|
+
"""Create coverage metrics from discovery results.
|
|
136
|
+
|
|
137
|
+
This factory method calculates metrics directly from the raw discovery
|
|
138
|
+
data, computing the unmapped types and coverage percentage.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
discovered_types: Dictionary of discovered type names to type info.
|
|
142
|
+
registered_routes: Set of type names with registered routes.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
ModelCoverageMetrics with calculated values.
|
|
146
|
+
|
|
147
|
+
Example:
|
|
148
|
+
>>> discovered = {"TypeA": ..., "TypeB": ..., "TypeC": ...}
|
|
149
|
+
>>> registered = {"TypeA", "TypeB"}
|
|
150
|
+
>>> metrics = ModelCoverageMetrics.from_discovery(discovered, registered)
|
|
151
|
+
>>> metrics.total_types
|
|
152
|
+
3
|
|
153
|
+
>>> metrics.registered_types
|
|
154
|
+
2
|
|
155
|
+
>>> metrics.unmapped_types
|
|
156
|
+
['TypeC']
|
|
157
|
+
|
|
158
|
+
.. versionadded:: 0.6.0
|
|
159
|
+
"""
|
|
160
|
+
discovered_names = set(discovered_types.keys())
|
|
161
|
+
unmapped = discovered_names - registered_routes
|
|
162
|
+
total = len(discovered_types)
|
|
163
|
+
registered = total - len(unmapped)
|
|
164
|
+
|
|
165
|
+
return cls.from_counts(
|
|
166
|
+
total=total,
|
|
167
|
+
registered=registered,
|
|
168
|
+
unmapped=unmapped,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
@classmethod
|
|
172
|
+
def from_legacy_dict(cls, report: dict[str, object]) -> ModelCoverageMetrics:
|
|
173
|
+
"""Create from legacy dictionary-based coverage report.
|
|
174
|
+
|
|
175
|
+
This factory method handles the conversion from the old dict pattern
|
|
176
|
+
to the new model structure. The parameter type uses ``dict[str, object]``
|
|
177
|
+
instead of ``dict[str, int | float | list[str]]`` to reduce union count;
|
|
178
|
+
runtime type assertions ensure the values have the expected types.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
report: Legacy coverage report dictionary with keys:
|
|
182
|
+
- "total_types": int
|
|
183
|
+
- "registered_types": int
|
|
184
|
+
- "unmapped_types": list[str]
|
|
185
|
+
- "coverage_percent": float
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
ModelCoverageMetrics with equivalent values.
|
|
189
|
+
|
|
190
|
+
Raises:
|
|
191
|
+
ProtocolConfigurationError: If any value has an unexpected type.
|
|
192
|
+
|
|
193
|
+
Example:
|
|
194
|
+
>>> legacy = {
|
|
195
|
+
... "total_types": 100,
|
|
196
|
+
... "registered_types": 95,
|
|
197
|
+
... "unmapped_types": ["TypeA", "TypeB"],
|
|
198
|
+
... "coverage_percent": 95.0,
|
|
199
|
+
... }
|
|
200
|
+
>>> metrics = ModelCoverageMetrics.from_legacy_dict(legacy)
|
|
201
|
+
>>> metrics.total_types
|
|
202
|
+
100
|
|
203
|
+
|
|
204
|
+
.. versionadded:: 0.6.0
|
|
205
|
+
"""
|
|
206
|
+
# Type assertions validate the expected structure at runtime
|
|
207
|
+
total_types = report["total_types"]
|
|
208
|
+
registered_types = report["registered_types"]
|
|
209
|
+
unmapped_types = report["unmapped_types"]
|
|
210
|
+
coverage_percent = report["coverage_percent"]
|
|
211
|
+
|
|
212
|
+
context = ModelInfraErrorContext(
|
|
213
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
214
|
+
operation="from_legacy_dict",
|
|
215
|
+
correlation_id=uuid4(),
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
if not isinstance(total_types, int):
|
|
219
|
+
raise ProtocolConfigurationError("total_types must be int", context=context)
|
|
220
|
+
if not isinstance(registered_types, int):
|
|
221
|
+
raise ProtocolConfigurationError(
|
|
222
|
+
"registered_types must be int", context=context
|
|
223
|
+
)
|
|
224
|
+
if not isinstance(unmapped_types, list):
|
|
225
|
+
raise ProtocolConfigurationError(
|
|
226
|
+
"unmapped_types must be list[str]", context=context
|
|
227
|
+
)
|
|
228
|
+
if not isinstance(coverage_percent, int | float):
|
|
229
|
+
raise ProtocolConfigurationError(
|
|
230
|
+
"coverage_percent must be int or float", context=context
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
return cls(
|
|
234
|
+
total_types=total_types,
|
|
235
|
+
registered_types=registered_types,
|
|
236
|
+
unmapped_types=unmapped_types,
|
|
237
|
+
coverage_percent=float(coverage_percent),
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
def to_dict(self) -> dict[str, object]:
|
|
241
|
+
"""Convert to legacy dictionary format.
|
|
242
|
+
|
|
243
|
+
This method enables gradual migration by allowing conversion back
|
|
244
|
+
to the original format where needed for backwards compatibility.
|
|
245
|
+
|
|
246
|
+
The return type uses ``dict[str, object]`` instead of the union
|
|
247
|
+
``dict[str, int | float | list[str]]`` to reduce union count while
|
|
248
|
+
maintaining structural compatibility. Callers should use the typed
|
|
249
|
+
model fields for type-safe access; this method is primarily for
|
|
250
|
+
serialization and legacy API compatibility.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Dictionary with keys: total_types (int), registered_types (int),
|
|
254
|
+
unmapped_types (list[str]), coverage_percent (float).
|
|
255
|
+
|
|
256
|
+
Example:
|
|
257
|
+
>>> metrics = ModelCoverageMetrics.from_counts(
|
|
258
|
+
... total=100, registered=95, unmapped=["TypeA"]
|
|
259
|
+
... )
|
|
260
|
+
>>> report = metrics.to_dict()
|
|
261
|
+
>>> report["total_types"]
|
|
262
|
+
100
|
|
263
|
+
>>> report["coverage_percent"]
|
|
264
|
+
95.0
|
|
265
|
+
|
|
266
|
+
.. versionadded:: 0.6.0
|
|
267
|
+
"""
|
|
268
|
+
return {
|
|
269
|
+
"total_types": self.total_types,
|
|
270
|
+
"registered_types": self.registered_types,
|
|
271
|
+
"unmapped_types": list(self.unmapped_types), # defensive copy
|
|
272
|
+
"coverage_percent": self.coverage_percent,
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@property
|
|
276
|
+
def is_fully_covered(self) -> bool:
|
|
277
|
+
"""Check if all types have routes.
|
|
278
|
+
|
|
279
|
+
Returns:
|
|
280
|
+
True if coverage is 100%, False otherwise.
|
|
281
|
+
|
|
282
|
+
Example:
|
|
283
|
+
>>> metrics = ModelCoverageMetrics.from_counts(
|
|
284
|
+
... total=10, registered=10, unmapped=[]
|
|
285
|
+
... )
|
|
286
|
+
>>> metrics.is_fully_covered
|
|
287
|
+
True
|
|
288
|
+
|
|
289
|
+
.. versionadded:: 0.6.0
|
|
290
|
+
"""
|
|
291
|
+
return len(self.unmapped_types) == 0
|
|
292
|
+
|
|
293
|
+
def meets_threshold(self, threshold_percent: float) -> bool:
|
|
294
|
+
"""Check if coverage meets a minimum threshold.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
threshold_percent: Minimum required coverage percentage (0.0 to 100.0).
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
True if coverage_percent >= threshold_percent.
|
|
301
|
+
|
|
302
|
+
Example:
|
|
303
|
+
>>> metrics = ModelCoverageMetrics.from_counts(
|
|
304
|
+
... total=100, registered=95, unmapped=["TypeA"] * 5
|
|
305
|
+
... )
|
|
306
|
+
>>> metrics.meets_threshold(90.0)
|
|
307
|
+
True
|
|
308
|
+
>>> metrics.meets_threshold(99.0)
|
|
309
|
+
False
|
|
310
|
+
|
|
311
|
+
.. versionadded:: 0.6.0
|
|
312
|
+
"""
|
|
313
|
+
return self.coverage_percent >= threshold_percent
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
__all__ = ["ModelCoverageMetrics"]
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Execution Shape Rule Model.
|
|
4
|
+
|
|
5
|
+
Defines the validation rules for ONEX node archetype execution shapes.
|
|
6
|
+
Each rule specifies what node output types a node archetype is allowed
|
|
7
|
+
to return, whether it can publish directly, and other constraints.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, Field, ValidationInfo, field_validator
|
|
13
|
+
|
|
14
|
+
from omnibase_infra.enums import EnumNodeArchetype, EnumNodeOutputType
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ModelExecutionShapeRule(BaseModel):
|
|
18
|
+
"""Execution shape rule for ONEX node archetype validation.
|
|
19
|
+
|
|
20
|
+
Defines the constraints for a specific node archetype in the ONEX
|
|
21
|
+
4-node architecture. These rules are used by the execution shape
|
|
22
|
+
validator to detect violations during static analysis.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
node_archetype: The node archetype this rule applies to.
|
|
26
|
+
allowed_return_types: Node output types the node CAN return.
|
|
27
|
+
forbidden_return_types: Node output types the node CANNOT return.
|
|
28
|
+
can_publish_directly: Whether node can bypass event bus routing.
|
|
29
|
+
can_access_system_time: Whether node can access non-deterministic time.
|
|
30
|
+
|
|
31
|
+
Example:
|
|
32
|
+
>>> from omnibase_infra.enums import EnumNodeArchetype, EnumNodeOutputType
|
|
33
|
+
>>> from omnibase_infra.models.validation import ModelExecutionShapeRule
|
|
34
|
+
>>>
|
|
35
|
+
>>> # Reducer rule: can return projections, cannot return events
|
|
36
|
+
>>> rule = ModelExecutionShapeRule(
|
|
37
|
+
... node_archetype=EnumNodeArchetype.REDUCER,
|
|
38
|
+
... allowed_return_types=[EnumNodeOutputType.PROJECTION],
|
|
39
|
+
... forbidden_return_types=[EnumNodeOutputType.EVENT],
|
|
40
|
+
... can_publish_directly=False,
|
|
41
|
+
... can_access_system_time=False,
|
|
42
|
+
... )
|
|
43
|
+
>>>
|
|
44
|
+
>>> # Check if a return type is allowed
|
|
45
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.PROJECTION) # True
|
|
46
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.EVENT) # False
|
|
47
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.COMMAND) # False (not in allowed)
|
|
48
|
+
|
|
49
|
+
Note:
|
|
50
|
+
**Interaction between allowed_return_types and forbidden_return_types:**
|
|
51
|
+
|
|
52
|
+
The validation logic applies rules in the following priority order:
|
|
53
|
+
|
|
54
|
+
1. **Forbidden check (highest priority)**: Output types in
|
|
55
|
+
`forbidden_return_types` are ALWAYS rejected, regardless of
|
|
56
|
+
whether they appear in `allowed_return_types`.
|
|
57
|
+
|
|
58
|
+
2. **Allowed check**: If `allowed_return_types` is non-empty,
|
|
59
|
+
the output type must be in that list to be allowed (explicit
|
|
60
|
+
allow-list mode).
|
|
61
|
+
|
|
62
|
+
3. **Permissive fallback**: If `allowed_return_types` is empty,
|
|
63
|
+
all non-forbidden output types are implicitly allowed. This mode
|
|
64
|
+
is not typically used in ONEX nodes.
|
|
65
|
+
|
|
66
|
+
**Practical usage in ONEX:**
|
|
67
|
+
|
|
68
|
+
Most node archetype rules explicitly list their allowed output types for
|
|
69
|
+
clarity and type safety:
|
|
70
|
+
|
|
71
|
+
- EFFECT: allowed=[EVENT, COMMAND], forbidden=[PROJECTION]
|
|
72
|
+
- COMPUTE: allowed=[all 4 output types], forbidden=[] (fully permissive)
|
|
73
|
+
- REDUCER: allowed=[PROJECTION], forbidden=[EVENT]
|
|
74
|
+
- ORCHESTRATOR: allowed=[COMMAND, EVENT], forbidden=[INTENT, PROJECTION]
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
node_archetype: EnumNodeArchetype = Field(
|
|
78
|
+
...,
|
|
79
|
+
description="The node archetype this rule applies to",
|
|
80
|
+
)
|
|
81
|
+
allowed_return_types: list[EnumNodeOutputType] = Field(
|
|
82
|
+
default_factory=list,
|
|
83
|
+
description=(
|
|
84
|
+
"Node output types this node archetype is explicitly allowed to return. "
|
|
85
|
+
"If non-empty, acts as an allow-list: only listed types pass validation. "
|
|
86
|
+
"If empty, all non-forbidden types are implicitly allowed (permissive mode). "
|
|
87
|
+
"Used by is_return_type_allowed() method for validation. "
|
|
88
|
+
"Example: REDUCER sets [PROJECTION] to only allow projections, "
|
|
89
|
+
"while COMPUTE sets all 4 types to be fully permissive."
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
forbidden_return_types: list[EnumNodeOutputType] = Field(
|
|
93
|
+
default_factory=list,
|
|
94
|
+
description="Node output types this node archetype is forbidden from returning",
|
|
95
|
+
)
|
|
96
|
+
can_publish_directly: bool = Field(
|
|
97
|
+
default=False,
|
|
98
|
+
description="Whether this node can publish messages directly (bypassing event bus)",
|
|
99
|
+
)
|
|
100
|
+
can_access_system_time: bool = Field(
|
|
101
|
+
default=True,
|
|
102
|
+
description="Whether this node can access system time (non-deterministic)",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
model_config = ConfigDict(
|
|
106
|
+
frozen=True,
|
|
107
|
+
str_strip_whitespace=True,
|
|
108
|
+
use_enum_values=False, # Keep enum objects for type safety
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
@field_validator("allowed_return_types", "forbidden_return_types")
|
|
112
|
+
@classmethod
|
|
113
|
+
def validate_no_duplicates(
|
|
114
|
+
cls, v: list[EnumNodeOutputType], info: ValidationInfo
|
|
115
|
+
) -> list[EnumNodeOutputType]:
|
|
116
|
+
"""Ensure no duplicate output types in return type lists."""
|
|
117
|
+
if len(v) != len(set(v)):
|
|
118
|
+
raise ValueError(f"Duplicate output types in {info.field_name}")
|
|
119
|
+
return v
|
|
120
|
+
|
|
121
|
+
def is_return_type_allowed(self, output_type: EnumNodeOutputType) -> bool:
|
|
122
|
+
"""Check if a node output type is allowed as a return type.
|
|
123
|
+
|
|
124
|
+
The validation logic applies the following rules in order:
|
|
125
|
+
|
|
126
|
+
1. If the output type is in `forbidden_return_types`, it is always forbidden.
|
|
127
|
+
2. If `allowed_return_types` is non-empty, the output type must be in that list
|
|
128
|
+
to be allowed (explicit allow-list mode).
|
|
129
|
+
3. If `allowed_return_types` is empty, all non-forbidden output types are
|
|
130
|
+
implicitly allowed (permissive mode for COMPUTE nodes).
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
output_type: The node output type to check.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
True if the output type is allowed, False if forbidden.
|
|
137
|
+
|
|
138
|
+
Example:
|
|
139
|
+
>>> # REDUCER: allowed=[PROJECTION], forbidden=[EVENT]
|
|
140
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.PROJECTION) # True
|
|
141
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.EVENT) # False
|
|
142
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.COMMAND) # False (not in allowed)
|
|
143
|
+
>>>
|
|
144
|
+
>>> # COMPUTE: allowed=[all 4 output types], forbidden=[]
|
|
145
|
+
>>> rule.is_return_type_allowed(EnumNodeOutputType.EVENT) # True
|
|
146
|
+
"""
|
|
147
|
+
# Rule 1: Forbidden output types are always rejected
|
|
148
|
+
if output_type in self.forbidden_return_types:
|
|
149
|
+
return False
|
|
150
|
+
|
|
151
|
+
# Rule 2: If allowed list is specified, output type must be in it
|
|
152
|
+
if self.allowed_return_types and output_type not in self.allowed_return_types:
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
# Rule 3: All other output types are allowed
|
|
156
|
+
return True
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
__all__ = ["ModelExecutionShapeRule"]
|