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,596 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Mixin for execution shape violation checking.
|
|
4
|
+
|
|
5
|
+
This module provides the MixinExecutionShapeViolationChecks mixin which extracts
|
|
6
|
+
violation detection logic from ExecutionShapeValidator. It validates ONEX handlers
|
|
7
|
+
against execution shape rules (return types, publish calls, system time access).
|
|
8
|
+
|
|
9
|
+
Violation Types:
|
|
10
|
+
- REDUCER_RETURNS_EVENTS: Reducer handler returns Event types
|
|
11
|
+
- ORCHESTRATOR_RETURNS_INTENTS: Orchestrator returns Intent types
|
|
12
|
+
- ORCHESTRATOR_RETURNS_PROJECTIONS: Orchestrator returns Projection types
|
|
13
|
+
- EFFECT_RETURNS_PROJECTIONS: Effect handler returns Projection types
|
|
14
|
+
- HANDLER_DIRECT_PUBLISH: Any handler calls .publish() directly
|
|
15
|
+
- REDUCER_ACCESSES_SYSTEM_TIME: Reducer calls time.time(), datetime.now(), etc.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import ast
|
|
21
|
+
from typing import TYPE_CHECKING
|
|
22
|
+
|
|
23
|
+
from omnibase_infra.enums import (
|
|
24
|
+
EnumExecutionShapeViolation,
|
|
25
|
+
EnumMessageCategory,
|
|
26
|
+
EnumNodeArchetype,
|
|
27
|
+
EnumNodeOutputType,
|
|
28
|
+
EnumValidationSeverity,
|
|
29
|
+
)
|
|
30
|
+
from omnibase_infra.models.validation.model_execution_shape_rule import (
|
|
31
|
+
ModelExecutionShapeRule,
|
|
32
|
+
)
|
|
33
|
+
from omnibase_infra.models.validation.model_execution_shape_violation import (
|
|
34
|
+
ModelExecutionShapeViolationResult,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from omnibase_infra.validation.validator_execution_shape import (
|
|
39
|
+
ModelDetectedNodeInfo,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Forbidden direct publish method names
|
|
43
|
+
_FORBIDDEN_PUBLISH_METHODS: frozenset[str] = frozenset(
|
|
44
|
+
{
|
|
45
|
+
"publish",
|
|
46
|
+
"send_event",
|
|
47
|
+
"emit",
|
|
48
|
+
"emit_event",
|
|
49
|
+
"dispatch",
|
|
50
|
+
"dispatch_event",
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# System time access patterns (non-deterministic for reducers)
|
|
55
|
+
_SYSTEM_TIME_PATTERNS: frozenset[str] = frozenset(
|
|
56
|
+
{
|
|
57
|
+
"time.time",
|
|
58
|
+
"datetime.now",
|
|
59
|
+
"datetime.utcnow",
|
|
60
|
+
"datetime.datetime.now",
|
|
61
|
+
"datetime.datetime.utcnow",
|
|
62
|
+
# Django timezone support
|
|
63
|
+
"timezone.now",
|
|
64
|
+
"django.utils.timezone.now",
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Module-level time function patterns
|
|
69
|
+
_TIME_FUNCTION_NAMES: frozenset[str] = frozenset(
|
|
70
|
+
{
|
|
71
|
+
"time",
|
|
72
|
+
"now",
|
|
73
|
+
"utcnow",
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Mapping from EnumMessageCategory to EnumNodeOutputType for type normalization.
|
|
78
|
+
_MESSAGE_CATEGORY_TO_OUTPUT_TYPE: dict[EnumMessageCategory, EnumNodeOutputType] = {
|
|
79
|
+
EnumMessageCategory.EVENT: EnumNodeOutputType.EVENT,
|
|
80
|
+
EnumMessageCategory.COMMAND: EnumNodeOutputType.COMMAND,
|
|
81
|
+
EnumMessageCategory.INTENT: EnumNodeOutputType.INTENT,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class MixinExecutionShapeViolationChecks:
|
|
86
|
+
"""Mixin providing execution shape violation checking capabilities.
|
|
87
|
+
|
|
88
|
+
This mixin extracts violation checking logic from ExecutionShapeValidator
|
|
89
|
+
to reduce method count while preserving functionality.
|
|
90
|
+
|
|
91
|
+
Requires:
|
|
92
|
+
- `_rules: dict[EnumNodeArchetype, ModelExecutionShapeRule]` attribute
|
|
93
|
+
- `_get_name_from_expr(expr: ast.expr) -> str | None` method
|
|
94
|
+
|
|
95
|
+
Methods:
|
|
96
|
+
_validate_handler: Validate a single handler for violations.
|
|
97
|
+
_check_return_type_violations: Check for forbidden return types.
|
|
98
|
+
_is_return_type_allowed: Check if return type is allowed.
|
|
99
|
+
_analyze_return_value: Analyze return statement for forbidden types.
|
|
100
|
+
_detect_message_category: Detect message category from type name.
|
|
101
|
+
_create_return_type_violation: Create return type violation result.
|
|
102
|
+
_check_direct_publish_violations: Check for direct publish calls.
|
|
103
|
+
_check_system_time_violations: Check for system time access.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
# Type hint for _rules attribute (set by main class)
|
|
107
|
+
_rules: dict[EnumNodeArchetype, ModelExecutionShapeRule]
|
|
108
|
+
|
|
109
|
+
def _validate_handler(
|
|
110
|
+
self,
|
|
111
|
+
handler: ModelDetectedNodeInfo,
|
|
112
|
+
) -> list[ModelExecutionShapeViolationResult]:
|
|
113
|
+
"""Validate a single handler for execution shape violations.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
handler: The handler information.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
List of violations found in this handler.
|
|
120
|
+
"""
|
|
121
|
+
violations: list[ModelExecutionShapeViolationResult] = []
|
|
122
|
+
rule = self._rules.get(handler.node_archetype)
|
|
123
|
+
|
|
124
|
+
if rule is None:
|
|
125
|
+
return violations
|
|
126
|
+
|
|
127
|
+
# Get all methods if this is a class
|
|
128
|
+
methods: list[ast.FunctionDef | ast.AsyncFunctionDef] = []
|
|
129
|
+
if isinstance(handler.node, ast.ClassDef):
|
|
130
|
+
for item in handler.node.body:
|
|
131
|
+
if isinstance(item, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
132
|
+
methods.append(item)
|
|
133
|
+
else:
|
|
134
|
+
methods = [handler.node]
|
|
135
|
+
|
|
136
|
+
# Validate each method
|
|
137
|
+
for method in methods:
|
|
138
|
+
# Check return type violations
|
|
139
|
+
return_violations = self._check_return_type_violations(
|
|
140
|
+
method, handler, rule
|
|
141
|
+
)
|
|
142
|
+
violations.extend(return_violations)
|
|
143
|
+
|
|
144
|
+
# Check direct publish violations
|
|
145
|
+
publish_violations = self._check_direct_publish_violations(method, handler)
|
|
146
|
+
violations.extend(publish_violations)
|
|
147
|
+
|
|
148
|
+
# Check system time access violations (reducers only)
|
|
149
|
+
if not rule.can_access_system_time:
|
|
150
|
+
time_violations = self._check_system_time_violations(method, handler)
|
|
151
|
+
violations.extend(time_violations)
|
|
152
|
+
|
|
153
|
+
return violations
|
|
154
|
+
|
|
155
|
+
def _check_return_type_violations(
|
|
156
|
+
self,
|
|
157
|
+
method: ast.FunctionDef | ast.AsyncFunctionDef,
|
|
158
|
+
handler: ModelDetectedNodeInfo,
|
|
159
|
+
rule: ModelExecutionShapeRule,
|
|
160
|
+
) -> list[ModelExecutionShapeViolationResult]:
|
|
161
|
+
"""Check for forbidden return type violations.
|
|
162
|
+
|
|
163
|
+
Analyzes:
|
|
164
|
+
1. Return type annotations
|
|
165
|
+
2. Actual return statements
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
method: The method AST node.
|
|
169
|
+
handler: The handler information.
|
|
170
|
+
rule: The execution shape rule to validate against.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
List of return type violations.
|
|
174
|
+
"""
|
|
175
|
+
violations: list[ModelExecutionShapeViolationResult] = []
|
|
176
|
+
|
|
177
|
+
# Check return type annotation
|
|
178
|
+
if method.returns is not None:
|
|
179
|
+
annotation_str = self._get_name_from_expr(method.returns)
|
|
180
|
+
if annotation_str is not None:
|
|
181
|
+
category = self._detect_message_category(annotation_str)
|
|
182
|
+
if category is not None and not self._is_return_type_allowed(
|
|
183
|
+
category, handler.node_archetype, rule
|
|
184
|
+
):
|
|
185
|
+
violation = self._create_return_type_violation(
|
|
186
|
+
handler, method.lineno, category, annotation_str
|
|
187
|
+
)
|
|
188
|
+
if violation is not None:
|
|
189
|
+
violations.append(violation)
|
|
190
|
+
|
|
191
|
+
# Check actual return statements
|
|
192
|
+
for node in ast.walk(method):
|
|
193
|
+
if isinstance(node, ast.Return) and node.value is not None:
|
|
194
|
+
return_violations = self._analyze_return_value(node, handler, rule)
|
|
195
|
+
violations.extend(return_violations)
|
|
196
|
+
|
|
197
|
+
return violations
|
|
198
|
+
|
|
199
|
+
def _is_return_type_allowed(
|
|
200
|
+
self,
|
|
201
|
+
category: EnumMessageCategory | EnumNodeOutputType,
|
|
202
|
+
node_archetype: EnumNodeArchetype,
|
|
203
|
+
rule: ModelExecutionShapeRule,
|
|
204
|
+
) -> bool:
|
|
205
|
+
"""Check if a return type is allowed for a handler.
|
|
206
|
+
|
|
207
|
+
Handles both EnumMessageCategory (EVENT, COMMAND, INTENT) and
|
|
208
|
+
EnumNodeOutputType (PROJECTION) appropriately by converting
|
|
209
|
+
message categories to their corresponding node output types.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
category: The detected message category or node output type.
|
|
213
|
+
node_archetype: The node archetype to check against.
|
|
214
|
+
rule: The execution shape rule (uses EnumNodeOutputType).
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
True if the return type is allowed, False otherwise.
|
|
218
|
+
"""
|
|
219
|
+
# Convert EnumMessageCategory to EnumNodeOutputType for validation
|
|
220
|
+
# since the rules use EnumNodeOutputType consistently
|
|
221
|
+
output_type: EnumNodeOutputType
|
|
222
|
+
if isinstance(category, EnumNodeOutputType):
|
|
223
|
+
output_type = category
|
|
224
|
+
elif isinstance(category, EnumMessageCategory):
|
|
225
|
+
# Use module-level mapping constant for type conversion
|
|
226
|
+
mapped_type = _MESSAGE_CATEGORY_TO_OUTPUT_TYPE.get(category)
|
|
227
|
+
if mapped_type is None:
|
|
228
|
+
# Forward compatibility: Unknown/new message category - disallow
|
|
229
|
+
# by default until explicitly added to the module-level mapping.
|
|
230
|
+
return False
|
|
231
|
+
output_type = mapped_type
|
|
232
|
+
else:
|
|
233
|
+
# Unknown category type - disallow by default
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
return rule.is_return_type_allowed(output_type)
|
|
237
|
+
|
|
238
|
+
def _analyze_return_value(
|
|
239
|
+
self,
|
|
240
|
+
return_node: ast.Return,
|
|
241
|
+
handler: ModelDetectedNodeInfo,
|
|
242
|
+
rule: ModelExecutionShapeRule,
|
|
243
|
+
) -> list[ModelExecutionShapeViolationResult]:
|
|
244
|
+
"""Analyze a return statement for forbidden types.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
return_node: The return statement AST node.
|
|
248
|
+
handler: The handler information.
|
|
249
|
+
rule: The execution shape rule.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
List of violations from this return statement.
|
|
253
|
+
"""
|
|
254
|
+
violations: list[ModelExecutionShapeViolationResult] = []
|
|
255
|
+
|
|
256
|
+
if return_node.value is None:
|
|
257
|
+
return violations
|
|
258
|
+
|
|
259
|
+
# Check if returning a call like Event(...) or ModelEvent(...)
|
|
260
|
+
if isinstance(return_node.value, ast.Call):
|
|
261
|
+
func_name = self._get_name_from_expr(return_node.value.func)
|
|
262
|
+
if func_name is not None:
|
|
263
|
+
category = self._detect_message_category(func_name)
|
|
264
|
+
if category is not None and not self._is_return_type_allowed(
|
|
265
|
+
category, handler.node_archetype, rule
|
|
266
|
+
):
|
|
267
|
+
violation = self._create_return_type_violation(
|
|
268
|
+
handler, return_node.lineno, category, func_name
|
|
269
|
+
)
|
|
270
|
+
if violation is not None:
|
|
271
|
+
violations.append(violation)
|
|
272
|
+
|
|
273
|
+
# Check if returning a variable with a type-hinted name
|
|
274
|
+
if isinstance(return_node.value, ast.Name):
|
|
275
|
+
var_name = return_node.value.id
|
|
276
|
+
category = self._detect_message_category(var_name)
|
|
277
|
+
if category is not None and not self._is_return_type_allowed(
|
|
278
|
+
category, handler.node_archetype, rule
|
|
279
|
+
):
|
|
280
|
+
violation = self._create_return_type_violation(
|
|
281
|
+
handler, return_node.lineno, category, var_name
|
|
282
|
+
)
|
|
283
|
+
if violation is not None:
|
|
284
|
+
violations.append(violation)
|
|
285
|
+
|
|
286
|
+
return violations
|
|
287
|
+
|
|
288
|
+
def _detect_message_category(
|
|
289
|
+
self, name: str
|
|
290
|
+
) -> EnumMessageCategory | EnumNodeOutputType | None:
|
|
291
|
+
"""Detect message category or node output type from a type or variable name.
|
|
292
|
+
|
|
293
|
+
Uses a multi-phase detection strategy:
|
|
294
|
+
1. First, check for exact suffix matches (most reliable, fewest false positives)
|
|
295
|
+
2. Then, check for prefix patterns (Model* naming convention)
|
|
296
|
+
3. Check for exact uppercase enum-style names
|
|
297
|
+
4. Finally, lenient substring matching (catches non-standard names)
|
|
298
|
+
|
|
299
|
+
Note:
|
|
300
|
+
PROJECTION returns EnumNodeOutputType.PROJECTION because projections
|
|
301
|
+
are node output types, not message categories for routing.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
name: The name to analyze (type name, class name, or variable name).
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
The detected message category or EnumNodeOutputType.PROJECTION, or None.
|
|
308
|
+
"""
|
|
309
|
+
# Phase 1: Check suffix-based patterns (most reliable)
|
|
310
|
+
suffix_patterns: list[tuple[str, EnumMessageCategory | EnumNodeOutputType]] = [
|
|
311
|
+
# Event suffixes - ordered by length (longest first)
|
|
312
|
+
("EventMessage", EnumMessageCategory.EVENT),
|
|
313
|
+
("Event", EnumMessageCategory.EVENT),
|
|
314
|
+
# Command suffixes - ordered by length (longest first)
|
|
315
|
+
("CommandMessage", EnumMessageCategory.COMMAND),
|
|
316
|
+
("Command", EnumMessageCategory.COMMAND),
|
|
317
|
+
# Intent suffixes - ordered by length (longest first)
|
|
318
|
+
("IntentMessage", EnumMessageCategory.INTENT),
|
|
319
|
+
("Intent", EnumMessageCategory.INTENT),
|
|
320
|
+
# Projection suffixes - use EnumNodeOutputType (not a message category)
|
|
321
|
+
("ProjectionMessage", EnumNodeOutputType.PROJECTION),
|
|
322
|
+
("Projection", EnumNodeOutputType.PROJECTION),
|
|
323
|
+
]
|
|
324
|
+
|
|
325
|
+
for suffix, category in suffix_patterns:
|
|
326
|
+
if name.endswith(suffix):
|
|
327
|
+
return category
|
|
328
|
+
|
|
329
|
+
# Phase 2: Check prefix patterns for Model* naming convention
|
|
330
|
+
prefix_patterns: list[tuple[str, EnumMessageCategory | EnumNodeOutputType]] = [
|
|
331
|
+
("ModelEvent", EnumMessageCategory.EVENT),
|
|
332
|
+
("ModelCommand", EnumMessageCategory.COMMAND),
|
|
333
|
+
("ModelIntent", EnumMessageCategory.INTENT),
|
|
334
|
+
("ModelProjection", EnumNodeOutputType.PROJECTION),
|
|
335
|
+
]
|
|
336
|
+
|
|
337
|
+
for prefix, category in prefix_patterns:
|
|
338
|
+
if name.startswith(prefix):
|
|
339
|
+
return category
|
|
340
|
+
|
|
341
|
+
# Phase 3: Check for exact uppercase enum-style names
|
|
342
|
+
uppercase_patterns: dict[str, EnumMessageCategory | EnumNodeOutputType] = {
|
|
343
|
+
"EVENT": EnumMessageCategory.EVENT,
|
|
344
|
+
"COMMAND": EnumMessageCategory.COMMAND,
|
|
345
|
+
"INTENT": EnumMessageCategory.INTENT,
|
|
346
|
+
"PROJECTION": EnumNodeOutputType.PROJECTION,
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
if name in uppercase_patterns:
|
|
350
|
+
return uppercase_patterns[name]
|
|
351
|
+
|
|
352
|
+
# Phase 4: Lenient substring matching for non-standard naming
|
|
353
|
+
name_lower = name.lower()
|
|
354
|
+
|
|
355
|
+
if name_lower.endswith("event") or "_event" in name_lower:
|
|
356
|
+
return EnumMessageCategory.EVENT
|
|
357
|
+
if name_lower.endswith("command") or "_command" in name_lower:
|
|
358
|
+
return EnumMessageCategory.COMMAND
|
|
359
|
+
if name_lower.endswith("intent") or "_intent" in name_lower:
|
|
360
|
+
return EnumMessageCategory.INTENT
|
|
361
|
+
if name_lower.endswith("projection") or "_projection" in name_lower:
|
|
362
|
+
return EnumNodeOutputType.PROJECTION
|
|
363
|
+
|
|
364
|
+
return None
|
|
365
|
+
|
|
366
|
+
def _create_return_type_violation(
|
|
367
|
+
self,
|
|
368
|
+
handler: ModelDetectedNodeInfo,
|
|
369
|
+
line_number: int,
|
|
370
|
+
category: EnumMessageCategory | EnumNodeOutputType,
|
|
371
|
+
type_name: str,
|
|
372
|
+
) -> ModelExecutionShapeViolationResult | None:
|
|
373
|
+
"""Create a return type violation result.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
handler: The handler information.
|
|
377
|
+
line_number: Line number of the violation.
|
|
378
|
+
category: The forbidden message category or node output type.
|
|
379
|
+
type_name: The actual type name in code.
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
The violation result, or None if no matching violation type.
|
|
383
|
+
"""
|
|
384
|
+
violation_type: EnumExecutionShapeViolation | None = None
|
|
385
|
+
message = ""
|
|
386
|
+
|
|
387
|
+
# Get the execution shape rule for context
|
|
388
|
+
rule = self._rules.get(handler.node_archetype)
|
|
389
|
+
allowed_types_str = (
|
|
390
|
+
", ".join(t.name for t in rule.allowed_return_types) if rule else "unknown"
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
# Helper to check if category matches EVENT (from either enum)
|
|
394
|
+
def is_event(cat: EnumMessageCategory | EnumNodeOutputType) -> bool:
|
|
395
|
+
return cat == EnumMessageCategory.EVENT or cat == EnumNodeOutputType.EVENT
|
|
396
|
+
|
|
397
|
+
# Helper to check if category matches INTENT (from either enum)
|
|
398
|
+
def is_intent(cat: EnumMessageCategory | EnumNodeOutputType) -> bool:
|
|
399
|
+
return cat == EnumMessageCategory.INTENT or cat == EnumNodeOutputType.INTENT
|
|
400
|
+
|
|
401
|
+
# Helper to check if category matches PROJECTION
|
|
402
|
+
def is_projection(cat: EnumMessageCategory | EnumNodeOutputType) -> bool:
|
|
403
|
+
return cat == EnumNodeOutputType.PROJECTION
|
|
404
|
+
|
|
405
|
+
# Get the category name for consistent error messages
|
|
406
|
+
category_name = category.name if hasattr(category, "name") else str(category)
|
|
407
|
+
|
|
408
|
+
if handler.node_archetype == EnumNodeArchetype.REDUCER:
|
|
409
|
+
if is_event(category):
|
|
410
|
+
violation_type = EnumExecutionShapeViolation.REDUCER_RETURNS_EVENTS
|
|
411
|
+
message = (
|
|
412
|
+
f"Execution shape violation: Node archetype 'REDUCER' cannot produce "
|
|
413
|
+
f"output type 'EVENT'. Handler '{handler.name}' returns type '{type_name}'. "
|
|
414
|
+
f"Expected output types: [{allowed_types_str}]. Found: {category_name}. "
|
|
415
|
+
f"Reducers must be pure state projectors; event emission is an EFFECT operation."
|
|
416
|
+
)
|
|
417
|
+
elif handler.node_archetype == EnumNodeArchetype.ORCHESTRATOR:
|
|
418
|
+
if is_intent(category):
|
|
419
|
+
violation_type = (
|
|
420
|
+
EnumExecutionShapeViolation.ORCHESTRATOR_RETURNS_INTENTS
|
|
421
|
+
)
|
|
422
|
+
message = (
|
|
423
|
+
f"Execution shape violation: Node archetype 'ORCHESTRATOR' cannot produce "
|
|
424
|
+
f"output type 'INTENT'. Handler '{handler.name}' returns type '{type_name}'. "
|
|
425
|
+
f"Expected output types: [{allowed_types_str}]. Found: {category_name}. "
|
|
426
|
+
f"Intents represent external user/system requests and should not be "
|
|
427
|
+
f"generated by orchestration logic."
|
|
428
|
+
)
|
|
429
|
+
elif is_projection(category):
|
|
430
|
+
violation_type = (
|
|
431
|
+
EnumExecutionShapeViolation.ORCHESTRATOR_RETURNS_PROJECTIONS
|
|
432
|
+
)
|
|
433
|
+
message = (
|
|
434
|
+
f"Execution shape violation: Node archetype 'ORCHESTRATOR' cannot produce "
|
|
435
|
+
f"output type 'PROJECTION'. Handler '{handler.name}' returns type '{type_name}'. "
|
|
436
|
+
f"Expected output types: [{allowed_types_str}]. Found: {category_name}. "
|
|
437
|
+
f"PROJECTION (EnumNodeOutputType.PROJECTION) represents aggregated state "
|
|
438
|
+
f"and is only valid for REDUCER nodes. Orchestrators coordinate workflows "
|
|
439
|
+
f"and should emit COMMAND or EVENT types."
|
|
440
|
+
)
|
|
441
|
+
elif handler.node_archetype == EnumNodeArchetype.EFFECT:
|
|
442
|
+
if is_projection(category):
|
|
443
|
+
violation_type = EnumExecutionShapeViolation.EFFECT_RETURNS_PROJECTIONS
|
|
444
|
+
message = (
|
|
445
|
+
f"Execution shape violation: Node archetype 'EFFECT' cannot produce "
|
|
446
|
+
f"output type 'PROJECTION'. Handler '{handler.name}' returns type '{type_name}'. "
|
|
447
|
+
f"Expected output types: [{allowed_types_str}]. Found: {category_name}. "
|
|
448
|
+
f"PROJECTION (EnumNodeOutputType.PROJECTION) represents aggregated state "
|
|
449
|
+
f"and is only valid for REDUCER nodes. Effect handlers interact with "
|
|
450
|
+
f"external systems and should emit EVENT or COMMAND types."
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
if violation_type is None:
|
|
454
|
+
return None
|
|
455
|
+
|
|
456
|
+
return ModelExecutionShapeViolationResult(
|
|
457
|
+
violation_type=violation_type,
|
|
458
|
+
node_archetype=handler.node_archetype,
|
|
459
|
+
file_path=handler.file_path,
|
|
460
|
+
line_number=line_number,
|
|
461
|
+
message=message,
|
|
462
|
+
severity=EnumValidationSeverity.ERROR,
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
def _check_direct_publish_violations(
|
|
466
|
+
self,
|
|
467
|
+
method: ast.FunctionDef | ast.AsyncFunctionDef,
|
|
468
|
+
handler: ModelDetectedNodeInfo,
|
|
469
|
+
) -> list[ModelExecutionShapeViolationResult]:
|
|
470
|
+
"""Check for direct publish method calls.
|
|
471
|
+
|
|
472
|
+
Forbidden patterns:
|
|
473
|
+
- self.publish(...)
|
|
474
|
+
- event_bus.publish(...)
|
|
475
|
+
- self.send_event(...)
|
|
476
|
+
- self.emit(...)
|
|
477
|
+
|
|
478
|
+
Args:
|
|
479
|
+
method: The method AST node.
|
|
480
|
+
handler: The handler information.
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
List of direct publish violations.
|
|
484
|
+
"""
|
|
485
|
+
violations: list[ModelExecutionShapeViolationResult] = []
|
|
486
|
+
|
|
487
|
+
for node in ast.walk(method):
|
|
488
|
+
if isinstance(node, ast.Call):
|
|
489
|
+
# Check for method calls like x.publish()
|
|
490
|
+
if isinstance(node.func, ast.Attribute):
|
|
491
|
+
method_name = node.func.attr
|
|
492
|
+
if method_name in _FORBIDDEN_PUBLISH_METHODS:
|
|
493
|
+
archetype_name = handler.node_archetype.name
|
|
494
|
+
violations.append(
|
|
495
|
+
ModelExecutionShapeViolationResult(
|
|
496
|
+
violation_type=EnumExecutionShapeViolation.HANDLER_DIRECT_PUBLISH,
|
|
497
|
+
node_archetype=handler.node_archetype,
|
|
498
|
+
file_path=handler.file_path,
|
|
499
|
+
line_number=node.lineno,
|
|
500
|
+
message=(
|
|
501
|
+
f"Execution shape violation: Node archetype '{archetype_name}' "
|
|
502
|
+
f"handler '{handler.name}' calls forbidden method '.{method_name}()' "
|
|
503
|
+
f"directly at line {node.lineno}. Direct publish methods are "
|
|
504
|
+
f"forbidden for all node archetypes. Allowed: Return message objects "
|
|
505
|
+
f"and let the dispatcher handle routing. Forbidden methods: "
|
|
506
|
+
f"{', '.join(sorted(_FORBIDDEN_PUBLISH_METHODS))}."
|
|
507
|
+
),
|
|
508
|
+
severity=EnumValidationSeverity.ERROR,
|
|
509
|
+
)
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
return violations
|
|
513
|
+
|
|
514
|
+
def _check_system_time_violations(
|
|
515
|
+
self,
|
|
516
|
+
method: ast.FunctionDef | ast.AsyncFunctionDef,
|
|
517
|
+
handler: ModelDetectedNodeInfo,
|
|
518
|
+
) -> list[ModelExecutionShapeViolationResult]:
|
|
519
|
+
"""Check for system time access in reducers.
|
|
520
|
+
|
|
521
|
+
Forbidden patterns:
|
|
522
|
+
- time.time()
|
|
523
|
+
- datetime.now()
|
|
524
|
+
- datetime.utcnow()
|
|
525
|
+
- datetime.datetime.now()
|
|
526
|
+
- datetime.datetime.utcnow()
|
|
527
|
+
|
|
528
|
+
Args:
|
|
529
|
+
method: The method AST node.
|
|
530
|
+
handler: The handler information.
|
|
531
|
+
|
|
532
|
+
Returns:
|
|
533
|
+
List of system time access violations.
|
|
534
|
+
"""
|
|
535
|
+
violations: list[ModelExecutionShapeViolationResult] = []
|
|
536
|
+
|
|
537
|
+
for node in ast.walk(method):
|
|
538
|
+
if isinstance(node, ast.Call):
|
|
539
|
+
func_name = self._get_name_from_expr(node.func)
|
|
540
|
+
if func_name is not None:
|
|
541
|
+
# Check against known system time patterns
|
|
542
|
+
if func_name in _SYSTEM_TIME_PATTERNS:
|
|
543
|
+
violations.append(
|
|
544
|
+
ModelExecutionShapeViolationResult(
|
|
545
|
+
violation_type=EnumExecutionShapeViolation.REDUCER_ACCESSES_SYSTEM_TIME,
|
|
546
|
+
node_archetype=handler.node_archetype,
|
|
547
|
+
file_path=handler.file_path,
|
|
548
|
+
line_number=node.lineno,
|
|
549
|
+
message=(
|
|
550
|
+
f"Execution shape violation: Node archetype 'REDUCER' "
|
|
551
|
+
f"cannot access system time. Handler '{handler.name}' calls "
|
|
552
|
+
f"'{func_name}()' at line {node.lineno}. REDUCER nodes must "
|
|
553
|
+
f"be deterministic for event replay consistency. Use timestamps "
|
|
554
|
+
f"from the event payload instead of system time. "
|
|
555
|
+
f"Forbidden patterns: {', '.join(sorted(_SYSTEM_TIME_PATTERNS))}."
|
|
556
|
+
),
|
|
557
|
+
severity=EnumValidationSeverity.ERROR,
|
|
558
|
+
)
|
|
559
|
+
)
|
|
560
|
+
# Check for method calls on datetime/time modules
|
|
561
|
+
elif isinstance(node.func, ast.Attribute):
|
|
562
|
+
attr_name = node.func.attr
|
|
563
|
+
if attr_name in _TIME_FUNCTION_NAMES:
|
|
564
|
+
base_name = self._get_name_from_expr(node.func.value)
|
|
565
|
+
if base_name is not None and (
|
|
566
|
+
"datetime" in base_name or "time" in base_name
|
|
567
|
+
):
|
|
568
|
+
full_name = f"{base_name}.{attr_name}"
|
|
569
|
+
violations.append(
|
|
570
|
+
ModelExecutionShapeViolationResult(
|
|
571
|
+
violation_type=EnumExecutionShapeViolation.REDUCER_ACCESSES_SYSTEM_TIME,
|
|
572
|
+
node_archetype=handler.node_archetype,
|
|
573
|
+
file_path=handler.file_path,
|
|
574
|
+
line_number=node.lineno,
|
|
575
|
+
message=(
|
|
576
|
+
f"Execution shape violation: Node archetype 'REDUCER' "
|
|
577
|
+
f"cannot access system time. Handler '{handler.name}' calls "
|
|
578
|
+
f"'{full_name}()' at line {node.lineno}. REDUCER nodes must "
|
|
579
|
+
f"be deterministic for event replay consistency. Use timestamps "
|
|
580
|
+
f"from the event payload instead of system time."
|
|
581
|
+
),
|
|
582
|
+
severity=EnumValidationSeverity.ERROR,
|
|
583
|
+
)
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
return violations
|
|
587
|
+
|
|
588
|
+
# Abstract method declaration for type checking - implemented by MixinNodeArchetypeDetection
|
|
589
|
+
def _get_name_from_expr(self, expr: ast.expr) -> str | None:
|
|
590
|
+
"""Extract a name string from an AST expression.
|
|
591
|
+
|
|
592
|
+
Note:
|
|
593
|
+
This method is provided by MixinNodeArchetypeDetection.
|
|
594
|
+
Declared here for type checking purposes.
|
|
595
|
+
"""
|
|
596
|
+
raise NotImplementedError("Provided by MixinNodeArchetypeDetection")
|