omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +132 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_kafka_acks.py +99 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +330 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +68 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +49 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +57 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +449 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +229 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1330 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1514 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +2033 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,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"]
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Copyright 2025 OmniNode Team. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
"""Configuration model for circuit breaker initialization.
|
|
4
|
+
|
|
5
|
+
Environment Variable Support:
|
|
6
|
+
This model supports creation from environment variables via the from_env()
|
|
7
|
+
class method. This enables runtime configuration of circuit breaker thresholds
|
|
8
|
+
without code changes.
|
|
9
|
+
|
|
10
|
+
Environment Variables:
|
|
11
|
+
{prefix}_THRESHOLD: Maximum consecutive failures before opening circuit (default: 5)
|
|
12
|
+
{prefix}_RESET_TIMEOUT: Seconds before auto-reset to half-open (default: 60.0)
|
|
13
|
+
|
|
14
|
+
Default prefix is "ONEX_CB", so variables would be:
|
|
15
|
+
ONEX_CB_THRESHOLD=5
|
|
16
|
+
ONEX_CB_RESET_TIMEOUT=60.0
|
|
17
|
+
|
|
18
|
+
This module provides the configuration model used to initialize the
|
|
19
|
+
MixinAsyncCircuitBreaker mixin. Grouping parameters into a configuration
|
|
20
|
+
model follows ONEX patterns for reducing function parameter count and
|
|
21
|
+
union patterns.
|
|
22
|
+
|
|
23
|
+
Circuit Breaker Overview:
|
|
24
|
+
The circuit breaker pattern prevents cascading failures in distributed systems
|
|
25
|
+
by temporarily blocking requests to a failing service. It operates in three states:
|
|
26
|
+
- CLOSED: Normal operation, requests allowed
|
|
27
|
+
- OPEN: Circuit tripped after threshold failures, requests blocked
|
|
28
|
+
- HALF_OPEN: Testing recovery after reset timeout, limited requests allowed
|
|
29
|
+
|
|
30
|
+
See Also:
|
|
31
|
+
- MixinAsyncCircuitBreaker: The mixin that uses this configuration
|
|
32
|
+
- docs/patterns/circuit_breaker_implementation.md: Implementation details
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
38
|
+
|
|
39
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
40
|
+
from omnibase_infra.utils.util_env_parsing import parse_env_float, parse_env_int
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ModelCircuitBreakerConfig(BaseModel):
|
|
44
|
+
"""Configuration model for circuit breaker initialization.
|
|
45
|
+
|
|
46
|
+
This model groups all parameters required by ``_init_circuit_breaker()``
|
|
47
|
+
into a single configuration object, following ONEX conventions for functions
|
|
48
|
+
with more than 5 parameters and reducing union type patterns.
|
|
49
|
+
|
|
50
|
+
Attributes:
|
|
51
|
+
threshold: Maximum number of consecutive failures before opening the
|
|
52
|
+
circuit. Must be >= 1. Default: 5.
|
|
53
|
+
reset_timeout_seconds: Time in seconds before the circuit automatically
|
|
54
|
+
transitions from OPEN to HALF_OPEN for recovery testing.
|
|
55
|
+
Must be >= 0. Default: 60.0.
|
|
56
|
+
service_name: Identifier for the service being protected. Used in error
|
|
57
|
+
context and logging. Default: "unknown".
|
|
58
|
+
transport_type: Transport type for error context classification.
|
|
59
|
+
Determines which error code is used when the circuit opens.
|
|
60
|
+
Default: HTTP.
|
|
61
|
+
|
|
62
|
+
Example:
|
|
63
|
+
```python
|
|
64
|
+
from omnibase_infra.models.resilience import ModelCircuitBreakerConfig
|
|
65
|
+
from omnibase_infra.mixins import MixinAsyncCircuitBreaker
|
|
66
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
67
|
+
|
|
68
|
+
class EventBusKafka(MixinAsyncCircuitBreaker):
|
|
69
|
+
def __init__(self, environment: str):
|
|
70
|
+
config = ModelCircuitBreakerConfig(
|
|
71
|
+
threshold=5,
|
|
72
|
+
reset_timeout_seconds=60.0,
|
|
73
|
+
service_name=f"kafka.{environment}",
|
|
74
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
75
|
+
)
|
|
76
|
+
self._init_circuit_breaker_from_config(config)
|
|
77
|
+
|
|
78
|
+
# With defaults
|
|
79
|
+
class HttpClient(MixinAsyncCircuitBreaker):
|
|
80
|
+
def __init__(self, service_name: str):
|
|
81
|
+
config = ModelCircuitBreakerConfig(service_name=service_name)
|
|
82
|
+
self._init_circuit_breaker_from_config(config)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Configuration Guidelines:
|
|
86
|
+
- High-reliability services: Use lower threshold (3) and longer timeout (120s)
|
|
87
|
+
- Best-effort services: Use higher threshold (10) and shorter timeout (30s)
|
|
88
|
+
- Tune based on service SLAs and failure characteristics
|
|
89
|
+
|
|
90
|
+
See Also:
|
|
91
|
+
MixinAsyncCircuitBreaker: The mixin that uses this configuration.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
threshold: int = Field(
|
|
95
|
+
default=5,
|
|
96
|
+
ge=1,
|
|
97
|
+
description="Maximum consecutive failures before opening the circuit",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
reset_timeout_seconds: float = Field(
|
|
101
|
+
default=60.0,
|
|
102
|
+
ge=0.0,
|
|
103
|
+
description="Seconds before automatic transition from OPEN to HALF_OPEN",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
service_name: str = Field(
|
|
107
|
+
default="unknown",
|
|
108
|
+
min_length=1,
|
|
109
|
+
description="Service identifier for error context and logging",
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
transport_type: EnumInfraTransportType = Field(
|
|
113
|
+
default=EnumInfraTransportType.HTTP,
|
|
114
|
+
description="Transport type for error context classification",
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
model_config = ConfigDict(
|
|
118
|
+
frozen=True,
|
|
119
|
+
extra="forbid",
|
|
120
|
+
json_schema_extra={
|
|
121
|
+
"examples": [
|
|
122
|
+
{
|
|
123
|
+
"threshold": 5,
|
|
124
|
+
"reset_timeout_seconds": 60.0,
|
|
125
|
+
"service_name": "kafka.production",
|
|
126
|
+
"transport_type": "kafka",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"threshold": 3,
|
|
130
|
+
"reset_timeout_seconds": 120.0,
|
|
131
|
+
"service_name": "postgresql-primary",
|
|
132
|
+
"transport_type": "db",
|
|
133
|
+
},
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def from_env(
|
|
140
|
+
cls,
|
|
141
|
+
service_name: str = "unknown",
|
|
142
|
+
transport_type: EnumInfraTransportType = EnumInfraTransportType.HTTP,
|
|
143
|
+
prefix: str = "ONEX_CB",
|
|
144
|
+
) -> ModelCircuitBreakerConfig:
|
|
145
|
+
"""Create configuration from environment variables.
|
|
146
|
+
|
|
147
|
+
Reads circuit breaker settings from environment variables, falling back
|
|
148
|
+
to defaults if not set. This enables runtime configuration without
|
|
149
|
+
code changes.
|
|
150
|
+
|
|
151
|
+
Environment Variables:
|
|
152
|
+
{prefix}_THRESHOLD: Maximum consecutive failures before opening circuit.
|
|
153
|
+
Must be >= 1 and <= 1000. Default: 5.
|
|
154
|
+
{prefix}_RESET_TIMEOUT: Seconds before auto-reset from OPEN to HALF_OPEN.
|
|
155
|
+
Must be >= 0 and <= 3600 (1 hour). Default: 60.0.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
service_name: Service identifier for error context and logging.
|
|
159
|
+
This is NOT read from environment - must be provided by caller.
|
|
160
|
+
transport_type: Transport type for error context classification.
|
|
161
|
+
This is NOT read from environment - must be provided by caller.
|
|
162
|
+
prefix: Environment variable prefix. Default: "ONEX_CB".
|
|
163
|
+
Override to create service-specific configurations.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
ModelCircuitBreakerConfig with values from environment or defaults.
|
|
167
|
+
|
|
168
|
+
Raises:
|
|
169
|
+
ProtocolConfigurationError: If environment variable values cannot be
|
|
170
|
+
parsed as int (threshold) or float (reset_timeout). The error
|
|
171
|
+
includes ModelInfraErrorContext with transport_type and service_name.
|
|
172
|
+
|
|
173
|
+
Example:
|
|
174
|
+
```python
|
|
175
|
+
# With default prefix (reads ONEX_CB_THRESHOLD, ONEX_CB_RESET_TIMEOUT)
|
|
176
|
+
config = ModelCircuitBreakerConfig.from_env(
|
|
177
|
+
service_name="kafka.production",
|
|
178
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
# With custom prefix (reads KAFKA_CB_THRESHOLD, KAFKA_CB_RESET_TIMEOUT)
|
|
182
|
+
config = ModelCircuitBreakerConfig.from_env(
|
|
183
|
+
service_name="kafka.production",
|
|
184
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
185
|
+
prefix="KAFKA_CB",
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Use with circuit breaker mixin
|
|
189
|
+
self._init_circuit_breaker_from_config(config)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Note:
|
|
193
|
+
The service_name and transport_type are not read from environment
|
|
194
|
+
because they are context-specific and should be provided by the
|
|
195
|
+
calling code. Only the numeric thresholds are configurable via
|
|
196
|
+
environment to allow tuning without identifying which service
|
|
197
|
+
each variable affects.
|
|
198
|
+
"""
|
|
199
|
+
threshold_var = f"{prefix}_THRESHOLD"
|
|
200
|
+
reset_timeout_var = f"{prefix}_RESET_TIMEOUT"
|
|
201
|
+
|
|
202
|
+
threshold = parse_env_int(
|
|
203
|
+
threshold_var,
|
|
204
|
+
5,
|
|
205
|
+
min_value=1,
|
|
206
|
+
max_value=1000,
|
|
207
|
+
transport_type=transport_type,
|
|
208
|
+
service_name=service_name,
|
|
209
|
+
)
|
|
210
|
+
reset_timeout = parse_env_float(
|
|
211
|
+
reset_timeout_var,
|
|
212
|
+
60.0,
|
|
213
|
+
min_value=0.0,
|
|
214
|
+
max_value=3600.0,
|
|
215
|
+
transport_type=transport_type,
|
|
216
|
+
service_name=service_name,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
return cls(
|
|
220
|
+
threshold=threshold,
|
|
221
|
+
reset_timeout_seconds=reset_timeout,
|
|
222
|
+
service_name=service_name,
|
|
223
|
+
transport_type=transport_type,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
__all__ = ["ModelCircuitBreakerConfig"]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Routing models for declarative orchestrator configuration.
|
|
4
|
+
|
|
5
|
+
These models define the structure for routing configuration
|
|
6
|
+
loaded from contract.yaml files. They enable declarative mapping of
|
|
7
|
+
event models to handler implementations.
|
|
8
|
+
|
|
9
|
+
Note:
|
|
10
|
+
These models are local to omnibase_infra as they support infrastructure-
|
|
11
|
+
specific routing patterns. They may be promoted to omnibase_core
|
|
12
|
+
in the future if they become part of the standard ONEX contract schema.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from omnibase_infra.models.routing.model_routing_entry import (
|
|
16
|
+
ModelRoutingEntry,
|
|
17
|
+
)
|
|
18
|
+
from omnibase_infra.models.routing.model_routing_subcontract import (
|
|
19
|
+
ModelRoutingSubcontract,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"ModelRoutingEntry",
|
|
24
|
+
"ModelRoutingSubcontract",
|
|
25
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler routing entry model for event-to-handler mapping.
|
|
4
|
+
|
|
5
|
+
This model represents a single routing entry that maps an event model
|
|
6
|
+
(identified by routing_key) to a handler (identified by handler_key).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelRoutingEntry(BaseModel):
|
|
15
|
+
"""Single entry mapping an event model to a handler.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
routing_key: The event model name used for routing (e.g.,
|
|
19
|
+
"ModelNodeIntrospectionEvent"). This matches against
|
|
20
|
+
incoming event payloads.
|
|
21
|
+
handler_key: The handler's adapter ID in ServiceHandlerRegistry
|
|
22
|
+
(e.g., "handler-node-introspected"). This is the kebab-case
|
|
23
|
+
identifier used to look up the handler.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
```python
|
|
27
|
+
entry = ModelRoutingEntry(
|
|
28
|
+
routing_key="ModelNodeIntrospectionEvent",
|
|
29
|
+
handler_key="handler-node-introspected",
|
|
30
|
+
)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Note:
|
|
34
|
+
The handler_key is NOT the class name - it's the kebab-case
|
|
35
|
+
adapter ID. Use _convert_class_to_handler_key() to convert
|
|
36
|
+
from class names like "HandlerNodeIntrospected" to handler
|
|
37
|
+
keys like "handler-node-introspected".
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
routing_key: str = Field(
|
|
41
|
+
...,
|
|
42
|
+
description="Event model name used for routing (e.g., 'ModelNodeIntrospectionEvent')",
|
|
43
|
+
)
|
|
44
|
+
handler_key: str = Field(
|
|
45
|
+
...,
|
|
46
|
+
description="Handler adapter ID in kebab-case (e.g., 'handler-node-introspected')",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
model_config = {"frozen": True}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
__all__ = ["ModelRoutingEntry"]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Routing subcontract model for orchestrator configuration.
|
|
4
|
+
|
|
5
|
+
This model represents the complete routing configuration
|
|
6
|
+
for an orchestrator, including all routing entries and strategy.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Literal
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
|
|
15
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
16
|
+
from omnibase_infra.models.routing.model_routing_entry import (
|
|
17
|
+
ModelRoutingEntry,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelRoutingSubcontract(BaseModel):
|
|
22
|
+
"""Complete routing configuration for an orchestrator.
|
|
23
|
+
|
|
24
|
+
This subcontract defines how incoming events are routed to handlers.
|
|
25
|
+
It is loaded from the handler_routing section of contract.yaml.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
version: Semantic version of this routing configuration.
|
|
29
|
+
routing_strategy: Strategy for matching events to handlers.
|
|
30
|
+
Currently only "payload_type_match" is supported.
|
|
31
|
+
handlers: List of routing entries mapping event models to handlers.
|
|
32
|
+
default_handler: Optional fallback handler key for unmatched events.
|
|
33
|
+
|
|
34
|
+
Example:
|
|
35
|
+
```python
|
|
36
|
+
subcontract = ModelRoutingSubcontract(
|
|
37
|
+
version=ModelSemVer(major=1, minor=0, patch=0),
|
|
38
|
+
routing_strategy="payload_type_match",
|
|
39
|
+
handlers=[
|
|
40
|
+
ModelRoutingEntry(
|
|
41
|
+
routing_key="ModelNodeIntrospectionEvent",
|
|
42
|
+
handler_key="handler-node-introspected",
|
|
43
|
+
),
|
|
44
|
+
],
|
|
45
|
+
default_handler=None,
|
|
46
|
+
)
|
|
47
|
+
```
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
version: ModelSemVer = Field(
|
|
51
|
+
default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
|
|
52
|
+
description="Semantic version of this routing configuration",
|
|
53
|
+
)
|
|
54
|
+
routing_strategy: Literal["payload_type_match"] = Field(
|
|
55
|
+
default="payload_type_match",
|
|
56
|
+
description="Strategy for matching events to handlers",
|
|
57
|
+
)
|
|
58
|
+
handlers: list[ModelRoutingEntry] = Field(
|
|
59
|
+
default_factory=list,
|
|
60
|
+
description="List of routing entries mapping event models to handlers",
|
|
61
|
+
)
|
|
62
|
+
default_handler: str | None = Field(
|
|
63
|
+
default=None,
|
|
64
|
+
description="Optional fallback handler key for unmatched events",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
model_config = {"frozen": True}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
__all__ = ["ModelRoutingSubcontract"]
|