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,162 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Record for PostgreSQL Intent.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationRecord, a frozen record model
|
|
6
|
+
suitable for use with ModelPostgresUpsertRegistrationIntent.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
This model extends ModelRegistrationRecordBase from omnibase_core to ensure
|
|
10
|
+
protocol compliance and consistent serialization behavior. It captures the
|
|
11
|
+
minimal set of fields needed for node registration persistence.
|
|
12
|
+
|
|
13
|
+
Unlike ModelNodeRegistration (which is mutable and has complex validation),
|
|
14
|
+
this record is:
|
|
15
|
+
- Immutable (frozen=True)
|
|
16
|
+
- Minimal (only essential fields)
|
|
17
|
+
- Compliant with ProtocolRegistrationRecord
|
|
18
|
+
|
|
19
|
+
Strong Typing:
|
|
20
|
+
This model uses strongly-typed models for capabilities and metadata:
|
|
21
|
+
- capabilities: ModelNodeCapabilities - typed capability flags
|
|
22
|
+
- metadata: ModelNodeMetadata - typed deployment metadata
|
|
23
|
+
|
|
24
|
+
These models replace the legacy dict[str, Any] pattern to comply with
|
|
25
|
+
the ONEX "no Any types" rule. Both models use extra="allow" to support
|
|
26
|
+
custom fields while maintaining type safety for known fields.
|
|
27
|
+
|
|
28
|
+
Thread Safety:
|
|
29
|
+
ModelNodeRegistrationRecord is immutable after creation, making it
|
|
30
|
+
thread-safe for concurrent read access.
|
|
31
|
+
|
|
32
|
+
Related:
|
|
33
|
+
- ModelNodeRegistration: Full mutable registration model
|
|
34
|
+
- ModelPostgresUpsertRegistrationIntent: Intent that uses this record
|
|
35
|
+
- ModelNodeCapabilities: Strongly-typed capabilities model
|
|
36
|
+
- ModelNodeMetadata: Strongly-typed metadata model
|
|
37
|
+
- OMN-889: Infrastructure MVP
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
from datetime import datetime
|
|
43
|
+
from uuid import UUID
|
|
44
|
+
|
|
45
|
+
from pydantic import Field, field_validator
|
|
46
|
+
|
|
47
|
+
from omnibase_core.enums.enum_node_kind import EnumNodeKind
|
|
48
|
+
from omnibase_core.models.intents import ModelRegistrationRecordBase
|
|
49
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
50
|
+
from omnibase_infra.models.registration.model_node_capabilities import (
|
|
51
|
+
ModelNodeCapabilities,
|
|
52
|
+
)
|
|
53
|
+
from omnibase_infra.models.registration.model_node_metadata import ModelNodeMetadata
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ModelNodeRegistrationRecord(ModelRegistrationRecordBase):
|
|
57
|
+
"""Frozen record for node registration in PostgreSQL.
|
|
58
|
+
|
|
59
|
+
This is a minimal, immutable record designed for use with
|
|
60
|
+
ModelPostgresUpsertRegistrationIntent. It captures the essential
|
|
61
|
+
fields needed for node registration without complex validation.
|
|
62
|
+
|
|
63
|
+
The record is serialized by the Effect layer when persisting to PostgreSQL.
|
|
64
|
+
The to_persistence_dict() method (inherited from ModelRegistrationRecordBase)
|
|
65
|
+
handles JSON-compatible serialization.
|
|
66
|
+
|
|
67
|
+
Strong Typing:
|
|
68
|
+
Uses ModelNodeCapabilities and ModelNodeMetadata instead of dict[str, Any]
|
|
69
|
+
to comply with ONEX "no Any types" rule. Both models use extra="allow"
|
|
70
|
+
to support custom fields while providing type safety for known fields.
|
|
71
|
+
|
|
72
|
+
Attributes:
|
|
73
|
+
node_id: Unique node identifier (UUID).
|
|
74
|
+
node_type: ONEX node type (effect, compute, reducer, orchestrator).
|
|
75
|
+
node_version: Semantic version of the node.
|
|
76
|
+
capabilities: Strongly-typed node capabilities (ModelNodeCapabilities).
|
|
77
|
+
endpoints: Exposed endpoints as name -> URL mapping.
|
|
78
|
+
metadata: Strongly-typed node metadata (ModelNodeMetadata).
|
|
79
|
+
health_endpoint: Optional URL for health check endpoint.
|
|
80
|
+
registered_at: Timestamp when node was first registered.
|
|
81
|
+
updated_at: Timestamp of last update.
|
|
82
|
+
|
|
83
|
+
Example:
|
|
84
|
+
>>> from datetime import datetime, UTC
|
|
85
|
+
>>> from uuid import uuid4
|
|
86
|
+
>>> from omnibase_core.enums.enum_node_kind import EnumNodeKind
|
|
87
|
+
>>> from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
88
|
+
>>> from omnibase_infra.models.registration import (
|
|
89
|
+
... ModelNodeCapabilities,
|
|
90
|
+
... ModelNodeMetadata,
|
|
91
|
+
... )
|
|
92
|
+
>>> now = datetime.now(UTC)
|
|
93
|
+
>>> record = ModelNodeRegistrationRecord(
|
|
94
|
+
... node_id=uuid4(),
|
|
95
|
+
... node_type=EnumNodeKind.EFFECT,
|
|
96
|
+
... node_version=ModelSemVer(major=1, minor=0, patch=0),
|
|
97
|
+
... capabilities=ModelNodeCapabilities(postgres=True),
|
|
98
|
+
... endpoints={"health": "http://localhost:8080/health"},
|
|
99
|
+
... metadata=ModelNodeMetadata(environment="production"),
|
|
100
|
+
... health_endpoint="http://localhost:8080/health",
|
|
101
|
+
... registered_at=now,
|
|
102
|
+
... updated_at=now,
|
|
103
|
+
... )
|
|
104
|
+
>>> db_data = record.to_persistence_dict()
|
|
105
|
+
>>> assert isinstance(db_data["node_id"], str) # UUID serialized
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
# Identity
|
|
109
|
+
node_id: UUID = Field(..., description="Unique node identifier")
|
|
110
|
+
node_type: EnumNodeKind = Field(..., description="ONEX node type")
|
|
111
|
+
node_version: ModelSemVer = Field(
|
|
112
|
+
default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
|
|
113
|
+
description="Semantic version of the node",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
@field_validator("node_version", mode="before")
|
|
117
|
+
@classmethod
|
|
118
|
+
def parse_node_version(cls, v: ModelSemVer | str) -> ModelSemVer:
|
|
119
|
+
"""Parse node_version from string or ModelSemVer.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
v: Either a ModelSemVer instance or a semver string.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Validated ModelSemVer instance.
|
|
126
|
+
|
|
127
|
+
Raises:
|
|
128
|
+
ValueError: If the string is not a valid semantic version.
|
|
129
|
+
"""
|
|
130
|
+
if isinstance(v, str):
|
|
131
|
+
try:
|
|
132
|
+
return ModelSemVer.parse(v)
|
|
133
|
+
except Exception as e:
|
|
134
|
+
raise ValueError(f"node_version: {e!s}") from e
|
|
135
|
+
return v
|
|
136
|
+
|
|
137
|
+
# Capabilities and endpoints - strongly typed models
|
|
138
|
+
capabilities: ModelNodeCapabilities = Field(
|
|
139
|
+
default_factory=ModelNodeCapabilities,
|
|
140
|
+
description="Strongly-typed node capabilities",
|
|
141
|
+
)
|
|
142
|
+
endpoints: dict[str, str] = Field(
|
|
143
|
+
default_factory=dict, description="Exposed endpoints (name -> URL)"
|
|
144
|
+
)
|
|
145
|
+
metadata: ModelNodeMetadata = Field(
|
|
146
|
+
default_factory=ModelNodeMetadata,
|
|
147
|
+
description="Strongly-typed node metadata",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Health tracking
|
|
151
|
+
health_endpoint: str | None = Field(
|
|
152
|
+
default=None, description="URL for health check endpoint"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Timestamps
|
|
156
|
+
registered_at: datetime = Field(
|
|
157
|
+
..., description="Timestamp when node was first registered"
|
|
158
|
+
)
|
|
159
|
+
updated_at: datetime = Field(..., description="Timestamp of last update")
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
__all__ = ["ModelNodeRegistrationRecord"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry Models Module.
|
|
4
|
+
|
|
5
|
+
This module provides Pydantic models for message type registry functionality
|
|
6
|
+
in the ONEX runtime dispatch infrastructure.
|
|
7
|
+
|
|
8
|
+
Models:
|
|
9
|
+
- ModelDomainConstraint: Domain ownership rules and cross-domain constraints
|
|
10
|
+
- ModelMessageTypeEntry: Registry entry for message type to handler mappings
|
|
11
|
+
|
|
12
|
+
Related:
|
|
13
|
+
- OMN-937: Central Message Type Registry implementation
|
|
14
|
+
- runtime.registry: Registry implementation using these models
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.5.0
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from omnibase_infra.models.registry.model_domain_constraint import (
|
|
20
|
+
ModelDomainConstraint,
|
|
21
|
+
)
|
|
22
|
+
from omnibase_infra.models.registry.model_message_type_entry import (
|
|
23
|
+
ModelMessageTypeEntry,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__: list[str] = [
|
|
27
|
+
"ModelDomainConstraint",
|
|
28
|
+
"ModelMessageTypeEntry",
|
|
29
|
+
]
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Domain Constraint Model.
|
|
5
|
+
|
|
6
|
+
Defines domain ownership rules and cross-domain consumption constraints for
|
|
7
|
+
message type routing in the ONEX runtime.
|
|
8
|
+
|
|
9
|
+
Design Principles:
|
|
10
|
+
- Domain ownership is derived from topic name (onex.<domain>.*) AND message type
|
|
11
|
+
registry entry domain field
|
|
12
|
+
- Domain isolation by default: handlers can only process messages from their domain
|
|
13
|
+
- Cross-domain consumption requires explicit opt-in via allowed_cross_domains
|
|
14
|
+
- Clear fail-fast validation at startup time
|
|
15
|
+
|
|
16
|
+
Topic Domain Extraction:
|
|
17
|
+
Domain is extracted from the first segment after the namespace prefix:
|
|
18
|
+
- "onex.registration.events" -> domain = "registration"
|
|
19
|
+
- "dev.user.events.v1" -> domain = "user"
|
|
20
|
+
- "prod.order.commands.v2" -> domain = "order"
|
|
21
|
+
|
|
22
|
+
Related:
|
|
23
|
+
- OMN-937: Central Message Type Registry implementation
|
|
24
|
+
- RegistryMessageType: Uses domain constraints for validation
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.5.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
30
|
+
|
|
31
|
+
from omnibase_infra.models.validation import ModelValidationOutcome
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ModelDomainConstraint(BaseModel):
|
|
35
|
+
"""
|
|
36
|
+
Domain constraint configuration for message type routing.
|
|
37
|
+
|
|
38
|
+
Defines which domains a handler can consume messages from and enforces
|
|
39
|
+
domain ownership rules. By default, handlers are isolated to their own
|
|
40
|
+
domain and must explicitly opt-in to cross-domain message consumption.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
owning_domain: The domain that owns this handler/message type.
|
|
44
|
+
Must match the domain extracted from topic for same-domain processing.
|
|
45
|
+
Example: "registration", "user", "order"
|
|
46
|
+
allowed_cross_domains: Set of domains this handler can consume from
|
|
47
|
+
in addition to its own domain. Empty by default (domain isolation).
|
|
48
|
+
Example: {"user", "order"} allows consuming from user.* and order.* topics
|
|
49
|
+
allow_all_domains: If True, allows consumption from any domain.
|
|
50
|
+
Use sparingly - only for truly domain-agnostic handlers.
|
|
51
|
+
Overrides allowed_cross_domains if True.
|
|
52
|
+
require_explicit_opt_in: If True, cross-domain consumption raises error
|
|
53
|
+
unless explicitly allowed. Default True for security.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
>>> # Registration handler only processes registration messages
|
|
57
|
+
>>> constraint = ModelDomainConstraint(owning_domain="registration")
|
|
58
|
+
>>> constraint.can_consume_from("registration")
|
|
59
|
+
True
|
|
60
|
+
>>> constraint.can_consume_from("user")
|
|
61
|
+
False
|
|
62
|
+
|
|
63
|
+
>>> # Handler with cross-domain access
|
|
64
|
+
>>> constraint = ModelDomainConstraint(
|
|
65
|
+
... owning_domain="notification",
|
|
66
|
+
... allowed_cross_domains={"user", "order"},
|
|
67
|
+
... )
|
|
68
|
+
>>> constraint.can_consume_from("user")
|
|
69
|
+
True
|
|
70
|
+
>>> constraint.can_consume_from("billing")
|
|
71
|
+
False
|
|
72
|
+
|
|
73
|
+
Thread Safety:
|
|
74
|
+
This model is immutable (frozen=True) and thread-safe for concurrent access.
|
|
75
|
+
|
|
76
|
+
.. versionadded:: 0.5.0
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
model_config = ConfigDict(
|
|
80
|
+
frozen=True,
|
|
81
|
+
extra="forbid",
|
|
82
|
+
from_attributes=True,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
owning_domain: str = Field(
|
|
86
|
+
...,
|
|
87
|
+
description=(
|
|
88
|
+
"The domain that owns this handler/message type. "
|
|
89
|
+
"Must match topic domain for same-domain processing."
|
|
90
|
+
),
|
|
91
|
+
min_length=1,
|
|
92
|
+
max_length=100,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
allowed_cross_domains: frozenset[str] = Field(
|
|
96
|
+
default_factory=frozenset,
|
|
97
|
+
description=(
|
|
98
|
+
"Domains this handler can consume from in addition to owning_domain. "
|
|
99
|
+
"Empty by default for domain isolation."
|
|
100
|
+
),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
allow_all_domains: bool = Field(
|
|
104
|
+
default=False,
|
|
105
|
+
description=(
|
|
106
|
+
"If True, allows consumption from any domain. "
|
|
107
|
+
"Overrides allowed_cross_domains. Use sparingly."
|
|
108
|
+
),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
require_explicit_opt_in: bool = Field(
|
|
112
|
+
default=True,
|
|
113
|
+
description=(
|
|
114
|
+
"If True, cross-domain consumption raises error unless explicitly "
|
|
115
|
+
"allowed via allowed_cross_domains or allow_all_domains."
|
|
116
|
+
),
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def can_consume_from(self, topic_domain: str) -> bool:
|
|
120
|
+
"""
|
|
121
|
+
Check if this constraint allows consuming messages from the given domain.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
topic_domain: The domain extracted from the topic being consumed.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
True if consumption is allowed, False otherwise.
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
>>> constraint = ModelDomainConstraint(owning_domain="registration")
|
|
131
|
+
>>> constraint.can_consume_from("registration")
|
|
132
|
+
True
|
|
133
|
+
>>> constraint.can_consume_from("user")
|
|
134
|
+
False
|
|
135
|
+
|
|
136
|
+
.. versionadded:: 0.5.0
|
|
137
|
+
"""
|
|
138
|
+
# Allow all domains if flag is set
|
|
139
|
+
if self.allow_all_domains:
|
|
140
|
+
return True
|
|
141
|
+
|
|
142
|
+
# Always allow own domain
|
|
143
|
+
if topic_domain == self.owning_domain:
|
|
144
|
+
return True
|
|
145
|
+
|
|
146
|
+
# Check explicit cross-domain allowlist
|
|
147
|
+
if topic_domain in self.allowed_cross_domains:
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
return False
|
|
151
|
+
|
|
152
|
+
def validate_consumption(
|
|
153
|
+
self,
|
|
154
|
+
topic_domain: str,
|
|
155
|
+
message_type: str,
|
|
156
|
+
) -> ModelValidationOutcome:
|
|
157
|
+
"""
|
|
158
|
+
Validate if consumption is allowed and return detailed error if not.
|
|
159
|
+
|
|
160
|
+
This method provides detailed validation with error messages suitable
|
|
161
|
+
for fail-fast behavior at startup time.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
topic_domain: The domain extracted from the topic.
|
|
165
|
+
message_type: The message type being consumed (for error messages).
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
ModelValidationOutcome with is_valid=True if valid,
|
|
169
|
+
or is_valid=False with error_message if invalid.
|
|
170
|
+
|
|
171
|
+
Example:
|
|
172
|
+
>>> constraint = ModelDomainConstraint(owning_domain="registration")
|
|
173
|
+
>>> outcome = constraint.validate_consumption("user", "UserCreated")
|
|
174
|
+
>>> outcome.is_valid
|
|
175
|
+
False
|
|
176
|
+
|
|
177
|
+
.. versionadded:: 0.5.0
|
|
178
|
+
.. versionchanged:: 0.6.0
|
|
179
|
+
Return type changed from tuple[bool, str | None] to ModelValidationOutcome.
|
|
180
|
+
"""
|
|
181
|
+
if self.can_consume_from(topic_domain):
|
|
182
|
+
return ModelValidationOutcome.success()
|
|
183
|
+
|
|
184
|
+
# Build detailed error message
|
|
185
|
+
if self.require_explicit_opt_in:
|
|
186
|
+
allowed = [self.owning_domain]
|
|
187
|
+
allowed.extend(sorted(self.allowed_cross_domains))
|
|
188
|
+
return ModelValidationOutcome.failure(
|
|
189
|
+
f"Domain mismatch: handler in domain '{self.owning_domain}' cannot "
|
|
190
|
+
f"consume message type '{message_type}' from domain '{topic_domain}'. "
|
|
191
|
+
f"Allowed domains: {allowed}. "
|
|
192
|
+
f"To enable cross-domain consumption, add '{topic_domain}' to "
|
|
193
|
+
f"allowed_cross_domains or set allow_all_domains=True."
|
|
194
|
+
)
|
|
195
|
+
else:
|
|
196
|
+
return ModelValidationOutcome.failure(
|
|
197
|
+
f"Domain mismatch: handler domain '{self.owning_domain}' does not "
|
|
198
|
+
f"match topic domain '{topic_domain}' for message type '{message_type}'."
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
__all__ = ["ModelDomainConstraint"]
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Message Type Entry Model.
|
|
5
|
+
|
|
6
|
+
Defines the registry entry for message type to handler mappings in the
|
|
7
|
+
Central Message Type Registry.
|
|
8
|
+
|
|
9
|
+
Design Principles:
|
|
10
|
+
- Each entry maps a message type to one or more handler implementations
|
|
11
|
+
- Topic category constraints define where message types can appear
|
|
12
|
+
- Domain ownership is tracked for cross-domain validation
|
|
13
|
+
- Immutable entries for thread-safe concurrent access
|
|
14
|
+
|
|
15
|
+
Related:
|
|
16
|
+
- OMN-937: Central Message Type Registry implementation
|
|
17
|
+
- ModelDomainConstraint: Domain ownership rules
|
|
18
|
+
- RegistryMessageType: Uses entries for handler resolution
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.5.0
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from datetime import datetime
|
|
24
|
+
|
|
25
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
26
|
+
|
|
27
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
28
|
+
from omnibase_infra.models.registry.model_domain_constraint import (
|
|
29
|
+
ModelDomainConstraint,
|
|
30
|
+
)
|
|
31
|
+
from omnibase_infra.models.validation import ModelValidationOutcome
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ModelMessageTypeEntry(BaseModel):
|
|
35
|
+
"""
|
|
36
|
+
Registry entry mapping a message type to handler(s) with constraints.
|
|
37
|
+
|
|
38
|
+
Each entry represents a message type registration in the Central Message Type
|
|
39
|
+
Registry. It defines which handlers process the message type, what categories
|
|
40
|
+
are allowed, and domain ownership constraints.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
message_type: The fully-qualified message type name.
|
|
44
|
+
Example: "UserCreated", "CreateOrderCommand", "CheckoutIntent"
|
|
45
|
+
handler_ids: List of handler IDs that can process this message type.
|
|
46
|
+
Supports fan-out pattern with multiple handlers per type.
|
|
47
|
+
allowed_categories: Message categories where this type can appear.
|
|
48
|
+
Example: [EVENT] for domain events, [COMMAND] for commands.
|
|
49
|
+
domain_constraint: Domain ownership and cross-domain rules.
|
|
50
|
+
description: Human-readable description of the message type.
|
|
51
|
+
enabled: Whether this entry is active. Disabled entries are skipped.
|
|
52
|
+
registered_at: Timestamp when this entry was registered.
|
|
53
|
+
|
|
54
|
+
Fan-Out Support:
|
|
55
|
+
Multiple handler_ids can be registered for the same message type to enable
|
|
56
|
+
fan-out processing patterns. Each registered handler will receive the
|
|
57
|
+
message independently.
|
|
58
|
+
|
|
59
|
+
Example:
|
|
60
|
+
>>> entry = ModelMessageTypeEntry(
|
|
61
|
+
... message_type="UserCreated",
|
|
62
|
+
... handler_ids=["user-event-handler", "audit-logger"],
|
|
63
|
+
... allowed_categories=[EnumMessageCategory.EVENT],
|
|
64
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="user"),
|
|
65
|
+
... description="User creation event",
|
|
66
|
+
... )
|
|
67
|
+
>>> entry.supports_category(EnumMessageCategory.EVENT)
|
|
68
|
+
True
|
|
69
|
+
>>> entry.supports_category(EnumMessageCategory.COMMAND)
|
|
70
|
+
False
|
|
71
|
+
|
|
72
|
+
Thread Safety:
|
|
73
|
+
This model is immutable (frozen=True) and thread-safe for concurrent access.
|
|
74
|
+
|
|
75
|
+
.. versionadded:: 0.5.0
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
model_config = ConfigDict(
|
|
79
|
+
frozen=True,
|
|
80
|
+
extra="forbid",
|
|
81
|
+
from_attributes=True,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# ---- Message Type Identity ----
|
|
85
|
+
message_type: str = Field(
|
|
86
|
+
...,
|
|
87
|
+
description="The fully-qualified message type name.",
|
|
88
|
+
min_length=1,
|
|
89
|
+
max_length=200,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# ---- Handler Mapping ----
|
|
93
|
+
handler_ids: tuple[str, ...] = Field(
|
|
94
|
+
...,
|
|
95
|
+
description=(
|
|
96
|
+
"Handler IDs that can process this message type. "
|
|
97
|
+
"Tuple for immutability and fan-out support."
|
|
98
|
+
),
|
|
99
|
+
min_length=1,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# ---- Category Constraints ----
|
|
103
|
+
allowed_categories: frozenset[EnumMessageCategory] = Field(
|
|
104
|
+
...,
|
|
105
|
+
description=(
|
|
106
|
+
"Message categories where this type can appear. Frozenset for immutability."
|
|
107
|
+
),
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
@field_validator("allowed_categories")
|
|
111
|
+
@classmethod
|
|
112
|
+
def validate_allowed_categories_not_empty(
|
|
113
|
+
cls, value: frozenset[EnumMessageCategory]
|
|
114
|
+
) -> frozenset[EnumMessageCategory]:
|
|
115
|
+
"""Validate that allowed_categories contains at least one category.
|
|
116
|
+
|
|
117
|
+
A message type with no allowed categories is invalid because it can
|
|
118
|
+
never be routed - there is no valid topic category where it could appear.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
value: The frozenset of allowed categories.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
The validated frozenset.
|
|
125
|
+
|
|
126
|
+
Raises:
|
|
127
|
+
ValueError: If the frozenset is empty.
|
|
128
|
+
"""
|
|
129
|
+
if not value:
|
|
130
|
+
msg = (
|
|
131
|
+
"allowed_categories cannot be empty. "
|
|
132
|
+
"A message type must be allowed in at least one category "
|
|
133
|
+
"(EVENT, COMMAND, or INTENT) to be routable."
|
|
134
|
+
)
|
|
135
|
+
raise ValueError(msg)
|
|
136
|
+
return value
|
|
137
|
+
|
|
138
|
+
# ---- Domain Constraints ----
|
|
139
|
+
domain_constraint: ModelDomainConstraint = Field(
|
|
140
|
+
...,
|
|
141
|
+
description="Domain ownership and cross-domain consumption rules.",
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# ---- Metadata ----
|
|
145
|
+
description: str | None = Field(
|
|
146
|
+
default=None,
|
|
147
|
+
description="Human-readable description of the message type.",
|
|
148
|
+
max_length=500,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
enabled: bool = Field(
|
|
152
|
+
default=True,
|
|
153
|
+
description="Whether this entry is active. Disabled entries are skipped.",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
157
|
+
registered_at: datetime = Field(
|
|
158
|
+
...,
|
|
159
|
+
description="Timestamp when this entry was registered (UTC, must be explicitly provided).",
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def supports_category(self, category: EnumMessageCategory) -> bool:
|
|
163
|
+
"""
|
|
164
|
+
Check if this message type is allowed in the given category.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
category: The message category to check.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
True if the message type can appear in this category, False otherwise.
|
|
171
|
+
|
|
172
|
+
Example:
|
|
173
|
+
>>> entry = ModelMessageTypeEntry(
|
|
174
|
+
... message_type="UserCreated",
|
|
175
|
+
... handler_ids=("handler-1",),
|
|
176
|
+
... allowed_categories=frozenset([EnumMessageCategory.EVENT]),
|
|
177
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="user"),
|
|
178
|
+
... )
|
|
179
|
+
>>> entry.supports_category(EnumMessageCategory.EVENT)
|
|
180
|
+
True
|
|
181
|
+
|
|
182
|
+
.. versionadded:: 0.5.0
|
|
183
|
+
"""
|
|
184
|
+
return category in self.allowed_categories
|
|
185
|
+
|
|
186
|
+
def validate_category(
|
|
187
|
+
self,
|
|
188
|
+
topic_category: EnumMessageCategory,
|
|
189
|
+
) -> ModelValidationOutcome:
|
|
190
|
+
"""
|
|
191
|
+
Validate if the message type can appear in the given topic category.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
topic_category: The category inferred from the topic.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
ModelValidationOutcome with is_valid=True if valid,
|
|
198
|
+
or is_valid=False with error_message if invalid.
|
|
199
|
+
|
|
200
|
+
Example:
|
|
201
|
+
>>> entry = ModelMessageTypeEntry(
|
|
202
|
+
... message_type="UserCreated",
|
|
203
|
+
... handler_ids=("handler-1",),
|
|
204
|
+
... allowed_categories=frozenset([EnumMessageCategory.EVENT]),
|
|
205
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="user"),
|
|
206
|
+
... )
|
|
207
|
+
>>> outcome = entry.validate_category(EnumMessageCategory.COMMAND)
|
|
208
|
+
>>> outcome.is_valid
|
|
209
|
+
False
|
|
210
|
+
|
|
211
|
+
.. versionadded:: 0.5.0
|
|
212
|
+
.. versionchanged:: 0.6.0
|
|
213
|
+
Return type changed from tuple[bool, str | None] to ModelValidationOutcome.
|
|
214
|
+
"""
|
|
215
|
+
if self.supports_category(topic_category):
|
|
216
|
+
return ModelValidationOutcome.success()
|
|
217
|
+
|
|
218
|
+
allowed_str = ", ".join(sorted(c.value for c in self.allowed_categories))
|
|
219
|
+
return ModelValidationOutcome.failure(
|
|
220
|
+
f"Message type '{self.message_type}' is not allowed in category "
|
|
221
|
+
f"'{topic_category.value}'. Allowed categories: [{allowed_str}]."
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def with_additional_handler(self, handler_id: str) -> "ModelMessageTypeEntry":
|
|
225
|
+
"""
|
|
226
|
+
Create a new entry with an additional handler ID.
|
|
227
|
+
|
|
228
|
+
Used for fan-out registration where multiple handlers process
|
|
229
|
+
the same message type.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
handler_id: The handler ID to add.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
New ModelMessageTypeEntry with the additional handler.
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
>>> entry = ModelMessageTypeEntry(
|
|
239
|
+
... message_type="UserCreated",
|
|
240
|
+
... handler_ids=("handler-1",),
|
|
241
|
+
... allowed_categories=frozenset([EnumMessageCategory.EVENT]),
|
|
242
|
+
... domain_constraint=ModelDomainConstraint(owning_domain="user"),
|
|
243
|
+
... )
|
|
244
|
+
>>> updated = entry.with_additional_handler("handler-2")
|
|
245
|
+
>>> updated.handler_ids
|
|
246
|
+
('handler-1', 'handler-2')
|
|
247
|
+
|
|
248
|
+
.. versionadded:: 0.5.0
|
|
249
|
+
"""
|
|
250
|
+
if handler_id in self.handler_ids:
|
|
251
|
+
return self
|
|
252
|
+
|
|
253
|
+
new_handlers = tuple(list(self.handler_ids) + [handler_id])
|
|
254
|
+
return self.model_copy(update={"handler_ids": new_handlers})
|
|
255
|
+
|
|
256
|
+
def with_enabled(self, enabled: bool) -> "ModelMessageTypeEntry":
|
|
257
|
+
"""
|
|
258
|
+
Create a new entry with updated enabled status.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
enabled: The new enabled status.
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
New ModelMessageTypeEntry with updated status.
|
|
265
|
+
|
|
266
|
+
.. versionadded:: 0.5.0
|
|
267
|
+
"""
|
|
268
|
+
return self.model_copy(update={"enabled": enabled})
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
__all__ = ["ModelMessageTypeEntry"]
|