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,624 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Runtime Scheduler Configuration Model.
|
|
4
|
+
|
|
5
|
+
Provides a Pydantic configuration model for the runtime tick scheduler that emits
|
|
6
|
+
RuntimeTick events at configurable intervals. Supports environment variable overrides
|
|
7
|
+
for deployment flexibility and restart-safe behavior through sequence number tracking.
|
|
8
|
+
|
|
9
|
+
Features:
|
|
10
|
+
- Strong typing with comprehensive validation
|
|
11
|
+
- Environment variable override support with type conversion
|
|
12
|
+
- Sensible defaults for production deployment
|
|
13
|
+
- Circuit breaker configuration for publish failure resilience
|
|
14
|
+
- Restart-safe sequence number persistence
|
|
15
|
+
|
|
16
|
+
Environment Variables:
|
|
17
|
+
All environment variables are optional and fall back to defaults if not set
|
|
18
|
+
or if parsing fails. Invalid values log warnings and use defaults.
|
|
19
|
+
|
|
20
|
+
Core Settings:
|
|
21
|
+
ONEX_RUNTIME_SCHEDULER_TICK_INTERVAL_MS: Tick interval in milliseconds (integer, 10-60000)
|
|
22
|
+
Default: 1000 (1 second)
|
|
23
|
+
Example: "5000" (5 seconds)
|
|
24
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
25
|
+
|
|
26
|
+
ONEX_RUNTIME_SCHEDULER_ID: Unique scheduler identifier
|
|
27
|
+
Default: "runtime-scheduler-default"
|
|
28
|
+
Example: "runtime-scheduler-prod-1"
|
|
29
|
+
|
|
30
|
+
ONEX_RUNTIME_SCHEDULER_TICK_TOPIC: Kafka topic for publishing ticks
|
|
31
|
+
Default: "runtime.tick.v1"
|
|
32
|
+
Example: "prod.runtime.tick.v1"
|
|
33
|
+
|
|
34
|
+
Restart-Safety Settings:
|
|
35
|
+
ONEX_RUNTIME_SCHEDULER_PERSIST_SEQUENCE: Enable sequence number persistence (boolean)
|
|
36
|
+
Default: true
|
|
37
|
+
True values: "true", "1", "yes", "on" (case-insensitive)
|
|
38
|
+
False values: "false", "0", "no", "off" (case-insensitive)
|
|
39
|
+
|
|
40
|
+
ONEX_RUNTIME_SCHEDULER_SEQUENCE_KEY: Key for sequence number storage
|
|
41
|
+
Default: "runtime_scheduler_sequence"
|
|
42
|
+
Example: "scheduler_seq_prod"
|
|
43
|
+
|
|
44
|
+
Performance Settings:
|
|
45
|
+
ONEX_RUNTIME_SCHEDULER_MAX_JITTER_MS: Maximum jitter in milliseconds (integer, 0-10000)
|
|
46
|
+
Default: 100
|
|
47
|
+
Example: "50"
|
|
48
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
49
|
+
|
|
50
|
+
Circuit Breaker Settings:
|
|
51
|
+
ONEX_RUNTIME_SCHEDULER_CB_THRESHOLD: Failures before circuit opens (integer, 1-100)
|
|
52
|
+
Default: 5
|
|
53
|
+
Example: "10"
|
|
54
|
+
Warning: Logs warning if not a valid integer, uses default
|
|
55
|
+
|
|
56
|
+
ONEX_RUNTIME_SCHEDULER_CB_RESET_TIMEOUT: Reset timeout in seconds (float, 1.0-3600.0)
|
|
57
|
+
Default: 60.0
|
|
58
|
+
Example: "120.0"
|
|
59
|
+
Warning: Logs warning if not a valid float, uses default
|
|
60
|
+
|
|
61
|
+
Metrics Settings:
|
|
62
|
+
ONEX_RUNTIME_SCHEDULER_ENABLE_METRICS: Enable metrics collection (boolean)
|
|
63
|
+
Default: true
|
|
64
|
+
True values: "true", "1", "yes", "on" (case-insensitive)
|
|
65
|
+
False values: "false", "0", "no", "off" (case-insensitive)
|
|
66
|
+
|
|
67
|
+
ONEX_RUNTIME_SCHEDULER_METRICS_PREFIX: Prefix for metrics names
|
|
68
|
+
Default: "runtime_scheduler"
|
|
69
|
+
Example: "prod_runtime_scheduler"
|
|
70
|
+
|
|
71
|
+
Valkey (Redis-compatible) Settings:
|
|
72
|
+
REDIS_HOST: Valkey host for sequence number persistence
|
|
73
|
+
Default: "localhost"
|
|
74
|
+
Example: "omninode-bridge-valkey" or use REDIS_HOST env var
|
|
75
|
+
|
|
76
|
+
REDIS_PORT: Valkey port (integer, 1-65535)
|
|
77
|
+
Default: 6379
|
|
78
|
+
|
|
79
|
+
REDIS_PASSWORD: Valkey password (optional)
|
|
80
|
+
Default: None (no authentication)
|
|
81
|
+
|
|
82
|
+
ONEX_RUNTIME_SCHEDULER_VALKEY_TIMEOUT: Timeout for Valkey ops (float)
|
|
83
|
+
Default: 5.0 seconds
|
|
84
|
+
Range: 0.1-60.0
|
|
85
|
+
|
|
86
|
+
ONEX_RUNTIME_SCHEDULER_VALKEY_RETRIES: Connection retries (integer)
|
|
87
|
+
Default: 3
|
|
88
|
+
Range: 0-10
|
|
89
|
+
|
|
90
|
+
Parsing Behavior:
|
|
91
|
+
- Integer/Float fields: Logs warning and uses default if parsing fails
|
|
92
|
+
- Boolean fields: Logs warning if value not in expected set, treats as False
|
|
93
|
+
- String fields: No validation, accepts any string value
|
|
94
|
+
- All warnings include the environment variable name, invalid value, and
|
|
95
|
+
the field name that will use the default value
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
from __future__ import annotations
|
|
99
|
+
|
|
100
|
+
import logging
|
|
101
|
+
import os
|
|
102
|
+
import re
|
|
103
|
+
from uuid import uuid4
|
|
104
|
+
|
|
105
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
106
|
+
|
|
107
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
108
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
109
|
+
|
|
110
|
+
logger = logging.getLogger(__name__)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class ModelRuntimeSchedulerConfig(BaseModel):
|
|
114
|
+
"""Configuration model for the runtime tick scheduler.
|
|
115
|
+
|
|
116
|
+
Controls how frequently RuntimeTick events are emitted and provides
|
|
117
|
+
restart-safe behavior through sequence number persistence.
|
|
118
|
+
|
|
119
|
+
Attributes:
|
|
120
|
+
tick_interval_ms: Interval between ticks in milliseconds (10-60000)
|
|
121
|
+
scheduler_id: Unique identifier for this scheduler instance
|
|
122
|
+
tick_topic: Kafka topic for publishing tick events
|
|
123
|
+
persist_sequence_number: Whether to persist sequence numbers for restart safety
|
|
124
|
+
sequence_number_key: Key used for sequence number storage
|
|
125
|
+
max_tick_jitter_ms: Maximum jitter to prevent thundering herd (0-10000)
|
|
126
|
+
circuit_breaker_threshold: Failures before circuit opens (1-100)
|
|
127
|
+
circuit_breaker_reset_timeout_seconds: Reset timeout in seconds (1.0-3600.0)
|
|
128
|
+
enable_metrics: Whether to collect scheduler metrics
|
|
129
|
+
metrics_prefix: Prefix for metrics names
|
|
130
|
+
valkey_host: Valkey host for sequence number persistence
|
|
131
|
+
valkey_port: Valkey port for sequence number persistence (1-65535)
|
|
132
|
+
valkey_password: Valkey password (optional)
|
|
133
|
+
valkey_timeout_seconds: Timeout for Valkey operations (0.1-60.0)
|
|
134
|
+
valkey_connection_retries: Connection retries before fallback (0-10)
|
|
135
|
+
|
|
136
|
+
Example:
|
|
137
|
+
```python
|
|
138
|
+
# Using defaults with environment overrides
|
|
139
|
+
config = ModelRuntimeSchedulerConfig.default()
|
|
140
|
+
|
|
141
|
+
# Manual construction with custom values
|
|
142
|
+
config = ModelRuntimeSchedulerConfig(
|
|
143
|
+
tick_interval_ms=5000, # 5 seconds
|
|
144
|
+
scheduler_id="prod-scheduler-1",
|
|
145
|
+
tick_topic="prod.runtime.tick.v1",
|
|
146
|
+
)
|
|
147
|
+
```
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
model_config = ConfigDict(
|
|
151
|
+
frozen=True,
|
|
152
|
+
extra="forbid",
|
|
153
|
+
from_attributes=True,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Core scheduling configuration
|
|
157
|
+
tick_interval_ms: int = Field(
|
|
158
|
+
default=1000,
|
|
159
|
+
description="Interval between ticks in milliseconds",
|
|
160
|
+
ge=10,
|
|
161
|
+
le=60000,
|
|
162
|
+
)
|
|
163
|
+
scheduler_id: str = Field(
|
|
164
|
+
default="runtime-scheduler-default",
|
|
165
|
+
description="Unique identifier for this scheduler instance",
|
|
166
|
+
min_length=1,
|
|
167
|
+
max_length=255,
|
|
168
|
+
)
|
|
169
|
+
tick_topic: str = Field(
|
|
170
|
+
default="runtime.tick.v1",
|
|
171
|
+
description="Kafka topic for publishing tick events",
|
|
172
|
+
min_length=1,
|
|
173
|
+
max_length=255,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
# Restart-safety configuration
|
|
177
|
+
persist_sequence_number: bool = Field(
|
|
178
|
+
default=True,
|
|
179
|
+
description="Whether to persist sequence numbers for restart safety",
|
|
180
|
+
)
|
|
181
|
+
sequence_number_key: str = Field(
|
|
182
|
+
default="runtime_scheduler_sequence",
|
|
183
|
+
description="Key used for sequence number storage",
|
|
184
|
+
min_length=1,
|
|
185
|
+
max_length=255,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Performance tuning
|
|
189
|
+
max_tick_jitter_ms: int = Field(
|
|
190
|
+
default=100,
|
|
191
|
+
description="Maximum jitter in milliseconds to prevent thundering herd",
|
|
192
|
+
ge=0,
|
|
193
|
+
le=10000,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Circuit breaker configuration
|
|
197
|
+
circuit_breaker_threshold: int = Field(
|
|
198
|
+
default=5,
|
|
199
|
+
description="Number of consecutive failures before circuit opens",
|
|
200
|
+
ge=1,
|
|
201
|
+
le=100,
|
|
202
|
+
)
|
|
203
|
+
circuit_breaker_reset_timeout_seconds: float = Field(
|
|
204
|
+
default=60.0,
|
|
205
|
+
description="Seconds before circuit breaker resets to half-open state",
|
|
206
|
+
ge=1.0,
|
|
207
|
+
le=3600.0,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Metrics configuration
|
|
211
|
+
enable_metrics: bool = Field(
|
|
212
|
+
default=True,
|
|
213
|
+
description="Whether to collect scheduler metrics",
|
|
214
|
+
)
|
|
215
|
+
metrics_prefix: str = Field(
|
|
216
|
+
default="runtime_scheduler",
|
|
217
|
+
description="Prefix for metrics names",
|
|
218
|
+
min_length=1,
|
|
219
|
+
max_length=255,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Valkey (Redis-compatible) configuration for sequence number persistence
|
|
223
|
+
valkey_host: str = Field(
|
|
224
|
+
default="localhost",
|
|
225
|
+
description="Valkey host for sequence number persistence",
|
|
226
|
+
min_length=1,
|
|
227
|
+
max_length=255,
|
|
228
|
+
)
|
|
229
|
+
valkey_port: int = Field(
|
|
230
|
+
default=6379,
|
|
231
|
+
description="Valkey port for sequence number persistence",
|
|
232
|
+
ge=1,
|
|
233
|
+
le=65535,
|
|
234
|
+
)
|
|
235
|
+
valkey_password: str | None = Field(
|
|
236
|
+
default=None,
|
|
237
|
+
description="Valkey password (optional, from REDIS_PASSWORD env var)",
|
|
238
|
+
)
|
|
239
|
+
valkey_timeout_seconds: float = Field(
|
|
240
|
+
default=5.0,
|
|
241
|
+
description="Timeout for Valkey operations in seconds",
|
|
242
|
+
ge=0.1,
|
|
243
|
+
le=60.0,
|
|
244
|
+
)
|
|
245
|
+
valkey_connection_retries: int = Field(
|
|
246
|
+
default=3,
|
|
247
|
+
description="Number of connection retries before fallback",
|
|
248
|
+
ge=0,
|
|
249
|
+
le=10,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
@field_validator("scheduler_id", mode="before")
|
|
253
|
+
@classmethod
|
|
254
|
+
def validate_scheduler_id(cls, v: object) -> str:
|
|
255
|
+
"""Validate scheduler identifier.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
v: Scheduler ID value (any type before Pydantic conversion)
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Validated scheduler ID string
|
|
262
|
+
|
|
263
|
+
Raises:
|
|
264
|
+
ProtocolConfigurationError: If scheduler ID is empty, invalid type,
|
|
265
|
+
or contains invalid characters
|
|
266
|
+
"""
|
|
267
|
+
context = ModelInfraErrorContext(
|
|
268
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
269
|
+
operation="validate_config",
|
|
270
|
+
target_name="runtime_scheduler_config",
|
|
271
|
+
correlation_id=uuid4(),
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
if v is None:
|
|
275
|
+
raise ProtocolConfigurationError(
|
|
276
|
+
"scheduler_id cannot be None",
|
|
277
|
+
context=context,
|
|
278
|
+
parameter="scheduler_id",
|
|
279
|
+
value=None,
|
|
280
|
+
)
|
|
281
|
+
if not isinstance(v, str):
|
|
282
|
+
raise ProtocolConfigurationError(
|
|
283
|
+
f"scheduler_id must be a string, got {type(v).__name__}",
|
|
284
|
+
context=context,
|
|
285
|
+
parameter="scheduler_id",
|
|
286
|
+
value=type(v).__name__,
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
scheduler_id = v.strip()
|
|
290
|
+
if not scheduler_id:
|
|
291
|
+
raise ProtocolConfigurationError(
|
|
292
|
+
"scheduler_id cannot be empty",
|
|
293
|
+
context=context,
|
|
294
|
+
parameter="scheduler_id",
|
|
295
|
+
value=v,
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# Check for invalid characters (control characters, null bytes)
|
|
299
|
+
for char in scheduler_id:
|
|
300
|
+
if ord(char) < 32 or char == "\x7f":
|
|
301
|
+
raise ProtocolConfigurationError(
|
|
302
|
+
f"scheduler_id '{scheduler_id}' contains invalid control character",
|
|
303
|
+
context=context,
|
|
304
|
+
parameter="scheduler_id",
|
|
305
|
+
value=scheduler_id,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return scheduler_id
|
|
309
|
+
|
|
310
|
+
@field_validator("tick_topic", mode="before")
|
|
311
|
+
@classmethod
|
|
312
|
+
def validate_tick_topic(cls, v: object) -> str:
|
|
313
|
+
"""Validate tick topic name.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
v: Topic name value (any type before Pydantic conversion)
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
Validated topic name string
|
|
320
|
+
|
|
321
|
+
Raises:
|
|
322
|
+
ProtocolConfigurationError: If topic name is empty, invalid type,
|
|
323
|
+
or contains invalid characters
|
|
324
|
+
"""
|
|
325
|
+
context = ModelInfraErrorContext(
|
|
326
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
327
|
+
operation="validate_config",
|
|
328
|
+
target_name="runtime_scheduler_config",
|
|
329
|
+
correlation_id=uuid4(),
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
if v is None:
|
|
333
|
+
raise ProtocolConfigurationError(
|
|
334
|
+
"tick_topic cannot be None",
|
|
335
|
+
context=context,
|
|
336
|
+
parameter="tick_topic",
|
|
337
|
+
value=None,
|
|
338
|
+
)
|
|
339
|
+
if not isinstance(v, str):
|
|
340
|
+
raise ProtocolConfigurationError(
|
|
341
|
+
f"tick_topic must be a string, got {type(v).__name__}",
|
|
342
|
+
context=context,
|
|
343
|
+
parameter="tick_topic",
|
|
344
|
+
value=type(v).__name__,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
topic_name = v.strip()
|
|
348
|
+
if not topic_name:
|
|
349
|
+
raise ProtocolConfigurationError(
|
|
350
|
+
"tick_topic cannot be empty",
|
|
351
|
+
context=context,
|
|
352
|
+
parameter="tick_topic",
|
|
353
|
+
value=v,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# Kafka topic naming rules: alphanumeric, dots, underscores, hyphens
|
|
357
|
+
if not re.match(r"^[a-zA-Z0-9._-]+$", topic_name):
|
|
358
|
+
raise ProtocolConfigurationError(
|
|
359
|
+
f"tick_topic '{topic_name}' contains invalid characters. "
|
|
360
|
+
"Only alphanumeric characters, dots, underscores, and hyphens are allowed",
|
|
361
|
+
context=context,
|
|
362
|
+
parameter="tick_topic",
|
|
363
|
+
value=topic_name,
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
return topic_name
|
|
367
|
+
|
|
368
|
+
@field_validator("sequence_number_key", mode="before")
|
|
369
|
+
@classmethod
|
|
370
|
+
def validate_sequence_number_key(cls, v: object) -> str:
|
|
371
|
+
"""Validate sequence number storage key.
|
|
372
|
+
|
|
373
|
+
Args:
|
|
374
|
+
v: Key value (any type before Pydantic conversion)
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Validated key string
|
|
378
|
+
|
|
379
|
+
Raises:
|
|
380
|
+
ProtocolConfigurationError: If key is empty or invalid type
|
|
381
|
+
"""
|
|
382
|
+
context = ModelInfraErrorContext(
|
|
383
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
384
|
+
operation="validate_config",
|
|
385
|
+
target_name="runtime_scheduler_config",
|
|
386
|
+
correlation_id=uuid4(),
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
if v is None:
|
|
390
|
+
raise ProtocolConfigurationError(
|
|
391
|
+
"sequence_number_key cannot be None",
|
|
392
|
+
context=context,
|
|
393
|
+
parameter="sequence_number_key",
|
|
394
|
+
value=None,
|
|
395
|
+
)
|
|
396
|
+
if not isinstance(v, str):
|
|
397
|
+
raise ProtocolConfigurationError(
|
|
398
|
+
f"sequence_number_key must be a string, got {type(v).__name__}",
|
|
399
|
+
context=context,
|
|
400
|
+
parameter="sequence_number_key",
|
|
401
|
+
value=type(v).__name__,
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
key = v.strip()
|
|
405
|
+
if not key:
|
|
406
|
+
raise ProtocolConfigurationError(
|
|
407
|
+
"sequence_number_key cannot be empty",
|
|
408
|
+
context=context,
|
|
409
|
+
parameter="sequence_number_key",
|
|
410
|
+
value=v,
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
return key
|
|
414
|
+
|
|
415
|
+
@field_validator("metrics_prefix", mode="before")
|
|
416
|
+
@classmethod
|
|
417
|
+
def validate_metrics_prefix(cls, v: object) -> str:
|
|
418
|
+
"""Validate metrics prefix.
|
|
419
|
+
|
|
420
|
+
Args:
|
|
421
|
+
v: Prefix value (any type before Pydantic conversion)
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
Validated prefix string
|
|
425
|
+
|
|
426
|
+
Raises:
|
|
427
|
+
ProtocolConfigurationError: If prefix is empty, invalid type,
|
|
428
|
+
or contains invalid characters
|
|
429
|
+
"""
|
|
430
|
+
context = ModelInfraErrorContext(
|
|
431
|
+
transport_type=EnumInfraTransportType.KAFKA,
|
|
432
|
+
operation="validate_config",
|
|
433
|
+
target_name="runtime_scheduler_config",
|
|
434
|
+
correlation_id=uuid4(),
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
if v is None:
|
|
438
|
+
raise ProtocolConfigurationError(
|
|
439
|
+
"metrics_prefix cannot be None",
|
|
440
|
+
context=context,
|
|
441
|
+
parameter="metrics_prefix",
|
|
442
|
+
value=None,
|
|
443
|
+
)
|
|
444
|
+
if not isinstance(v, str):
|
|
445
|
+
raise ProtocolConfigurationError(
|
|
446
|
+
f"metrics_prefix must be a string, got {type(v).__name__}",
|
|
447
|
+
context=context,
|
|
448
|
+
parameter="metrics_prefix",
|
|
449
|
+
value=type(v).__name__,
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
prefix = v.strip()
|
|
453
|
+
if not prefix:
|
|
454
|
+
raise ProtocolConfigurationError(
|
|
455
|
+
"metrics_prefix cannot be empty",
|
|
456
|
+
context=context,
|
|
457
|
+
parameter="metrics_prefix",
|
|
458
|
+
value=v,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
# Metrics prefixes should be alphanumeric with underscores only
|
|
462
|
+
if not re.match(r"^[a-zA-Z][a-zA-Z0-9_]*$", prefix):
|
|
463
|
+
raise ProtocolConfigurationError(
|
|
464
|
+
f"metrics_prefix '{prefix}' is invalid. "
|
|
465
|
+
"Must start with a letter and contain only alphanumeric characters "
|
|
466
|
+
"and underscores",
|
|
467
|
+
context=context,
|
|
468
|
+
parameter="metrics_prefix",
|
|
469
|
+
value=prefix,
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
return prefix
|
|
473
|
+
|
|
474
|
+
def apply_environment_overrides(self) -> ModelRuntimeSchedulerConfig:
|
|
475
|
+
"""Apply environment variable overrides to configuration.
|
|
476
|
+
|
|
477
|
+
Environment variables are mapped as follows:
|
|
478
|
+
- ONEX_RUNTIME_SCHEDULER_TICK_INTERVAL_MS -> tick_interval_ms
|
|
479
|
+
- ONEX_RUNTIME_SCHEDULER_ID -> scheduler_id
|
|
480
|
+
- ONEX_RUNTIME_SCHEDULER_TICK_TOPIC -> tick_topic
|
|
481
|
+
- ONEX_RUNTIME_SCHEDULER_PERSIST_SEQUENCE -> persist_sequence_number
|
|
482
|
+
- ONEX_RUNTIME_SCHEDULER_SEQUENCE_KEY -> sequence_number_key
|
|
483
|
+
- ONEX_RUNTIME_SCHEDULER_MAX_JITTER_MS -> max_tick_jitter_ms
|
|
484
|
+
- ONEX_RUNTIME_SCHEDULER_CB_THRESHOLD -> circuit_breaker_threshold
|
|
485
|
+
- ONEX_RUNTIME_SCHEDULER_CB_RESET_TIMEOUT -> circuit_breaker_reset_timeout_seconds
|
|
486
|
+
- ONEX_RUNTIME_SCHEDULER_ENABLE_METRICS -> enable_metrics
|
|
487
|
+
- ONEX_RUNTIME_SCHEDULER_METRICS_PREFIX -> metrics_prefix
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
New configuration instance with environment overrides applied
|
|
491
|
+
"""
|
|
492
|
+
overrides: dict[str, object] = {}
|
|
493
|
+
|
|
494
|
+
env_mappings: dict[str, str] = {
|
|
495
|
+
"ONEX_RUNTIME_SCHEDULER_TICK_INTERVAL_MS": "tick_interval_ms",
|
|
496
|
+
"ONEX_RUNTIME_SCHEDULER_ID": "scheduler_id",
|
|
497
|
+
"ONEX_RUNTIME_SCHEDULER_TICK_TOPIC": "tick_topic",
|
|
498
|
+
"ONEX_RUNTIME_SCHEDULER_PERSIST_SEQUENCE": "persist_sequence_number",
|
|
499
|
+
"ONEX_RUNTIME_SCHEDULER_SEQUENCE_KEY": "sequence_number_key",
|
|
500
|
+
"ONEX_RUNTIME_SCHEDULER_MAX_JITTER_MS": "max_tick_jitter_ms",
|
|
501
|
+
"ONEX_RUNTIME_SCHEDULER_CB_THRESHOLD": "circuit_breaker_threshold",
|
|
502
|
+
"ONEX_RUNTIME_SCHEDULER_CB_RESET_TIMEOUT": "circuit_breaker_reset_timeout_seconds",
|
|
503
|
+
"ONEX_RUNTIME_SCHEDULER_ENABLE_METRICS": "enable_metrics",
|
|
504
|
+
"ONEX_RUNTIME_SCHEDULER_METRICS_PREFIX": "metrics_prefix",
|
|
505
|
+
# Valkey configuration from Redis environment variables
|
|
506
|
+
"REDIS_HOST": "valkey_host",
|
|
507
|
+
"REDIS_PORT": "valkey_port",
|
|
508
|
+
"REDIS_PASSWORD": "valkey_password",
|
|
509
|
+
"ONEX_RUNTIME_SCHEDULER_VALKEY_TIMEOUT": "valkey_timeout_seconds",
|
|
510
|
+
"ONEX_RUNTIME_SCHEDULER_VALKEY_RETRIES": "valkey_connection_retries",
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
# Integer fields for type conversion
|
|
514
|
+
int_fields = {
|
|
515
|
+
"tick_interval_ms",
|
|
516
|
+
"max_tick_jitter_ms",
|
|
517
|
+
"circuit_breaker_threshold",
|
|
518
|
+
"valkey_port",
|
|
519
|
+
"valkey_connection_retries",
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
# Float fields for type conversion
|
|
523
|
+
float_fields = {
|
|
524
|
+
"circuit_breaker_reset_timeout_seconds",
|
|
525
|
+
"valkey_timeout_seconds",
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
# Boolean fields for type conversion
|
|
529
|
+
bool_fields = {
|
|
530
|
+
"persist_sequence_number",
|
|
531
|
+
"enable_metrics",
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
for env_var, field_name in env_mappings.items():
|
|
535
|
+
env_value = os.environ.get(env_var)
|
|
536
|
+
if env_value is not None:
|
|
537
|
+
if field_name in int_fields:
|
|
538
|
+
try:
|
|
539
|
+
overrides[field_name] = int(env_value)
|
|
540
|
+
except ValueError:
|
|
541
|
+
logger.warning(
|
|
542
|
+
"Failed to parse integer environment variable %s='%s', "
|
|
543
|
+
"using default value for %s",
|
|
544
|
+
env_var,
|
|
545
|
+
env_value,
|
|
546
|
+
field_name,
|
|
547
|
+
)
|
|
548
|
+
continue
|
|
549
|
+
elif field_name in float_fields:
|
|
550
|
+
try:
|
|
551
|
+
overrides[field_name] = float(env_value)
|
|
552
|
+
except ValueError:
|
|
553
|
+
logger.warning(
|
|
554
|
+
"Failed to parse float environment variable %s='%s', "
|
|
555
|
+
"using default value for %s",
|
|
556
|
+
env_var,
|
|
557
|
+
env_value,
|
|
558
|
+
field_name,
|
|
559
|
+
)
|
|
560
|
+
continue
|
|
561
|
+
elif field_name in bool_fields:
|
|
562
|
+
# Boolean conversion with explicit falsy value handling
|
|
563
|
+
# True values: "true", "1", "yes", "on" (case-insensitive)
|
|
564
|
+
# False values: All other values (including "false", "0", "no", "off")
|
|
565
|
+
parsed_value = env_value.lower() in ("true", "1", "yes", "on")
|
|
566
|
+
if env_value.lower() not in (
|
|
567
|
+
"true",
|
|
568
|
+
"1",
|
|
569
|
+
"yes",
|
|
570
|
+
"on",
|
|
571
|
+
"false",
|
|
572
|
+
"0",
|
|
573
|
+
"no",
|
|
574
|
+
"off",
|
|
575
|
+
):
|
|
576
|
+
logger.warning(
|
|
577
|
+
"Boolean environment variable %s='%s' has unexpected value. "
|
|
578
|
+
"Valid values are: true/1/yes/on (True) or false/0/no/off (False). "
|
|
579
|
+
"Treating as False.",
|
|
580
|
+
env_var,
|
|
581
|
+
env_value,
|
|
582
|
+
)
|
|
583
|
+
overrides[field_name] = parsed_value
|
|
584
|
+
else:
|
|
585
|
+
overrides[field_name] = env_value
|
|
586
|
+
|
|
587
|
+
if overrides:
|
|
588
|
+
current_data = self.model_dump()
|
|
589
|
+
current_data.update(overrides)
|
|
590
|
+
return ModelRuntimeSchedulerConfig(**current_data)
|
|
591
|
+
|
|
592
|
+
return self
|
|
593
|
+
|
|
594
|
+
@classmethod
|
|
595
|
+
def default(cls) -> ModelRuntimeSchedulerConfig:
|
|
596
|
+
"""Create default configuration with environment overrides.
|
|
597
|
+
|
|
598
|
+
Returns a canonical default configuration for development, testing,
|
|
599
|
+
and CLI fallback use, with environment variable overrides applied.
|
|
600
|
+
|
|
601
|
+
Returns:
|
|
602
|
+
Default configuration instance with environment overrides
|
|
603
|
+
"""
|
|
604
|
+
base_config = cls(
|
|
605
|
+
tick_interval_ms=1000,
|
|
606
|
+
scheduler_id="runtime-scheduler-default",
|
|
607
|
+
tick_topic="runtime.tick.v1",
|
|
608
|
+
persist_sequence_number=True,
|
|
609
|
+
sequence_number_key="runtime_scheduler_sequence",
|
|
610
|
+
max_tick_jitter_ms=100,
|
|
611
|
+
circuit_breaker_threshold=5,
|
|
612
|
+
circuit_breaker_reset_timeout_seconds=60.0,
|
|
613
|
+
enable_metrics=True,
|
|
614
|
+
metrics_prefix="runtime_scheduler",
|
|
615
|
+
valkey_host="localhost",
|
|
616
|
+
valkey_port=6379,
|
|
617
|
+
valkey_password=None,
|
|
618
|
+
valkey_timeout_seconds=5.0,
|
|
619
|
+
valkey_connection_retries=3,
|
|
620
|
+
)
|
|
621
|
+
return base_config.apply_environment_overrides()
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
__all__: list[str] = ["ModelRuntimeSchedulerConfig"]
|