omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +132 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_kafka_acks.py +99 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +330 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +68 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +49 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +57 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +449 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +229 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1330 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1514 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +2033 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Consul intent payload model for registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides the typed payload model for Consul registration intents.
|
|
6
|
+
|
|
7
|
+
Thread Safety:
|
|
8
|
+
This model is fully immutable (frozen=True) with immutable field types.
|
|
9
|
+
- ``tags`` uses tuple instead of list
|
|
10
|
+
- ``meta`` uses tuple of key-value pairs instead of dict
|
|
11
|
+
|
|
12
|
+
For dict-like access to metadata, use the ``meta_dict`` property which
|
|
13
|
+
returns a MappingProxyType (read-only view).
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from collections.abc import Mapping
|
|
19
|
+
from types import MappingProxyType
|
|
20
|
+
|
|
21
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ModelConsulIntentPayload(BaseModel):
|
|
25
|
+
"""Payload for Consul registration intents.
|
|
26
|
+
|
|
27
|
+
Used by the Consul adapter to register nodes in service discovery.
|
|
28
|
+
|
|
29
|
+
This model is fully immutable to support thread-safe concurrent access.
|
|
30
|
+
All fields use immutable types (tuple instead of list/dict).
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
service_name: Name to register the node as in Consul.
|
|
34
|
+
tags: Immutable tuple of service tags for Consul filtering.
|
|
35
|
+
meta: Immutable tuple of (key, value) pairs for metadata.
|
|
36
|
+
Use the ``meta_dict`` property for dict-like read access.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
>>> payload = ModelConsulIntentPayload(
|
|
40
|
+
... service_name="my-service",
|
|
41
|
+
... tags=["production", "v1"],
|
|
42
|
+
... meta={"env": "prod", "region": "us-west"},
|
|
43
|
+
... )
|
|
44
|
+
>>> payload.tags
|
|
45
|
+
('production', 'v1')
|
|
46
|
+
>>> payload.meta_dict["env"]
|
|
47
|
+
'prod'
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(
|
|
51
|
+
frozen=True,
|
|
52
|
+
extra="forbid",
|
|
53
|
+
strict=True,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
service_name: str = Field(
|
|
57
|
+
...,
|
|
58
|
+
min_length=1,
|
|
59
|
+
description="Service name to register in Consul",
|
|
60
|
+
)
|
|
61
|
+
tags: tuple[str, ...] = Field(
|
|
62
|
+
default=(),
|
|
63
|
+
description="Immutable tuple of service tags for Consul filtering",
|
|
64
|
+
)
|
|
65
|
+
meta: tuple[tuple[str, str], ...] = Field(
|
|
66
|
+
default=(),
|
|
67
|
+
description="Immutable tuple of (key, value) pairs for metadata",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
@field_validator("tags", mode="before")
|
|
71
|
+
@classmethod
|
|
72
|
+
def _coerce_tags_to_tuple(cls, v: object) -> tuple[str, ...]:
|
|
73
|
+
"""Convert list/sequence to tuple for immutability.
|
|
74
|
+
|
|
75
|
+
This validator ensures explicit handling of all input types rather than
|
|
76
|
+
silent fallback, which could mask invalid input. In strict mode, all
|
|
77
|
+
items must already be strings - no silent type coercion.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
v: The input value to coerce. Must be a tuple, list, set, or frozenset
|
|
81
|
+
containing only string elements.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
A tuple of string tags.
|
|
85
|
+
|
|
86
|
+
Raises:
|
|
87
|
+
ValueError: If the input is not a recognized sequence type or if
|
|
88
|
+
any element is not a string. This ensures invalid input types
|
|
89
|
+
are explicitly rejected rather than silently coerced.
|
|
90
|
+
|
|
91
|
+
Edge Cases:
|
|
92
|
+
- ``None``: Raises ValueError (explicit rejection)
|
|
93
|
+
- Empty sequence ``[]``, ``()``: Returns empty tuple
|
|
94
|
+
- Invalid types (int, str, dict): Raises ValueError
|
|
95
|
+
- Non-string elements: Raises ValueError (strict mode)
|
|
96
|
+
- Valid sequences of strings: Converts to tuple
|
|
97
|
+
"""
|
|
98
|
+
if isinstance(v, tuple):
|
|
99
|
+
# Validate tuple contents in strict mode
|
|
100
|
+
for i, item in enumerate(v):
|
|
101
|
+
if not isinstance(item, str):
|
|
102
|
+
raise ValueError(
|
|
103
|
+
f"tags[{i}] must be a string, got {type(item).__name__}"
|
|
104
|
+
)
|
|
105
|
+
return v # type: ignore[return-value] # NOTE: runtime type validated by Pydantic
|
|
106
|
+
if isinstance(v, list | set | frozenset):
|
|
107
|
+
# Validate and convert to tuple - strict mode requires string elements
|
|
108
|
+
result: list[str] = []
|
|
109
|
+
for i, item in enumerate(v):
|
|
110
|
+
if not isinstance(item, str):
|
|
111
|
+
raise ValueError(
|
|
112
|
+
f"tags[{i}] must be a string, got {type(item).__name__}"
|
|
113
|
+
)
|
|
114
|
+
result.append(item)
|
|
115
|
+
return tuple(result)
|
|
116
|
+
raise ValueError(
|
|
117
|
+
f"tags must be a tuple, list, set, or frozenset, got {type(v).__name__}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
@field_validator("meta", mode="before")
|
|
121
|
+
@classmethod
|
|
122
|
+
def _coerce_meta_to_tuple(cls, v: object) -> tuple[tuple[str, str], ...]:
|
|
123
|
+
"""Convert dict/mapping to tuple of pairs for immutability.
|
|
124
|
+
|
|
125
|
+
This validator ensures explicit handling of all input types rather than
|
|
126
|
+
silent fallback to empty tuple, which could mask invalid input. In strict
|
|
127
|
+
mode, all keys and values must already be strings - no silent type coercion.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
v: The input value to coerce. Must be either a tuple of (key, value)
|
|
131
|
+
pairs or a Mapping (dict-like object) with string keys and values.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
A tuple of (key, value) string pairs.
|
|
135
|
+
|
|
136
|
+
Raises:
|
|
137
|
+
ValueError: If the input is neither a tuple nor a Mapping type, or if
|
|
138
|
+
any key/value is not a string. This ensures invalid input types
|
|
139
|
+
are explicitly rejected rather than silently coerced.
|
|
140
|
+
|
|
141
|
+
Edge Cases:
|
|
142
|
+
- ``None``: Raises ValueError (explicit rejection)
|
|
143
|
+
- Empty Mapping ``{}``: Returns empty tuple
|
|
144
|
+
- Empty tuple ``()``: Passed through (same as default)
|
|
145
|
+
- Invalid types (list, int, str): Raises ValueError
|
|
146
|
+
- Non-string keys/values: Raises ValueError (strict mode)
|
|
147
|
+
- Non-empty Mapping with strings: Converts to tuple of (key, value) pairs
|
|
148
|
+
"""
|
|
149
|
+
if isinstance(v, tuple):
|
|
150
|
+
# Validate tuple contents in strict mode
|
|
151
|
+
for i, item in enumerate(v):
|
|
152
|
+
if not isinstance(item, tuple) or len(item) != 2:
|
|
153
|
+
raise ValueError(
|
|
154
|
+
f"meta[{i}] must be a (key, value) tuple, got {type(item).__name__}"
|
|
155
|
+
)
|
|
156
|
+
key, val = item
|
|
157
|
+
if not isinstance(key, str):
|
|
158
|
+
raise ValueError(
|
|
159
|
+
f"meta[{i}][0] (key) must be a string, got {type(key).__name__}"
|
|
160
|
+
)
|
|
161
|
+
if not isinstance(val, str):
|
|
162
|
+
raise ValueError(
|
|
163
|
+
f"meta[{i}][1] (value) must be a string, got {type(val).__name__}"
|
|
164
|
+
)
|
|
165
|
+
return v # type: ignore[return-value] # NOTE: runtime type validated by Pydantic
|
|
166
|
+
if isinstance(v, Mapping):
|
|
167
|
+
# Validate and convert to tuple - strict mode requires string keys/values
|
|
168
|
+
result: list[tuple[str, str]] = []
|
|
169
|
+
for key, val in v.items():
|
|
170
|
+
if not isinstance(key, str):
|
|
171
|
+
raise ValueError(
|
|
172
|
+
f"meta key must be a string, got {type(key).__name__}"
|
|
173
|
+
)
|
|
174
|
+
if not isinstance(val, str):
|
|
175
|
+
raise ValueError(
|
|
176
|
+
f"meta[{key!r}] value must be a string, got {type(val).__name__}"
|
|
177
|
+
)
|
|
178
|
+
result.append((key, val))
|
|
179
|
+
return tuple(result)
|
|
180
|
+
raise ValueError(f"meta must be a tuple or Mapping, got {type(v).__name__}")
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def meta_dict(self) -> MappingProxyType[str, str]:
|
|
184
|
+
"""Return a read-only dict view of the metadata.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
MappingProxyType providing dict-like read access to metadata.
|
|
188
|
+
"""
|
|
189
|
+
return MappingProxyType(dict(self.meta))
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
__all__ = [
|
|
193
|
+
"ModelConsulIntentPayload",
|
|
194
|
+
]
|
omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Consul registration intent model for registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides the typed intent model for Consul registration operations.
|
|
6
|
+
Registered with RegistryIntent for dynamic type resolution.
|
|
7
|
+
|
|
8
|
+
Related:
|
|
9
|
+
- ModelRegistryIntent: Base class for all registration intents
|
|
10
|
+
- RegistryIntent: Decorator-based registry for intent type discovery
|
|
11
|
+
- OMN-1007: Union reduction refactoring
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from typing import Literal
|
|
17
|
+
|
|
18
|
+
from pydantic import ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_consul_intent_payload import (
|
|
21
|
+
ModelConsulIntentPayload,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_registry_intent import (
|
|
24
|
+
ModelRegistryIntent,
|
|
25
|
+
RegistryIntent,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@RegistryIntent.register("consul")
|
|
30
|
+
class ModelConsulRegistrationIntent(ModelRegistryIntent):
|
|
31
|
+
"""Intent to register a node in Consul service discovery.
|
|
32
|
+
|
|
33
|
+
This model is registered with RegistryIntent for dynamic type resolution,
|
|
34
|
+
enabling Pydantic discriminated union validation without explicit union types.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
kind: Literal discriminator, always "consul".
|
|
38
|
+
operation: The operation type (e.g., "register", "deregister").
|
|
39
|
+
node_id: Target node ID for the operation.
|
|
40
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
41
|
+
payload: Consul-specific registration payload.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
model_config = ConfigDict(
|
|
45
|
+
frozen=True,
|
|
46
|
+
extra="forbid",
|
|
47
|
+
strict=True,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
kind: Literal["consul"] = Field(
|
|
51
|
+
default="consul",
|
|
52
|
+
description="Intent type discriminator",
|
|
53
|
+
)
|
|
54
|
+
operation: str = Field(
|
|
55
|
+
...,
|
|
56
|
+
min_length=1,
|
|
57
|
+
description="Operation to perform (e.g., 'register', 'deregister')",
|
|
58
|
+
)
|
|
59
|
+
payload: ModelConsulIntentPayload = Field(
|
|
60
|
+
...,
|
|
61
|
+
description="Consul-specific registration payload",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
__all__ = [
|
|
66
|
+
"ModelConsulRegistrationIntent",
|
|
67
|
+
]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Intent execution result model for registration orchestrator."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ModelIntentExecutionResult(BaseModel):
|
|
11
|
+
"""Result of executing a single intent.
|
|
12
|
+
|
|
13
|
+
Captures the outcome of a single registration intent execution,
|
|
14
|
+
including success/failure status, timing, and error details.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
intent_kind: The type of intent that was executed (e.g., 'consul', 'postgres').
|
|
18
|
+
success: Whether the execution completed successfully.
|
|
19
|
+
error: Error message if execution failed, None otherwise.
|
|
20
|
+
execution_time_ms: Time taken to execute the intent in milliseconds.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
model_config = ConfigDict(
|
|
24
|
+
frozen=True,
|
|
25
|
+
extra="forbid",
|
|
26
|
+
strict=True,
|
|
27
|
+
from_attributes=True,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
intent_kind: str = Field(
|
|
31
|
+
...,
|
|
32
|
+
min_length=1,
|
|
33
|
+
description="The intent kind that was executed",
|
|
34
|
+
)
|
|
35
|
+
success: bool = Field(
|
|
36
|
+
...,
|
|
37
|
+
description="Whether execution succeeded",
|
|
38
|
+
)
|
|
39
|
+
error: str | None = Field(
|
|
40
|
+
default=None,
|
|
41
|
+
description="Error message if failed",
|
|
42
|
+
)
|
|
43
|
+
execution_time_ms: float = Field(
|
|
44
|
+
...,
|
|
45
|
+
ge=0.0,
|
|
46
|
+
description="Execution time in milliseconds",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
__all__ = ["ModelIntentExecutionResult"]
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Liveness expired event model for the registration orchestrator.
|
|
4
|
+
|
|
5
|
+
Emitted when an active node misses its liveness heartbeat deadline.
|
|
6
|
+
This is a timeout decision event that triggers state transition to LIVENESS_EXPIRED.
|
|
7
|
+
|
|
8
|
+
Timestamp Accuracy Verification (2025-12-25):
|
|
9
|
+
All timestamps in this event model are verified accurate:
|
|
10
|
+
|
|
11
|
+
- detected_at: Fresh UTC timestamp from RuntimeTick.now at detection time.
|
|
12
|
+
Source: RuntimeScheduler.emit_tick() -> datetime.now(UTC) -> process_timeouts().
|
|
13
|
+
NOT cached or stale.
|
|
14
|
+
|
|
15
|
+
- liveness_deadline: The deadline that was missed, sourced from the
|
|
16
|
+
registration projection (calculated as last_heartbeat_at + liveness_window
|
|
17
|
+
when heartbeat was processed).
|
|
18
|
+
|
|
19
|
+
- last_heartbeat_at: Optional timestamp of last heartbeat, sourced from
|
|
20
|
+
projection.last_heartbeat_at (set from heartbeat event timestamp).
|
|
21
|
+
|
|
22
|
+
UTC timezone handling is enforced at the RuntimeScheduler level using
|
|
23
|
+
datetime.now(UTC). See test_timeout_emitter.py for comprehensive tests.
|
|
24
|
+
|
|
25
|
+
Related Tickets:
|
|
26
|
+
- OMN-932 (C2): Durable Timeout Handling
|
|
27
|
+
- OMN-888 (C1): Registration Orchestrator
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from datetime import datetime
|
|
33
|
+
from uuid import UUID
|
|
34
|
+
|
|
35
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ModelNodeLivenessExpired(BaseModel):
|
|
39
|
+
"""Event emitted when an active node misses liveness heartbeat deadline.
|
|
40
|
+
|
|
41
|
+
This is a timeout decision event emitted by the orchestrator when:
|
|
42
|
+
- liveness_deadline has passed
|
|
43
|
+
- Node state is ACTIVE
|
|
44
|
+
- No previous expiry event was emitted (liveness_timeout_emitted_at was None)
|
|
45
|
+
|
|
46
|
+
The orchestrator emits this event during RuntimeTick processing when
|
|
47
|
+
scanning projections for missed heartbeat deadlines. The reducer will
|
|
48
|
+
transition the node to LIVENESS_EXPIRED state (terminal) upon receiving
|
|
49
|
+
this event.
|
|
50
|
+
|
|
51
|
+
Topic Pattern:
|
|
52
|
+
{env}.{namespace}.onex.evt.node-liveness-expired.v1
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
node_id: UUID of the node whose liveness expired.
|
|
56
|
+
liveness_deadline: The deadline that was missed.
|
|
57
|
+
detected_at: When the expiry was detected (from RuntimeTick.now).
|
|
58
|
+
last_heartbeat_at: When the last heartbeat was received (if tracked).
|
|
59
|
+
correlation_id: Correlation ID from the RuntimeTick that triggered detection.
|
|
60
|
+
causation_id: Message ID that caused this event (RuntimeTick.tick_id).
|
|
61
|
+
|
|
62
|
+
Example:
|
|
63
|
+
>>> from datetime import datetime, UTC, timedelta
|
|
64
|
+
>>> from uuid import uuid4
|
|
65
|
+
>>> now = datetime.now(UTC)
|
|
66
|
+
>>> event = ModelNodeLivenessExpired(
|
|
67
|
+
... node_id=uuid4(),
|
|
68
|
+
... liveness_deadline=now - timedelta(seconds=30),
|
|
69
|
+
... detected_at=now,
|
|
70
|
+
... last_heartbeat_at=now - timedelta(minutes=2),
|
|
71
|
+
... correlation_id=uuid4(),
|
|
72
|
+
... causation_id=uuid4(),
|
|
73
|
+
... )
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
model_config = ConfigDict(
|
|
77
|
+
frozen=True,
|
|
78
|
+
extra="forbid",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
node_id: UUID = Field(
|
|
82
|
+
...,
|
|
83
|
+
description="UUID of the node whose liveness expired",
|
|
84
|
+
)
|
|
85
|
+
liveness_deadline: datetime = Field(
|
|
86
|
+
...,
|
|
87
|
+
description="The deadline that was missed",
|
|
88
|
+
)
|
|
89
|
+
detected_at: datetime = Field(
|
|
90
|
+
...,
|
|
91
|
+
description="When the expiry was detected (from RuntimeTick.now)",
|
|
92
|
+
)
|
|
93
|
+
last_heartbeat_at: datetime | None = Field(
|
|
94
|
+
default=None,
|
|
95
|
+
description="When last heartbeat was received (if tracked)",
|
|
96
|
+
)
|
|
97
|
+
correlation_id: UUID = Field(
|
|
98
|
+
...,
|
|
99
|
+
description="Correlation ID from the RuntimeTick that triggered detection",
|
|
100
|
+
)
|
|
101
|
+
causation_id: UUID = Field(
|
|
102
|
+
...,
|
|
103
|
+
description="Message ID that caused this event (RuntimeTick.tick_id)",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
__all__ = ["ModelNodeLivenessExpired"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Configuration model for registration orchestrator."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ModelOrchestratorConfig(BaseModel):
|
|
11
|
+
"""Configuration for the registration orchestrator node.
|
|
12
|
+
|
|
13
|
+
Controls workflow execution parameters including timeouts, retry behavior,
|
|
14
|
+
and failure handling strategies.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
timeout_seconds: Maximum time allowed for the entire workflow.
|
|
18
|
+
max_retries: Maximum retry attempts for individual effect calls.
|
|
19
|
+
initial_delay_ms: Initial delay before first retry attempt.
|
|
20
|
+
max_delay_ms: Maximum delay between retry attempts.
|
|
21
|
+
exponential_base: Base for exponential backoff calculation.
|
|
22
|
+
fail_fast: If True, stop workflow on first failure; if False, continue.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
model_config = ConfigDict(
|
|
26
|
+
frozen=True,
|
|
27
|
+
extra="forbid",
|
|
28
|
+
strict=True,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
timeout_seconds: float = Field(
|
|
32
|
+
default=30.0,
|
|
33
|
+
ge=1.0,
|
|
34
|
+
le=300.0,
|
|
35
|
+
description="Workflow timeout in seconds",
|
|
36
|
+
)
|
|
37
|
+
max_retries: int = Field(
|
|
38
|
+
default=3,
|
|
39
|
+
ge=0,
|
|
40
|
+
le=10,
|
|
41
|
+
description="Max retry attempts for effect calls",
|
|
42
|
+
)
|
|
43
|
+
initial_delay_ms: int = Field(
|
|
44
|
+
default=100,
|
|
45
|
+
ge=10,
|
|
46
|
+
le=10000,
|
|
47
|
+
description="Initial retry delay in milliseconds",
|
|
48
|
+
)
|
|
49
|
+
max_delay_ms: int = Field(
|
|
50
|
+
default=5000,
|
|
51
|
+
ge=100,
|
|
52
|
+
le=60000,
|
|
53
|
+
description="Max retry delay in milliseconds",
|
|
54
|
+
)
|
|
55
|
+
exponential_base: float = Field(
|
|
56
|
+
default=2.0,
|
|
57
|
+
ge=1.1,
|
|
58
|
+
le=4.0,
|
|
59
|
+
description="Exponential backoff base multiplier",
|
|
60
|
+
)
|
|
61
|
+
fail_fast: bool = Field(
|
|
62
|
+
default=True,
|
|
63
|
+
description="Stop on first failure if True",
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
__all__ = ["ModelOrchestratorConfig"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Input model for registration orchestrator."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from uuid import UUID
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
10
|
+
|
|
11
|
+
from omnibase_infra.models.registration import ModelNodeIntrospectionEvent
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelOrchestratorInput(BaseModel):
|
|
15
|
+
"""Input for the registration orchestrator workflow.
|
|
16
|
+
|
|
17
|
+
Contains the introspection event to process and correlation ID for
|
|
18
|
+
distributed tracing across the workflow execution.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
introspection_event: The introspection event containing node registration data.
|
|
22
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
model_config = ConfigDict(
|
|
26
|
+
frozen=True,
|
|
27
|
+
extra="forbid",
|
|
28
|
+
strict=True,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
introspection_event: ModelNodeIntrospectionEvent = Field(
|
|
32
|
+
...,
|
|
33
|
+
description="The introspection event to process",
|
|
34
|
+
)
|
|
35
|
+
correlation_id: UUID = Field(
|
|
36
|
+
...,
|
|
37
|
+
description="Correlation ID for distributed tracing",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
__all__ = ["ModelOrchestratorInput"]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Output model for registration orchestrator.
|
|
4
|
+
|
|
5
|
+
Thread Safety:
|
|
6
|
+
This model is fully immutable (frozen=True) with immutable field types.
|
|
7
|
+
The ``intent_results`` field uses tuple instead of list to ensure
|
|
8
|
+
complete immutability for thread-safe concurrent access.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
from typing import Literal
|
|
15
|
+
from uuid import UUID
|
|
16
|
+
|
|
17
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
18
|
+
|
|
19
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_intent_execution_result import (
|
|
20
|
+
ModelIntentExecutionResult,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ModelOrchestratorOutput(BaseModel):
|
|
25
|
+
"""Output from the registration orchestrator workflow.
|
|
26
|
+
|
|
27
|
+
Provides comprehensive results of the orchestrated registration workflow,
|
|
28
|
+
including per-target success status and detailed execution metrics.
|
|
29
|
+
|
|
30
|
+
This model is fully immutable to support thread-safe concurrent access.
|
|
31
|
+
All collection fields use immutable types (tuple instead of list).
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
35
|
+
status: Overall workflow status - success, partial, or failed.
|
|
36
|
+
consul_applied: Whether Consul registration succeeded.
|
|
37
|
+
postgres_applied: Whether PostgreSQL registration succeeded.
|
|
38
|
+
consul_error: Error message from Consul registration if any.
|
|
39
|
+
postgres_error: Error message from PostgreSQL registration if any.
|
|
40
|
+
intent_results: Immutable tuple of results for each executed intent.
|
|
41
|
+
total_execution_time_ms: Total workflow execution time in milliseconds.
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
>>> output = ModelOrchestratorOutput(
|
|
45
|
+
... correlation_id=uuid4(),
|
|
46
|
+
... status="success",
|
|
47
|
+
... intent_results=[result1, result2], # list auto-converted to tuple
|
|
48
|
+
... total_execution_time_ms=150.5,
|
|
49
|
+
... )
|
|
50
|
+
>>> isinstance(output.intent_results, tuple)
|
|
51
|
+
True
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
model_config = ConfigDict(
|
|
55
|
+
frozen=True,
|
|
56
|
+
extra="forbid",
|
|
57
|
+
strict=True,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
correlation_id: UUID = Field(
|
|
61
|
+
...,
|
|
62
|
+
description="Correlation ID for distributed tracing",
|
|
63
|
+
)
|
|
64
|
+
status: Literal["success", "partial", "failed"] = Field(
|
|
65
|
+
...,
|
|
66
|
+
description="Overall workflow status",
|
|
67
|
+
)
|
|
68
|
+
consul_applied: bool = Field(
|
|
69
|
+
default=False,
|
|
70
|
+
description="Whether Consul registration succeeded",
|
|
71
|
+
)
|
|
72
|
+
postgres_applied: bool = Field(
|
|
73
|
+
default=False,
|
|
74
|
+
description="Whether PostgreSQL registration succeeded",
|
|
75
|
+
)
|
|
76
|
+
consul_error: str | None = Field(
|
|
77
|
+
default=None,
|
|
78
|
+
description="Consul error message if any",
|
|
79
|
+
)
|
|
80
|
+
postgres_error: str | None = Field(
|
|
81
|
+
default=None,
|
|
82
|
+
description="PostgreSQL error message if any",
|
|
83
|
+
)
|
|
84
|
+
intent_results: tuple[ModelIntentExecutionResult, ...] = Field(
|
|
85
|
+
default=(),
|
|
86
|
+
description="Immutable tuple of results for each intent execution",
|
|
87
|
+
)
|
|
88
|
+
total_execution_time_ms: float = Field(
|
|
89
|
+
...,
|
|
90
|
+
ge=0.0,
|
|
91
|
+
description="Total workflow execution time in milliseconds",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
@field_validator("intent_results", mode="before")
|
|
95
|
+
@classmethod
|
|
96
|
+
def _coerce_intent_results_to_tuple(
|
|
97
|
+
cls, v: object
|
|
98
|
+
) -> tuple[ModelIntentExecutionResult, ...]:
|
|
99
|
+
"""Convert list/sequence to tuple for immutability.
|
|
100
|
+
|
|
101
|
+
This validator ensures explicit handling of all input types rather than
|
|
102
|
+
silent fallback to empty tuple, which could mask invalid input. In strict
|
|
103
|
+
mode, all elements must already be ModelIntentExecutionResult instances -
|
|
104
|
+
no silent type coercion from dicts or other types.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
v: The input value to coerce. Must be either a tuple or a Sequence
|
|
108
|
+
(excluding str and bytes) containing only ModelIntentExecutionResult
|
|
109
|
+
instances.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
A tuple of ModelIntentExecutionResult items.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
ValueError: If the input is None, str, bytes, or any other non-sequence
|
|
116
|
+
type, OR if any element is not a ModelIntentExecutionResult instance.
|
|
117
|
+
This ensures invalid input types are explicitly rejected rather than
|
|
118
|
+
silently coerced.
|
|
119
|
+
|
|
120
|
+
Edge Cases:
|
|
121
|
+
- ``None``: Raises ValueError (explicit rejection)
|
|
122
|
+
- ``str`` or ``bytes``: Raises ValueError (not valid sequences for this field)
|
|
123
|
+
- Empty tuple ``()``: Passed through (same as default)
|
|
124
|
+
- Empty list ``[]``: Converted to empty tuple
|
|
125
|
+
- Other non-sequence types (int, dict, etc.): Raises ValueError
|
|
126
|
+
- Sequence with dict elements: Raises ValueError (strict mode - no coercion)
|
|
127
|
+
- Sequence with ModelIntentExecutionResult: Converts to tuple
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
>>> # Valid inputs
|
|
131
|
+
>>> _coerce_intent_results_to_tuple([result1, result2])
|
|
132
|
+
(result1, result2)
|
|
133
|
+
>>> _coerce_intent_results_to_tuple(())
|
|
134
|
+
()
|
|
135
|
+
>>> # Invalid inputs raise ValueError
|
|
136
|
+
>>> _coerce_intent_results_to_tuple(None) # Raises ValueError
|
|
137
|
+
>>> _coerce_intent_results_to_tuple("not a sequence") # Raises ValueError
|
|
138
|
+
>>> _coerce_intent_results_to_tuple([{"target": "consul"}]) # Raises ValueError
|
|
139
|
+
"""
|
|
140
|
+
if isinstance(v, tuple):
|
|
141
|
+
# Validate tuple contents in strict mode
|
|
142
|
+
for i, item in enumerate(v):
|
|
143
|
+
if not isinstance(item, ModelIntentExecutionResult):
|
|
144
|
+
raise ValueError(
|
|
145
|
+
f"intent_results[{i}] must be a ModelIntentExecutionResult, "
|
|
146
|
+
f"got {type(item).__name__}"
|
|
147
|
+
)
|
|
148
|
+
return v # type: ignore[return-value] # NOTE: runtime type validated above
|
|
149
|
+
if isinstance(v, Sequence) and not isinstance(v, str | bytes):
|
|
150
|
+
# Validate and convert to tuple - strict mode requires model instances
|
|
151
|
+
result: list[ModelIntentExecutionResult] = []
|
|
152
|
+
for i, item in enumerate(v):
|
|
153
|
+
if not isinstance(item, ModelIntentExecutionResult):
|
|
154
|
+
raise ValueError(
|
|
155
|
+
f"intent_results[{i}] must be a ModelIntentExecutionResult, "
|
|
156
|
+
f"got {type(item).__name__}"
|
|
157
|
+
)
|
|
158
|
+
result.append(item)
|
|
159
|
+
return tuple(result)
|
|
160
|
+
raise ValueError(
|
|
161
|
+
f"intent_results must be a tuple or Sequence (excluding str/bytes), "
|
|
162
|
+
f"got {type(v).__name__}"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
__all__ = ["ModelOrchestratorOutput"]
|