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,279 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatch Route Model.
|
|
5
|
+
|
|
6
|
+
Represents a routing rule that maps topic patterns and message types to dispatchers
|
|
7
|
+
in the runtime dispatch engine. Routes are used by the engine to determine
|
|
8
|
+
which dispatcher should process incoming messages.
|
|
9
|
+
|
|
10
|
+
Design Pattern:
|
|
11
|
+
ModelDispatchRoute is a pure data model that defines a routing rule. It contains:
|
|
12
|
+
- Topic pattern matching (exact or glob patterns)
|
|
13
|
+
- Message category filtering (COMMAND, EVENT, INTENT)
|
|
14
|
+
- Message type filtering (optional specific type within category)
|
|
15
|
+
- Dispatcher reference (identifier for the registered dispatcher)
|
|
16
|
+
- Priority for route ordering when multiple routes match
|
|
17
|
+
|
|
18
|
+
The dispatch engine uses these routes to determine the appropriate dispatcher
|
|
19
|
+
for each incoming message based on topic and message type.
|
|
20
|
+
|
|
21
|
+
Thread Safety:
|
|
22
|
+
ModelDispatchRoute is immutable (frozen=True) after creation,
|
|
23
|
+
making it thread-safe for concurrent read access.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> from omnibase_infra.models.dispatch import ModelDispatchRoute
|
|
27
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
28
|
+
>>>
|
|
29
|
+
>>> # Create a route for user events
|
|
30
|
+
>>> route = ModelDispatchRoute(
|
|
31
|
+
... route_id="user-events-route",
|
|
32
|
+
... topic_pattern="*.user.events.*",
|
|
33
|
+
... message_category=EnumMessageCategory.EVENT,
|
|
34
|
+
... dispatcher_id="user-event-dispatcher",
|
|
35
|
+
... priority=10,
|
|
36
|
+
... )
|
|
37
|
+
>>>
|
|
38
|
+
>>> # Check if route matches a topic
|
|
39
|
+
>>> route.matches_topic("dev.user.events.v1")
|
|
40
|
+
True
|
|
41
|
+
|
|
42
|
+
See Also:
|
|
43
|
+
omnibase_infra.models.dispatch.ModelDispatcherRegistration: Dispatcher metadata
|
|
44
|
+
omnibase_infra.models.dispatch.ModelDispatchResult: Dispatch operation result
|
|
45
|
+
omnibase_infra.enums.EnumMessageCategory: Message category enum
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
import re
|
|
49
|
+
from functools import cached_property
|
|
50
|
+
from uuid import UUID, uuid4
|
|
51
|
+
|
|
52
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
53
|
+
|
|
54
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
55
|
+
from omnibase_infra.models.dispatch.model_dispatch_metadata import ModelDispatchMetadata
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class ModelDispatchRoute(BaseModel):
|
|
59
|
+
"""
|
|
60
|
+
Routing rule for the dispatch engine.
|
|
61
|
+
|
|
62
|
+
Maps topic patterns and message types to dispatchers. Used by the engine
|
|
63
|
+
to determine which dispatcher should process incoming messages.
|
|
64
|
+
|
|
65
|
+
Attributes:
|
|
66
|
+
route_id: Unique identifier for this route (for logging/debugging).
|
|
67
|
+
topic_pattern: Topic pattern to match (exact string or glob pattern).
|
|
68
|
+
Supports wildcards: '*' matches any single segment, '**' matches
|
|
69
|
+
multiple segments.
|
|
70
|
+
message_category: The message category this route handles (EVENT,
|
|
71
|
+
COMMAND, or INTENT).
|
|
72
|
+
message_type: Optional specific message type within the category.
|
|
73
|
+
When None, matches all message types in the category.
|
|
74
|
+
dispatcher_id: Identifier of the dispatcher to invoke when this route matches.
|
|
75
|
+
priority: Route priority for ordering (higher = matched first).
|
|
76
|
+
When multiple routes match, highest priority wins.
|
|
77
|
+
enabled: Whether this route is active. Disabled routes are skipped.
|
|
78
|
+
description: Human-readable description of the route's purpose.
|
|
79
|
+
metadata: Optional additional metadata for the route.
|
|
80
|
+
|
|
81
|
+
Example:
|
|
82
|
+
>>> route = ModelDispatchRoute(
|
|
83
|
+
... route_id="order-commands",
|
|
84
|
+
... topic_pattern="*.order.commands.*",
|
|
85
|
+
... message_category=EnumMessageCategory.COMMAND,
|
|
86
|
+
... message_type="CreateOrderCommand",
|
|
87
|
+
... dispatcher_id="order-command-dispatcher",
|
|
88
|
+
... priority=100,
|
|
89
|
+
... description="Routes order creation commands",
|
|
90
|
+
... )
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
model_config = ConfigDict(
|
|
94
|
+
frozen=True,
|
|
95
|
+
extra="forbid",
|
|
96
|
+
from_attributes=True,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# ---- Route Identity ----
|
|
100
|
+
route_id: str = Field(
|
|
101
|
+
...,
|
|
102
|
+
description="Unique identifier for this route (for logging/debugging).",
|
|
103
|
+
min_length=1,
|
|
104
|
+
max_length=200,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# ---- Matching Criteria ----
|
|
108
|
+
topic_pattern: str = Field(
|
|
109
|
+
...,
|
|
110
|
+
description=(
|
|
111
|
+
"Topic pattern to match. Supports exact match or glob patterns. "
|
|
112
|
+
"Use '*' for single segment wildcard, '**' for multi-segment."
|
|
113
|
+
),
|
|
114
|
+
min_length=1,
|
|
115
|
+
max_length=500,
|
|
116
|
+
)
|
|
117
|
+
message_category: EnumMessageCategory = Field(
|
|
118
|
+
...,
|
|
119
|
+
description="The message category this route handles (EVENT, COMMAND, INTENT).",
|
|
120
|
+
)
|
|
121
|
+
message_type: str | None = Field(
|
|
122
|
+
default=None,
|
|
123
|
+
description=(
|
|
124
|
+
"Optional specific message type within the category. "
|
|
125
|
+
"When None, matches all message types in the category."
|
|
126
|
+
),
|
|
127
|
+
max_length=200,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# ---- Dispatcher Reference ----
|
|
131
|
+
dispatcher_id: str = Field(
|
|
132
|
+
...,
|
|
133
|
+
description="Identifier of the dispatcher to invoke when this route matches.",
|
|
134
|
+
min_length=1,
|
|
135
|
+
max_length=200,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# ---- Route Configuration ----
|
|
139
|
+
priority: int = Field(
|
|
140
|
+
default=0,
|
|
141
|
+
description="Route priority for ordering. Higher priority routes are matched first.",
|
|
142
|
+
ge=-1000,
|
|
143
|
+
le=1000,
|
|
144
|
+
)
|
|
145
|
+
enabled: bool = Field(
|
|
146
|
+
default=True,
|
|
147
|
+
description="Whether this route is active. Disabled routes are skipped.",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# ---- Documentation ----
|
|
151
|
+
description: str | None = Field(
|
|
152
|
+
default=None,
|
|
153
|
+
description="Human-readable description of the route's purpose.",
|
|
154
|
+
max_length=1000,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# ---- Tracing Context ----
|
|
158
|
+
correlation_id: UUID = Field(
|
|
159
|
+
default_factory=uuid4,
|
|
160
|
+
description="Correlation ID for tracing route creation (auto-generated if not provided).",
|
|
161
|
+
)
|
|
162
|
+
metadata: ModelDispatchMetadata | None = Field(
|
|
163
|
+
default=None,
|
|
164
|
+
description="Optional additional metadata for the route.",
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
@field_validator("topic_pattern")
|
|
168
|
+
@classmethod
|
|
169
|
+
def validate_topic_pattern(cls, v: str) -> str:
|
|
170
|
+
"""Validate that the topic pattern is well-formed."""
|
|
171
|
+
# Basic validation: must not be empty or only whitespace
|
|
172
|
+
if not v or not v.strip():
|
|
173
|
+
msg = "Topic pattern cannot be empty or whitespace"
|
|
174
|
+
raise ValueError(msg)
|
|
175
|
+
# Pattern should not start/end with dots (invalid topic structure)
|
|
176
|
+
if v.startswith(".") or v.endswith("."):
|
|
177
|
+
msg = "Topic pattern cannot start or end with a dot"
|
|
178
|
+
raise ValueError(msg)
|
|
179
|
+
return v
|
|
180
|
+
|
|
181
|
+
@cached_property
|
|
182
|
+
def _compiled_pattern(self) -> re.Pattern[str]:
|
|
183
|
+
"""
|
|
184
|
+
Compile the topic pattern to a regex for efficient matching.
|
|
185
|
+
|
|
186
|
+
Converts glob-style patterns to regex:
|
|
187
|
+
- '*' matches any single segment (no dots)
|
|
188
|
+
- '**' matches any number of segments (including dots)
|
|
189
|
+
"""
|
|
190
|
+
# Escape special regex characters except * and **
|
|
191
|
+
pattern = self.topic_pattern
|
|
192
|
+
# Handle ** first (must be done before single *)
|
|
193
|
+
pattern = pattern.replace("**", "__DOUBLE_STAR__")
|
|
194
|
+
# Escape dots and other special chars
|
|
195
|
+
pattern = re.escape(pattern)
|
|
196
|
+
# Convert back ** placeholder to multi-segment match
|
|
197
|
+
pattern = pattern.replace("__DOUBLE_STAR__", ".*")
|
|
198
|
+
# Convert single * to single-segment match (no dots)
|
|
199
|
+
pattern = pattern.replace(r"\*", "[^.]+")
|
|
200
|
+
# Anchor the pattern
|
|
201
|
+
return re.compile(f"^{pattern}$", re.IGNORECASE)
|
|
202
|
+
|
|
203
|
+
def matches_topic(self, topic: str) -> bool:
|
|
204
|
+
"""
|
|
205
|
+
Check if this route matches the given topic.
|
|
206
|
+
|
|
207
|
+
Uses glob-style pattern matching where:
|
|
208
|
+
- '*' matches any single segment (between dots)
|
|
209
|
+
- '**' matches any number of segments
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
topic: The topic to check against this route's pattern
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
True if the topic matches the pattern, False otherwise
|
|
216
|
+
|
|
217
|
+
Example:
|
|
218
|
+
>>> route = ModelDispatchRoute(
|
|
219
|
+
... route_id="test",
|
|
220
|
+
... topic_pattern="*.user.events.*",
|
|
221
|
+
... message_category=EnumMessageCategory.EVENT,
|
|
222
|
+
... dispatcher_id="dispatcher",
|
|
223
|
+
... )
|
|
224
|
+
>>> route.matches_topic("dev.user.events.v1")
|
|
225
|
+
True
|
|
226
|
+
>>> route.matches_topic("user.commands.v1")
|
|
227
|
+
False
|
|
228
|
+
"""
|
|
229
|
+
if not self.enabled:
|
|
230
|
+
return False
|
|
231
|
+
return bool(self._compiled_pattern.match(topic))
|
|
232
|
+
|
|
233
|
+
def matches(
|
|
234
|
+
self,
|
|
235
|
+
topic: str,
|
|
236
|
+
category: EnumMessageCategory,
|
|
237
|
+
message_type: str | None = None,
|
|
238
|
+
) -> bool:
|
|
239
|
+
"""
|
|
240
|
+
Check if this route matches the given topic, category, and message type.
|
|
241
|
+
|
|
242
|
+
A route matches if:
|
|
243
|
+
1. The route is enabled (checked by matches_topic)
|
|
244
|
+
2. The topic matches the pattern
|
|
245
|
+
3. The category matches
|
|
246
|
+
4. Either this route has no message_type filter, or the message types match
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
topic: The topic to check
|
|
250
|
+
category: The message category to check
|
|
251
|
+
message_type: Optional message type to check
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
True if all criteria match, False otherwise
|
|
255
|
+
|
|
256
|
+
Example:
|
|
257
|
+
>>> route = ModelDispatchRoute(
|
|
258
|
+
... route_id="test",
|
|
259
|
+
... topic_pattern="*.user.events.*",
|
|
260
|
+
... message_category=EnumMessageCategory.EVENT,
|
|
261
|
+
... message_type="UserCreatedEvent",
|
|
262
|
+
... dispatcher_id="dispatcher",
|
|
263
|
+
... )
|
|
264
|
+
>>> route.matches("dev.user.events.v1", EnumMessageCategory.EVENT, "UserCreatedEvent")
|
|
265
|
+
True
|
|
266
|
+
>>> route.matches("dev.user.events.v1", EnumMessageCategory.COMMAND, "UserCreatedEvent")
|
|
267
|
+
False
|
|
268
|
+
"""
|
|
269
|
+
# matches_topic already checks self.enabled
|
|
270
|
+
if not self.matches_topic(topic):
|
|
271
|
+
return False
|
|
272
|
+
if self.message_category != category:
|
|
273
|
+
return False
|
|
274
|
+
if self.message_type is not None and self.message_type != message_type:
|
|
275
|
+
return False
|
|
276
|
+
return True
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
__all__ = ["ModelDispatchRoute"]
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatcher Metrics Model.
|
|
5
|
+
|
|
6
|
+
Per-dispatcher metrics for dispatch engine observability. Tracks execution counts,
|
|
7
|
+
error rates, and latency statistics for individual dispatchers.
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
ModelDispatcherMetrics is a mutable data model that accumulates metrics during
|
|
11
|
+
dispatch engine operation. Unlike most ONEX models, it is NOT frozen because
|
|
12
|
+
metrics need to be updated in real-time during dispatch operations.
|
|
13
|
+
|
|
14
|
+
For thread-safety in production, the dispatch engine maintains its own
|
|
15
|
+
synchronization when updating these metrics.
|
|
16
|
+
|
|
17
|
+
Thread Safety:
|
|
18
|
+
This model is NOT thread-safe on its own. The MessageDispatchEngine provides
|
|
19
|
+
thread-safety guarantees during metrics collection.
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
>>> from omnibase_infra.models.dispatch import ModelDispatcherMetrics
|
|
23
|
+
>>>
|
|
24
|
+
>>> metrics = ModelDispatcherMetrics(dispatcher_id="user-event-dispatcher")
|
|
25
|
+
>>> metrics = metrics.record_execution(duration_ms=45.2, success=True)
|
|
26
|
+
>>> print(f"Success rate: {metrics.success_rate:.1%}")
|
|
27
|
+
|
|
28
|
+
See Also:
|
|
29
|
+
omnibase_infra.models.dispatch.ModelDispatchMetrics: Aggregate dispatch metrics
|
|
30
|
+
omnibase_core.runtime.MessageDispatchEngine: Uses these for observability
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ModelDispatcherMetrics(BaseModel):
|
|
37
|
+
"""
|
|
38
|
+
Metrics for a single dispatcher in the dispatch engine.
|
|
39
|
+
|
|
40
|
+
Tracks execution statistics including counts, error rates, and latency
|
|
41
|
+
for observability and performance monitoring.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
dispatcher_id: The dispatcher's unique identifier.
|
|
45
|
+
execution_count: Total number of times this dispatcher was executed.
|
|
46
|
+
success_count: Number of successful executions.
|
|
47
|
+
error_count: Number of failed executions.
|
|
48
|
+
total_latency_ms: Cumulative latency across all executions.
|
|
49
|
+
min_latency_ms: Minimum observed latency (-1.0 if no executions).
|
|
50
|
+
max_latency_ms: Maximum observed latency (-1.0 if no executions).
|
|
51
|
+
last_error_message: Most recent error message (empty string if none).
|
|
52
|
+
last_execution_topic: Topic of the most recent execution (empty string if none).
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
>>> metrics = ModelDispatcherMetrics(dispatcher_id="my-dispatcher")
|
|
56
|
+
>>> metrics = metrics.record_execution(duration_ms=50.0, success=True)
|
|
57
|
+
>>> metrics.avg_latency_ms
|
|
58
|
+
50.0
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
model_config = ConfigDict(
|
|
62
|
+
extra="forbid",
|
|
63
|
+
from_attributes=True,
|
|
64
|
+
validate_assignment=True,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# ---- Dispatcher Identity ----
|
|
68
|
+
dispatcher_id: str = Field(
|
|
69
|
+
...,
|
|
70
|
+
description="The dispatcher's unique identifier.",
|
|
71
|
+
min_length=1,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# ---- Execution Counts ----
|
|
75
|
+
execution_count: int = Field(
|
|
76
|
+
default=0,
|
|
77
|
+
description="Total number of times this dispatcher was executed.",
|
|
78
|
+
ge=0,
|
|
79
|
+
)
|
|
80
|
+
success_count: int = Field(
|
|
81
|
+
default=0,
|
|
82
|
+
description="Number of successful executions.",
|
|
83
|
+
ge=0,
|
|
84
|
+
)
|
|
85
|
+
error_count: int = Field(
|
|
86
|
+
default=0,
|
|
87
|
+
description="Number of failed executions.",
|
|
88
|
+
ge=0,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# ---- Latency Metrics ----
|
|
92
|
+
total_latency_ms: float = Field(
|
|
93
|
+
default=0.0,
|
|
94
|
+
description="Cumulative latency across all executions in milliseconds.",
|
|
95
|
+
ge=0,
|
|
96
|
+
)
|
|
97
|
+
min_latency_ms: float = Field(
|
|
98
|
+
default=-1.0,
|
|
99
|
+
description=(
|
|
100
|
+
"Minimum observed latency in milliseconds. "
|
|
101
|
+
"Value of -1.0 indicates no executions recorded yet."
|
|
102
|
+
),
|
|
103
|
+
)
|
|
104
|
+
max_latency_ms: float = Field(
|
|
105
|
+
default=-1.0,
|
|
106
|
+
description=(
|
|
107
|
+
"Maximum observed latency in milliseconds. "
|
|
108
|
+
"Value of -1.0 indicates no executions recorded yet."
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# ---- Last Execution Info ----
|
|
113
|
+
last_error_message: str = Field(
|
|
114
|
+
default="",
|
|
115
|
+
description=(
|
|
116
|
+
"Most recent error message. Empty string indicates no errors recorded."
|
|
117
|
+
),
|
|
118
|
+
)
|
|
119
|
+
last_execution_topic: str = Field(
|
|
120
|
+
default="",
|
|
121
|
+
description=(
|
|
122
|
+
"Topic of the most recent execution. "
|
|
123
|
+
"Empty string indicates no executions recorded yet."
|
|
124
|
+
),
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def avg_latency_ms(self) -> float:
|
|
129
|
+
"""
|
|
130
|
+
Calculate average latency across all executions.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Average latency in milliseconds, or 0.0 if no executions.
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
>>> metrics = ModelDispatcherMetrics(
|
|
137
|
+
... dispatcher_id="test",
|
|
138
|
+
... execution_count=10,
|
|
139
|
+
... total_latency_ms=500.0,
|
|
140
|
+
... )
|
|
141
|
+
>>> metrics.avg_latency_ms
|
|
142
|
+
50.0
|
|
143
|
+
"""
|
|
144
|
+
if self.execution_count == 0:
|
|
145
|
+
return 0.0
|
|
146
|
+
return self.total_latency_ms / self.execution_count
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def success_rate(self) -> float:
|
|
150
|
+
"""
|
|
151
|
+
Calculate success rate as a fraction (0.0 to 1.0).
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Success rate as a decimal, or 1.0 if no executions.
|
|
155
|
+
|
|
156
|
+
Example:
|
|
157
|
+
>>> metrics = ModelDispatcherMetrics(
|
|
158
|
+
... dispatcher_id="test",
|
|
159
|
+
... execution_count=100,
|
|
160
|
+
... success_count=95,
|
|
161
|
+
... error_count=5,
|
|
162
|
+
... )
|
|
163
|
+
>>> metrics.success_rate
|
|
164
|
+
0.95
|
|
165
|
+
"""
|
|
166
|
+
if self.execution_count == 0:
|
|
167
|
+
return 1.0
|
|
168
|
+
return self.success_count / self.execution_count
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def error_rate(self) -> float:
|
|
172
|
+
"""
|
|
173
|
+
Calculate error rate as a fraction (0.0 to 1.0).
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Error rate as a decimal, or 0.0 if no executions.
|
|
177
|
+
|
|
178
|
+
Example:
|
|
179
|
+
>>> metrics = ModelDispatcherMetrics(
|
|
180
|
+
... dispatcher_id="test",
|
|
181
|
+
... execution_count=100,
|
|
182
|
+
... error_count=5,
|
|
183
|
+
... )
|
|
184
|
+
>>> metrics.error_rate
|
|
185
|
+
0.05
|
|
186
|
+
"""
|
|
187
|
+
if self.execution_count == 0:
|
|
188
|
+
return 0.0
|
|
189
|
+
return self.error_count / self.execution_count
|
|
190
|
+
|
|
191
|
+
def record_execution(
|
|
192
|
+
self,
|
|
193
|
+
duration_ms: float,
|
|
194
|
+
success: bool,
|
|
195
|
+
topic: str | None = None,
|
|
196
|
+
error_message: str | None = None,
|
|
197
|
+
) -> "ModelDispatcherMetrics":
|
|
198
|
+
"""
|
|
199
|
+
Record an execution and return updated metrics.
|
|
200
|
+
|
|
201
|
+
Creates a new ModelDispatcherMetrics instance with updated statistics.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
duration_ms: Execution duration in milliseconds.
|
|
205
|
+
success: Whether the execution was successful.
|
|
206
|
+
topic: Optional topic the message was from.
|
|
207
|
+
error_message: Optional error message if execution failed.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
New ModelDispatcherMetrics with updated statistics.
|
|
211
|
+
|
|
212
|
+
Example:
|
|
213
|
+
>>> metrics = ModelDispatcherMetrics(dispatcher_id="test")
|
|
214
|
+
>>> metrics = metrics.record_execution(
|
|
215
|
+
... duration_ms=45.0,
|
|
216
|
+
... success=True,
|
|
217
|
+
... topic="user.events.v1",
|
|
218
|
+
... )
|
|
219
|
+
>>> metrics.execution_count
|
|
220
|
+
1
|
|
221
|
+
"""
|
|
222
|
+
# Sentinel value -1.0 means "not yet computed"
|
|
223
|
+
new_min = (
|
|
224
|
+
duration_ms
|
|
225
|
+
if self.min_latency_ms < 0
|
|
226
|
+
else min(self.min_latency_ms, duration_ms)
|
|
227
|
+
)
|
|
228
|
+
new_max = (
|
|
229
|
+
duration_ms
|
|
230
|
+
if self.max_latency_ms < 0
|
|
231
|
+
else max(self.max_latency_ms, duration_ms)
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Use model_copy to prevent field drift when new fields are added
|
|
235
|
+
return self.model_copy(
|
|
236
|
+
update={
|
|
237
|
+
"execution_count": self.execution_count + 1,
|
|
238
|
+
"success_count": self.success_count + (1 if success else 0),
|
|
239
|
+
"error_count": self.error_count + (0 if success else 1),
|
|
240
|
+
"total_latency_ms": self.total_latency_ms + duration_ms,
|
|
241
|
+
"min_latency_ms": new_min,
|
|
242
|
+
"max_latency_ms": new_max,
|
|
243
|
+
# On failure: use error_message (or empty string); on success: preserve previous
|
|
244
|
+
"last_error_message": (error_message or "")
|
|
245
|
+
if not success
|
|
246
|
+
else self.last_error_message,
|
|
247
|
+
"last_execution_topic": topic if topic else self.last_execution_topic,
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
def to_dict(self) -> dict[str, object]:
|
|
252
|
+
"""
|
|
253
|
+
Convert to dictionary with computed properties included.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Dictionary with all metrics including computed properties.
|
|
257
|
+
Values are float, int, or str types.
|
|
258
|
+
"""
|
|
259
|
+
return {
|
|
260
|
+
"dispatcher_id": self.dispatcher_id,
|
|
261
|
+
"execution_count": self.execution_count,
|
|
262
|
+
"success_count": self.success_count,
|
|
263
|
+
"error_count": self.error_count,
|
|
264
|
+
"total_latency_ms": self.total_latency_ms,
|
|
265
|
+
"avg_latency_ms": self.avg_latency_ms,
|
|
266
|
+
"min_latency_ms": self.min_latency_ms,
|
|
267
|
+
"max_latency_ms": self.max_latency_ms,
|
|
268
|
+
"success_rate": self.success_rate,
|
|
269
|
+
"error_rate": self.error_rate,
|
|
270
|
+
"last_error_message": self.last_error_message,
|
|
271
|
+
"last_execution_topic": self.last_execution_topic,
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
__all__ = ["ModelDispatcherMetrics"]
|