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,235 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""PostgreSQL intent payload model for registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides the typed payload model for PostgreSQL registration intents.
|
|
6
|
+
|
|
7
|
+
Design Note:
|
|
8
|
+
This model uses strongly-typed ModelNodeCapabilities and ModelNodeMetadata
|
|
9
|
+
instead of generic dict[str, JsonType] to adhere to ONEX "no Any types"
|
|
10
|
+
principle. The JsonType type alias contains list[Any] and dict[str, Any]
|
|
11
|
+
internally, which violates strict typing requirements.
|
|
12
|
+
|
|
13
|
+
Using the same typed models as ModelNodeIntrospectionEvent ensures:
|
|
14
|
+
1. Type safety throughout the registration pipeline
|
|
15
|
+
2. Consistent validation between event source and database persistence
|
|
16
|
+
3. No implicit Any types in the payload structure
|
|
17
|
+
|
|
18
|
+
Thread Safety:
|
|
19
|
+
This model is fully immutable (frozen=True) with immutable field types.
|
|
20
|
+
The ``endpoints`` field uses tuple of key-value pairs instead of dict
|
|
21
|
+
to ensure complete immutability for thread-safe concurrent access.
|
|
22
|
+
|
|
23
|
+
For dict-like access to endpoints, use the ``endpoints_dict`` property
|
|
24
|
+
which returns a MappingProxyType (read-only view).
|
|
25
|
+
|
|
26
|
+
Edge Case Behavior:
|
|
27
|
+
The ``endpoints`` field validator explicitly handles the following cases:
|
|
28
|
+
- ``None``: Raises ValueError (invalid input, not silently ignored)
|
|
29
|
+
- Empty Mapping ``{}``: Logs warning and converts to empty tuple
|
|
30
|
+
- Invalid types (int, str, list, etc.): Raises ValueError
|
|
31
|
+
- Tuple: Passed through as-is
|
|
32
|
+
- Non-empty Mapping: Converted to tuple of (key, value) pairs
|
|
33
|
+
- Non-string keys/values: Raises ValueError (strict mode)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
import logging
|
|
39
|
+
import warnings
|
|
40
|
+
from collections.abc import Mapping
|
|
41
|
+
from types import MappingProxyType
|
|
42
|
+
from uuid import UUID
|
|
43
|
+
|
|
44
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
45
|
+
|
|
46
|
+
from omnibase_core.enums import EnumNodeKind
|
|
47
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
48
|
+
from omnibase_infra.models.registration.model_node_capabilities import (
|
|
49
|
+
ModelNodeCapabilities,
|
|
50
|
+
)
|
|
51
|
+
from omnibase_infra.models.registration.model_node_metadata import ModelNodeMetadata
|
|
52
|
+
|
|
53
|
+
# Module-level initialization (after all imports)
|
|
54
|
+
logger = logging.getLogger(__name__)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ModelPostgresIntentPayload(BaseModel):
|
|
58
|
+
"""Payload for PostgreSQL registration intents.
|
|
59
|
+
|
|
60
|
+
Contains the full node introspection data to upsert into the
|
|
61
|
+
registration database. This is a typed representation of the
|
|
62
|
+
data previously passed via model_dump().
|
|
63
|
+
|
|
64
|
+
Uses strongly-typed capability and metadata models matching
|
|
65
|
+
ModelNodeIntrospectionEvent for type-safe pipeline processing.
|
|
66
|
+
|
|
67
|
+
This model is fully immutable to support thread-safe concurrent access.
|
|
68
|
+
All collection fields use immutable types (tuple instead of dict).
|
|
69
|
+
|
|
70
|
+
Attributes:
|
|
71
|
+
node_id: Unique node identifier.
|
|
72
|
+
node_type: ONEX node type (effect, compute, reducer, orchestrator).
|
|
73
|
+
node_version: Semantic version of the node.
|
|
74
|
+
capabilities: Strongly-typed node capabilities.
|
|
75
|
+
endpoints: Immutable tuple of (name, URL) pairs for exposed endpoints.
|
|
76
|
+
Use the ``endpoints_dict`` property for dict-like read access.
|
|
77
|
+
node_role: Optional role descriptor.
|
|
78
|
+
metadata: Strongly-typed node metadata.
|
|
79
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
80
|
+
network_id: Network/cluster identifier.
|
|
81
|
+
deployment_id: Deployment/release identifier.
|
|
82
|
+
epoch: Registration epoch for ordering.
|
|
83
|
+
timestamp: Event timestamp as ISO string.
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
>>> from omnibase_core.enums import EnumNodeKind
|
|
87
|
+
>>> payload = ModelPostgresIntentPayload(
|
|
88
|
+
... node_id=uuid4(),
|
|
89
|
+
... node_type=EnumNodeKind.EFFECT,
|
|
90
|
+
... endpoints={"health": "/health", "api": "/api/v1"},
|
|
91
|
+
... correlation_id=uuid4(),
|
|
92
|
+
... timestamp="2025-01-01T00:00:00Z",
|
|
93
|
+
... )
|
|
94
|
+
>>> payload.endpoints
|
|
95
|
+
(('health', '/health'), ('api', '/api/v1'))
|
|
96
|
+
>>> payload.endpoints_dict["health"]
|
|
97
|
+
'/health'
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
model_config = ConfigDict(
|
|
101
|
+
frozen=True,
|
|
102
|
+
extra="forbid",
|
|
103
|
+
strict=True,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
node_id: UUID = Field(..., description="Unique node identifier")
|
|
107
|
+
# Design Note: node_type uses EnumNodeKind for type-safe ONEX node type validation.
|
|
108
|
+
# This ensures only valid ONEX node types can be persisted to PostgreSQL.
|
|
109
|
+
node_type: EnumNodeKind = Field(..., description="ONEX node type")
|
|
110
|
+
node_version: ModelSemVer = Field(
|
|
111
|
+
default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
|
|
112
|
+
description="Semantic version of the node",
|
|
113
|
+
)
|
|
114
|
+
capabilities: ModelNodeCapabilities = Field(
|
|
115
|
+
default_factory=ModelNodeCapabilities,
|
|
116
|
+
description="Strongly-typed node capabilities",
|
|
117
|
+
)
|
|
118
|
+
endpoints: tuple[tuple[str, str], ...] = Field(
|
|
119
|
+
default=(),
|
|
120
|
+
description="Immutable tuple of (name, URL) pairs for exposed endpoints",
|
|
121
|
+
)
|
|
122
|
+
node_role: str | None = Field(default=None, description="Node role")
|
|
123
|
+
metadata: ModelNodeMetadata = Field(
|
|
124
|
+
default_factory=ModelNodeMetadata,
|
|
125
|
+
description="Strongly-typed node metadata",
|
|
126
|
+
)
|
|
127
|
+
correlation_id: UUID = Field(..., description="Correlation ID for tracing")
|
|
128
|
+
network_id: str | None = Field(default=None, description="Network identifier")
|
|
129
|
+
deployment_id: str | None = Field(default=None, description="Deployment identifier")
|
|
130
|
+
epoch: int | None = Field(default=None, ge=0, description="Registration epoch")
|
|
131
|
+
timestamp: str = Field(..., description="Event timestamp as ISO string")
|
|
132
|
+
|
|
133
|
+
@field_validator("endpoints", mode="before")
|
|
134
|
+
@classmethod
|
|
135
|
+
def _coerce_endpoints_to_tuple(cls, v: object) -> tuple[tuple[str, str], ...]:
|
|
136
|
+
"""Convert dict/mapping to tuple of pairs for immutability.
|
|
137
|
+
|
|
138
|
+
This validator ensures explicit handling of all input types rather than
|
|
139
|
+
silent fallback to empty tuple, which could mask invalid input. In strict
|
|
140
|
+
mode, all keys and values must already be strings - no silent type coercion.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
v: The input value to coerce. Must be either a tuple of (key, value)
|
|
144
|
+
pairs or a Mapping (dict-like object) with string keys and values.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
A tuple of (key, value) string pairs.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If the input is neither a tuple nor a Mapping type, or if
|
|
151
|
+
any key/value is not a string. This ensures invalid input types
|
|
152
|
+
are explicitly rejected rather than silently coerced.
|
|
153
|
+
|
|
154
|
+
Edge Cases:
|
|
155
|
+
- ``None``: Raises ValueError (explicit rejection)
|
|
156
|
+
- Empty Mapping ``{}``: Logs warning, returns empty tuple
|
|
157
|
+
- Empty tuple ``()``: Passed through (same as default)
|
|
158
|
+
- Invalid types (list, int, str): Raises ValueError
|
|
159
|
+
- Non-string keys/values: Raises ValueError (strict mode)
|
|
160
|
+
- Non-empty Mapping with strings: Converts to tuple of (key, value) pairs
|
|
161
|
+
|
|
162
|
+
Example:
|
|
163
|
+
>>> # Valid inputs
|
|
164
|
+
>>> _coerce_endpoints_to_tuple({"health": "/health"})
|
|
165
|
+
(('health', '/health'),)
|
|
166
|
+
>>> _coerce_endpoints_to_tuple(())
|
|
167
|
+
()
|
|
168
|
+
>>> # Invalid inputs raise ValueError
|
|
169
|
+
>>> _coerce_endpoints_to_tuple(None) # Raises ValueError
|
|
170
|
+
>>> _coerce_endpoints_to_tuple([]) # Raises ValueError (list not Mapping)
|
|
171
|
+
>>> _coerce_endpoints_to_tuple({1: "/health"}) # Raises ValueError (non-string key)
|
|
172
|
+
"""
|
|
173
|
+
if isinstance(v, tuple):
|
|
174
|
+
# Validate tuple contents in strict mode
|
|
175
|
+
for i, item in enumerate(v):
|
|
176
|
+
if not isinstance(item, tuple) or len(item) != 2:
|
|
177
|
+
raise ValueError(
|
|
178
|
+
f"endpoints[{i}] must be a (key, value) tuple, "
|
|
179
|
+
f"got {type(item).__name__}"
|
|
180
|
+
)
|
|
181
|
+
key, val = item
|
|
182
|
+
if not isinstance(key, str):
|
|
183
|
+
raise ValueError(
|
|
184
|
+
f"endpoints[{i}][0] (key) must be a string, "
|
|
185
|
+
f"got {type(key).__name__}"
|
|
186
|
+
)
|
|
187
|
+
if not isinstance(val, str):
|
|
188
|
+
raise ValueError(
|
|
189
|
+
f"endpoints[{i}][1] (value) must be a string, "
|
|
190
|
+
f"got {type(val).__name__}"
|
|
191
|
+
)
|
|
192
|
+
return v # type: ignore[return-value] # NOTE: runtime type validated by Pydantic
|
|
193
|
+
if isinstance(v, Mapping):
|
|
194
|
+
if len(v) == 0:
|
|
195
|
+
# Log warning for empty Mapping to help detect potentially missing data.
|
|
196
|
+
# This is different from the default empty tuple - it's an explicit
|
|
197
|
+
# empty Mapping input that gets coerced.
|
|
198
|
+
warning_msg = (
|
|
199
|
+
"Empty Mapping provided for endpoints, coercing to empty tuple. "
|
|
200
|
+
"If this is intentional, consider using default=() instead."
|
|
201
|
+
)
|
|
202
|
+
logger.warning(warning_msg)
|
|
203
|
+
warnings.warn(warning_msg, UserWarning, stacklevel=2)
|
|
204
|
+
return ()
|
|
205
|
+
# Validate and convert to tuple - strict mode requires string keys/values
|
|
206
|
+
result: list[tuple[str, str]] = []
|
|
207
|
+
for key, val in v.items():
|
|
208
|
+
if not isinstance(key, str):
|
|
209
|
+
raise ValueError(
|
|
210
|
+
f"endpoints key must be a string, got {type(key).__name__}"
|
|
211
|
+
)
|
|
212
|
+
if not isinstance(val, str):
|
|
213
|
+
raise ValueError(
|
|
214
|
+
f"endpoints[{key!r}] value must be a string, "
|
|
215
|
+
f"got {type(val).__name__}"
|
|
216
|
+
)
|
|
217
|
+
result.append((key, val))
|
|
218
|
+
return tuple(result)
|
|
219
|
+
raise ValueError(
|
|
220
|
+
f"endpoints must be a tuple or Mapping, got {type(v).__name__}"
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def endpoints_dict(self) -> MappingProxyType[str, str]:
|
|
225
|
+
"""Return a read-only dict view of the endpoints.
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
MappingProxyType providing dict-like read access to endpoints.
|
|
229
|
+
"""
|
|
230
|
+
return MappingProxyType(dict(self.endpoints))
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
__all__ = [
|
|
234
|
+
"ModelPostgresIntentPayload",
|
|
235
|
+
]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""PostgreSQL upsert intent model for registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides the typed intent model for PostgreSQL upsert 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_postgres_intent_payload import (
|
|
21
|
+
ModelPostgresIntentPayload,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_registry_intent import (
|
|
24
|
+
ModelRegistryIntent,
|
|
25
|
+
RegistryIntent,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@RegistryIntent.register("postgres")
|
|
30
|
+
class ModelPostgresUpsertIntent(ModelRegistryIntent):
|
|
31
|
+
"""Intent to upsert node registration in PostgreSQL.
|
|
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 "postgres".
|
|
38
|
+
operation: The operation type (e.g., "upsert", "delete").
|
|
39
|
+
node_id: Target node ID for the operation.
|
|
40
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
41
|
+
payload: PostgreSQL-specific registration payload.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
model_config = ConfigDict(
|
|
45
|
+
frozen=True,
|
|
46
|
+
extra="forbid",
|
|
47
|
+
strict=True,
|
|
48
|
+
from_attributes=True,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
kind: Literal["postgres"] = Field(
|
|
52
|
+
default="postgres",
|
|
53
|
+
description="Intent type discriminator",
|
|
54
|
+
)
|
|
55
|
+
operation: str = Field(
|
|
56
|
+
...,
|
|
57
|
+
min_length=1,
|
|
58
|
+
description="Operation to perform (e.g., 'upsert', 'delete')",
|
|
59
|
+
)
|
|
60
|
+
payload: ModelPostgresIntentPayload = Field(
|
|
61
|
+
...,
|
|
62
|
+
description="PostgreSQL-specific registration payload",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
__all__ = [
|
|
67
|
+
"ModelPostgresUpsertIntent",
|
|
68
|
+
]
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Reducer execution result model for the registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This model replaces the tuple pattern `tuple[ModelReducerState, tuple[ModelRegistrationIntent, ...]]`
|
|
6
|
+
that was used for reducer return values. By using a single model type, we eliminate
|
|
7
|
+
the tuple pattern while providing richer context and self-documenting field names.
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
ModelReducerExecutionResult replaces tuple returns from ProtocolReducer.reduce()
|
|
11
|
+
with a strongly-typed, self-documenting model. This follows the ONEX principle
|
|
12
|
+
of using Pydantic models instead of tuple returns for method results.
|
|
13
|
+
|
|
14
|
+
The model is intentionally frozen (immutable) to ensure thread safety when
|
|
15
|
+
the same result is passed between components. The intents field uses an
|
|
16
|
+
immutable tuple rather than a mutable list to maintain full immutability.
|
|
17
|
+
|
|
18
|
+
Intent Typing:
|
|
19
|
+
The intents field accepts any model inheriting from ModelRegistryIntent.
|
|
20
|
+
Intent types self-register via the @RegistryIntent.register() decorator,
|
|
21
|
+
enabling dynamic type resolution during deserialization without explicit unions.
|
|
22
|
+
|
|
23
|
+
This registry-based approach:
|
|
24
|
+
- Eliminates duplicate union definitions across modules
|
|
25
|
+
- Allows future intent types to be added by simply implementing ModelRegistryIntent
|
|
26
|
+
and registering with @RegistryIntent.register("kind")
|
|
27
|
+
- Uses the `kind` field as a discriminator for type resolution
|
|
28
|
+
- Follows ONEX duck typing principles while maintaining type safety
|
|
29
|
+
|
|
30
|
+
Current implementations:
|
|
31
|
+
- ModelConsulRegistrationIntent (kind="consul"): Consul service registration
|
|
32
|
+
- ModelPostgresUpsertIntent (kind="postgres"): PostgreSQL upsert operations
|
|
33
|
+
|
|
34
|
+
For type hints in external code, use ProtocolRegistrationIntent from
|
|
35
|
+
omnibase_infra.nodes.node_registration_orchestrator.protocols for duck-typed
|
|
36
|
+
signatures, or ModelRegistryIntent for concrete model requirements.
|
|
37
|
+
|
|
38
|
+
Thread Safety:
|
|
39
|
+
ModelReducerExecutionResult is immutable (frozen=True) after creation,
|
|
40
|
+
making it thread-safe for concurrent read access. All fields use immutable
|
|
41
|
+
types (ModelReducerState is also frozen, intents is a tuple).
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
>>> from omnibase_infra.nodes.node_registration_orchestrator.models import (
|
|
45
|
+
... ModelReducerExecutionResult,
|
|
46
|
+
... ModelReducerState,
|
|
47
|
+
... )
|
|
48
|
+
>>>
|
|
49
|
+
>>> # Create a result with no intents
|
|
50
|
+
>>> result = ModelReducerExecutionResult.empty()
|
|
51
|
+
>>> result.state.processed_node_ids
|
|
52
|
+
frozenset()
|
|
53
|
+
>>> result.intents
|
|
54
|
+
()
|
|
55
|
+
>>>
|
|
56
|
+
>>> # Create from existing state with intents
|
|
57
|
+
>>> state = ModelReducerState(pending_registrations=2)
|
|
58
|
+
>>> result = ModelReducerExecutionResult(state=state, intents=(intent1, intent2))
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.7.0
|
|
61
|
+
Created as part of tuple-to-model conversion work (OMN-1007).
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
from __future__ import annotations
|
|
65
|
+
|
|
66
|
+
from collections.abc import Sequence
|
|
67
|
+
|
|
68
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
69
|
+
|
|
70
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_reducer_state import (
|
|
71
|
+
ModelReducerState,
|
|
72
|
+
)
|
|
73
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_registry_intent import (
|
|
74
|
+
ModelRegistryIntent,
|
|
75
|
+
RegistryIntent,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ModelReducerExecutionResult(BaseModel):
|
|
80
|
+
"""Result of reducer execution containing state and generated intents.
|
|
81
|
+
|
|
82
|
+
This model replaces the `tuple[ModelReducerState, tuple[ModelRegistrationIntent, ...]]`
|
|
83
|
+
pattern with a strongly-typed container that provides:
|
|
84
|
+
- Self-documenting field names (state, intents)
|
|
85
|
+
- Factory methods for common patterns (empty, no_change, with_intents)
|
|
86
|
+
- Full immutability for thread safety (frozen model with tuple intents)
|
|
87
|
+
- Protocol-based intent typing for extensibility (ProtocolRegistrationIntent)
|
|
88
|
+
|
|
89
|
+
Attributes:
|
|
90
|
+
state: The updated reducer state after processing an event.
|
|
91
|
+
intents: Tuple of registration intents to be executed by the effect node.
|
|
92
|
+
May be empty if no infrastructure operations are needed.
|
|
93
|
+
|
|
94
|
+
Warning:
|
|
95
|
+
**Non-standard __bool__ behavior**: This model overrides ``__bool__`` to return
|
|
96
|
+
``True`` only when intents are present (i.e., ``has_intents`` is True). This
|
|
97
|
+
differs from typical Pydantic model behavior where ``bool(model)`` always
|
|
98
|
+
returns ``True`` for any valid model instance.
|
|
99
|
+
|
|
100
|
+
This design enables idiomatic conditional checks for work to be done::
|
|
101
|
+
|
|
102
|
+
if result:
|
|
103
|
+
# Process intents - there is work to do
|
|
104
|
+
execute_intents(result.intents)
|
|
105
|
+
else:
|
|
106
|
+
# No intents - skip processing
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
If you need to check model validity instead, use explicit attribute access::
|
|
110
|
+
|
|
111
|
+
# Check for intents (uses __bool__)
|
|
112
|
+
if result:
|
|
113
|
+
...
|
|
114
|
+
|
|
115
|
+
# Check model is valid (always True for constructed instance)
|
|
116
|
+
if result is not None:
|
|
117
|
+
...
|
|
118
|
+
|
|
119
|
+
# Explicit intent check (preferred for clarity)
|
|
120
|
+
if result.has_intents:
|
|
121
|
+
...
|
|
122
|
+
|
|
123
|
+
Example:
|
|
124
|
+
>>> # Create result with state and intents
|
|
125
|
+
>>> state = ModelReducerState(pending_registrations=2)
|
|
126
|
+
>>> result = ModelReducerExecutionResult(
|
|
127
|
+
... state=state,
|
|
128
|
+
... intents=(consul_intent, postgres_intent),
|
|
129
|
+
... )
|
|
130
|
+
>>> result.has_intents
|
|
131
|
+
True
|
|
132
|
+
>>> result.intent_count
|
|
133
|
+
2
|
|
134
|
+
|
|
135
|
+
>>> # Create empty result (no state changes, no intents)
|
|
136
|
+
>>> result = ModelReducerExecutionResult.empty()
|
|
137
|
+
>>> result.has_intents
|
|
138
|
+
False
|
|
139
|
+
|
|
140
|
+
.. versionadded:: 0.7.0
|
|
141
|
+
Created as part of OMN-1007 tuple-to-model conversion.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
model_config = ConfigDict(
|
|
145
|
+
frozen=True,
|
|
146
|
+
extra="forbid",
|
|
147
|
+
strict=True,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
state: ModelReducerState = Field(
|
|
151
|
+
...,
|
|
152
|
+
description="The updated reducer state after processing the event.",
|
|
153
|
+
)
|
|
154
|
+
intents: tuple[ModelRegistryIntent, ...] = Field(
|
|
155
|
+
default=(),
|
|
156
|
+
description=(
|
|
157
|
+
"Tuple of registration intents to be executed by the effect node. "
|
|
158
|
+
"All intents must inherit from ModelRegistryIntent and be registered "
|
|
159
|
+
"with RegistryIntent."
|
|
160
|
+
),
|
|
161
|
+
)
|
|
162
|
+
# Note: When serializing this model, use model_dump(serialize_as_any=True)
|
|
163
|
+
# to ensure intent fields (like 'payload') that exist only on concrete types
|
|
164
|
+
# are included. Without this, Pydantic serializes according to the declared
|
|
165
|
+
# base type (ModelRegistryIntent) which omits subclass-specific fields.
|
|
166
|
+
|
|
167
|
+
@field_validator("intents", mode="before")
|
|
168
|
+
@classmethod
|
|
169
|
+
def validate_intents(cls, v: object) -> tuple[ModelRegistryIntent, ...]:
|
|
170
|
+
"""Resolve intent types dynamically from RegistryIntent.
|
|
171
|
+
|
|
172
|
+
When deserializing from JSON/dict, uses the 'kind' field to look up
|
|
173
|
+
the correct concrete intent class from the registry.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
v: Raw input value (tuple, list, or sequence of dicts/models)
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Tuple of validated ModelRegistryIntent instances
|
|
180
|
+
|
|
181
|
+
Raises:
|
|
182
|
+
ValueError: If intent kind is not registered or dict missing 'kind' field
|
|
183
|
+
"""
|
|
184
|
+
if v is None:
|
|
185
|
+
return ()
|
|
186
|
+
|
|
187
|
+
# Validate input is a proper sequence (not str/bytes)
|
|
188
|
+
if not isinstance(v, Sequence) or isinstance(v, str | bytes):
|
|
189
|
+
raise ValueError(
|
|
190
|
+
f"intents must be a tuple or Sequence (excluding str/bytes), "
|
|
191
|
+
f"got {type(v).__name__}"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
result: list[ModelRegistryIntent] = []
|
|
195
|
+
for item in v:
|
|
196
|
+
if isinstance(item, dict):
|
|
197
|
+
kind = item.get("kind")
|
|
198
|
+
if kind is None:
|
|
199
|
+
raise ValueError("Intent dict missing required 'kind' field")
|
|
200
|
+
try:
|
|
201
|
+
intent_cls = RegistryIntent.get_type(kind)
|
|
202
|
+
except KeyError as e:
|
|
203
|
+
raise ValueError(str(e)) from e
|
|
204
|
+
result.append(intent_cls.model_validate(item))
|
|
205
|
+
elif isinstance(item, ModelRegistryIntent):
|
|
206
|
+
result.append(item)
|
|
207
|
+
else:
|
|
208
|
+
raise ValueError(
|
|
209
|
+
f"Intent must be dict or ModelRegistryIntent, got {type(item).__name__}"
|
|
210
|
+
)
|
|
211
|
+
return tuple(result)
|
|
212
|
+
|
|
213
|
+
@property
|
|
214
|
+
def has_intents(self) -> bool:
|
|
215
|
+
"""Check if the result contains any intents.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
True if intents tuple is non-empty, False otherwise.
|
|
219
|
+
|
|
220
|
+
Example:
|
|
221
|
+
>>> ModelReducerExecutionResult.empty().has_intents
|
|
222
|
+
False
|
|
223
|
+
>>> result = ModelReducerExecutionResult(
|
|
224
|
+
... state=ModelReducerState.initial(),
|
|
225
|
+
... intents=(some_intent,),
|
|
226
|
+
... )
|
|
227
|
+
>>> result.has_intents
|
|
228
|
+
True
|
|
229
|
+
|
|
230
|
+
.. versionadded:: 0.7.0
|
|
231
|
+
"""
|
|
232
|
+
return len(self.intents) > 0
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def intent_count(self) -> int:
|
|
236
|
+
"""Get the number of intents in the result.
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
Number of intents in the intents tuple.
|
|
240
|
+
|
|
241
|
+
Example:
|
|
242
|
+
>>> ModelReducerExecutionResult.empty().intent_count
|
|
243
|
+
0
|
|
244
|
+
|
|
245
|
+
.. versionadded:: 0.7.0
|
|
246
|
+
"""
|
|
247
|
+
return len(self.intents)
|
|
248
|
+
|
|
249
|
+
@classmethod
|
|
250
|
+
def empty(cls) -> ModelReducerExecutionResult:
|
|
251
|
+
"""Create an empty result with initial state and no intents.
|
|
252
|
+
|
|
253
|
+
Use this factory when the reducer determines no action is needed
|
|
254
|
+
(e.g., duplicate event, filtered event).
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
ModelReducerExecutionResult with initial state and empty intents.
|
|
258
|
+
|
|
259
|
+
Example:
|
|
260
|
+
>>> result = ModelReducerExecutionResult.empty()
|
|
261
|
+
>>> result.state.processed_node_ids
|
|
262
|
+
frozenset()
|
|
263
|
+
>>> result.intents
|
|
264
|
+
()
|
|
265
|
+
|
|
266
|
+
.. versionadded:: 0.7.0
|
|
267
|
+
"""
|
|
268
|
+
return cls(state=ModelReducerState.initial(), intents=())
|
|
269
|
+
|
|
270
|
+
@classmethod
|
|
271
|
+
def no_change(cls, state: ModelReducerState) -> ModelReducerExecutionResult:
|
|
272
|
+
"""Create a result with existing state and no intents.
|
|
273
|
+
|
|
274
|
+
Use this factory when the reducer determines the event should be
|
|
275
|
+
filtered but state should be preserved (e.g., already processed node).
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
state: The current reducer state to preserve.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
ModelReducerExecutionResult with preserved state and empty intents.
|
|
282
|
+
|
|
283
|
+
Example:
|
|
284
|
+
>>> state = ModelReducerState(pending_registrations=5)
|
|
285
|
+
>>> result = ModelReducerExecutionResult.no_change(state)
|
|
286
|
+
>>> result.state.pending_registrations
|
|
287
|
+
5
|
|
288
|
+
>>> result.intents
|
|
289
|
+
()
|
|
290
|
+
|
|
291
|
+
.. versionadded:: 0.7.0
|
|
292
|
+
"""
|
|
293
|
+
return cls(state=state, intents=())
|
|
294
|
+
|
|
295
|
+
@classmethod
|
|
296
|
+
def with_intents(
|
|
297
|
+
cls,
|
|
298
|
+
state: ModelReducerState,
|
|
299
|
+
intents: Sequence[ModelRegistryIntent],
|
|
300
|
+
) -> ModelReducerExecutionResult:
|
|
301
|
+
"""Create a result with state and intents.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
state: The updated reducer state.
|
|
305
|
+
intents: Sequence of registration intents to execute. Each intent
|
|
306
|
+
must inherit from ModelRegistryIntent and be registered with
|
|
307
|
+
RegistryIntent (e.g., ModelConsulRegistrationIntent,
|
|
308
|
+
ModelPostgresUpsertIntent). Will be converted to an immutable tuple.
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
ModelReducerExecutionResult with the provided state and intents.
|
|
312
|
+
|
|
313
|
+
Example:
|
|
314
|
+
>>> state = ModelReducerState(pending_registrations=2)
|
|
315
|
+
>>> result = ModelReducerExecutionResult.with_intents(
|
|
316
|
+
... state=state,
|
|
317
|
+
... intents=[consul_intent, postgres_intent],
|
|
318
|
+
... )
|
|
319
|
+
>>> result.intent_count
|
|
320
|
+
2
|
|
321
|
+
|
|
322
|
+
.. versionadded:: 0.7.0
|
|
323
|
+
"""
|
|
324
|
+
return cls(state=state, intents=tuple(intents))
|
|
325
|
+
|
|
326
|
+
def __bool__(self) -> bool:
|
|
327
|
+
"""Allow using result in boolean context to check for pending work.
|
|
328
|
+
|
|
329
|
+
Returns True if the result contains any intents, indicating that
|
|
330
|
+
infrastructure operations need to be performed.
|
|
331
|
+
|
|
332
|
+
Warning:
|
|
333
|
+
This differs from typical Pydantic model behavior where ``bool(model)``
|
|
334
|
+
always returns ``True`` for any valid model instance. Here, ``bool(result)``
|
|
335
|
+
returns ``False`` for valid results with no intents.
|
|
336
|
+
|
|
337
|
+
Use ``result.has_intents`` for explicit, self-documenting code.
|
|
338
|
+
Use ``result is not None`` if you need to check model existence.
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
True if intents tuple is non-empty, False otherwise.
|
|
342
|
+
|
|
343
|
+
Example:
|
|
344
|
+
>>> result_with_work = ModelReducerExecutionResult.with_intents(
|
|
345
|
+
... state=ModelReducerState.initial(),
|
|
346
|
+
... intents=(some_intent,),
|
|
347
|
+
... )
|
|
348
|
+
>>> bool(result_with_work)
|
|
349
|
+
True
|
|
350
|
+
|
|
351
|
+
>>> result_no_work = ModelReducerExecutionResult.empty()
|
|
352
|
+
>>> bool(result_no_work) # False even though model is valid!
|
|
353
|
+
False
|
|
354
|
+
|
|
355
|
+
>>> # Idiomatic usage
|
|
356
|
+
>>> if result_no_work:
|
|
357
|
+
... print("Has work to do")
|
|
358
|
+
... else:
|
|
359
|
+
... print("No work needed")
|
|
360
|
+
No work needed
|
|
361
|
+
|
|
362
|
+
.. versionadded:: 0.7.0
|
|
363
|
+
"""
|
|
364
|
+
return self.has_intents
|
|
365
|
+
|
|
366
|
+
def __str__(self) -> str:
|
|
367
|
+
"""Return a human-readable string representation for debugging.
|
|
368
|
+
|
|
369
|
+
Returns:
|
|
370
|
+
String showing state summary and intent count.
|
|
371
|
+
|
|
372
|
+
.. versionadded:: 0.7.0
|
|
373
|
+
"""
|
|
374
|
+
processed = len(self.state.processed_node_ids)
|
|
375
|
+
pending = self.state.pending_registrations
|
|
376
|
+
return (
|
|
377
|
+
f"ModelReducerExecutionResult("
|
|
378
|
+
f"processed={processed}, "
|
|
379
|
+
f"pending={pending}, "
|
|
380
|
+
f"intents={self.intent_count})"
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
__all__ = ["ModelReducerExecutionResult"]
|