omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +132 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_kafka_acks.py +99 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +330 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +68 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +49 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +57 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +449 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +229 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1330 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1514 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +2033 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Descriptor Model for Filesystem Discovery.
|
|
4
|
+
|
|
5
|
+
This module provides ModelHandlerDescriptor, which represents a discovered handler
|
|
6
|
+
from a contract file. Part of OMN-1097 HandlerContractSource filesystem discovery.
|
|
7
|
+
|
|
8
|
+
The descriptor captures essential metadata about a handler discovered from a
|
|
9
|
+
handler_contract.yaml file, suitable for registration and validation.
|
|
10
|
+
|
|
11
|
+
See Also:
|
|
12
|
+
- HandlerContractSource: Source that discovers these descriptors
|
|
13
|
+
- ModelHandlerContract: Contract model from omnibase_core
|
|
14
|
+
- ModelContractDiscoveryResult: Result model with graceful error handling
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.6.2
|
|
17
|
+
Created as part of OMN-1097 filesystem handler discovery.
|
|
18
|
+
|
|
19
|
+
.. versionchanged:: 0.6.3
|
|
20
|
+
Changed version field from str to ModelSemVer for better type safety
|
|
21
|
+
and consistency with rest of codebase.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from typing import Annotated, Literal
|
|
27
|
+
|
|
28
|
+
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
|
|
29
|
+
|
|
30
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
31
|
+
from omnibase_core.types import JsonType
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _parse_version(v: ModelSemVer | str | dict[str, JsonType]) -> ModelSemVer:
|
|
35
|
+
"""Parse version input to ModelSemVer.
|
|
36
|
+
|
|
37
|
+
Accepts ModelSemVer instance, string (e.g., "1.0.0"), or dict
|
|
38
|
+
(e.g., {"major": 1, "minor": 0, "patch": 0}).
|
|
39
|
+
|
|
40
|
+
This validator enables flexible input while maintaining ModelSemVer
|
|
41
|
+
as the canonical type, supporting:
|
|
42
|
+
- Direct ModelSemVer instances (programmatic use)
|
|
43
|
+
- String versions (from YAML contract files)
|
|
44
|
+
- Dict representations (from JSON/dict sources)
|
|
45
|
+
|
|
46
|
+
Dict Validation:
|
|
47
|
+
When a dict is provided, the validator explicitly checks for:
|
|
48
|
+
1. Required keys ("major", "minor", "patch") are present
|
|
49
|
+
2. Required key values are integers (not strings or other types)
|
|
50
|
+
|
|
51
|
+
This provides clearer error messages before delegating to model_validate(),
|
|
52
|
+
rather than relying on Pydantic's generic validation errors.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
ValueError: If dict input is missing required keys (major, minor, patch),
|
|
56
|
+
or if required key values are not integers.
|
|
57
|
+
"""
|
|
58
|
+
if isinstance(v, ModelSemVer):
|
|
59
|
+
return v
|
|
60
|
+
if isinstance(v, str):
|
|
61
|
+
return ModelSemVer.parse(v)
|
|
62
|
+
if isinstance(v, dict):
|
|
63
|
+
required_keys = {"major", "minor", "patch"}
|
|
64
|
+
if not required_keys.issubset(v.keys()):
|
|
65
|
+
missing = required_keys - v.keys()
|
|
66
|
+
raise ValueError(f"Version dict missing required keys: {missing}")
|
|
67
|
+
# Validate value types before delegating to model_validate()
|
|
68
|
+
for key in required_keys:
|
|
69
|
+
value = v[key]
|
|
70
|
+
if not isinstance(value, int):
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"Version '{key}' must be an integer, "
|
|
73
|
+
f"got {type(value).__name__}: {value!r}"
|
|
74
|
+
)
|
|
75
|
+
return ModelSemVer.model_validate(v)
|
|
76
|
+
# NOTE: Return as-is for unhandled types and let Pydantic's own
|
|
77
|
+
# validation raise an appropriate error with type information.
|
|
78
|
+
return v # type: ignore[return-value] # NOTE: Pydantic validation handles unknown types
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# Annotated type for version field that accepts string, dict, or ModelSemVer
|
|
82
|
+
_VersionField = Annotated[ModelSemVer, BeforeValidator(_parse_version)]
|
|
83
|
+
|
|
84
|
+
# Type alias for valid ONEX handler kinds
|
|
85
|
+
LiteralHandlerKind = Literal["compute", "effect", "reducer", "orchestrator"]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class ModelHandlerDescriptor(BaseModel):
|
|
89
|
+
"""Handler descriptor model representing a discovered handler.
|
|
90
|
+
|
|
91
|
+
This model captures the essential metadata about a handler discovered
|
|
92
|
+
from a contract file, suitable for registration and validation.
|
|
93
|
+
|
|
94
|
+
Attributes:
|
|
95
|
+
handler_id: Unique identifier for the handler.
|
|
96
|
+
name: Human-readable name for the handler.
|
|
97
|
+
version: Semantic version (ModelSemVer). Accepts string, dict, or ModelSemVer.
|
|
98
|
+
handler_kind: Handler kind (compute, effect, reducer, orchestrator).
|
|
99
|
+
input_model: Fully qualified input model class path.
|
|
100
|
+
output_model: Fully qualified output model class path.
|
|
101
|
+
description: Optional description of the handler.
|
|
102
|
+
handler_class: Fully qualified Python class path for dynamic handler import.
|
|
103
|
+
contract_path: Path to the source contract file.
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
Create with string version (common when loading from YAML):
|
|
107
|
+
|
|
108
|
+
>>> descriptor = ModelHandlerDescriptor(
|
|
109
|
+
... handler_id="auth.handler",
|
|
110
|
+
... name="Auth Handler",
|
|
111
|
+
... version="1.0.0",
|
|
112
|
+
... handler_kind="compute",
|
|
113
|
+
... input_model="auth.models.AuthInput",
|
|
114
|
+
... output_model="auth.models.AuthOutput",
|
|
115
|
+
... )
|
|
116
|
+
>>> descriptor.version.major
|
|
117
|
+
1
|
|
118
|
+
|
|
119
|
+
Create with ModelSemVer instance:
|
|
120
|
+
|
|
121
|
+
>>> from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
122
|
+
>>> descriptor = ModelHandlerDescriptor(
|
|
123
|
+
... handler_id="auth.handler",
|
|
124
|
+
... name="Auth Handler",
|
|
125
|
+
... version=ModelSemVer(major=2, minor=1, patch=0, prerelease=("beta", 1)),
|
|
126
|
+
... handler_kind="compute",
|
|
127
|
+
... input_model="auth.models.AuthInput",
|
|
128
|
+
... output_model="auth.models.AuthOutput",
|
|
129
|
+
... )
|
|
130
|
+
>>> str(descriptor.version)
|
|
131
|
+
'2.1.0-beta.1'
|
|
132
|
+
|
|
133
|
+
.. versionadded:: 0.6.2
|
|
134
|
+
Created as part of OMN-1097 filesystem handler discovery.
|
|
135
|
+
|
|
136
|
+
.. versionchanged:: 0.6.3
|
|
137
|
+
Changed version field from str to ModelSemVer for better type safety.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
model_config = ConfigDict(
|
|
141
|
+
frozen=True,
|
|
142
|
+
extra="forbid",
|
|
143
|
+
strict=True,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
handler_id: str = Field(
|
|
147
|
+
...,
|
|
148
|
+
min_length=1,
|
|
149
|
+
description="Unique identifier for the handler",
|
|
150
|
+
)
|
|
151
|
+
name: str = Field(
|
|
152
|
+
...,
|
|
153
|
+
min_length=1,
|
|
154
|
+
description="Human-readable name for the handler",
|
|
155
|
+
)
|
|
156
|
+
version: _VersionField = Field(
|
|
157
|
+
...,
|
|
158
|
+
description="Semantic version (accepts string, dict, or ModelSemVer instance)",
|
|
159
|
+
)
|
|
160
|
+
handler_kind: LiteralHandlerKind = Field(
|
|
161
|
+
...,
|
|
162
|
+
description="Handler architectural kind (compute, effect, reducer, orchestrator)",
|
|
163
|
+
)
|
|
164
|
+
input_model: str = Field(
|
|
165
|
+
...,
|
|
166
|
+
min_length=3,
|
|
167
|
+
pattern=r"^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)+$",
|
|
168
|
+
description="Fully qualified input model class path (e.g., 'myapp.models.User')",
|
|
169
|
+
)
|
|
170
|
+
output_model: str = Field(
|
|
171
|
+
...,
|
|
172
|
+
min_length=3,
|
|
173
|
+
pattern=r"^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)+$",
|
|
174
|
+
description="Fully qualified output model class path (e.g., 'myapp.models.Result')",
|
|
175
|
+
)
|
|
176
|
+
description: str | None = Field(
|
|
177
|
+
default=None,
|
|
178
|
+
description="Optional description of the handler",
|
|
179
|
+
)
|
|
180
|
+
handler_class: str | None = Field(
|
|
181
|
+
default=None,
|
|
182
|
+
min_length=3,
|
|
183
|
+
pattern=r"^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)+$",
|
|
184
|
+
description="Fully qualified Python class path for dynamic handler import (e.g., 'omnibase_infra.handlers.handler_consul.HandlerConsul')",
|
|
185
|
+
)
|
|
186
|
+
contract_path: str | None = Field(
|
|
187
|
+
default=None,
|
|
188
|
+
description="Path to the source contract file",
|
|
189
|
+
)
|
|
190
|
+
contract_config: dict[str, JsonType] | None = Field(
|
|
191
|
+
default=None,
|
|
192
|
+
description=(
|
|
193
|
+
"Parsed configuration from the handler contract file. "
|
|
194
|
+
"Contains extracted values like security settings, tags, and handler metadata. "
|
|
195
|
+
"Populated during handler discovery when contract_path is set."
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
__all__ = ["LiteralHandlerKind", "ModelHandlerDescriptor"]
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Identifier Model for Validation Error Reporting.
|
|
4
|
+
|
|
5
|
+
This module provides ModelHandlerIdentifier for uniquely identifying handlers
|
|
6
|
+
in validation error contexts. Part of OMN-1091 structured validation and error
|
|
7
|
+
reporting for handlers.
|
|
8
|
+
|
|
9
|
+
The identifier supports multiple construction patterns:
|
|
10
|
+
- From handler_id alone (minimal identification)
|
|
11
|
+
- From node_path and handler_type (structured identification)
|
|
12
|
+
- Full context with human-readable name
|
|
13
|
+
|
|
14
|
+
This model enables precise error reporting by capturing handler identity
|
|
15
|
+
information at validation failure points.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from typing import Self
|
|
21
|
+
|
|
22
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
23
|
+
|
|
24
|
+
from omnibase_infra.enums import EnumHandlerType
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ModelHandlerIdentifier(BaseModel):
|
|
28
|
+
"""Identifies a handler for validation error reporting.
|
|
29
|
+
|
|
30
|
+
This model captures the identity and context of a handler when validation
|
|
31
|
+
errors occur, enabling precise error reporting and debugging. It supports
|
|
32
|
+
multiple levels of detail, from minimal handler_id-only identification to
|
|
33
|
+
full context with node paths and types.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
handler_id: Unique identifier for the handler (e.g., "http-handler", "db-handler").
|
|
37
|
+
This is the minimal required field for handler identification.
|
|
38
|
+
handler_type: Type of handler (EFFECT, COMPUTE, REDUCER, ORCHESTRATOR).
|
|
39
|
+
Optional, provides architectural context for the handler.
|
|
40
|
+
handler_name: Human-readable name for the handler.
|
|
41
|
+
Optional, used for display purposes in error messages.
|
|
42
|
+
node_path: Path to the node containing this handler.
|
|
43
|
+
Optional, provides location context for debugging.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
>>> # Minimal identification
|
|
47
|
+
>>> identifier = ModelHandlerIdentifier.from_handler_id("http-handler")
|
|
48
|
+
>>> identifier.handler_id
|
|
49
|
+
'http-handler'
|
|
50
|
+
|
|
51
|
+
>>> # Structured identification with type
|
|
52
|
+
>>> identifier = ModelHandlerIdentifier.from_node(
|
|
53
|
+
... node_path="nodes/registration/node.py",
|
|
54
|
+
... handler_type=EnumHandlerType.ORCHESTRATOR,
|
|
55
|
+
... )
|
|
56
|
+
>>> identifier.handler_type
|
|
57
|
+
<EnumHandlerType.ORCHESTRATOR: 'orchestrator'>
|
|
58
|
+
|
|
59
|
+
>>> # Full context
|
|
60
|
+
>>> identifier = ModelHandlerIdentifier(
|
|
61
|
+
... handler_id="registration-orchestrator",
|
|
62
|
+
... handler_type=EnumHandlerType.ORCHESTRATOR,
|
|
63
|
+
... handler_name="Registration Orchestrator",
|
|
64
|
+
... node_path="nodes/registration/node.py",
|
|
65
|
+
... )
|
|
66
|
+
|
|
67
|
+
Note:
|
|
68
|
+
This model is frozen to ensure immutability in error contexts.
|
|
69
|
+
Use factory methods for common construction patterns.
|
|
70
|
+
|
|
71
|
+
.. versionadded:: 0.6.1
|
|
72
|
+
Created as part of OMN-1091 structured validation and error reporting.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
model_config = ConfigDict(
|
|
76
|
+
frozen=True,
|
|
77
|
+
extra="forbid",
|
|
78
|
+
strict=True,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
handler_id: str = Field(
|
|
82
|
+
description="Unique identifier for the handler (e.g., 'http-handler', 'db-handler')",
|
|
83
|
+
)
|
|
84
|
+
handler_type: EnumHandlerType | None = Field(
|
|
85
|
+
default=None,
|
|
86
|
+
description="Type of handler (EFFECT, COMPUTE, REDUCER, ORCHESTRATOR)",
|
|
87
|
+
)
|
|
88
|
+
handler_name: str | None = Field(
|
|
89
|
+
default=None,
|
|
90
|
+
description="Human-readable name for the handler",
|
|
91
|
+
)
|
|
92
|
+
node_path: str | None = Field(
|
|
93
|
+
default=None,
|
|
94
|
+
description="Path to the node containing this handler",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def from_handler_id(cls, handler_id: str) -> Self:
|
|
99
|
+
"""Create identifier from handler_id alone (minimal identification).
|
|
100
|
+
|
|
101
|
+
Use this factory method when only the handler_id is available,
|
|
102
|
+
typically in contexts where detailed handler metadata is not
|
|
103
|
+
readily accessible.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
handler_id: Unique identifier for the handler.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
ModelHandlerIdentifier with only handler_id set.
|
|
110
|
+
|
|
111
|
+
Example:
|
|
112
|
+
>>> identifier = ModelHandlerIdentifier.from_handler_id("http-handler")
|
|
113
|
+
>>> identifier.handler_id
|
|
114
|
+
'http-handler'
|
|
115
|
+
>>> identifier.handler_type is None
|
|
116
|
+
True
|
|
117
|
+
|
|
118
|
+
.. versionadded:: 0.6.1
|
|
119
|
+
"""
|
|
120
|
+
return cls(handler_id=handler_id)
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def from_node(
|
|
124
|
+
cls,
|
|
125
|
+
node_path: str,
|
|
126
|
+
handler_type: EnumHandlerType,
|
|
127
|
+
handler_name: str | None = None,
|
|
128
|
+
) -> Self:
|
|
129
|
+
"""Create identifier from node path and handler type (structured identification).
|
|
130
|
+
|
|
131
|
+
Use this factory method when constructing identifiers from node context,
|
|
132
|
+
typically during contract validation or handler registration. The handler_id
|
|
133
|
+
is derived from the node path and handler type.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
node_path: Path to the node containing the handler.
|
|
137
|
+
handler_type: Type of handler (EFFECT, COMPUTE, REDUCER, ORCHESTRATOR).
|
|
138
|
+
handler_name: Optional human-readable name for the handler.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
ModelHandlerIdentifier with full context.
|
|
142
|
+
|
|
143
|
+
Example:
|
|
144
|
+
>>> identifier = ModelHandlerIdentifier.from_node(
|
|
145
|
+
... node_path="nodes/registration/node.py",
|
|
146
|
+
... handler_type=EnumHandlerType.ORCHESTRATOR,
|
|
147
|
+
... handler_name="Registration Orchestrator",
|
|
148
|
+
... )
|
|
149
|
+
>>> identifier.handler_id
|
|
150
|
+
'nodes/registration/node.py::orchestrator'
|
|
151
|
+
>>> identifier.handler_type
|
|
152
|
+
<EnumHandlerType.ORCHESTRATOR: 'orchestrator'>
|
|
153
|
+
|
|
154
|
+
Note:
|
|
155
|
+
The handler_id is constructed as "{node_path}::{handler_type.value}"
|
|
156
|
+
to provide a unique identifier that combines location and type.
|
|
157
|
+
|
|
158
|
+
.. versionadded:: 0.6.1
|
|
159
|
+
"""
|
|
160
|
+
# Derive handler_id from node_path and handler_type
|
|
161
|
+
handler_id = f"{node_path}::{handler_type.value}"
|
|
162
|
+
|
|
163
|
+
return cls(
|
|
164
|
+
handler_id=handler_id,
|
|
165
|
+
handler_type=handler_type,
|
|
166
|
+
handler_name=handler_name,
|
|
167
|
+
node_path=node_path,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def format_for_error(self) -> str:
|
|
171
|
+
"""Format identifier for inclusion in error messages.
|
|
172
|
+
|
|
173
|
+
Produces a human-readable string representation suitable for
|
|
174
|
+
error messages and logs. The format varies based on available
|
|
175
|
+
information, prioritizing readability.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Formatted string representation of the handler identifier.
|
|
179
|
+
|
|
180
|
+
Example:
|
|
181
|
+
>>> # Minimal format
|
|
182
|
+
>>> ModelHandlerIdentifier.from_handler_id("http-handler").format_for_error()
|
|
183
|
+
'handler_id=http-handler'
|
|
184
|
+
|
|
185
|
+
>>> # Full format
|
|
186
|
+
>>> identifier = ModelHandlerIdentifier(
|
|
187
|
+
... handler_id="registration-orchestrator",
|
|
188
|
+
... handler_type=EnumHandlerType.ORCHESTRATOR,
|
|
189
|
+
... handler_name="Registration Orchestrator",
|
|
190
|
+
... node_path="nodes/registration/node.py",
|
|
191
|
+
... )
|
|
192
|
+
>>> identifier.format_for_error()
|
|
193
|
+
'Registration Orchestrator (orchestrator) at nodes/registration/node.py'
|
|
194
|
+
|
|
195
|
+
.. versionadded:: 0.6.1
|
|
196
|
+
"""
|
|
197
|
+
# If we have a human-readable name, use it as the primary identifier
|
|
198
|
+
if self.handler_name:
|
|
199
|
+
parts = [self.handler_name]
|
|
200
|
+
if self.handler_type:
|
|
201
|
+
parts.append(f"({self.handler_type.value})")
|
|
202
|
+
if self.node_path:
|
|
203
|
+
parts.append(f"at {self.node_path}")
|
|
204
|
+
return " ".join(parts)
|
|
205
|
+
|
|
206
|
+
# Fall back to handler_id if no name is available
|
|
207
|
+
parts = [f"handler_id={self.handler_id}"]
|
|
208
|
+
if self.handler_type:
|
|
209
|
+
parts.append(f"type={self.handler_type.value}")
|
|
210
|
+
if self.node_path:
|
|
211
|
+
parts.append(f"path={self.node_path}")
|
|
212
|
+
return ", ".join(parts)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
__all__ = ["ModelHandlerIdentifier"]
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Source Configuration Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelHandlerSourceConfig, a Pydantic model for
|
|
6
|
+
configuring handler source mode selection at runtime.
|
|
7
|
+
|
|
8
|
+
The configuration controls how handlers are discovered and loaded:
|
|
9
|
+
- BOOTSTRAP: Hardcoded handlers from _KNOWN_HANDLERS dict (MVP mode)
|
|
10
|
+
- CONTRACT: YAML contracts from handler_contract.yaml files (production)
|
|
11
|
+
- HYBRID: Contract-first with bootstrap fallback per-handler identity
|
|
12
|
+
|
|
13
|
+
Production hardening features:
|
|
14
|
+
- Bootstrap expiry enforcement: If bootstrap_expires_at is set and now > expires_at,
|
|
15
|
+
the runtime will refuse to start in BOOTSTRAP mode (or force CONTRACT mode)
|
|
16
|
+
- Structured logging of expiry status at startup
|
|
17
|
+
- Override control for hybrid mode handler resolution
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.7.0
|
|
20
|
+
Created as part of OMN-1095 handler source mode configuration.
|
|
21
|
+
|
|
22
|
+
See Also:
|
|
23
|
+
- HANDLER_PROTOCOL_DRIVEN_ARCHITECTURE.md: Full architecture documentation
|
|
24
|
+
- EnumHandlerSourceMode: Enum defining valid source modes
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from datetime import UTC, datetime
|
|
30
|
+
|
|
31
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
32
|
+
|
|
33
|
+
from omnibase_infra.enums.enum_handler_source_mode import EnumHandlerSourceMode
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ModelHandlerSourceConfig(BaseModel):
|
|
37
|
+
"""Configuration for handler source mode selection.
|
|
38
|
+
|
|
39
|
+
Controls how handlers are discovered and loaded at runtime. This model
|
|
40
|
+
is used by RuntimeHostProcess and related components to determine the
|
|
41
|
+
handler loading strategy.
|
|
42
|
+
|
|
43
|
+
Configuration Options:
|
|
44
|
+
- handler_source_mode: Selects the loading strategy (BOOTSTRAP, CONTRACT, HYBRID)
|
|
45
|
+
- allow_bootstrap_override: Controls handler resolution in HYBRID mode
|
|
46
|
+
- bootstrap_expires_at: Production safety - forces CONTRACT after expiry
|
|
47
|
+
|
|
48
|
+
Production Hardening:
|
|
49
|
+
When bootstrap_expires_at is set and the current time exceeds it:
|
|
50
|
+
- BOOTSTRAP mode: Runtime refuses to start (safety mechanism)
|
|
51
|
+
- HYBRID mode: Bootstrap fallback disabled, contract-only resolution
|
|
52
|
+
- CONTRACT mode: No effect (already contract-only)
|
|
53
|
+
|
|
54
|
+
This prevents accidental deployment with hardcoded handlers in production.
|
|
55
|
+
|
|
56
|
+
Attributes:
|
|
57
|
+
handler_source_mode: Handler loading source mode.
|
|
58
|
+
- BOOTSTRAP: Load from hardcoded _KNOWN_HANDLERS dict (MVP)
|
|
59
|
+
- CONTRACT: Load from handler_contract.yaml files (production)
|
|
60
|
+
- HYBRID: Contract-first with bootstrap fallback per-handler identity
|
|
61
|
+
Defaults to HYBRID as recommended for gradual migration.
|
|
62
|
+
|
|
63
|
+
allow_bootstrap_override: If True, bootstrap handlers can override
|
|
64
|
+
contract handlers in HYBRID mode. Default is False, meaning
|
|
65
|
+
contract handlers take precedence (inverse of naive HYBRID).
|
|
66
|
+
Has no effect in BOOTSTRAP or CONTRACT modes.
|
|
67
|
+
When parsing from environment or config, string values "true",
|
|
68
|
+
"yes", "1", "on" (case-insensitive) are accepted as truthy.
|
|
69
|
+
|
|
70
|
+
bootstrap_expires_at: If set and expired, refuse BOOTSTRAP mode and
|
|
71
|
+
force CONTRACT. This is a production safety mechanism to ensure
|
|
72
|
+
hardcoded handlers are not accidentally deployed to production
|
|
73
|
+
after a migration deadline. Set to None to disable expiry checking.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
>>> from datetime import datetime, timezone
|
|
77
|
+
>>> from omnibase_infra.models.handlers import ModelHandlerSourceConfig
|
|
78
|
+
>>> from omnibase_infra.enums import EnumHandlerSourceMode
|
|
79
|
+
>>>
|
|
80
|
+
>>> # Production configuration (recommended)
|
|
81
|
+
>>> config = ModelHandlerSourceConfig(
|
|
82
|
+
... handler_source_mode=EnumHandlerSourceMode.CONTRACT,
|
|
83
|
+
... )
|
|
84
|
+
>>>
|
|
85
|
+
>>> # Migration configuration with safety expiry (must be timezone-aware)
|
|
86
|
+
>>> config = ModelHandlerSourceConfig(
|
|
87
|
+
... handler_source_mode=EnumHandlerSourceMode.HYBRID,
|
|
88
|
+
... bootstrap_expires_at=datetime(2025, 3, 1, 0, 0, 0, tzinfo=timezone.utc),
|
|
89
|
+
... )
|
|
90
|
+
>>>
|
|
91
|
+
>>> # Check if bootstrap is expired
|
|
92
|
+
>>> if config.is_bootstrap_expired:
|
|
93
|
+
... print("Bootstrap mode has expired - must use CONTRACT")
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
model_config = ConfigDict(
|
|
97
|
+
strict=True,
|
|
98
|
+
frozen=True,
|
|
99
|
+
extra="forbid",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
handler_source_mode: EnumHandlerSourceMode = Field(
|
|
103
|
+
default=EnumHandlerSourceMode.HYBRID,
|
|
104
|
+
description="Handler loading source mode: BOOTSTRAP, CONTRACT, or HYBRID. "
|
|
105
|
+
"Defaults to HYBRID (contract-first with bootstrap fallback).",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
allow_bootstrap_override: bool = Field(
|
|
109
|
+
default=False,
|
|
110
|
+
description=(
|
|
111
|
+
"If True, bootstrap handlers can override contract handlers in HYBRID mode. "
|
|
112
|
+
"Default is False (contract handlers take precedence). "
|
|
113
|
+
"When parsing from config, string values 'true', 'yes', '1', 'on' "
|
|
114
|
+
"(case-insensitive) are accepted as truthy."
|
|
115
|
+
),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
bootstrap_expires_at: datetime | None = Field(
|
|
119
|
+
default=None,
|
|
120
|
+
description=(
|
|
121
|
+
"If set and expired, refuse BOOTSTRAP mode and force CONTRACT. "
|
|
122
|
+
"Production safety mechanism for migration deadlines. "
|
|
123
|
+
"Must be timezone-aware (UTC recommended); naive datetimes are rejected."
|
|
124
|
+
),
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@field_validator("allow_bootstrap_override", mode="before")
|
|
128
|
+
@classmethod
|
|
129
|
+
def _coerce_allow_bootstrap_override(cls, value: object) -> bool:
|
|
130
|
+
"""Coerce string and numeric values to boolean for config file compatibility.
|
|
131
|
+
|
|
132
|
+
Environment variables and YAML/JSON config files often represent booleans
|
|
133
|
+
as strings. This validator handles common truthy string representations
|
|
134
|
+
before Pydantic's strict type validation.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
value: The raw value to coerce (may be str, bool, int, float, None, or other).
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
True if value is a truthy string ("true", "yes", "1", "on") or
|
|
141
|
+
a truthy boolean, False otherwise.
|
|
142
|
+
|
|
143
|
+
Type Handling:
|
|
144
|
+
- bool: Passed through unchanged.
|
|
145
|
+
- str: Case-insensitive check for "true", "yes", "1", "on".
|
|
146
|
+
- int/float: 0 and 0.0 are False, all other numbers are True.
|
|
147
|
+
- None: Returns False.
|
|
148
|
+
- Unknown types: Default to False for safety.
|
|
149
|
+
"""
|
|
150
|
+
if isinstance(value, bool):
|
|
151
|
+
return value
|
|
152
|
+
if isinstance(value, str):
|
|
153
|
+
return value.lower() in ("true", "yes", "1", "on")
|
|
154
|
+
if isinstance(value, (int, float)):
|
|
155
|
+
# Explicit: 0/0.0 = False, any other number = True
|
|
156
|
+
return bool(value)
|
|
157
|
+
# Unknown types default to False for safety
|
|
158
|
+
return False
|
|
159
|
+
|
|
160
|
+
@field_validator("bootstrap_expires_at")
|
|
161
|
+
@classmethod
|
|
162
|
+
def _validate_expires_at_timezone(cls, value: datetime | None) -> datetime | None:
|
|
163
|
+
"""Validate and normalize bootstrap_expires_at to UTC.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
value: The datetime value to validate.
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
None if value is None, otherwise the datetime normalized to UTC.
|
|
170
|
+
|
|
171
|
+
Raises:
|
|
172
|
+
ValueError: If the datetime is naive (no timezone info).
|
|
173
|
+
"""
|
|
174
|
+
if value is None:
|
|
175
|
+
return None
|
|
176
|
+
if value.tzinfo is None:
|
|
177
|
+
raise ValueError(
|
|
178
|
+
"bootstrap_expires_at must be timezone-aware (UTC recommended). "
|
|
179
|
+
"Use datetime.now(timezone.utc) or datetime(..., tzinfo=timezone.utc)."
|
|
180
|
+
)
|
|
181
|
+
return value.astimezone(UTC)
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def is_bootstrap_expired(self) -> bool:
|
|
185
|
+
"""Check if bootstrap mode has expired.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
True if bootstrap_expires_at is set and current time exceeds it,
|
|
189
|
+
False otherwise.
|
|
190
|
+
|
|
191
|
+
Note:
|
|
192
|
+
Uses UTC-aware comparison. The bootstrap_expires_at field is
|
|
193
|
+
validated and normalized to UTC at construction time.
|
|
194
|
+
"""
|
|
195
|
+
if self.bootstrap_expires_at is None:
|
|
196
|
+
return False
|
|
197
|
+
return datetime.now(UTC) > self.bootstrap_expires_at
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def effective_mode(self) -> EnumHandlerSourceMode:
|
|
201
|
+
"""Get the effective handler source mode after expiry check.
|
|
202
|
+
|
|
203
|
+
If bootstrap_expires_at is set and expired, returns CONTRACT
|
|
204
|
+
regardless of the configured handler_source_mode. Otherwise
|
|
205
|
+
returns the configured mode.
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
The effective handler source mode to use at runtime.
|
|
209
|
+
|
|
210
|
+
Note:
|
|
211
|
+
This property should be used by runtime components instead of
|
|
212
|
+
directly accessing handler_source_mode to ensure expiry
|
|
213
|
+
enforcement is applied.
|
|
214
|
+
"""
|
|
215
|
+
if self.is_bootstrap_expired:
|
|
216
|
+
return EnumHandlerSourceMode.CONTRACT
|
|
217
|
+
return self.handler_source_mode
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
__all__ = ["ModelHandlerSourceConfig"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Health check models for infrastructure components."""
|
|
4
|
+
|
|
5
|
+
from omnibase_infra.models.health.model_health_check_result import (
|
|
6
|
+
ModelHealthCheckResult,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
__all__ = ["ModelHealthCheckResult"]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Health Check Result Model for infrastructure components."""
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ModelHealthCheckResult(BaseModel):
|
|
9
|
+
"""Result of a health check operation on infrastructure components.
|
|
10
|
+
|
|
11
|
+
Provides standardized health check responses with typed fields
|
|
12
|
+
replacing loose dict[str, object] returns.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
healthy: Whether the component is healthy and operational.
|
|
16
|
+
reason: Human-readable explanation of the health status.
|
|
17
|
+
error_type: Exception type name if health check failed.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
model_config = ConfigDict(
|
|
21
|
+
frozen=True,
|
|
22
|
+
extra="forbid",
|
|
23
|
+
from_attributes=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
healthy: bool = Field(
|
|
27
|
+
...,
|
|
28
|
+
description="Whether the component is healthy and operational.",
|
|
29
|
+
)
|
|
30
|
+
reason: str = Field(
|
|
31
|
+
...,
|
|
32
|
+
description="Human-readable explanation of the health status.",
|
|
33
|
+
)
|
|
34
|
+
error_type: str | None = Field(
|
|
35
|
+
default=None,
|
|
36
|
+
description="Exception type name if health check failed.",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
__all__ = ["ModelHealthCheckResult"]
|