omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Reducer state model for the registration orchestrator."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from uuid import UUID
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ModelReducerState(BaseModel):
|
|
13
|
+
"""State model for the registration reducer.
|
|
14
|
+
|
|
15
|
+
This model captures the reducer's internal state between reductions.
|
|
16
|
+
The orchestrator treats this as an opaque container that it passes
|
|
17
|
+
to the reducer but does not inspect.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
last_event_timestamp: ISO timestamp of the last processed event.
|
|
21
|
+
processed_node_ids: Set of node IDs that have been processed.
|
|
22
|
+
pending_registrations: Count of registrations awaiting confirmation.
|
|
23
|
+
|
|
24
|
+
Note:
|
|
25
|
+
This is a minimal placeholder. The actual reducer (OMN-889) may
|
|
26
|
+
extend this with additional state fields for deduplication,
|
|
27
|
+
rate limiting, or batching logic.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
model_config = ConfigDict(
|
|
31
|
+
frozen=True,
|
|
32
|
+
extra="forbid",
|
|
33
|
+
strict=True,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
last_event_timestamp: str | None = Field(
|
|
37
|
+
default=None,
|
|
38
|
+
description="ISO timestamp of the last processed event",
|
|
39
|
+
)
|
|
40
|
+
processed_node_ids: frozenset[UUID] = Field(
|
|
41
|
+
default_factory=frozenset,
|
|
42
|
+
description="Set of node IDs that have been processed",
|
|
43
|
+
)
|
|
44
|
+
pending_registrations: int = Field(
|
|
45
|
+
default=0,
|
|
46
|
+
ge=0,
|
|
47
|
+
description="Count of registrations awaiting confirmation",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def initial(cls) -> ModelReducerState:
|
|
52
|
+
"""Create an initial empty state.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
A fresh ModelReducerState with default values.
|
|
56
|
+
"""
|
|
57
|
+
return cls()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
__all__ = ["ModelReducerState"]
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registration intent type aliases for the registration orchestrator.
|
|
4
|
+
|
|
5
|
+
This module provides type aliases that aggregate the individual intent and
|
|
6
|
+
payload models into discriminated unions. These aliases enable type narrowing
|
|
7
|
+
based on the `kind` field in intent models.
|
|
8
|
+
|
|
9
|
+
IMPORTANT - Union Sync Requirements (OMN-1007):
|
|
10
|
+
This module defines explicit union types that MUST stay in sync with the
|
|
11
|
+
RegistryIntent in model_registry_intent.py. There are two parallel systems:
|
|
12
|
+
|
|
13
|
+
1. **RegistryIntent** (dynamic): Decorator-based registration for runtime
|
|
14
|
+
type resolution. Used by ModelReducerExecutionResult for deserialization.
|
|
15
|
+
|
|
16
|
+
2. **ModelRegistrationIntent** (static): Annotated union for Pydantic field
|
|
17
|
+
validation. Used by ProtocolEffect.execute_intent() and similar APIs.
|
|
18
|
+
|
|
19
|
+
When adding a new intent type, you MUST update BOTH:
|
|
20
|
+
- Register with @RegistryIntent.register("kind") on the model class
|
|
21
|
+
- Add the model to ModelRegistrationIntent union below
|
|
22
|
+
|
|
23
|
+
Use validate_union_registry_sync() in tests to verify consistency.
|
|
24
|
+
|
|
25
|
+
For function signatures, prefer ProtocolRegistrationIntent (duck-typed)
|
|
26
|
+
over ModelRegistrationIntent (union-typed) when possible.
|
|
27
|
+
|
|
28
|
+
Design Note:
|
|
29
|
+
Rather than using a loose dict[str, JsonType] for payloads, we use
|
|
30
|
+
typed payload models that match the exact structure expected by each
|
|
31
|
+
infrastructure adapter. This follows the ONEX principle of "no Any types"
|
|
32
|
+
and provides compile-time validation of intent payloads.
|
|
33
|
+
|
|
34
|
+
The pattern uses Literal discriminators for the `kind` field, enabling
|
|
35
|
+
type narrowing in effect node handlers.
|
|
36
|
+
|
|
37
|
+
Related:
|
|
38
|
+
- model_registry_intent.py: RegistryIntent and ModelRegistryIntent base
|
|
39
|
+
- protocols.py: ProtocolRegistrationIntent for duck-typed signatures
|
|
40
|
+
- OMN-1007: Union reduction refactoring
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
from typing import Annotated
|
|
46
|
+
|
|
47
|
+
from pydantic import Field
|
|
48
|
+
|
|
49
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_consul_intent_payload import (
|
|
50
|
+
ModelConsulIntentPayload,
|
|
51
|
+
)
|
|
52
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_consul_registration_intent import (
|
|
53
|
+
ModelConsulRegistrationIntent,
|
|
54
|
+
)
|
|
55
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_postgres_intent_payload import (
|
|
56
|
+
ModelPostgresIntentPayload,
|
|
57
|
+
)
|
|
58
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_postgres_upsert_intent import (
|
|
59
|
+
ModelPostgresUpsertIntent,
|
|
60
|
+
)
|
|
61
|
+
from omnibase_infra.nodes.node_registration_orchestrator.models.model_registry_intent import (
|
|
62
|
+
RegistryIntent,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Type alias for intent payloads
|
|
66
|
+
IntentPayload = ModelConsulIntentPayload | ModelPostgresIntentPayload
|
|
67
|
+
|
|
68
|
+
# =============================================================================
|
|
69
|
+
# Discriminated Union Definitions
|
|
70
|
+
#
|
|
71
|
+
# SYNC REQUIREMENT: These unions MUST stay in sync with RegistryIntent.
|
|
72
|
+
# When adding a new intent type:
|
|
73
|
+
# 1. Create model inheriting from ModelRegistryIntent
|
|
74
|
+
# 2. Register with @RegistryIntent.register("kind")
|
|
75
|
+
# 3. Add model to the union below
|
|
76
|
+
# 4. Run validate_union_registry_sync() to verify
|
|
77
|
+
# =============================================================================
|
|
78
|
+
|
|
79
|
+
# Discriminated union of all intent types using Annotated pattern
|
|
80
|
+
# This enables type narrowing based on the `kind` field
|
|
81
|
+
# SYNC: Must include all types registered in RegistryIntent
|
|
82
|
+
ModelRegistrationIntent = Annotated[
|
|
83
|
+
ModelConsulRegistrationIntent | ModelPostgresUpsertIntent,
|
|
84
|
+
Field(discriminator="kind"),
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
# Explicit list of intent model classes in the union
|
|
88
|
+
# Used by validate_union_registry_sync() for verification
|
|
89
|
+
_UNION_INTENT_TYPES: tuple[type, ...] = (
|
|
90
|
+
ModelConsulRegistrationIntent,
|
|
91
|
+
ModelPostgresUpsertIntent,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def validate_union_registry_sync() -> tuple[bool, list[str]]:
|
|
96
|
+
"""Validate that ModelRegistrationIntent union matches RegistryIntent.
|
|
97
|
+
|
|
98
|
+
This function checks that:
|
|
99
|
+
1. All types in the union are registered in RegistryIntent
|
|
100
|
+
2. All types in RegistryIntent are included in the union
|
|
101
|
+
|
|
102
|
+
Use this in tests to catch sync issues early.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Tuple of (is_valid, list of error messages).
|
|
106
|
+
If is_valid is True, error list is empty.
|
|
107
|
+
|
|
108
|
+
Example:
|
|
109
|
+
>>> is_valid, errors = validate_union_registry_sync()
|
|
110
|
+
>>> if not is_valid:
|
|
111
|
+
... for error in errors:
|
|
112
|
+
... print(f"ERROR: {error}")
|
|
113
|
+
|
|
114
|
+
.. versionadded:: 0.7.1
|
|
115
|
+
Created as part of OMN-1007 union sync fix.
|
|
116
|
+
"""
|
|
117
|
+
errors: list[str] = []
|
|
118
|
+
registry_types = RegistryIntent.get_all_types()
|
|
119
|
+
|
|
120
|
+
# Check 1: All union types are registered
|
|
121
|
+
for union_type in _UNION_INTENT_TYPES:
|
|
122
|
+
# Get the kind from the class default
|
|
123
|
+
kind_default = getattr(union_type, "model_fields", {}).get("kind")
|
|
124
|
+
if kind_default is None:
|
|
125
|
+
errors.append(
|
|
126
|
+
f"Invalid union type '{union_type.__name__}': expected 'kind' field, got None"
|
|
127
|
+
)
|
|
128
|
+
continue
|
|
129
|
+
|
|
130
|
+
# Get the default value from the field
|
|
131
|
+
kind_value = kind_default.default
|
|
132
|
+
if kind_value not in registry_types:
|
|
133
|
+
errors.append(
|
|
134
|
+
f"Union type {union_type.__name__} (kind='{kind_value}') "
|
|
135
|
+
f"is not registered in RegistryIntent"
|
|
136
|
+
)
|
|
137
|
+
elif registry_types[kind_value] is not union_type:
|
|
138
|
+
errors.append(
|
|
139
|
+
f"Kind '{kind_value}' is registered to "
|
|
140
|
+
f"{registry_types[kind_value].__name__}, "
|
|
141
|
+
f"but union contains {union_type.__name__}"
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Check 2: All registered types are in union
|
|
145
|
+
union_type_set = set(_UNION_INTENT_TYPES)
|
|
146
|
+
for kind, registered_type in registry_types.items():
|
|
147
|
+
if registered_type not in union_type_set:
|
|
148
|
+
errors.append(
|
|
149
|
+
f"Registered type {registered_type.__name__} (kind='{kind}') "
|
|
150
|
+
f"is missing from ModelRegistrationIntent union. "
|
|
151
|
+
f"Add it to the union in model_registration_intent.py"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return len(errors) == 0, errors
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def get_union_intent_types() -> tuple[type, ...]:
|
|
158
|
+
"""Get the tuple of intent model types in the ModelRegistrationIntent union.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
Tuple of intent model classes that are part of the union.
|
|
162
|
+
|
|
163
|
+
.. versionadded:: 0.7.1
|
|
164
|
+
"""
|
|
165
|
+
return _UNION_INTENT_TYPES
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
__all__ = [
|
|
169
|
+
"IntentPayload",
|
|
170
|
+
"ModelConsulIntentPayload",
|
|
171
|
+
"ModelConsulRegistrationIntent",
|
|
172
|
+
"ModelPostgresIntentPayload",
|
|
173
|
+
"ModelPostgresUpsertIntent",
|
|
174
|
+
"ModelRegistrationIntent",
|
|
175
|
+
"get_union_intent_types",
|
|
176
|
+
"validate_union_registry_sync",
|
|
177
|
+
]
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry-based intent model for dynamic type resolution.
|
|
4
|
+
|
|
5
|
+
This module provides:
|
|
6
|
+
- ModelRegistryIntent: Base model for all registration intents
|
|
7
|
+
- RegistryIntent: Decorator-based registry for intent type discovery
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
Instead of maintaining explicit union types like:
|
|
11
|
+
_IntentUnion = ModelConsulIntent | ModelPostgresIntent
|
|
12
|
+
|
|
13
|
+
Intent models self-register via decorator:
|
|
14
|
+
@RegistryIntent.register("consul")
|
|
15
|
+
class ModelConsulRegistrationIntent(ModelRegistryIntent): ...
|
|
16
|
+
|
|
17
|
+
The registry resolves types dynamically during Pydantic validation,
|
|
18
|
+
enabling new intent types to be added without modifying existing code.
|
|
19
|
+
|
|
20
|
+
IMPORTANT - Union Sync Requirement (OMN-1007):
|
|
21
|
+
When adding a new intent type, you MUST update BOTH:
|
|
22
|
+
|
|
23
|
+
1. Register with @RegistryIntent.register("kind") decorator (this file)
|
|
24
|
+
2. Add the model to ModelRegistrationIntent union in model_registration_intent.py
|
|
25
|
+
|
|
26
|
+
The RegistryIntent enables dynamic type resolution for ModelReducerExecutionResult,
|
|
27
|
+
while ModelRegistrationIntent is a static discriminated union used for Pydantic
|
|
28
|
+
field type hints in protocols (e.g., ProtocolEffect.execute_intent).
|
|
29
|
+
|
|
30
|
+
Use validate_union_registry_sync() from model_registration_intent.py in tests
|
|
31
|
+
to verify the two systems stay in sync.
|
|
32
|
+
|
|
33
|
+
Related:
|
|
34
|
+
- model_registration_intent.py: ModelRegistrationIntent discriminated union
|
|
35
|
+
- ProtocolRegistrationIntent: Protocol for duck-typed function signatures
|
|
36
|
+
- validate_union_registry_sync(): Test helper for sync validation
|
|
37
|
+
- OMN-1007: Union reduction refactoring
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
import threading
|
|
43
|
+
import warnings
|
|
44
|
+
from collections.abc import Callable
|
|
45
|
+
from typing import ClassVar
|
|
46
|
+
from uuid import UUID, uuid4
|
|
47
|
+
|
|
48
|
+
from pydantic import BaseModel, ConfigDict
|
|
49
|
+
|
|
50
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
51
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class RegistryIntent:
|
|
55
|
+
"""Registry for intent model types with decorator-based registration.
|
|
56
|
+
|
|
57
|
+
This registry enables dynamic type resolution for Pydantic validation
|
|
58
|
+
without requiring explicit union type definitions.
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
@RegistryIntent.register("consul")
|
|
62
|
+
class ModelConsulRegistrationIntent(ModelRegistryIntent):
|
|
63
|
+
kind: Literal["consul"] = "consul"
|
|
64
|
+
...
|
|
65
|
+
|
|
66
|
+
# Later, resolve type from kind
|
|
67
|
+
intent_cls = RegistryIntent.get_type("consul")
|
|
68
|
+
intent = intent_cls.model_validate(data)
|
|
69
|
+
|
|
70
|
+
Thread Safety:
|
|
71
|
+
All registration and mutation operations are protected by a class-level
|
|
72
|
+
threading.Lock to ensure thread-safe access. Read operations (get_type,
|
|
73
|
+
get_all_types, is_registered) are atomic dictionary operations and safe
|
|
74
|
+
for concurrent access. The lock ensures that check-and-set operations
|
|
75
|
+
in register() are atomic, preventing race conditions.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
_types: ClassVar[dict[str, type[ModelRegistryIntent]]] = {}
|
|
79
|
+
_lock: ClassVar[threading.Lock] = threading.Lock()
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def register(cls, kind: str) -> Callable[[type], type]:
|
|
83
|
+
"""Decorator to register an intent model type.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
kind: The intent kind identifier (e.g., "consul", "postgres").
|
|
87
|
+
Must match the model's `kind` field value.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Decorator function that registers the class and returns it unchanged.
|
|
91
|
+
|
|
92
|
+
Raises:
|
|
93
|
+
ValueError: If kind is already registered (prevents duplicates).
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
@RegistryIntent.register("consul")
|
|
97
|
+
class ModelConsulRegistrationIntent(ModelRegistryIntent):
|
|
98
|
+
kind: Literal["consul"] = "consul"
|
|
99
|
+
service_name: str
|
|
100
|
+
...
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def decorator(intent_cls: type) -> type:
|
|
104
|
+
# Thread-safe registration with atomic check-and-set
|
|
105
|
+
with cls._lock:
|
|
106
|
+
if kind in cls._types:
|
|
107
|
+
context = ModelInfraErrorContext(
|
|
108
|
+
transport_type=EnumInfraTransportType.RUNTIME,
|
|
109
|
+
operation="register_intent",
|
|
110
|
+
correlation_id=uuid4(),
|
|
111
|
+
)
|
|
112
|
+
raise ProtocolConfigurationError(
|
|
113
|
+
f"Intent kind '{kind}' already registered to {cls._types[kind].__name__}. "
|
|
114
|
+
f"Cannot register {intent_cls.__name__}.",
|
|
115
|
+
context=context,
|
|
116
|
+
)
|
|
117
|
+
cls._types[kind] = intent_cls
|
|
118
|
+
return intent_cls
|
|
119
|
+
|
|
120
|
+
return decorator
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def get_type(cls, kind: str) -> type[ModelRegistryIntent]:
|
|
124
|
+
"""Get the intent model class for a given kind.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
kind: The intent kind identifier.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
The registered intent model class.
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
KeyError: If kind is not registered.
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
intent_cls = RegistryIntent.get_type("consul")
|
|
137
|
+
intent = intent_cls.model_validate({"kind": "consul", ...})
|
|
138
|
+
"""
|
|
139
|
+
if kind not in cls._types:
|
|
140
|
+
registered = ", ".join(sorted(cls._types.keys())) or "(none)"
|
|
141
|
+
raise KeyError(
|
|
142
|
+
f"Unknown intent kind '{kind}'. Registered kinds: {registered}"
|
|
143
|
+
)
|
|
144
|
+
return cls._types[kind]
|
|
145
|
+
|
|
146
|
+
@classmethod
|
|
147
|
+
def get_all_types(cls) -> dict[str, type[ModelRegistryIntent]]:
|
|
148
|
+
"""Get all registered intent types.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Dict mapping kind strings to intent model classes.
|
|
152
|
+
|
|
153
|
+
Example:
|
|
154
|
+
all_types = RegistryIntent.get_all_types()
|
|
155
|
+
for kind, intent_cls in all_types.items():
|
|
156
|
+
print(f"{kind}: {intent_cls.__name__}")
|
|
157
|
+
"""
|
|
158
|
+
return dict(cls._types)
|
|
159
|
+
|
|
160
|
+
@classmethod
|
|
161
|
+
def is_registered(cls, kind: str) -> bool:
|
|
162
|
+
"""Check if a kind is registered.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
kind: The intent kind identifier.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
True if registered, False otherwise.
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
if RegistryIntent.is_registered("consul"):
|
|
172
|
+
intent_cls = RegistryIntent.get_type("consul")
|
|
173
|
+
"""
|
|
174
|
+
return kind in cls._types
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def clear(cls) -> None:
|
|
178
|
+
"""Clear all registered types.
|
|
179
|
+
|
|
180
|
+
Warning:
|
|
181
|
+
This method is intended for **testing purposes only**.
|
|
182
|
+
Calling it in production code will emit a warning.
|
|
183
|
+
It breaks the immutability guarantee after startup.
|
|
184
|
+
|
|
185
|
+
Thread Safety:
|
|
186
|
+
This method is protected by the class-level lock to ensure
|
|
187
|
+
thread-safe clearing of the registry.
|
|
188
|
+
"""
|
|
189
|
+
warnings.warn(
|
|
190
|
+
"RegistryIntent.clear() is intended for testing only. "
|
|
191
|
+
"Do not use in production code.",
|
|
192
|
+
UserWarning,
|
|
193
|
+
stacklevel=2,
|
|
194
|
+
)
|
|
195
|
+
with cls._lock:
|
|
196
|
+
cls._types.clear()
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class ModelRegistryIntent(BaseModel):
|
|
200
|
+
"""Base model for all registry-managed registration intents.
|
|
201
|
+
|
|
202
|
+
All concrete intent models MUST:
|
|
203
|
+
1. Inherit from this base class
|
|
204
|
+
2. Use @RegistryIntent.register("kind") decorator
|
|
205
|
+
3. Define kind as Literal["kind"] with matching default
|
|
206
|
+
4. Be frozen (immutable) for thread safety
|
|
207
|
+
|
|
208
|
+
This base class defines the common interface that all intents share,
|
|
209
|
+
enabling type-safe access to common fields without type narrowing.
|
|
210
|
+
|
|
211
|
+
Example:
|
|
212
|
+
@RegistryIntent.register("consul")
|
|
213
|
+
class ModelConsulRegistrationIntent(ModelRegistryIntent):
|
|
214
|
+
kind: Literal["consul"] = "consul"
|
|
215
|
+
service_name: str
|
|
216
|
+
...
|
|
217
|
+
|
|
218
|
+
Attributes:
|
|
219
|
+
kind: Intent kind identifier used for type discrimination.
|
|
220
|
+
operation: The operation to perform (e.g., 'register', 'upsert', 'deregister').
|
|
221
|
+
node_id: The node ID this intent applies to.
|
|
222
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
223
|
+
|
|
224
|
+
Related:
|
|
225
|
+
- RegistryIntent: Registration decorator and type lookup
|
|
226
|
+
- ProtocolRegistrationIntent: Protocol for duck-typed signatures
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
230
|
+
|
|
231
|
+
kind: str
|
|
232
|
+
"""Intent kind identifier used for type discrimination."""
|
|
233
|
+
|
|
234
|
+
operation: str
|
|
235
|
+
"""The operation to perform (e.g., 'register', 'upsert', 'deregister')."""
|
|
236
|
+
|
|
237
|
+
node_id: UUID
|
|
238
|
+
"""The node ID this intent applies to."""
|
|
239
|
+
|
|
240
|
+
correlation_id: UUID
|
|
241
|
+
"""Correlation ID for distributed tracing."""
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
__all__ = [
|
|
245
|
+
"RegistryIntent",
|
|
246
|
+
"ModelRegistryIntent",
|
|
247
|
+
]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Orchestrator - Declarative workflow coordinator.
|
|
4
|
+
|
|
5
|
+
This orchestrator follows the ONEX declarative pattern:
|
|
6
|
+
- DECLARATIVE orchestrator driven by contract.yaml
|
|
7
|
+
- Zero custom routing logic - all behavior from workflow_definition
|
|
8
|
+
- Used for ONEX-compliant runtime execution via RuntimeHostProcess
|
|
9
|
+
- Pattern: "Contract-driven, handlers wired by registry"
|
|
10
|
+
|
|
11
|
+
Extends NodeOrchestrator from omnibase_core for workflow-driven coordination.
|
|
12
|
+
All workflow logic is 100% driven by contract.yaml, not Python code.
|
|
13
|
+
|
|
14
|
+
Workflow Pattern:
|
|
15
|
+
1. Receive introspection event (consumed_events in contract)
|
|
16
|
+
2. Call reducer to compute intents (workflow_definition.execution_graph)
|
|
17
|
+
3. Execute intents via effect (workflow_definition.execution_graph)
|
|
18
|
+
4. Publish result events (published_events in contract)
|
|
19
|
+
|
|
20
|
+
All workflow logic, retry policies, and result aggregation are handled
|
|
21
|
+
by the NodeOrchestrator base class using contract.yaml configuration.
|
|
22
|
+
|
|
23
|
+
Handler Routing:
|
|
24
|
+
Handler routing is defined declaratively in contract.yaml under
|
|
25
|
+
handler_routing section. The orchestrator does NOT contain custom
|
|
26
|
+
dispatch logic - the base class routes events based on:
|
|
27
|
+
- routing_strategy: "payload_type_match"
|
|
28
|
+
- handlers: mapping of event_model to handler_class
|
|
29
|
+
|
|
30
|
+
Handler routing is initialized by the RUNTIME (not this module) via
|
|
31
|
+
MixinHandlerRouting._init_handler_routing(), using the registry created
|
|
32
|
+
by RegistryInfraNodeRegistrationOrchestrator. This module only provides
|
|
33
|
+
the helper function _create_handler_routing_subcontract() for the runtime.
|
|
34
|
+
|
|
35
|
+
Design Decisions:
|
|
36
|
+
- 100% Contract-Driven: All workflow logic in YAML, not Python
|
|
37
|
+
- Zero Custom Methods: Base class handles everything
|
|
38
|
+
- Declarative Execution: Workflow steps defined in execution_graph
|
|
39
|
+
- Retry at Base Class: NodeOrchestrator owns retry policy
|
|
40
|
+
- Contract-Driven Wiring: Handlers wired via handler_routing in contract.yaml
|
|
41
|
+
- Mixin-Based Routing: MixinHandlerRouting provides route_to_handlers()
|
|
42
|
+
|
|
43
|
+
Coroutine Safety:
|
|
44
|
+
This orchestrator is NOT coroutine-safe. Each instance should handle one
|
|
45
|
+
workflow at a time. For concurrent workflows, create multiple instances.
|
|
46
|
+
|
|
47
|
+
Related Modules:
|
|
48
|
+
- contract.yaml: Workflow definition, execution graph, and handler routing
|
|
49
|
+
- handlers/: Handler implementations (HandlerNodeIntrospected, etc.)
|
|
50
|
+
- registry/: RegistryInfraNodeRegistrationOrchestrator for handler wiring
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
from __future__ import annotations
|
|
54
|
+
|
|
55
|
+
import logging
|
|
56
|
+
from pathlib import Path
|
|
57
|
+
from typing import TYPE_CHECKING
|
|
58
|
+
|
|
59
|
+
from omnibase_core.nodes.node_orchestrator import NodeOrchestrator
|
|
60
|
+
from omnibase_infra.models.routing import ModelRoutingSubcontract
|
|
61
|
+
from omnibase_infra.runtime.contract_loaders import load_handler_routing_subcontract
|
|
62
|
+
|
|
63
|
+
if TYPE_CHECKING:
|
|
64
|
+
from omnibase_core.models.container import ModelONEXContainer
|
|
65
|
+
|
|
66
|
+
logger = logging.getLogger(__name__)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _create_handler_routing_subcontract() -> ModelRoutingSubcontract:
|
|
70
|
+
"""Load handler routing configuration from this node's contract.yaml.
|
|
71
|
+
|
|
72
|
+
Thin wrapper around the shared utility load_handler_routing_subcontract()
|
|
73
|
+
that provides the contract path for this node. This maintains the existing
|
|
74
|
+
function signature for internal callers while delegating to the shared
|
|
75
|
+
implementation.
|
|
76
|
+
|
|
77
|
+
Part of OMN-1316: Refactored to use shared handler routing loader utility.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
ModelRoutingSubcontract with entries mapping event models to handlers.
|
|
81
|
+
|
|
82
|
+
Raises:
|
|
83
|
+
ProtocolConfigurationError: If contract.yaml does not exist, contains invalid
|
|
84
|
+
YAML syntax, is empty, or handler_routing section is missing.
|
|
85
|
+
"""
|
|
86
|
+
contract_path = Path(__file__).parent / "contract.yaml"
|
|
87
|
+
return load_handler_routing_subcontract(contract_path)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class NodeRegistrationOrchestrator(NodeOrchestrator):
|
|
91
|
+
"""Declarative orchestrator for node registration workflow.
|
|
92
|
+
|
|
93
|
+
All behavior is defined in contract.yaml - no custom logic here.
|
|
94
|
+
Handler routing is driven entirely by the contract and initialized
|
|
95
|
+
via MixinHandlerRouting from the base class.
|
|
96
|
+
|
|
97
|
+
Example YAML Contract (contract.yaml format):
|
|
98
|
+
```yaml
|
|
99
|
+
handler_routing:
|
|
100
|
+
routing_strategy: "payload_type_match"
|
|
101
|
+
handlers:
|
|
102
|
+
- event_model:
|
|
103
|
+
name: "ModelNodeIntrospectionEvent"
|
|
104
|
+
module: "omnibase_infra.models.registration..."
|
|
105
|
+
handler:
|
|
106
|
+
name: "HandlerNodeIntrospected"
|
|
107
|
+
module: "omnibase_infra.nodes...handlers..."
|
|
108
|
+
- event_model:
|
|
109
|
+
name: "ModelRuntimeTick"
|
|
110
|
+
module: "omnibase_infra.runtime.models..."
|
|
111
|
+
handler:
|
|
112
|
+
name: "HandlerRuntimeTick"
|
|
113
|
+
module: "omnibase_infra.nodes...handlers..."
|
|
114
|
+
|
|
115
|
+
workflow_coordination:
|
|
116
|
+
workflow_definition:
|
|
117
|
+
workflow_metadata:
|
|
118
|
+
workflow_name: node_registration
|
|
119
|
+
workflow_version: {major: 1, minor: 0, patch: 0}
|
|
120
|
+
execution_mode: sequential
|
|
121
|
+
description: "Node registration workflow"
|
|
122
|
+
|
|
123
|
+
execution_graph:
|
|
124
|
+
nodes:
|
|
125
|
+
- node_id: "compute_intents"
|
|
126
|
+
node_type: REDUCER_GENERIC
|
|
127
|
+
description: "Compute registration intents"
|
|
128
|
+
- node_id: "execute_consul"
|
|
129
|
+
node_type: EFFECT_GENERIC
|
|
130
|
+
description: "Register with Consul"
|
|
131
|
+
- node_id: "execute_postgres"
|
|
132
|
+
node_type: EFFECT_GENERIC
|
|
133
|
+
description: "Register in PostgreSQL"
|
|
134
|
+
|
|
135
|
+
coordination_rules:
|
|
136
|
+
parallel_execution_allowed: false
|
|
137
|
+
failure_recovery_strategy: retry
|
|
138
|
+
max_retries: 3
|
|
139
|
+
timeout_ms: 30000
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Note on Handler Routing Field Names:
|
|
143
|
+
The contract.yaml uses a nested structure with ``event_model.name`` and
|
|
144
|
+
``handler.name``, but ModelRoutingEntry uses flat fields:
|
|
145
|
+
|
|
146
|
+
- ``routing_key``: Corresponds to ``event_model.name``
|
|
147
|
+
- ``handler_key``: The handler's adapter ID in ServiceHandlerRegistry
|
|
148
|
+
(e.g., "handler-node-introspected"), NOT the class name
|
|
149
|
+
|
|
150
|
+
See ``_create_handler_routing_subcontract()`` for the translation.
|
|
151
|
+
|
|
152
|
+
Usage:
|
|
153
|
+
```python
|
|
154
|
+
from omnibase_core.models.container import ModelONEXContainer
|
|
155
|
+
|
|
156
|
+
# Create and initialize
|
|
157
|
+
container = ModelONEXContainer()
|
|
158
|
+
orchestrator = NodeRegistrationOrchestrator(container)
|
|
159
|
+
|
|
160
|
+
# Workflow definition loaded from contract.yaml by runtime
|
|
161
|
+
# Handler routing initialized via runtime using registry factory
|
|
162
|
+
# Process input
|
|
163
|
+
result = await orchestrator.process(input_data)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Handler Routing:
|
|
167
|
+
Handler routing is initialized by the runtime, not by this class.
|
|
168
|
+
The runtime uses RegistryInfraNodeRegistrationOrchestrator.create_registry()
|
|
169
|
+
to create the handler registry and calls _init_handler_routing() on
|
|
170
|
+
the orchestrator instance.
|
|
171
|
+
|
|
172
|
+
Runtime Initialization:
|
|
173
|
+
Handler routing is initialized by RuntimeHostProcess, not by this class.
|
|
174
|
+
The runtime performs the following sequence:
|
|
175
|
+
|
|
176
|
+
1. Creates handler registry via
|
|
177
|
+
RegistryInfraNodeRegistrationOrchestrator.create_registry()
|
|
178
|
+
2. Creates handler routing subcontract via
|
|
179
|
+
_create_handler_routing_subcontract()
|
|
180
|
+
3. Calls orchestrator._init_handler_routing(subcontract, registry)
|
|
181
|
+
|
|
182
|
+
This separation ensures the orchestrator remains purely declarative
|
|
183
|
+
with no custom initialization logic.
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def __init__(self, container: ModelONEXContainer) -> None:
|
|
187
|
+
"""Initialize with container dependency injection.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
container: ONEX dependency injection container.
|
|
191
|
+
"""
|
|
192
|
+
super().__init__(container)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
__all__ = ["NodeRegistrationOrchestrator"]
|