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,725 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Topic Parser for ONEX Deterministic Routing.
|
|
5
|
+
|
|
6
|
+
Provides structured parsing of ONEX topic names to support deterministic routing
|
|
7
|
+
based on topic category. Handles both ONEX Kafka format (onex.<domain>.<type>)
|
|
8
|
+
and Environment-Aware format (<env>.<domain>.<category>.<version>).
|
|
9
|
+
|
|
10
|
+
Design Pattern:
|
|
11
|
+
ModelTopicParser is a stateless utility class that provides topic parsing
|
|
12
|
+
and pattern matching capabilities. It extracts structured information from
|
|
13
|
+
topic strings including:
|
|
14
|
+
- Topic standard detection (ONEX Kafka vs Environment-Aware)
|
|
15
|
+
- Domain extraction
|
|
16
|
+
- Message category inference (EVENT, COMMAND, INTENT)
|
|
17
|
+
- Topic type (events, commands, intents, snapshots)
|
|
18
|
+
- Environment and version (for Environment-Aware format)
|
|
19
|
+
|
|
20
|
+
This enables deterministic routing decisions based on topic structure
|
|
21
|
+
without requiring dispatcher registration lookups.
|
|
22
|
+
|
|
23
|
+
Thread Safety:
|
|
24
|
+
ModelTopicParser is safe for concurrent use across threads.
|
|
25
|
+
|
|
26
|
+
- **Module-level parse cache** (``@lru_cache`` on ``_parse_topic_cached``):
|
|
27
|
+
Thread-safe. Python's ``functools.lru_cache`` uses internal locking to
|
|
28
|
+
ensure atomic cache updates, making concurrent parsing of topics safe.
|
|
29
|
+
|
|
30
|
+
- **Instance-level pattern cache** (``_pattern_cache`` dict in ``__init__``):
|
|
31
|
+
Safe but not synchronized. Concurrent calls to ``matches_pattern()`` on
|
|
32
|
+
the same parser instance may compile the same regex pattern multiple times
|
|
33
|
+
(duplicate work), but dict assignment in CPython is atomic so there's no
|
|
34
|
+
risk of data corruption. For single-threaded use or when patterns are
|
|
35
|
+
pre-warmed, this is optimal. For high-concurrency pattern matching on
|
|
36
|
+
shared instances, consider using separate parser instances per thread or
|
|
37
|
+
pre-warming patterns during initialization.
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
>>> from omnibase_infra.models.dispatch import ModelTopicParser, ModelParsedTopic
|
|
41
|
+
>>>
|
|
42
|
+
>>> parser = ModelTopicParser()
|
|
43
|
+
>>>
|
|
44
|
+
>>> # Parse ONEX Kafka format
|
|
45
|
+
>>> result = parser.parse("onex.registration.events")
|
|
46
|
+
>>> result.domain
|
|
47
|
+
'registration'
|
|
48
|
+
>>> result.category
|
|
49
|
+
<EnumMessageCategory.EVENT: 'event'>
|
|
50
|
+
>>>
|
|
51
|
+
>>> # Parse Environment-Aware format
|
|
52
|
+
>>> result = parser.parse("dev.user.events.v1")
|
|
53
|
+
>>> result.environment
|
|
54
|
+
'dev'
|
|
55
|
+
>>> result.version
|
|
56
|
+
'v1'
|
|
57
|
+
>>>
|
|
58
|
+
>>> # Get category for routing
|
|
59
|
+
>>> parser.get_category("onex.registration.commands")
|
|
60
|
+
<EnumMessageCategory.COMMAND: 'command'>
|
|
61
|
+
>>>
|
|
62
|
+
>>> # Pattern matching
|
|
63
|
+
>>> parser.matches_pattern("onex.*.events", "onex.registration.events")
|
|
64
|
+
True
|
|
65
|
+
|
|
66
|
+
See Also:
|
|
67
|
+
omnibase_infra.enums.EnumMessageCategory: Message category classification
|
|
68
|
+
(EVENT, COMMAND, INTENT) for routing decisions.
|
|
69
|
+
omnibase_infra.enums.EnumTopicType: Topic type suffix enumeration
|
|
70
|
+
(events, commands, intents, snapshots).
|
|
71
|
+
omnibase_infra.enums.EnumTopicStandard: Topic naming standard detection
|
|
72
|
+
(ONEX_KAFKA, ENVIRONMENT_AWARE, UNKNOWN).
|
|
73
|
+
omnibase_infra.models.dispatch.ModelParsedTopic: Structured parse result
|
|
74
|
+
with extracted components and validation status.
|
|
75
|
+
omnibase_infra.runtime.MessageDispatchEngine: Uses topic parsing for
|
|
76
|
+
deterministic message routing to registered dispatchers.
|
|
77
|
+
CLAUDE.md "Enum Usage: Message Routing vs Node Validation": Project-level
|
|
78
|
+
documentation explaining when to use EnumMessageCategory (for message
|
|
79
|
+
routing, topic parsing, dispatcher selection) vs EnumNodeOutputType
|
|
80
|
+
(for execution shape validation, handler return type validation).
|
|
81
|
+
|
|
82
|
+
Topic Taxonomy Reference:
|
|
83
|
+
The ONEX topic naming taxonomy defines standardized patterns for message
|
|
84
|
+
routing:
|
|
85
|
+
|
|
86
|
+
**ONEX Kafka Format** (canonical):
|
|
87
|
+
Pattern: ``onex.<domain>.<type>``
|
|
88
|
+
- Prefix: Always ``onex`` (fixed namespace identifier)
|
|
89
|
+
- Domain: Bounded context name (e.g., registration, discovery, order)
|
|
90
|
+
- Type: Message category suffix (events, commands, intents, snapshots)
|
|
91
|
+
- Examples:
|
|
92
|
+
- ``onex.registration.events`` - Domain events from registration
|
|
93
|
+
- ``onex.discovery.commands`` - Commands for discovery service
|
|
94
|
+
- ``onex.checkout.intents`` - User intents for checkout workflow
|
|
95
|
+
|
|
96
|
+
**Environment-Aware Format** (deployment-specific):
|
|
97
|
+
Pattern: ``<env>.<domain>.<category>.<version>``
|
|
98
|
+
- Environment: Deployment target (dev, staging, prod, test, local)
|
|
99
|
+
- Domain: Bounded context name
|
|
100
|
+
- Category: Message category suffix (events, commands, intents)
|
|
101
|
+
- Version: API version identifier (v1, v2, etc.)
|
|
102
|
+
- Examples:
|
|
103
|
+
- ``dev.user.events.v1`` - Development user events, version 1
|
|
104
|
+
- ``prod.order.commands.v2`` - Production order commands, version 2
|
|
105
|
+
- ``staging.payment.intents.v1`` - Staging payment intents
|
|
106
|
+
|
|
107
|
+
**Domain Naming Rules**:
|
|
108
|
+
- Lowercase alphanumeric characters with hyphens
|
|
109
|
+
- Must start with a letter
|
|
110
|
+
- Single letter domains are allowed (e.g., ``onex.a.events``)
|
|
111
|
+
- Multi-part domains use hyphens (e.g., ``order-fulfillment``)
|
|
112
|
+
|
|
113
|
+
**Category-Based Routing**:
|
|
114
|
+
Topic category determines the message processing pattern:
|
|
115
|
+
- ``events``: Immutable facts processed by reducers and projections
|
|
116
|
+
- ``commands``: Action instructions processed by command handlers
|
|
117
|
+
- ``intents``: User intentions processed by orchestrators
|
|
118
|
+
- ``snapshots``: State snapshots for materialized views (no category mapping)
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
import re
|
|
122
|
+
from functools import lru_cache
|
|
123
|
+
|
|
124
|
+
from omnibase_core.enums import EnumTopicType
|
|
125
|
+
from omnibase_infra.enums import EnumMessageCategory, EnumTopicStandard
|
|
126
|
+
from omnibase_infra.models.dispatch.model_parsed_topic import ModelParsedTopic
|
|
127
|
+
from omnibase_infra.types import TypeCacheInfo
|
|
128
|
+
|
|
129
|
+
# Module-level LRU cache for topic parsing performance.
|
|
130
|
+
# Since ModelTopicParser is stateless and all class-level attributes are constants,
|
|
131
|
+
# we can safely cache parse results at the module level. This provides significant
|
|
132
|
+
# performance benefits for repeated topic parsing (common in production).
|
|
133
|
+
#
|
|
134
|
+
# Cache size of 1024 is chosen to balance memory usage with hit rate:
|
|
135
|
+
# - Typical production environments have 10-100 unique topics
|
|
136
|
+
# - Cache can hold results for multiple environments/deployments
|
|
137
|
+
# - LRU eviction ensures frequently-used topics stay cached
|
|
138
|
+
_TOPIC_PARSE_CACHE_SIZE = 1024
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@lru_cache(maxsize=_TOPIC_PARSE_CACHE_SIZE)
|
|
142
|
+
def _parse_topic_cached(topic: str) -> ModelParsedTopic:
|
|
143
|
+
"""
|
|
144
|
+
Module-level cached topic parsing implementation.
|
|
145
|
+
|
|
146
|
+
This function contains the actual parsing logic and is decorated with
|
|
147
|
+
@lru_cache to provide automatic caching with LRU eviction.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
topic: The topic string to parse (must be non-empty, stripped)
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
ModelParsedTopic with extracted components and validation status
|
|
154
|
+
|
|
155
|
+
Note:
|
|
156
|
+
This function is internal to the module. Use ModelTopicParser.parse()
|
|
157
|
+
for the public API, which handles empty/whitespace topics before
|
|
158
|
+
delegating to this cached implementation.
|
|
159
|
+
"""
|
|
160
|
+
# Try ONEX Kafka format first (canonical)
|
|
161
|
+
onex_match = ModelTopicParser._ONEX_KAFKA_PATTERN.match(topic)
|
|
162
|
+
if onex_match:
|
|
163
|
+
domain = onex_match.group("domain").lower()
|
|
164
|
+
type_str = onex_match.group("type").lower()
|
|
165
|
+
|
|
166
|
+
topic_type = ModelTopicParser._TOPIC_TYPE_MAP.get(type_str)
|
|
167
|
+
category = ModelTopicParser._CATEGORY_MAP.get(type_str)
|
|
168
|
+
|
|
169
|
+
return ModelParsedTopic(
|
|
170
|
+
raw_topic=topic,
|
|
171
|
+
standard=EnumTopicStandard.ONEX_KAFKA,
|
|
172
|
+
domain=domain,
|
|
173
|
+
category=category,
|
|
174
|
+
topic_type=topic_type,
|
|
175
|
+
is_valid=True,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# Try Environment-Aware format
|
|
179
|
+
env_match = ModelTopicParser._ENV_AWARE_PATTERN.match(topic)
|
|
180
|
+
if env_match:
|
|
181
|
+
environment = env_match.group("env").lower()
|
|
182
|
+
domain = env_match.group("domain").lower()
|
|
183
|
+
category_str = env_match.group("category").lower()
|
|
184
|
+
version = env_match.group("version").lower()
|
|
185
|
+
|
|
186
|
+
topic_type = ModelTopicParser._TOPIC_TYPE_MAP.get(category_str)
|
|
187
|
+
category = ModelTopicParser._CATEGORY_MAP.get(category_str)
|
|
188
|
+
|
|
189
|
+
return ModelParsedTopic(
|
|
190
|
+
raw_topic=topic,
|
|
191
|
+
standard=EnumTopicStandard.ENVIRONMENT_AWARE,
|
|
192
|
+
domain=domain,
|
|
193
|
+
category=category,
|
|
194
|
+
topic_type=topic_type,
|
|
195
|
+
environment=environment,
|
|
196
|
+
version=version,
|
|
197
|
+
is_valid=True,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# -------------------------------------------------------------------------
|
|
201
|
+
# FALLBACK PARSING LOGIC
|
|
202
|
+
# -------------------------------------------------------------------------
|
|
203
|
+
# Why this fallback exists:
|
|
204
|
+
# The primary patterns (ONEX Kafka and Environment-Aware) are strict and
|
|
205
|
+
# require exact format matches. However, in practice we may encounter:
|
|
206
|
+
#
|
|
207
|
+
# 1. **Legacy topic formats** from older systems that predate ONEX standards
|
|
208
|
+
# (e.g., "myapp.orders.events" without the "onex." prefix)
|
|
209
|
+
#
|
|
210
|
+
# 2. **Partial matches** where the topic contains a valid category suffix
|
|
211
|
+
# (events, commands, intents) but doesn't fully conform to either standard
|
|
212
|
+
# (e.g., "custom-prefix.domain.events.extra-suffix")
|
|
213
|
+
#
|
|
214
|
+
# 3. **Custom deployments** with non-standard environment prefixes or
|
|
215
|
+
# versioning schemes that still use ONEX-style category suffixes
|
|
216
|
+
#
|
|
217
|
+
# The fallback uses EnumMessageCategory.from_topic() which performs a more
|
|
218
|
+
# lenient suffix-based search to find category indicators anywhere in the
|
|
219
|
+
# topic string.
|
|
220
|
+
# -------------------------------------------------------------------------
|
|
221
|
+
category = EnumMessageCategory.from_topic(topic)
|
|
222
|
+
if category is not None:
|
|
223
|
+
# We found a valid category suffix in the topic. Now attempt to extract
|
|
224
|
+
# the domain by locating the category suffix position and taking the
|
|
225
|
+
# segment immediately before it.
|
|
226
|
+
#
|
|
227
|
+
# Domain extraction logic:
|
|
228
|
+
# Given topic "some.prefix.mydomain.events.extra", we:
|
|
229
|
+
# 1. Find ".events" at position X
|
|
230
|
+
# 2. Take everything before that: "some.prefix.mydomain"
|
|
231
|
+
# 3. Split by "." and take the last segment: "mydomain"
|
|
232
|
+
# 4. If there are multiple prefix segments, assume first is environment
|
|
233
|
+
topic_lower = topic.lower()
|
|
234
|
+
category_suffix = f".{category.topic_suffix}"
|
|
235
|
+
if category_suffix in topic_lower:
|
|
236
|
+
# Find the domain: everything before the category suffix
|
|
237
|
+
suffix_idx = topic_lower.find(category_suffix)
|
|
238
|
+
prefix = topic[:suffix_idx]
|
|
239
|
+
# Remove environment prefix if present
|
|
240
|
+
parts = prefix.split(".")
|
|
241
|
+
domain = parts[-1] if parts else None
|
|
242
|
+
env = parts[0] if len(parts) > 1 else None
|
|
243
|
+
|
|
244
|
+
# -------------------------------------------------------------------------
|
|
245
|
+
# is_valid=True semantics for UNKNOWN-standard topics:
|
|
246
|
+
# -------------------------------------------------------------------------
|
|
247
|
+
# A topic parsed with EnumTopicStandard.UNKNOWN and is_valid=True means:
|
|
248
|
+
# - The topic does NOT conform to any recognized naming standard
|
|
249
|
+
# - BUT we successfully extracted a message category (EVENT/COMMAND/INTENT)
|
|
250
|
+
# - This makes the topic "partially valid" for routing purposes
|
|
251
|
+
#
|
|
252
|
+
# The dispatch engine can still route these messages because the category
|
|
253
|
+
# is the primary routing key. However, consumers should be aware that:
|
|
254
|
+
# - Domain extraction is best-effort and may be incorrect
|
|
255
|
+
# - Environment/version fields may be absent or inferred incorrectly
|
|
256
|
+
# - The topic naming doesn't follow ONEX best practices
|
|
257
|
+
#
|
|
258
|
+
# In contrast, is_valid=False (below) means we couldn't extract ANY
|
|
259
|
+
# useful routing information from the topic.
|
|
260
|
+
# -------------------------------------------------------------------------
|
|
261
|
+
return ModelParsedTopic(
|
|
262
|
+
raw_topic=topic,
|
|
263
|
+
standard=EnumTopicStandard.UNKNOWN,
|
|
264
|
+
domain=domain,
|
|
265
|
+
category=category,
|
|
266
|
+
environment=env,
|
|
267
|
+
is_valid=True, # Partially valid - category extracted
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
# Unknown format
|
|
271
|
+
return ModelParsedTopic(
|
|
272
|
+
raw_topic=topic,
|
|
273
|
+
standard=EnumTopicStandard.UNKNOWN,
|
|
274
|
+
is_valid=False,
|
|
275
|
+
validation_error=(
|
|
276
|
+
f"Topic '{topic}' does not match any known format. "
|
|
277
|
+
"Expected: onex.<domain>.<type> or <env>.<domain>.<category>.<version>"
|
|
278
|
+
),
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def get_topic_parse_cache_info() -> TypeCacheInfo:
|
|
283
|
+
"""
|
|
284
|
+
Get cache statistics for topic parsing.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
TypeCacheInfo: A named tuple with hits, misses, maxsize, and currsize.
|
|
288
|
+
|
|
289
|
+
Example:
|
|
290
|
+
>>> from omnibase_infra.models.dispatch import get_topic_parse_cache_info
|
|
291
|
+
>>> info = get_topic_parse_cache_info()
|
|
292
|
+
>>> print(f"Cache hit rate: {info.hits / (info.hits + info.misses):.2%}")
|
|
293
|
+
Cache hit rate: 95.00%
|
|
294
|
+
"""
|
|
295
|
+
# Convert from functools._CacheInfo to our typed TypeCacheInfo
|
|
296
|
+
info = _parse_topic_cached.cache_info()
|
|
297
|
+
return TypeCacheInfo(
|
|
298
|
+
hits=info.hits,
|
|
299
|
+
misses=info.misses,
|
|
300
|
+
maxsize=info.maxsize,
|
|
301
|
+
currsize=info.currsize,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def clear_topic_parse_cache() -> None:
|
|
306
|
+
"""
|
|
307
|
+
Clear the topic parsing cache.
|
|
308
|
+
|
|
309
|
+
This is useful for testing or when topic patterns change dynamically.
|
|
310
|
+
In production, this should rarely be needed as the LRU eviction
|
|
311
|
+
handles cache management automatically.
|
|
312
|
+
"""
|
|
313
|
+
_parse_topic_cached.cache_clear()
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
class ModelTopicParser:
|
|
317
|
+
"""
|
|
318
|
+
Parser for ONEX topic names supporting multiple format standards.
|
|
319
|
+
|
|
320
|
+
Provides structured parsing of topic strings to extract routing-relevant
|
|
321
|
+
information. Supports both ONEX Kafka format (onex.<domain>.<type>) and
|
|
322
|
+
Environment-Aware format (<env>.<domain>.<category>.<version>).
|
|
323
|
+
|
|
324
|
+
The parser is stateless and all methods are pure functions, making it
|
|
325
|
+
safe for concurrent use across threads.
|
|
326
|
+
|
|
327
|
+
Patterns:
|
|
328
|
+
- ONEX Kafka: onex.<domain>.<type>
|
|
329
|
+
Examples: onex.registration.events, onex.discovery.commands
|
|
330
|
+
- Environment-Aware: <env>.<domain>.<category>.<version>
|
|
331
|
+
Examples: dev.user.events.v1, prod.order.commands.v2
|
|
332
|
+
|
|
333
|
+
Example:
|
|
334
|
+
>>> parser = ModelTopicParser()
|
|
335
|
+
>>>
|
|
336
|
+
>>> # Parse and extract category for routing
|
|
337
|
+
>>> category = parser.get_category("onex.registration.events")
|
|
338
|
+
>>> category
|
|
339
|
+
<EnumMessageCategory.EVENT: 'event'>
|
|
340
|
+
>>>
|
|
341
|
+
>>> # Check pattern matching
|
|
342
|
+
>>> parser.matches_pattern("onex.*.events", "onex.registration.events")
|
|
343
|
+
True
|
|
344
|
+
>>> parser.matches_pattern("**.events", "dev.user.events.v1")
|
|
345
|
+
True
|
|
346
|
+
|
|
347
|
+
Attributes:
|
|
348
|
+
_ONEX_KAFKA_PATTERN: Compiled regex for ONEX Kafka format validation.
|
|
349
|
+
_ENV_AWARE_PATTERN: Compiled regex for Environment-Aware format validation.
|
|
350
|
+
_DOMAIN_PATTERN: Compiled regex for domain name validation.
|
|
351
|
+
_VALID_TOPIC_TYPES: Frozenset of valid topic type suffixes.
|
|
352
|
+
_TOPIC_TYPE_MAP: Mapping from suffix to EnumTopicType enum values.
|
|
353
|
+
_CATEGORY_MAP: Mapping from suffix to EnumMessageCategory enum values.
|
|
354
|
+
|
|
355
|
+
See Also:
|
|
356
|
+
omnibase_infra.models.dispatch.ModelParsedTopic: The structured result
|
|
357
|
+
returned by parse(), containing all extracted topic components.
|
|
358
|
+
omnibase_infra.enums.EnumMessageCategory: Message category enum used
|
|
359
|
+
for deterministic routing (EVENT, COMMAND, INTENT).
|
|
360
|
+
omnibase_infra.enums.EnumTopicType: Topic type enum representing the
|
|
361
|
+
valid suffixes (events, commands, intents, snapshots).
|
|
362
|
+
omnibase_infra.enums.EnumTopicStandard: Enum for topic naming standard
|
|
363
|
+
detection (ONEX_KAFKA, ENVIRONMENT_AWARE, UNKNOWN).
|
|
364
|
+
omnibase_infra.runtime.MessageDispatchEngine: The dispatch engine that
|
|
365
|
+
uses this parser for topic-based routing decisions.
|
|
366
|
+
get_topic_parse_cache_info: Function to retrieve LRU cache statistics.
|
|
367
|
+
clear_topic_parse_cache: Function to clear the topic parse cache.
|
|
368
|
+
|
|
369
|
+
Topic Taxonomy:
|
|
370
|
+
See module-level docstring for complete topic taxonomy documentation,
|
|
371
|
+
including format specifications, domain naming rules, and category-based
|
|
372
|
+
routing semantics.
|
|
373
|
+
|
|
374
|
+
External Documentation:
|
|
375
|
+
- ONEX Topic Taxonomy: docs/architecture/TOPIC_TAXONOMY.md (TODO(OMN-981): create)
|
|
376
|
+
- Environment-Aware Topics: docs/patterns/ENVIRONMENT_TOPICS.md (TODO(OMN-982): create)
|
|
377
|
+
- Message Categories: EnumMessageCategory in omnibase_infra.enums
|
|
378
|
+
"""
|
|
379
|
+
|
|
380
|
+
# ONEX Kafka format: onex.<domain>.<type>
|
|
381
|
+
# Domain: lowercase alphanumeric with hyphens, starting with letter
|
|
382
|
+
# Type: one of commands, events, intents, snapshots
|
|
383
|
+
_ONEX_KAFKA_PATTERN = re.compile(
|
|
384
|
+
r"^onex\.(?P<domain>[a-z][a-z0-9-]*[a-z0-9]|[a-z])\."
|
|
385
|
+
r"(?P<type>commands|events|intents|snapshots)$",
|
|
386
|
+
re.IGNORECASE,
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# Environment-Aware format: <env>.<domain>.<category>.<version>
|
|
390
|
+
# Env: dev, prod, staging, test, local (case-insensitive)
|
|
391
|
+
# Domain: alphanumeric with hyphens
|
|
392
|
+
# Category: events, commands, intents (plural form)
|
|
393
|
+
# Version: v followed by digits
|
|
394
|
+
_ENV_AWARE_PATTERN = re.compile(
|
|
395
|
+
r"^(?P<env>dev|prod|staging|test|local)\."
|
|
396
|
+
r"(?P<domain>[a-z][a-z0-9-]*[a-z0-9]|[a-z])\."
|
|
397
|
+
r"(?P<category>commands|events|intents)\."
|
|
398
|
+
r"(?P<version>v\d+)$",
|
|
399
|
+
re.IGNORECASE,
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
# Domain validation pattern (reused from constants_topic_taxonomy)
|
|
403
|
+
_DOMAIN_PATTERN = re.compile(r"^[a-z][a-z0-9-]*[a-z0-9]$|^[a-z]$")
|
|
404
|
+
|
|
405
|
+
# Valid topic types for validation
|
|
406
|
+
_VALID_TOPIC_TYPES = frozenset({"commands", "events", "intents", "snapshots"})
|
|
407
|
+
|
|
408
|
+
# Mapping from topic type suffix to EnumTopicType
|
|
409
|
+
_TOPIC_TYPE_MAP: dict[str, EnumTopicType] = {
|
|
410
|
+
"commands": EnumTopicType.COMMANDS,
|
|
411
|
+
"events": EnumTopicType.EVENTS,
|
|
412
|
+
"intents": EnumTopicType.INTENTS,
|
|
413
|
+
"snapshots": EnumTopicType.SNAPSHOTS,
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
# Mapping from topic type suffix to EnumMessageCategory
|
|
417
|
+
# Note: snapshots don't have a direct category mapping
|
|
418
|
+
_CATEGORY_MAP: dict[str, EnumMessageCategory] = {
|
|
419
|
+
"commands": EnumMessageCategory.COMMAND,
|
|
420
|
+
"events": EnumMessageCategory.EVENT,
|
|
421
|
+
"intents": EnumMessageCategory.INTENT,
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
def parse(self, topic: str) -> ModelParsedTopic:
|
|
425
|
+
"""
|
|
426
|
+
Parse a topic string and extract structured information.
|
|
427
|
+
|
|
428
|
+
Attempts to parse the topic against known formats (ONEX Kafka and
|
|
429
|
+
Environment-Aware) and returns a structured result with all extracted
|
|
430
|
+
components.
|
|
431
|
+
|
|
432
|
+
Caching:
|
|
433
|
+
Results are cached with LRU eviction (maxsize=1024) at the module
|
|
434
|
+
level. This provides significant performance benefits for repeated
|
|
435
|
+
topic parsing, which is common in production message dispatch.
|
|
436
|
+
Cache statistics can be monitored via get_topic_parse_cache_info().
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
topic: The topic string to parse
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
ModelParsedTopic with extracted components and validation status
|
|
443
|
+
|
|
444
|
+
Example:
|
|
445
|
+
>>> parser = ModelTopicParser()
|
|
446
|
+
>>> result = parser.parse("onex.registration.events")
|
|
447
|
+
>>> result.standard
|
|
448
|
+
<EnumTopicStandard.ONEX_KAFKA: 'onex_kafka'>
|
|
449
|
+
>>> result.domain
|
|
450
|
+
'registration'
|
|
451
|
+
>>> result.category
|
|
452
|
+
<EnumMessageCategory.EVENT: 'event'>
|
|
453
|
+
|
|
454
|
+
See Also:
|
|
455
|
+
get_topic_parse_cache_info: Get cache statistics (hits, misses, size)
|
|
456
|
+
clear_topic_parse_cache: Clear the parse cache if needed
|
|
457
|
+
"""
|
|
458
|
+
# Handle empty/whitespace topics (not cached - edge case)
|
|
459
|
+
if not topic or not topic.strip():
|
|
460
|
+
return ModelParsedTopic(
|
|
461
|
+
raw_topic="<empty>", # Use placeholder to satisfy min_length constraint
|
|
462
|
+
standard=EnumTopicStandard.UNKNOWN,
|
|
463
|
+
is_valid=False,
|
|
464
|
+
validation_error="Topic cannot be empty or whitespace",
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
# Delegate to cached implementation for actual parsing
|
|
468
|
+
return _parse_topic_cached(topic.strip())
|
|
469
|
+
|
|
470
|
+
def get_category(self, topic: str) -> EnumMessageCategory | None:
|
|
471
|
+
"""
|
|
472
|
+
Extract the message category from a topic for routing.
|
|
473
|
+
|
|
474
|
+
This is a convenience method that parses the topic and returns
|
|
475
|
+
just the category, which is the primary input for deterministic
|
|
476
|
+
routing decisions.
|
|
477
|
+
|
|
478
|
+
Args:
|
|
479
|
+
topic: The topic string to analyze
|
|
480
|
+
|
|
481
|
+
Returns:
|
|
482
|
+
EnumMessageCategory if detected, None otherwise
|
|
483
|
+
|
|
484
|
+
Example:
|
|
485
|
+
>>> parser = ModelTopicParser()
|
|
486
|
+
>>> parser.get_category("onex.registration.events")
|
|
487
|
+
<EnumMessageCategory.EVENT: 'event'>
|
|
488
|
+
>>> parser.get_category("dev.user.commands.v1")
|
|
489
|
+
<EnumMessageCategory.COMMAND: 'command'>
|
|
490
|
+
>>> parser.get_category("invalid.topic")
|
|
491
|
+
None
|
|
492
|
+
|
|
493
|
+
See Also:
|
|
494
|
+
EnumMessageCategory: The enum type returned, representing message
|
|
495
|
+
categories (EVENT, COMMAND, INTENT) for routing decisions.
|
|
496
|
+
EnumMessageCategory.topic_suffix: Property that returns the plural
|
|
497
|
+
suffix (events, commands, intents) for topic construction.
|
|
498
|
+
MessageDispatchEngine: Uses category for dispatcher selection.
|
|
499
|
+
"""
|
|
500
|
+
parsed = self.parse(topic)
|
|
501
|
+
return parsed.category
|
|
502
|
+
|
|
503
|
+
def matches_pattern(self, pattern: str, topic: str) -> bool:
|
|
504
|
+
"""
|
|
505
|
+
Check if a topic matches a glob-style pattern.
|
|
506
|
+
|
|
507
|
+
Supports the following wildcards:
|
|
508
|
+
- '*' (single asterisk): Matches any single segment (no dots)
|
|
509
|
+
- '**' (double asterisk): Matches any number of segments (including dots)
|
|
510
|
+
|
|
511
|
+
Pattern matching is case-insensitive.
|
|
512
|
+
|
|
513
|
+
Args:
|
|
514
|
+
pattern: The glob pattern to match against
|
|
515
|
+
topic: The topic to check
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
True if the topic matches the pattern, False otherwise
|
|
519
|
+
|
|
520
|
+
Example:
|
|
521
|
+
>>> parser = ModelTopicParser()
|
|
522
|
+
>>> parser.matches_pattern("onex.*.events", "onex.registration.events")
|
|
523
|
+
True
|
|
524
|
+
>>> parser.matches_pattern("onex.*.events", "onex.discovery.events")
|
|
525
|
+
True
|
|
526
|
+
>>> parser.matches_pattern("onex.*.events", "onex.discovery.commands")
|
|
527
|
+
False
|
|
528
|
+
>>> parser.matches_pattern("**.events", "dev.user.events.v1")
|
|
529
|
+
False # ** matches segments but v1 is after .events
|
|
530
|
+
>>> parser.matches_pattern("**.events.*", "dev.user.events.v1")
|
|
531
|
+
True
|
|
532
|
+
>>> parser.matches_pattern("dev.**", "dev.user.events.v1")
|
|
533
|
+
True
|
|
534
|
+
"""
|
|
535
|
+
if not pattern or not topic:
|
|
536
|
+
return False
|
|
537
|
+
|
|
538
|
+
# Compile pattern to regex
|
|
539
|
+
regex_pattern = self._pattern_to_regex(pattern)
|
|
540
|
+
return bool(regex_pattern.match(topic))
|
|
541
|
+
|
|
542
|
+
def __init__(self) -> None:
|
|
543
|
+
"""Initialize the topic parser with an empty pattern cache."""
|
|
544
|
+
self._pattern_cache: dict[str, re.Pattern[str]] = {}
|
|
545
|
+
|
|
546
|
+
def _pattern_to_regex(self, pattern: str) -> re.Pattern[str]:
|
|
547
|
+
"""Convert a glob-style pattern to a compiled regex.
|
|
548
|
+
|
|
549
|
+
Handles:
|
|
550
|
+
- '*' -> matches any single segment (no dots)
|
|
551
|
+
- '**' -> matches any number of segments (including empty)
|
|
552
|
+
|
|
553
|
+
Uses an instance-level cache to avoid recompiling frequently used patterns.
|
|
554
|
+
"""
|
|
555
|
+
# Check cache first
|
|
556
|
+
if pattern in self._pattern_cache:
|
|
557
|
+
return self._pattern_cache[pattern]
|
|
558
|
+
|
|
559
|
+
# Handle ** first (must be done before single *)
|
|
560
|
+
# Use a placeholder to avoid double-processing
|
|
561
|
+
escaped = pattern.replace("**", "__DOUBLE_STAR__")
|
|
562
|
+
|
|
563
|
+
# Escape special regex characters except *
|
|
564
|
+
escaped = re.escape(escaped)
|
|
565
|
+
|
|
566
|
+
# Convert back ** placeholder to multi-segment match
|
|
567
|
+
# ** matches zero or more segments: (?:[^.]+(?:\.[^.]+)*)?
|
|
568
|
+
# This matches: nothing, or one segment, or multiple segments separated by dots
|
|
569
|
+
escaped = escaped.replace("__DOUBLE_STAR__", "(?:[^.]+(?:\\.[^.]+)*)?")
|
|
570
|
+
|
|
571
|
+
# Convert single * to single-segment match (no dots)
|
|
572
|
+
escaped = escaped.replace(r"\*", "[^.]+")
|
|
573
|
+
|
|
574
|
+
# Compile and cache
|
|
575
|
+
compiled = re.compile(f"^{escaped}$", re.IGNORECASE)
|
|
576
|
+
self._pattern_cache[pattern] = compiled
|
|
577
|
+
return compiled
|
|
578
|
+
|
|
579
|
+
def validate_topic(
|
|
580
|
+
self, topic: str, strict: bool = False
|
|
581
|
+
) -> tuple[bool, str | None]:
|
|
582
|
+
"""
|
|
583
|
+
Validate a topic string against ONEX standards.
|
|
584
|
+
|
|
585
|
+
Args:
|
|
586
|
+
topic: The topic string to validate
|
|
587
|
+
strict: If True, requires exact match to ONEX Kafka format.
|
|
588
|
+
If False, accepts any format that yields a valid category.
|
|
589
|
+
|
|
590
|
+
Returns:
|
|
591
|
+
Tuple of (is_valid, error_message).
|
|
592
|
+
- (True, None) if valid
|
|
593
|
+
- (False, error_message) if invalid
|
|
594
|
+
|
|
595
|
+
Example:
|
|
596
|
+
>>> parser = ModelTopicParser()
|
|
597
|
+
>>> parser.validate_topic("onex.registration.events")
|
|
598
|
+
(True, None)
|
|
599
|
+
>>> parser.validate_topic("onex.registration.events", strict=True)
|
|
600
|
+
(True, None)
|
|
601
|
+
>>> parser.validate_topic("dev.user.events.v1")
|
|
602
|
+
(True, None)
|
|
603
|
+
>>> parser.validate_topic("dev.user.events.v1", strict=True)
|
|
604
|
+
(False, "Topic 'dev.user.events.v1' does not match ONEX Kafka format...")
|
|
605
|
+
>>> parser.validate_topic("invalid")
|
|
606
|
+
(False, "Topic 'invalid' does not match any known format...")
|
|
607
|
+
|
|
608
|
+
See Also:
|
|
609
|
+
EnumTopicStandard: Enum used to classify topic naming standards.
|
|
610
|
+
ONEX_KAFKA is the canonical format; ENVIRONMENT_AWARE is for
|
|
611
|
+
deployment-specific topics; UNKNOWN indicates unrecognized format.
|
|
612
|
+
ModelParsedTopic.is_valid: Boolean indicating parse success.
|
|
613
|
+
ModelParsedTopic.validation_error: Error message on parse failure.
|
|
614
|
+
"""
|
|
615
|
+
parsed = self.parse(topic)
|
|
616
|
+
|
|
617
|
+
if strict:
|
|
618
|
+
if parsed.standard != EnumTopicStandard.ONEX_KAFKA:
|
|
619
|
+
return (
|
|
620
|
+
False,
|
|
621
|
+
f"Topic '{topic}' does not match ONEX Kafka format "
|
|
622
|
+
f"(onex.<domain>.<type>). Detected standard: {parsed.standard.value}",
|
|
623
|
+
)
|
|
624
|
+
return (True, None)
|
|
625
|
+
|
|
626
|
+
# Non-strict: accept any valid parsed topic
|
|
627
|
+
if parsed.is_valid:
|
|
628
|
+
return (True, None)
|
|
629
|
+
|
|
630
|
+
return (False, parsed.validation_error)
|
|
631
|
+
|
|
632
|
+
def is_onex_kafka_format(self, topic: str) -> bool:
|
|
633
|
+
"""
|
|
634
|
+
Check if a topic follows the ONEX Kafka naming standard.
|
|
635
|
+
|
|
636
|
+
Args:
|
|
637
|
+
topic: The topic string to check
|
|
638
|
+
|
|
639
|
+
Returns:
|
|
640
|
+
True if the topic matches onex.<domain>.<type> format
|
|
641
|
+
|
|
642
|
+
Example:
|
|
643
|
+
>>> parser = ModelTopicParser()
|
|
644
|
+
>>> parser.is_onex_kafka_format("onex.registration.events")
|
|
645
|
+
True
|
|
646
|
+
>>> parser.is_onex_kafka_format("dev.user.events.v1")
|
|
647
|
+
False
|
|
648
|
+
|
|
649
|
+
See Also:
|
|
650
|
+
EnumTopicStandard.ONEX_KAFKA: The enum value for this format.
|
|
651
|
+
is_environment_aware_format: Check for the alternate format.
|
|
652
|
+
validate_topic: Validation with strict mode for ONEX Kafka only.
|
|
653
|
+
"""
|
|
654
|
+
return bool(self._ONEX_KAFKA_PATTERN.match(topic.strip()))
|
|
655
|
+
|
|
656
|
+
def is_environment_aware_format(self, topic: str) -> bool:
|
|
657
|
+
"""
|
|
658
|
+
Check if a topic follows the Environment-Aware naming standard.
|
|
659
|
+
|
|
660
|
+
Args:
|
|
661
|
+
topic: The topic string to check
|
|
662
|
+
|
|
663
|
+
Returns:
|
|
664
|
+
True if the topic matches <env>.<domain>.<category>.<version> format
|
|
665
|
+
|
|
666
|
+
Example:
|
|
667
|
+
>>> parser = ModelTopicParser()
|
|
668
|
+
>>> parser.is_environment_aware_format("dev.user.events.v1")
|
|
669
|
+
True
|
|
670
|
+
>>> parser.is_environment_aware_format("onex.registration.events")
|
|
671
|
+
False
|
|
672
|
+
|
|
673
|
+
Note:
|
|
674
|
+
Environment-Aware format includes additional metadata:
|
|
675
|
+
- Environment prefix (dev, staging, prod, test, local)
|
|
676
|
+
- Version suffix (v1, v2, etc.)
|
|
677
|
+
|
|
678
|
+
These components are extracted via parse() and available in
|
|
679
|
+
ModelParsedTopic.environment and ModelParsedTopic.version.
|
|
680
|
+
|
|
681
|
+
See Also:
|
|
682
|
+
EnumTopicStandard.ENVIRONMENT_AWARE: The enum value for this format.
|
|
683
|
+
is_onex_kafka_format: Check for the canonical ONEX format.
|
|
684
|
+
ModelParsedTopic.environment: Environment extracted from topic.
|
|
685
|
+
ModelParsedTopic.version: Version extracted from topic.
|
|
686
|
+
"""
|
|
687
|
+
return bool(self._ENV_AWARE_PATTERN.match(topic.strip()))
|
|
688
|
+
|
|
689
|
+
def extract_domain(self, topic: str) -> str | None:
|
|
690
|
+
"""
|
|
691
|
+
Extract the domain from a topic string.
|
|
692
|
+
|
|
693
|
+
Args:
|
|
694
|
+
topic: The topic string to analyze
|
|
695
|
+
|
|
696
|
+
Returns:
|
|
697
|
+
The domain name if extractable, None otherwise
|
|
698
|
+
|
|
699
|
+
Example:
|
|
700
|
+
>>> parser = ModelTopicParser()
|
|
701
|
+
>>> parser.extract_domain("onex.registration.events")
|
|
702
|
+
'registration'
|
|
703
|
+
>>> parser.extract_domain("dev.user.events.v1")
|
|
704
|
+
'user'
|
|
705
|
+
|
|
706
|
+
Note:
|
|
707
|
+
Domain naming follows these rules:
|
|
708
|
+
- Lowercase alphanumeric characters with hyphens
|
|
709
|
+
- Must start with a letter
|
|
710
|
+
- Single letter domains are valid (e.g., 'a', 'x')
|
|
711
|
+
- Multi-part domains use hyphens (e.g., 'order-fulfillment')
|
|
712
|
+
|
|
713
|
+
See Also:
|
|
714
|
+
ModelParsedTopic.domain: The domain field in parse results.
|
|
715
|
+
_DOMAIN_PATTERN: Class attribute with domain validation regex.
|
|
716
|
+
"""
|
|
717
|
+
parsed = self.parse(topic)
|
|
718
|
+
return parsed.domain
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
__all__ = [
|
|
722
|
+
"ModelTopicParser",
|
|
723
|
+
"clear_topic_parse_cache",
|
|
724
|
+
"get_topic_parse_cache_info",
|
|
725
|
+
]
|