omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Validator for ARCH-002: No Handler Publishing.
|
|
4
|
+
|
|
5
|
+
This validator uses AST analysis to detect handlers that directly publish
|
|
6
|
+
events to the event bus. Only orchestrators may publish events. This enforces
|
|
7
|
+
the ONEX architectural principle that handlers are pure processors that
|
|
8
|
+
return results, while orchestrators own the event publishing lifecycle.
|
|
9
|
+
|
|
10
|
+
Related:
|
|
11
|
+
- Ticket: OMN-1099 (Architecture Validator)
|
|
12
|
+
- PR: #124 (Protocol-Compliant Rule Classes)
|
|
13
|
+
- Rule: ARCH-002 (No Handler Publishing)
|
|
14
|
+
- See also: docs/patterns/dispatcher_resilience.md
|
|
15
|
+
|
|
16
|
+
Detection Patterns:
|
|
17
|
+
1. **Constructor parameters**: event_bus, bus, or publisher in __init__ signature
|
|
18
|
+
2. **Instance attributes**: _bus, _event_bus, _publisher assigned in handler
|
|
19
|
+
3. **Method calls**: publish(), emit(), or send_event() invocations
|
|
20
|
+
|
|
21
|
+
Handler Identification:
|
|
22
|
+
- Classes with "Handler" in the name (case sensitive)
|
|
23
|
+
- Classes with "Orchestrator" in the name are NOT handlers (excluded)
|
|
24
|
+
|
|
25
|
+
Example Violations::
|
|
26
|
+
|
|
27
|
+
# VIOLATION: Handler with event bus in constructor
|
|
28
|
+
class HandlerBad:
|
|
29
|
+
def __init__(self, container, event_bus): # Forbidden parameter
|
|
30
|
+
self._bus = event_bus # Forbidden attribute
|
|
31
|
+
def handle(self, event):
|
|
32
|
+
self._bus.publish(SomeEvent()) # Forbidden method call
|
|
33
|
+
|
|
34
|
+
# VIOLATION: Handler calling publish directly
|
|
35
|
+
class HandlerAlsoBad:
|
|
36
|
+
def handle(self, event):
|
|
37
|
+
self.emit(SomeEvent()) # Forbidden method
|
|
38
|
+
|
|
39
|
+
Allowed Patterns::
|
|
40
|
+
|
|
41
|
+
# OK: Handler returns event envelope for orchestrator to publish
|
|
42
|
+
class HandlerGood:
|
|
43
|
+
def handle(self, event):
|
|
44
|
+
return ModelEventEnvelope(payload=SomeEvent()) # Correct pattern
|
|
45
|
+
|
|
46
|
+
# OK: Orchestrator with event bus (orchestrators ARE allowed)
|
|
47
|
+
class OrchestratorGood:
|
|
48
|
+
def __init__(self, container, event_bus): # Allowed for orchestrators
|
|
49
|
+
self._bus = event_bus
|
|
50
|
+
def orchestrate(self, event):
|
|
51
|
+
self._bus.publish(response) # Allowed
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
from __future__ import annotations
|
|
55
|
+
|
|
56
|
+
import ast
|
|
57
|
+
from pathlib import Path
|
|
58
|
+
from typing import TYPE_CHECKING
|
|
59
|
+
|
|
60
|
+
from omnibase_infra.enums import EnumValidationSeverity
|
|
61
|
+
from omnibase_infra.nodes.architecture_validator.mixins import MixinFilePathRule
|
|
62
|
+
from omnibase_infra.nodes.architecture_validator.models.model_architecture_violation import (
|
|
63
|
+
ModelArchitectureViolation,
|
|
64
|
+
)
|
|
65
|
+
from omnibase_infra.nodes.architecture_validator.models.model_validation_result import (
|
|
66
|
+
ModelFileValidationResult,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if TYPE_CHECKING:
|
|
70
|
+
from omnibase_infra.nodes.architecture_validator.models import ModelRuleCheckResult
|
|
71
|
+
|
|
72
|
+
RULE_ID = "ARCH-002"
|
|
73
|
+
RULE_NAME = "No Handler Publishing"
|
|
74
|
+
|
|
75
|
+
# Forbidden patterns in constructor parameters
|
|
76
|
+
FORBIDDEN_PARAMS = {"event_bus", "bus", "publisher"}
|
|
77
|
+
|
|
78
|
+
# Forbidden attribute names (assignment targets)
|
|
79
|
+
FORBIDDEN_ATTRS = {"_bus", "_event_bus", "_publisher", "event_bus", "publisher"}
|
|
80
|
+
|
|
81
|
+
# Forbidden method names (publish-like calls)
|
|
82
|
+
FORBIDDEN_METHODS = {"publish", "emit", "send_event"}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class PublishingConstraintVisitor(ast.NodeVisitor):
|
|
86
|
+
"""AST visitor to detect handler publishing patterns.
|
|
87
|
+
|
|
88
|
+
This visitor traverses Python AST to find handler classes that
|
|
89
|
+
violate the ARCH-002 rule by having direct event bus access or
|
|
90
|
+
calling publish-like methods.
|
|
91
|
+
|
|
92
|
+
Attributes:
|
|
93
|
+
file_path: Path to the file being analyzed.
|
|
94
|
+
violations: List of violations found during traversal.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(self, file_path: str) -> None:
|
|
98
|
+
"""Initialize the visitor.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
file_path: Path to the file being analyzed.
|
|
102
|
+
"""
|
|
103
|
+
self.file_path = file_path
|
|
104
|
+
self.violations: list[ModelArchitectureViolation] = []
|
|
105
|
+
self._in_handler_class = False
|
|
106
|
+
self._current_class_name: str | None = None
|
|
107
|
+
|
|
108
|
+
def visit_ClassDef(self, node: ast.ClassDef) -> None:
|
|
109
|
+
"""Track handler class context.
|
|
110
|
+
|
|
111
|
+
Identifies handler classes by naming convention (contains "Handler"
|
|
112
|
+
but not "Orchestrator") and marks context for nested visits.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
node: AST ClassDef node to visit.
|
|
116
|
+
"""
|
|
117
|
+
# Determine if this is a handler class
|
|
118
|
+
is_handler = "Handler" in node.name
|
|
119
|
+
is_orchestrator = "Orchestrator" in node.name
|
|
120
|
+
|
|
121
|
+
# Only flag handlers, not orchestrators
|
|
122
|
+
# Orchestrators ARE allowed to have event bus access
|
|
123
|
+
old_in_handler = self._in_handler_class
|
|
124
|
+
old_class_name = self._current_class_name
|
|
125
|
+
|
|
126
|
+
self._in_handler_class = is_handler and not is_orchestrator
|
|
127
|
+
self._current_class_name = node.name
|
|
128
|
+
|
|
129
|
+
# Visit child nodes
|
|
130
|
+
self.generic_visit(node)
|
|
131
|
+
|
|
132
|
+
# Restore context
|
|
133
|
+
self._in_handler_class = old_in_handler
|
|
134
|
+
self._current_class_name = old_class_name
|
|
135
|
+
|
|
136
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
|
137
|
+
"""Check function definitions for forbidden parameters.
|
|
138
|
+
|
|
139
|
+
Only checks __init__ methods within handler classes for
|
|
140
|
+
forbidden event bus parameters.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
node: AST FunctionDef node to visit.
|
|
144
|
+
"""
|
|
145
|
+
if self._in_handler_class and node.name == "__init__":
|
|
146
|
+
# Check all arguments for forbidden parameters
|
|
147
|
+
for arg in node.args.args:
|
|
148
|
+
if arg.arg in FORBIDDEN_PARAMS:
|
|
149
|
+
self._add_violation(
|
|
150
|
+
node,
|
|
151
|
+
f"Handler '{self._current_class_name}' constructor has "
|
|
152
|
+
f"forbidden parameter '{arg.arg}'",
|
|
153
|
+
"Handlers must not receive event bus. "
|
|
154
|
+
"Return events for orchestrator to publish.",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Continue visiting nested nodes
|
|
158
|
+
self.generic_visit(node)
|
|
159
|
+
|
|
160
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
|
|
161
|
+
"""Check async function definitions for forbidden parameters.
|
|
162
|
+
|
|
163
|
+
Same logic as visit_FunctionDef but for async methods.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
node: AST AsyncFunctionDef node to visit.
|
|
167
|
+
"""
|
|
168
|
+
if self._in_handler_class and node.name == "__init__":
|
|
169
|
+
for arg in node.args.args:
|
|
170
|
+
if arg.arg in FORBIDDEN_PARAMS:
|
|
171
|
+
self._add_violation(
|
|
172
|
+
node,
|
|
173
|
+
f"Handler '{self._current_class_name}' constructor has "
|
|
174
|
+
f"forbidden parameter '{arg.arg}'",
|
|
175
|
+
"Handlers must not receive event bus. "
|
|
176
|
+
"Return events for orchestrator to publish.",
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
self.generic_visit(node)
|
|
180
|
+
|
|
181
|
+
def visit_Assign(self, node: ast.Assign) -> None:
|
|
182
|
+
"""Check for forbidden attribute assignments.
|
|
183
|
+
|
|
184
|
+
Detects assignments to attributes like _bus, _event_bus, _publisher
|
|
185
|
+
within handler classes.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
node: AST Assign node to visit.
|
|
189
|
+
"""
|
|
190
|
+
if self._in_handler_class:
|
|
191
|
+
for target in node.targets:
|
|
192
|
+
if isinstance(target, ast.Attribute):
|
|
193
|
+
if target.attr in FORBIDDEN_ATTRS:
|
|
194
|
+
self._add_violation(
|
|
195
|
+
node,
|
|
196
|
+
f"Handler '{self._current_class_name}' has "
|
|
197
|
+
f"forbidden attribute '{target.attr}'",
|
|
198
|
+
"Remove event bus attribute. "
|
|
199
|
+
"Return events for orchestrator to publish.",
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
self.generic_visit(node)
|
|
203
|
+
|
|
204
|
+
def visit_AnnAssign(self, node: ast.AnnAssign) -> None:
|
|
205
|
+
"""Check for forbidden annotated attribute assignments.
|
|
206
|
+
|
|
207
|
+
Same logic as visit_Assign but for annotated assignments (e.g., self._bus: EventBus = ...).
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
node: AST AnnAssign node to visit.
|
|
211
|
+
"""
|
|
212
|
+
if self._in_handler_class:
|
|
213
|
+
target = node.target
|
|
214
|
+
if isinstance(target, ast.Attribute):
|
|
215
|
+
if target.attr in FORBIDDEN_ATTRS:
|
|
216
|
+
self._add_violation(
|
|
217
|
+
node,
|
|
218
|
+
f"Handler '{self._current_class_name}' has "
|
|
219
|
+
f"forbidden attribute '{target.attr}'",
|
|
220
|
+
"Remove event bus attribute. "
|
|
221
|
+
"Return events for orchestrator to publish.",
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
self.generic_visit(node)
|
|
225
|
+
|
|
226
|
+
def visit_Call(self, node: ast.Call) -> None:
|
|
227
|
+
"""Check for forbidden publish method calls.
|
|
228
|
+
|
|
229
|
+
Detects calls to methods like publish(), emit(), send_event()
|
|
230
|
+
within handler classes.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
node: AST Call node to visit.
|
|
234
|
+
"""
|
|
235
|
+
if self._in_handler_class:
|
|
236
|
+
# Check for method calls like self._bus.publish() or self.emit()
|
|
237
|
+
if isinstance(node.func, ast.Attribute):
|
|
238
|
+
if node.func.attr in FORBIDDEN_METHODS:
|
|
239
|
+
self._add_violation(
|
|
240
|
+
node,
|
|
241
|
+
f"Handler '{self._current_class_name}' calls "
|
|
242
|
+
f"forbidden method '{node.func.attr}()'",
|
|
243
|
+
"Return events instead of publishing directly. "
|
|
244
|
+
"The orchestrator will handle publishing.",
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
self.generic_visit(node)
|
|
248
|
+
|
|
249
|
+
def _add_violation(
|
|
250
|
+
self,
|
|
251
|
+
node: ast.AST,
|
|
252
|
+
message: str,
|
|
253
|
+
suggestion: str,
|
|
254
|
+
) -> None:
|
|
255
|
+
"""Add a violation to the list.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
node: AST node where violation occurred.
|
|
259
|
+
message: Description of the violation.
|
|
260
|
+
suggestion: How to fix the violation.
|
|
261
|
+
"""
|
|
262
|
+
line_number = getattr(node, "lineno", None)
|
|
263
|
+
location = f"{self.file_path}:{line_number}" if line_number else self.file_path
|
|
264
|
+
self.violations.append(
|
|
265
|
+
ModelArchitectureViolation(
|
|
266
|
+
rule_id=RULE_ID,
|
|
267
|
+
rule_name=RULE_NAME,
|
|
268
|
+
severity=EnumValidationSeverity.ERROR,
|
|
269
|
+
target_type="handler",
|
|
270
|
+
target_name=self._current_class_name or "unknown",
|
|
271
|
+
message=message,
|
|
272
|
+
location=location,
|
|
273
|
+
suggestion=suggestion,
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def validate_no_handler_publishing(file_path: str) -> ModelFileValidationResult:
|
|
279
|
+
"""Validate that handlers do not publish events directly.
|
|
280
|
+
|
|
281
|
+
This function parses a Python source file and uses AST analysis to
|
|
282
|
+
detect handler classes that violate the ARCH-002 rule.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
file_path: Path to the Python source file to validate.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
ModelFileValidationResult with:
|
|
289
|
+
- valid=True if no publishing patterns found in handlers
|
|
290
|
+
- valid=False with violations if publishing patterns detected
|
|
291
|
+
|
|
292
|
+
Note:
|
|
293
|
+
Orchestrator classes are EXEMPT from this rule - they are allowed
|
|
294
|
+
to publish events. Only classes with "Handler" in the name (but not
|
|
295
|
+
"Orchestrator") are validated.
|
|
296
|
+
|
|
297
|
+
Example::
|
|
298
|
+
|
|
299
|
+
result = validate_no_handler_publishing("path/to/handler.py")
|
|
300
|
+
if not result.valid:
|
|
301
|
+
for v in result.violations:
|
|
302
|
+
print(f"{v.rule_id}: {v.message}")
|
|
303
|
+
"""
|
|
304
|
+
path = Path(file_path)
|
|
305
|
+
|
|
306
|
+
# Handle non-existent files or non-Python files
|
|
307
|
+
if not path.exists() or path.suffix != ".py":
|
|
308
|
+
return ModelFileValidationResult(
|
|
309
|
+
valid=True,
|
|
310
|
+
violations=[],
|
|
311
|
+
files_checked=0,
|
|
312
|
+
rules_checked=[RULE_ID],
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
# Read and parse the source file
|
|
316
|
+
try:
|
|
317
|
+
source = path.read_text(encoding="utf-8")
|
|
318
|
+
tree = ast.parse(source)
|
|
319
|
+
except SyntaxError as e:
|
|
320
|
+
# Return WARNING violation for syntax error
|
|
321
|
+
location = f"{file_path}:{e.lineno}" if e.lineno else file_path
|
|
322
|
+
return ModelFileValidationResult(
|
|
323
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
324
|
+
violations=[
|
|
325
|
+
ModelArchitectureViolation(
|
|
326
|
+
rule_id=RULE_ID,
|
|
327
|
+
rule_name=RULE_NAME,
|
|
328
|
+
severity=EnumValidationSeverity.WARNING,
|
|
329
|
+
target_type="file",
|
|
330
|
+
target_name=Path(file_path).name,
|
|
331
|
+
message=f"File has syntax error and could not be validated: {e.msg}",
|
|
332
|
+
location=location,
|
|
333
|
+
suggestion="Fix the syntax error to enable architecture validation",
|
|
334
|
+
)
|
|
335
|
+
],
|
|
336
|
+
files_checked=1,
|
|
337
|
+
rules_checked=[RULE_ID],
|
|
338
|
+
)
|
|
339
|
+
except (PermissionError, OSError) as e:
|
|
340
|
+
# Return WARNING violation for file I/O errors
|
|
341
|
+
return ModelFileValidationResult(
|
|
342
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
343
|
+
violations=[
|
|
344
|
+
ModelArchitectureViolation(
|
|
345
|
+
rule_id=RULE_ID,
|
|
346
|
+
rule_name=RULE_NAME,
|
|
347
|
+
severity=EnumValidationSeverity.WARNING,
|
|
348
|
+
target_type="file",
|
|
349
|
+
target_name=Path(file_path).name,
|
|
350
|
+
message=f"File could not be read: {e}",
|
|
351
|
+
location=file_path,
|
|
352
|
+
suggestion="Ensure file is readable and has correct permissions",
|
|
353
|
+
)
|
|
354
|
+
],
|
|
355
|
+
files_checked=1,
|
|
356
|
+
rules_checked=[RULE_ID],
|
|
357
|
+
)
|
|
358
|
+
except UnicodeDecodeError as e:
|
|
359
|
+
# Return WARNING violation for encoding errors
|
|
360
|
+
return ModelFileValidationResult(
|
|
361
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
362
|
+
violations=[
|
|
363
|
+
ModelArchitectureViolation(
|
|
364
|
+
rule_id=RULE_ID,
|
|
365
|
+
rule_name=RULE_NAME,
|
|
366
|
+
severity=EnumValidationSeverity.WARNING,
|
|
367
|
+
target_type="file",
|
|
368
|
+
target_name=Path(file_path).name,
|
|
369
|
+
message=f"File has encoding error and could not be validated: {e.reason}",
|
|
370
|
+
location=file_path,
|
|
371
|
+
suggestion="Ensure file is valid UTF-8 encoded",
|
|
372
|
+
)
|
|
373
|
+
],
|
|
374
|
+
files_checked=1,
|
|
375
|
+
rules_checked=[RULE_ID],
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
# Analyze the AST
|
|
379
|
+
visitor = PublishingConstraintVisitor(file_path)
|
|
380
|
+
visitor.visit(tree)
|
|
381
|
+
|
|
382
|
+
return ModelFileValidationResult(
|
|
383
|
+
valid=len(visitor.violations) == 0,
|
|
384
|
+
violations=visitor.violations,
|
|
385
|
+
files_checked=1,
|
|
386
|
+
rules_checked=[RULE_ID],
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
class RuleNoHandlerPublishing(MixinFilePathRule):
|
|
391
|
+
"""Protocol-compliant rule: Handlers must not publish events directly.
|
|
392
|
+
|
|
393
|
+
This class wraps the file-based validator to implement ProtocolArchitectureRule,
|
|
394
|
+
enabling use with NodeArchitectureValidatorCompute.
|
|
395
|
+
|
|
396
|
+
Thread Safety:
|
|
397
|
+
This rule is stateless and safe for concurrent use.
|
|
398
|
+
"""
|
|
399
|
+
|
|
400
|
+
@property
|
|
401
|
+
def rule_id(self) -> str:
|
|
402
|
+
"""Return the canonical rule ID matching contract.yaml."""
|
|
403
|
+
return RULE_ID
|
|
404
|
+
|
|
405
|
+
@property
|
|
406
|
+
def name(self) -> str:
|
|
407
|
+
"""Return human-readable rule name."""
|
|
408
|
+
return RULE_NAME
|
|
409
|
+
|
|
410
|
+
@property
|
|
411
|
+
def description(self) -> str:
|
|
412
|
+
"""Return detailed rule description."""
|
|
413
|
+
return (
|
|
414
|
+
"Handlers must not have direct event bus access. Only orchestrators "
|
|
415
|
+
"may publish events. Handlers should return events for orchestrators to publish."
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
@property
|
|
419
|
+
def severity(self) -> EnumValidationSeverity:
|
|
420
|
+
"""Return severity level for violations of this rule."""
|
|
421
|
+
return EnumValidationSeverity.ERROR
|
|
422
|
+
|
|
423
|
+
def check(self, target: object) -> ModelRuleCheckResult:
|
|
424
|
+
"""Check target against this rule.
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
target: Target to validate. If a string, treated as file path.
|
|
428
|
+
Other types return skipped=True with reason.
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
ModelRuleCheckResult indicating pass/fail with details.
|
|
432
|
+
|
|
433
|
+
Note:
|
|
434
|
+
When multiple violations are found, only the first violation's
|
|
435
|
+
message and location are returned. The total count is available
|
|
436
|
+
in ``details["total_violations"]``. This fail-fast behavior is
|
|
437
|
+
intentional - fix the first violation and re-run to find others.
|
|
438
|
+
"""
|
|
439
|
+
from omnibase_infra.nodes.architecture_validator.models import (
|
|
440
|
+
ModelRuleCheckResult,
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
file_path = self._extract_file_path(target)
|
|
444
|
+
if file_path is None:
|
|
445
|
+
return ModelRuleCheckResult(
|
|
446
|
+
passed=True,
|
|
447
|
+
rule_id=self.rule_id,
|
|
448
|
+
skipped=True,
|
|
449
|
+
reason="Target is not a valid file path",
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
# Delegate to existing file-based validator
|
|
453
|
+
result = validate_no_handler_publishing(file_path)
|
|
454
|
+
|
|
455
|
+
if result.valid:
|
|
456
|
+
return ModelRuleCheckResult(passed=True, rule_id=self.rule_id)
|
|
457
|
+
|
|
458
|
+
# Convert first violation to ModelRuleCheckResult
|
|
459
|
+
if result.violations:
|
|
460
|
+
violation = result.violations[0]
|
|
461
|
+
return ModelRuleCheckResult(
|
|
462
|
+
passed=False,
|
|
463
|
+
rule_id=self.rule_id,
|
|
464
|
+
message=violation.message,
|
|
465
|
+
details={
|
|
466
|
+
"target_name": violation.target_name,
|
|
467
|
+
"target_type": violation.target_type,
|
|
468
|
+
"location": violation.location,
|
|
469
|
+
"suggestion": violation.suggestion,
|
|
470
|
+
"total_violations": len(result.violations),
|
|
471
|
+
},
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
return ModelRuleCheckResult(
|
|
475
|
+
passed=False,
|
|
476
|
+
rule_id=self.rule_id,
|
|
477
|
+
message="Handler publishing violation detected",
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
__all__ = ["validate_no_handler_publishing", "RuleNoHandlerPublishing"]
|