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,491 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Validator for ARCH-003: No Workflow FSM in Orchestrators.
|
|
4
|
+
|
|
5
|
+
This validator ensures that orchestrators do not implement workflow FSM
|
|
6
|
+
(finite state machine) logic that should be owned by reducers. Orchestrators
|
|
7
|
+
are "reaction planners" that coordinate work, not state machine owners.
|
|
8
|
+
|
|
9
|
+
KEY CLARIFICATION from ticket OMN-1099:
|
|
10
|
+
- Reducers MAY implement aggregate state machines (that's their purpose)
|
|
11
|
+
- Orchestrators must NOT implement workflow FSMs duplicating reducer transitions
|
|
12
|
+
- Orchestrators are "reaction planners", not state machine owners
|
|
13
|
+
|
|
14
|
+
Related:
|
|
15
|
+
- Ticket: OMN-1099 (Architecture Validator - FSM Rule Clarified)
|
|
16
|
+
- PR: #124 (Protocol-Compliant Rule Classes)
|
|
17
|
+
- Rule: ARCH-003 (No Workflow FSM in Orchestrators)
|
|
18
|
+
|
|
19
|
+
Detection Patterns:
|
|
20
|
+
1. **Class-level FSM**: STATES, TRANSITIONS, STATE_MACHINE, FSM,
|
|
21
|
+
ALLOWED_TRANSITIONS
|
|
22
|
+
2. **State prefix**: STATE_* constants (e.g., STATE_PENDING)
|
|
23
|
+
3. **Instance attributes**: _state, _workflow_state, _current_step,
|
|
24
|
+
_fsm_state, _current_state
|
|
25
|
+
4. **FSM methods**: transition(), can_transition(), apply_transition(),
|
|
26
|
+
get_current_state(), set_state()
|
|
27
|
+
|
|
28
|
+
Example Violations::
|
|
29
|
+
|
|
30
|
+
# VIOLATION: Orchestrator with state transition table
|
|
31
|
+
class OrchestratorOrder(NodeOrchestrator):
|
|
32
|
+
STATES = ["pending", "processing", "completed"]
|
|
33
|
+
TRANSITIONS = {"pending": ["processing"], ...}
|
|
34
|
+
|
|
35
|
+
# VIOLATION: Orchestrator tracking workflow state
|
|
36
|
+
class OrchestratorPayment(NodeOrchestrator):
|
|
37
|
+
def __init__(self, container):
|
|
38
|
+
self._state = "initial"
|
|
39
|
+
self._current_step = 0
|
|
40
|
+
|
|
41
|
+
# VIOLATION: Orchestrator with transition methods
|
|
42
|
+
class OrchestratorShipping(NodeOrchestrator):
|
|
43
|
+
def can_transition(self, from_state, to_state):
|
|
44
|
+
...
|
|
45
|
+
def apply_transition(self, transition):
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
Allowed Patterns::
|
|
49
|
+
|
|
50
|
+
# OK: Reducers with FSM (this is what reducers do)
|
|
51
|
+
class ReducerOrder(NodeReducer):
|
|
52
|
+
STATES = ["created", "processing", "completed"] # Allowed
|
|
53
|
+
def reduce(self, state, event):
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
# OK: Orchestrator delegating to reducer
|
|
57
|
+
class OrchestratorUser(NodeOrchestrator):
|
|
58
|
+
def orchestrate(self, event):
|
|
59
|
+
intents = self._reducer.reduce(state, event)
|
|
60
|
+
return self.plan_reactions(intents)
|
|
61
|
+
|
|
62
|
+
# OK: Event-driven coordination (no state ownership)
|
|
63
|
+
class OrchestratorCheckout(NodeOrchestrator):
|
|
64
|
+
def orchestrate(self, event):
|
|
65
|
+
match event:
|
|
66
|
+
case CartSubmitted():
|
|
67
|
+
return [ValidateCart(), CalculateTotal()]
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
from __future__ import annotations
|
|
71
|
+
|
|
72
|
+
import ast
|
|
73
|
+
from pathlib import Path
|
|
74
|
+
from typing import TYPE_CHECKING
|
|
75
|
+
|
|
76
|
+
from omnibase_infra.enums import EnumValidationSeverity
|
|
77
|
+
from omnibase_infra.nodes.architecture_validator.mixins import MixinFilePathRule
|
|
78
|
+
from omnibase_infra.nodes.architecture_validator.models.model_architecture_violation import (
|
|
79
|
+
ModelArchitectureViolation,
|
|
80
|
+
)
|
|
81
|
+
from omnibase_infra.nodes.architecture_validator.models.model_validation_result import (
|
|
82
|
+
ModelFileValidationResult,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if TYPE_CHECKING:
|
|
86
|
+
from omnibase_infra.nodes.architecture_validator.models import ModelRuleCheckResult
|
|
87
|
+
|
|
88
|
+
RULE_ID = "ARCH-003"
|
|
89
|
+
RULE_NAME = "No Workflow FSM in Orchestrators"
|
|
90
|
+
|
|
91
|
+
# FSM class-level indicators (exact matches)
|
|
92
|
+
FSM_CLASS_ATTRS = {
|
|
93
|
+
"STATES",
|
|
94
|
+
"TRANSITIONS",
|
|
95
|
+
"STATE_MACHINE",
|
|
96
|
+
"FSM",
|
|
97
|
+
"ALLOWED_TRANSITIONS",
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
# FSM instance-level state tracking attributes
|
|
101
|
+
FSM_INSTANCE_ATTRS = {
|
|
102
|
+
"_state",
|
|
103
|
+
"_workflow_state",
|
|
104
|
+
"_current_step",
|
|
105
|
+
"_fsm_state",
|
|
106
|
+
"_current_state",
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# FSM method patterns
|
|
110
|
+
FSM_METHODS = {
|
|
111
|
+
"transition",
|
|
112
|
+
"can_transition",
|
|
113
|
+
"apply_transition",
|
|
114
|
+
"get_current_state",
|
|
115
|
+
"set_state",
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class OrchestratorFSMVisitor(ast.NodeVisitor):
|
|
120
|
+
"""AST visitor to detect FSM patterns in orchestrators.
|
|
121
|
+
|
|
122
|
+
This visitor traverses Python AST to find FSM anti-patterns in
|
|
123
|
+
orchestrator classes. Reducer classes are exempt from this check
|
|
124
|
+
as they are meant to own state machines.
|
|
125
|
+
|
|
126
|
+
Detection Patterns:
|
|
127
|
+
1. Class-level: STATES, TRANSITIONS, STATE_* constants
|
|
128
|
+
2. Instance-level: _state, _workflow_state, _current_step
|
|
129
|
+
3. Method-level: transition(), can_transition(), get_current_state()
|
|
130
|
+
|
|
131
|
+
Attributes:
|
|
132
|
+
file_path: Path to the file being analyzed.
|
|
133
|
+
violations: List of violations found during traversal.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
def __init__(self, file_path: str) -> None:
|
|
137
|
+
"""Initialize the visitor.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
file_path: Path to the file being analyzed.
|
|
141
|
+
"""
|
|
142
|
+
self.file_path = file_path
|
|
143
|
+
self.violations: list[ModelArchitectureViolation] = []
|
|
144
|
+
self._in_orchestrator = False
|
|
145
|
+
self._current_class_name: str | None = None
|
|
146
|
+
|
|
147
|
+
def visit_ClassDef(self, node: ast.ClassDef) -> None:
|
|
148
|
+
"""Track orchestrator class context, exempt reducers.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
node: The ClassDef AST node being visited.
|
|
152
|
+
"""
|
|
153
|
+
is_orchestrator = "Orchestrator" in node.name
|
|
154
|
+
is_reducer = "Reducer" in node.name
|
|
155
|
+
|
|
156
|
+
# Only check orchestrators, reducers are exempt
|
|
157
|
+
old_in_orchestrator = self._in_orchestrator
|
|
158
|
+
old_class_name = self._current_class_name
|
|
159
|
+
|
|
160
|
+
self._in_orchestrator = is_orchestrator and not is_reducer
|
|
161
|
+
self._current_class_name = node.name
|
|
162
|
+
|
|
163
|
+
if self._in_orchestrator:
|
|
164
|
+
self._check_class_level_fsm(node)
|
|
165
|
+
|
|
166
|
+
self.generic_visit(node)
|
|
167
|
+
|
|
168
|
+
self._in_orchestrator = old_in_orchestrator
|
|
169
|
+
self._current_class_name = old_class_name
|
|
170
|
+
|
|
171
|
+
def _check_class_level_fsm(self, node: ast.ClassDef) -> None:
|
|
172
|
+
"""Check for FSM class attributes.
|
|
173
|
+
|
|
174
|
+
Detects patterns like:
|
|
175
|
+
- STATES = [...]
|
|
176
|
+
- TRANSITIONS = {...}
|
|
177
|
+
- STATE_* = "..." (prefix pattern)
|
|
178
|
+
- ALLOWED_TRANSITIONS = {...}
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
node: The ClassDef AST node being checked.
|
|
182
|
+
"""
|
|
183
|
+
for item in node.body:
|
|
184
|
+
# Check class-level assignments (STATES = [...], TRANSITIONS = {...})
|
|
185
|
+
if isinstance(item, ast.Assign):
|
|
186
|
+
for target in item.targets:
|
|
187
|
+
if isinstance(target, ast.Name):
|
|
188
|
+
attr_name = target.id
|
|
189
|
+
# Check exact match FSM attributes
|
|
190
|
+
if attr_name in FSM_CLASS_ATTRS:
|
|
191
|
+
self._add_violation(
|
|
192
|
+
item,
|
|
193
|
+
f"Orchestrator has FSM class attribute '{attr_name}'",
|
|
194
|
+
"Move state machine logic to a Reducer. "
|
|
195
|
+
"Orchestrators are reaction planners.",
|
|
196
|
+
)
|
|
197
|
+
# Check STATE_* prefix pattern
|
|
198
|
+
elif attr_name.startswith("STATE_"):
|
|
199
|
+
self._add_violation(
|
|
200
|
+
item,
|
|
201
|
+
f"Orchestrator has FSM state constant '{attr_name}'",
|
|
202
|
+
"Move state constants to a Reducer. "
|
|
203
|
+
"Orchestrators should not define state values.",
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
|
207
|
+
"""Check for FSM methods in orchestrators.
|
|
208
|
+
|
|
209
|
+
Detects methods like:
|
|
210
|
+
- transition(), can_transition(), apply_transition()
|
|
211
|
+
- get_current_state(), set_state()
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
node: The FunctionDef AST node being visited.
|
|
215
|
+
"""
|
|
216
|
+
if self._in_orchestrator:
|
|
217
|
+
if node.name in FSM_METHODS:
|
|
218
|
+
self._add_violation(
|
|
219
|
+
node,
|
|
220
|
+
f"Orchestrator has FSM method '{node.name}()'",
|
|
221
|
+
"Move state machine logic to a Reducer. "
|
|
222
|
+
"Orchestrators should delegate state to reducers.",
|
|
223
|
+
)
|
|
224
|
+
self.generic_visit(node)
|
|
225
|
+
|
|
226
|
+
def visit_Assign(self, node: ast.Assign) -> None:
|
|
227
|
+
"""Check for FSM instance attributes in orchestrators.
|
|
228
|
+
|
|
229
|
+
Detects patterns like:
|
|
230
|
+
- self._state = ...
|
|
231
|
+
- self._workflow_state = ...
|
|
232
|
+
- self._current_step = ...
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
node: The Assign AST node being visited.
|
|
236
|
+
"""
|
|
237
|
+
if self._in_orchestrator:
|
|
238
|
+
for target in node.targets:
|
|
239
|
+
if isinstance(target, ast.Attribute) and isinstance(
|
|
240
|
+
target.value, ast.Name
|
|
241
|
+
):
|
|
242
|
+
if target.value.id == "self" and target.attr in FSM_INSTANCE_ATTRS:
|
|
243
|
+
self._add_violation(
|
|
244
|
+
node,
|
|
245
|
+
f"Orchestrator has FSM instance attribute '{target.attr}'",
|
|
246
|
+
"Move state tracking to a Reducer. "
|
|
247
|
+
"Orchestrators should not own workflow state.",
|
|
248
|
+
)
|
|
249
|
+
self.generic_visit(node)
|
|
250
|
+
|
|
251
|
+
def _add_violation(
|
|
252
|
+
self,
|
|
253
|
+
node: ast.AST,
|
|
254
|
+
message: str,
|
|
255
|
+
suggestion: str,
|
|
256
|
+
) -> None:
|
|
257
|
+
"""Add a violation to the list.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
node: The AST node where the violation was found.
|
|
261
|
+
message: Description of the violation.
|
|
262
|
+
suggestion: How to fix the violation.
|
|
263
|
+
"""
|
|
264
|
+
line_number = getattr(node, "lineno", None)
|
|
265
|
+
location = f"{self.file_path}:{line_number}" if line_number else self.file_path
|
|
266
|
+
self.violations.append(
|
|
267
|
+
ModelArchitectureViolation(
|
|
268
|
+
rule_id=RULE_ID,
|
|
269
|
+
rule_name=RULE_NAME,
|
|
270
|
+
severity=EnumValidationSeverity.ERROR,
|
|
271
|
+
target_type="orchestrator",
|
|
272
|
+
target_name=self._current_class_name or "unknown",
|
|
273
|
+
message=message,
|
|
274
|
+
location=location,
|
|
275
|
+
suggestion=suggestion,
|
|
276
|
+
)
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def validate_no_orchestrator_fsm(file_path: str) -> ModelFileValidationResult:
|
|
281
|
+
"""Validate that orchestrators do not implement workflow FSMs.
|
|
282
|
+
|
|
283
|
+
This function checks a Python file for FSM patterns in orchestrator code
|
|
284
|
+
that violate ARCH-003. Orchestrators should delegate state management
|
|
285
|
+
to reducers, not implement their own state machines.
|
|
286
|
+
|
|
287
|
+
Note:
|
|
288
|
+
Reducers are EXEMPT from this rule - they are meant to own state machines.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
file_path: Path to the Python file to validate.
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
ModelArchitectureValidationResult with:
|
|
295
|
+
- valid=True if no FSM patterns found in orchestrators
|
|
296
|
+
- valid=False with violations if FSM patterns detected
|
|
297
|
+
|
|
298
|
+
Detection Patterns:
|
|
299
|
+
1. Class-level FSM patterns:
|
|
300
|
+
- STATES = [...], TRANSITIONS = {...}
|
|
301
|
+
- STATE_* constants, ALLOWED_TRANSITIONS
|
|
302
|
+
|
|
303
|
+
2. Instance-level state tracking:
|
|
304
|
+
- self._state, self._current_step, self._workflow_state
|
|
305
|
+
|
|
306
|
+
3. FSM method patterns:
|
|
307
|
+
- can_transition(), apply_transition(), get_current_state()
|
|
308
|
+
- transition(), set_state()
|
|
309
|
+
|
|
310
|
+
Exclusions:
|
|
311
|
+
- Reducer classes (they OWN state machines)
|
|
312
|
+
- Non-orchestrator classes
|
|
313
|
+
- Non-Python files
|
|
314
|
+
"""
|
|
315
|
+
path = Path(file_path)
|
|
316
|
+
|
|
317
|
+
# Skip non-existent or non-Python files
|
|
318
|
+
if not path.exists() or path.suffix != ".py":
|
|
319
|
+
return ModelFileValidationResult(
|
|
320
|
+
valid=True,
|
|
321
|
+
violations=[],
|
|
322
|
+
files_checked=0,
|
|
323
|
+
rules_checked=[RULE_ID],
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
try:
|
|
327
|
+
source = path.read_text(encoding="utf-8")
|
|
328
|
+
tree = ast.parse(source)
|
|
329
|
+
except SyntaxError as e:
|
|
330
|
+
# Return WARNING violation for syntax error
|
|
331
|
+
location = f"{file_path}:{e.lineno}" if e.lineno else file_path
|
|
332
|
+
return ModelFileValidationResult(
|
|
333
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
334
|
+
violations=[
|
|
335
|
+
ModelArchitectureViolation(
|
|
336
|
+
rule_id=RULE_ID,
|
|
337
|
+
rule_name=RULE_NAME,
|
|
338
|
+
severity=EnumValidationSeverity.WARNING,
|
|
339
|
+
target_type="file",
|
|
340
|
+
target_name=Path(file_path).name,
|
|
341
|
+
message=f"File has syntax error and could not be validated: {e.msg}",
|
|
342
|
+
location=location,
|
|
343
|
+
suggestion="Fix the syntax error to enable architecture validation",
|
|
344
|
+
)
|
|
345
|
+
],
|
|
346
|
+
files_checked=1,
|
|
347
|
+
rules_checked=[RULE_ID],
|
|
348
|
+
)
|
|
349
|
+
except (PermissionError, OSError) as e:
|
|
350
|
+
# Return WARNING violation for file I/O errors
|
|
351
|
+
return ModelFileValidationResult(
|
|
352
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
353
|
+
violations=[
|
|
354
|
+
ModelArchitectureViolation(
|
|
355
|
+
rule_id=RULE_ID,
|
|
356
|
+
rule_name=RULE_NAME,
|
|
357
|
+
severity=EnumValidationSeverity.WARNING,
|
|
358
|
+
target_type="file",
|
|
359
|
+
target_name=Path(file_path).name,
|
|
360
|
+
message=f"File could not be read: {e}",
|
|
361
|
+
location=file_path,
|
|
362
|
+
suggestion="Ensure file is readable and has correct permissions",
|
|
363
|
+
)
|
|
364
|
+
],
|
|
365
|
+
files_checked=1,
|
|
366
|
+
rules_checked=[RULE_ID],
|
|
367
|
+
)
|
|
368
|
+
except UnicodeDecodeError as e:
|
|
369
|
+
# Return WARNING violation for encoding errors
|
|
370
|
+
return ModelFileValidationResult(
|
|
371
|
+
valid=True, # Still valid (not a rule violation), but with warning
|
|
372
|
+
violations=[
|
|
373
|
+
ModelArchitectureViolation(
|
|
374
|
+
rule_id=RULE_ID,
|
|
375
|
+
rule_name=RULE_NAME,
|
|
376
|
+
severity=EnumValidationSeverity.WARNING,
|
|
377
|
+
target_type="file",
|
|
378
|
+
target_name=Path(file_path).name,
|
|
379
|
+
message=f"File has encoding error and could not be validated: {e.reason}",
|
|
380
|
+
location=file_path,
|
|
381
|
+
suggestion="Ensure file is valid UTF-8 encoded",
|
|
382
|
+
)
|
|
383
|
+
],
|
|
384
|
+
files_checked=1,
|
|
385
|
+
rules_checked=[RULE_ID],
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
visitor = OrchestratorFSMVisitor(file_path)
|
|
389
|
+
visitor.visit(tree)
|
|
390
|
+
|
|
391
|
+
return ModelFileValidationResult(
|
|
392
|
+
valid=len(visitor.violations) == 0,
|
|
393
|
+
violations=visitor.violations,
|
|
394
|
+
files_checked=1,
|
|
395
|
+
rules_checked=[RULE_ID],
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
class RuleNoOrchestratorFSM(MixinFilePathRule):
|
|
400
|
+
"""Protocol-compliant rule: No workflow FSM in orchestrators.
|
|
401
|
+
|
|
402
|
+
This class wraps the file-based validator to implement ProtocolArchitectureRule,
|
|
403
|
+
enabling use with NodeArchitectureValidatorCompute.
|
|
404
|
+
|
|
405
|
+
Thread Safety:
|
|
406
|
+
This rule is stateless and safe for concurrent use.
|
|
407
|
+
"""
|
|
408
|
+
|
|
409
|
+
@property
|
|
410
|
+
def rule_id(self) -> str:
|
|
411
|
+
"""Return the canonical rule ID matching contract.yaml."""
|
|
412
|
+
return RULE_ID
|
|
413
|
+
|
|
414
|
+
@property
|
|
415
|
+
def name(self) -> str:
|
|
416
|
+
"""Return human-readable rule name."""
|
|
417
|
+
return RULE_NAME
|
|
418
|
+
|
|
419
|
+
@property
|
|
420
|
+
def description(self) -> str:
|
|
421
|
+
"""Return detailed rule description."""
|
|
422
|
+
return (
|
|
423
|
+
"Orchestrators must not implement workflow FSMs that duplicate reducer "
|
|
424
|
+
"state transitions. Orchestrators are reaction planners, not state machine owners. "
|
|
425
|
+
"Reducers may legitimately implement aggregate state machines."
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
@property
|
|
429
|
+
def severity(self) -> EnumValidationSeverity:
|
|
430
|
+
"""Return severity level for violations of this rule."""
|
|
431
|
+
return EnumValidationSeverity.ERROR
|
|
432
|
+
|
|
433
|
+
def check(self, target: object) -> ModelRuleCheckResult:
|
|
434
|
+
"""Check target against this rule.
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
target: Target to validate. If a string, treated as file path.
|
|
438
|
+
Other types return skipped=True with reason.
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
ModelRuleCheckResult indicating pass/fail with details.
|
|
442
|
+
|
|
443
|
+
Note:
|
|
444
|
+
When multiple violations are found, only the first violation's
|
|
445
|
+
message and location are returned. The total count is available
|
|
446
|
+
in ``details["total_violations"]``. This fail-fast behavior is
|
|
447
|
+
intentional - fix the first violation and re-run to find others.
|
|
448
|
+
"""
|
|
449
|
+
from omnibase_infra.nodes.architecture_validator.models import (
|
|
450
|
+
ModelRuleCheckResult,
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
file_path = self._extract_file_path(target)
|
|
454
|
+
if file_path is None:
|
|
455
|
+
return ModelRuleCheckResult(
|
|
456
|
+
passed=True,
|
|
457
|
+
rule_id=self.rule_id,
|
|
458
|
+
skipped=True,
|
|
459
|
+
reason="Target is not a valid file path",
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
# Delegate to existing file-based validator
|
|
463
|
+
result = validate_no_orchestrator_fsm(file_path)
|
|
464
|
+
|
|
465
|
+
if result.valid:
|
|
466
|
+
return ModelRuleCheckResult(passed=True, rule_id=self.rule_id)
|
|
467
|
+
|
|
468
|
+
# Convert first violation to ModelRuleCheckResult
|
|
469
|
+
if result.violations:
|
|
470
|
+
violation = result.violations[0]
|
|
471
|
+
return ModelRuleCheckResult(
|
|
472
|
+
passed=False,
|
|
473
|
+
rule_id=self.rule_id,
|
|
474
|
+
message=violation.message,
|
|
475
|
+
details={
|
|
476
|
+
"target_name": violation.target_name,
|
|
477
|
+
"target_type": violation.target_type,
|
|
478
|
+
"location": violation.location,
|
|
479
|
+
"suggestion": violation.suggestion,
|
|
480
|
+
"total_violations": len(result.violations),
|
|
481
|
+
},
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
return ModelRuleCheckResult(
|
|
485
|
+
passed=False,
|
|
486
|
+
rule_id=self.rule_id,
|
|
487
|
+
message="Orchestrator FSM violation detected",
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
__all__ = ["validate_no_orchestrator_fsm", "RuleNoOrchestratorFSM"]
|