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,107 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Initiated Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationInitiated for the ONEX 2-way
|
|
6
|
+
registration pattern. Emitted by the Registration Orchestrator when it
|
|
7
|
+
receives a NodeIntrospected event to represent the start of a registration
|
|
8
|
+
attempt.
|
|
9
|
+
|
|
10
|
+
IMPORTANT: Timestamp fields (emitted_at) have NO default_factory (no datetime.now()).
|
|
11
|
+
This is intentional per ONEX architecture - orchestrators use injected `now` parameter
|
|
12
|
+
from RuntimeTick or dispatch context. This ensures:
|
|
13
|
+
- Deterministic testing (fixed time in tests)
|
|
14
|
+
- Consistent ordering (no clock skew between nodes)
|
|
15
|
+
- Explicit time injection (no hidden time dependencies)
|
|
16
|
+
|
|
17
|
+
See Also:
|
|
18
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from datetime import datetime
|
|
24
|
+
from uuid import UUID
|
|
25
|
+
|
|
26
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ModelNodeRegistrationInitiated(BaseModel):
|
|
30
|
+
"""Event model for registration initiation by the orchestrator.
|
|
31
|
+
|
|
32
|
+
Emitted when the orchestrator receives a NodeIntrospected event and
|
|
33
|
+
begins processing a registration attempt. This event represents the
|
|
34
|
+
start of the registration workflow without implying command-driven
|
|
35
|
+
semantics.
|
|
36
|
+
|
|
37
|
+
This is the first decision event in the registration workflow, linking
|
|
38
|
+
the NodeIntrospected trigger to subsequent orchestrator decisions.
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
entity_id: The entity identifier (equals node_id for registration domain).
|
|
42
|
+
Used as partition key for ordering guarantees.
|
|
43
|
+
node_id: Unique identifier of the node being registered.
|
|
44
|
+
correlation_id: Correlation ID for distributed tracing across the workflow.
|
|
45
|
+
causation_id: Message ID of the triggering NodeIntrospected event.
|
|
46
|
+
emitted_at: Timestamp when the orchestrator emitted this event (UTC).
|
|
47
|
+
registration_attempt_id: Unique identifier for this registration attempt.
|
|
48
|
+
Enables tracking multiple registration attempts for the same node.
|
|
49
|
+
|
|
50
|
+
Time Injection:
|
|
51
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
52
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
53
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
>>> from datetime import UTC, datetime
|
|
57
|
+
>>> from uuid import uuid4
|
|
58
|
+
>>> event = ModelNodeRegistrationInitiated(
|
|
59
|
+
... entity_id=uuid4(),
|
|
60
|
+
... node_id=uuid4(),
|
|
61
|
+
... correlation_id=uuid4(),
|
|
62
|
+
... causation_id=uuid4(),
|
|
63
|
+
... emitted_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
64
|
+
... registration_attempt_id=uuid4(),
|
|
65
|
+
... )
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
model_config = ConfigDict(
|
|
69
|
+
frozen=True,
|
|
70
|
+
extra="forbid",
|
|
71
|
+
from_attributes=True,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Entity and node identification
|
|
75
|
+
entity_id: UUID = Field(
|
|
76
|
+
...,
|
|
77
|
+
description="Entity identifier (equals node_id for registration domain)",
|
|
78
|
+
)
|
|
79
|
+
node_id: UUID = Field(
|
|
80
|
+
...,
|
|
81
|
+
description="Unique identifier of the node being registered",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Tracing and causation
|
|
85
|
+
correlation_id: UUID = Field(
|
|
86
|
+
...,
|
|
87
|
+
description="Correlation ID for distributed tracing",
|
|
88
|
+
)
|
|
89
|
+
causation_id: UUID = Field(
|
|
90
|
+
...,
|
|
91
|
+
description="Message ID of the triggering NodeIntrospected event",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
95
|
+
emitted_at: datetime = Field(
|
|
96
|
+
...,
|
|
97
|
+
description="Timestamp when the orchestrator emitted this event (UTC)",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Registration-specific
|
|
101
|
+
registration_attempt_id: UUID = Field(
|
|
102
|
+
...,
|
|
103
|
+
description="Unique identifier for this registration attempt",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
__all__ = ["ModelNodeRegistrationInitiated"]
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Registration Rejected Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeRegistrationRejected for the ONEX 2-way
|
|
6
|
+
registration pattern. Emitted by the Registration Orchestrator when it
|
|
7
|
+
rejects a node's registration request.
|
|
8
|
+
|
|
9
|
+
See Also:
|
|
10
|
+
- docs/design/ONEX_RUNTIME_REGISTRATION_TICKET_PLAN.md (C1 section)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelNodeRegistrationRejected(BaseModel):
|
|
22
|
+
"""Event model for registration rejection by the orchestrator.
|
|
23
|
+
|
|
24
|
+
Emitted when the orchestrator decides to reject a node's registration.
|
|
25
|
+
This is a terminal state for the registration attempt - the node must
|
|
26
|
+
re-introspect to attempt registration again.
|
|
27
|
+
|
|
28
|
+
Common rejection reasons include:
|
|
29
|
+
- Node version incompatibility
|
|
30
|
+
- Capability requirements not met
|
|
31
|
+
- Rate limiting exceeded
|
|
32
|
+
- Duplicate registration attempt
|
|
33
|
+
- Policy violation
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
entity_id: The entity identifier (equals node_id for registration domain).
|
|
37
|
+
Used as partition key for ordering guarantees.
|
|
38
|
+
node_id: Unique identifier of the node being rejected.
|
|
39
|
+
correlation_id: Correlation ID for distributed tracing across the workflow.
|
|
40
|
+
causation_id: Message ID of the event that triggered this decision.
|
|
41
|
+
emitted_at: Timestamp when the orchestrator emitted this event (UTC).
|
|
42
|
+
rejection_reason: Human-readable explanation for the rejection.
|
|
43
|
+
Should be safe to expose to the node (no internal details).
|
|
44
|
+
|
|
45
|
+
Time Injection:
|
|
46
|
+
The `emitted_at` field must be explicitly provided by the handler
|
|
47
|
+
using its injected `now` parameter. Do NOT use datetime.now() directly.
|
|
48
|
+
This ensures deterministic testing and consistent ordering across nodes.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
>>> from datetime import UTC, datetime
|
|
52
|
+
>>> from uuid import uuid4
|
|
53
|
+
>>> event = ModelNodeRegistrationRejected(
|
|
54
|
+
... entity_id=uuid4(),
|
|
55
|
+
... node_id=uuid4(),
|
|
56
|
+
... correlation_id=uuid4(),
|
|
57
|
+
... causation_id=uuid4(),
|
|
58
|
+
... emitted_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
59
|
+
... rejection_reason="Node version 0.9.0 is below minimum required 1.0.0",
|
|
60
|
+
... )
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
model_config = ConfigDict(
|
|
64
|
+
frozen=True,
|
|
65
|
+
extra="forbid",
|
|
66
|
+
from_attributes=True,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Entity and node identification
|
|
70
|
+
entity_id: UUID = Field(
|
|
71
|
+
...,
|
|
72
|
+
description="Entity identifier (equals node_id for registration domain)",
|
|
73
|
+
)
|
|
74
|
+
node_id: UUID = Field(
|
|
75
|
+
...,
|
|
76
|
+
description="Unique identifier of the node being rejected",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Tracing and causation
|
|
80
|
+
correlation_id: UUID = Field(
|
|
81
|
+
...,
|
|
82
|
+
description="Correlation ID for distributed tracing",
|
|
83
|
+
)
|
|
84
|
+
causation_id: UUID = Field(
|
|
85
|
+
...,
|
|
86
|
+
description="Message ID of the event that triggered this decision",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
90
|
+
emitted_at: datetime = Field(
|
|
91
|
+
...,
|
|
92
|
+
description="Timestamp when the orchestrator emitted this event (UTC)",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Rejection-specific
|
|
96
|
+
rejection_reason: str = Field(
|
|
97
|
+
...,
|
|
98
|
+
min_length=1,
|
|
99
|
+
max_length=1024,
|
|
100
|
+
description="Human-readable explanation for the rejection",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
__all__ = ["ModelNodeRegistrationRejected"]
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Introspection performance metrics model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelIntrospectionMetrics for capturing timing and
|
|
6
|
+
performance information during node introspection operations.
|
|
7
|
+
|
|
8
|
+
.. versionadded:: 0.6.0
|
|
9
|
+
Created as part of OMN-1002 Union Reduction Phase 2 to replace the
|
|
10
|
+
union pattern ``dict[str, float | bool | int | list[str]]`` with a
|
|
11
|
+
strongly-typed Pydantic model.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
>>> metrics = ModelIntrospectionMetrics(
|
|
15
|
+
... get_capabilities_ms=12.5,
|
|
16
|
+
... total_introspection_ms=45.0,
|
|
17
|
+
... method_count=15,
|
|
18
|
+
... )
|
|
19
|
+
>>> metrics.threshold_exceeded
|
|
20
|
+
False
|
|
21
|
+
>>> metrics.to_dict()
|
|
22
|
+
{'get_capabilities_ms': 12.5, ...}
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ModelIntrospectionMetrics(BaseModel):
|
|
31
|
+
"""Performance metrics for introspection operations.
|
|
32
|
+
|
|
33
|
+
This Pydantic model captures timing information for introspection operations,
|
|
34
|
+
enabling performance monitoring and alerting when operations exceed
|
|
35
|
+
the <50ms target threshold.
|
|
36
|
+
|
|
37
|
+
.. versionadded:: 0.6.0
|
|
38
|
+
Created to replace union-typed dict return from dataclass.to_dict().
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
get_capabilities_ms: Time taken by get_capabilities() in milliseconds.
|
|
42
|
+
discover_capabilities_ms: Time taken by _discover_capabilities() in ms.
|
|
43
|
+
get_endpoints_ms: Time taken by get_endpoints() in milliseconds.
|
|
44
|
+
get_current_state_ms: Time taken by get_current_state() in milliseconds.
|
|
45
|
+
total_introspection_ms: Total time for get_introspection_data() in ms.
|
|
46
|
+
cache_hit: Whether the result was served from cache.
|
|
47
|
+
method_count: Number of methods discovered during reflection.
|
|
48
|
+
threshold_exceeded: Whether any operation exceeded performance thresholds.
|
|
49
|
+
slow_operations: List of operation names that exceeded their thresholds.
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
>>> from omnibase_infra.models.registration import ModelIntrospectionMetrics
|
|
53
|
+
>>> metrics = ModelIntrospectionMetrics(
|
|
54
|
+
... get_capabilities_ms=12.5,
|
|
55
|
+
... discover_capabilities_ms=8.0,
|
|
56
|
+
... get_endpoints_ms=2.0,
|
|
57
|
+
... get_current_state_ms=1.0,
|
|
58
|
+
... total_introspection_ms=25.0,
|
|
59
|
+
... cache_hit=False,
|
|
60
|
+
... method_count=15,
|
|
61
|
+
... threshold_exceeded=False,
|
|
62
|
+
... slow_operations=[],
|
|
63
|
+
... )
|
|
64
|
+
>>> metrics.total_introspection_ms
|
|
65
|
+
25.0
|
|
66
|
+
>>> metrics.cache_hit
|
|
67
|
+
False
|
|
68
|
+
|
|
69
|
+
# Convert to dictionary for logging/serialization
|
|
70
|
+
>>> metrics_dict = metrics.to_dict()
|
|
71
|
+
>>> metrics_dict["method_count"]
|
|
72
|
+
15
|
|
73
|
+
|
|
74
|
+
# Create from existing dataclass
|
|
75
|
+
>>> from dataclasses import dataclass, field
|
|
76
|
+
>>> @dataclass
|
|
77
|
+
... class LegacyMetrics:
|
|
78
|
+
... get_capabilities_ms: float = 0.0
|
|
79
|
+
... discover_capabilities_ms: float = 0.0
|
|
80
|
+
... get_endpoints_ms: float = 0.0
|
|
81
|
+
... get_current_state_ms: float = 0.0
|
|
82
|
+
... total_introspection_ms: float = 0.0
|
|
83
|
+
... cache_hit: bool = False
|
|
84
|
+
... method_count: int = 0
|
|
85
|
+
... threshold_exceeded: bool = False
|
|
86
|
+
... slow_operations: list[str] = field(default_factory=list)
|
|
87
|
+
>>> legacy = LegacyMetrics(total_introspection_ms=30.0)
|
|
88
|
+
>>> model = ModelIntrospectionMetrics.from_dataclass(legacy)
|
|
89
|
+
>>> model.total_introspection_ms
|
|
90
|
+
30.0
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
model_config = ConfigDict(
|
|
94
|
+
frozen=True,
|
|
95
|
+
extra="forbid",
|
|
96
|
+
from_attributes=True,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Timing fields (all in milliseconds)
|
|
100
|
+
get_capabilities_ms: float = Field(
|
|
101
|
+
default=0.0,
|
|
102
|
+
ge=0.0,
|
|
103
|
+
description="Time taken by get_capabilities() in milliseconds",
|
|
104
|
+
)
|
|
105
|
+
discover_capabilities_ms: float = Field(
|
|
106
|
+
default=0.0,
|
|
107
|
+
ge=0.0,
|
|
108
|
+
description="Time taken by _discover_capabilities() in milliseconds",
|
|
109
|
+
)
|
|
110
|
+
get_endpoints_ms: float = Field(
|
|
111
|
+
default=0.0,
|
|
112
|
+
ge=0.0,
|
|
113
|
+
description="Time taken by get_endpoints() in milliseconds",
|
|
114
|
+
)
|
|
115
|
+
get_current_state_ms: float = Field(
|
|
116
|
+
default=0.0,
|
|
117
|
+
ge=0.0,
|
|
118
|
+
description="Time taken by get_current_state() in milliseconds",
|
|
119
|
+
)
|
|
120
|
+
total_introspection_ms: float = Field(
|
|
121
|
+
default=0.0,
|
|
122
|
+
ge=0.0,
|
|
123
|
+
description="Total time for get_introspection_data() in milliseconds",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Status fields
|
|
127
|
+
cache_hit: bool = Field(
|
|
128
|
+
default=False,
|
|
129
|
+
description="Whether the result was served from cache",
|
|
130
|
+
)
|
|
131
|
+
method_count: int = Field(
|
|
132
|
+
default=0,
|
|
133
|
+
ge=0,
|
|
134
|
+
description="Number of methods discovered during reflection",
|
|
135
|
+
)
|
|
136
|
+
threshold_exceeded: bool = Field(
|
|
137
|
+
default=False,
|
|
138
|
+
description="Whether any operation exceeded performance thresholds",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# Operations that exceeded thresholds
|
|
142
|
+
slow_operations: list[str] = Field(
|
|
143
|
+
default_factory=list,
|
|
144
|
+
description="List of operation names that exceeded their thresholds",
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
def to_dict(self) -> dict[str, object]:
|
|
148
|
+
"""Convert metrics to dictionary for logging/serialization.
|
|
149
|
+
|
|
150
|
+
This method provides a dictionary output for JSON serialization
|
|
151
|
+
and logging purposes. Uses ``object`` as the value type to avoid
|
|
152
|
+
union complexity while maintaining type safety.
|
|
153
|
+
|
|
154
|
+
For strongly-typed access to individual fields, use the model
|
|
155
|
+
attributes directly (e.g., ``metrics.total_introspection_ms``).
|
|
156
|
+
|
|
157
|
+
.. versionadded:: 0.6.0
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
Dictionary with all metric fields. Uses ``object`` value type
|
|
161
|
+
for simplicity; actual values are floats, bools, ints, or lists.
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
>>> metrics = ModelIntrospectionMetrics(
|
|
165
|
+
... total_introspection_ms=25.0,
|
|
166
|
+
... method_count=15,
|
|
167
|
+
... )
|
|
168
|
+
>>> d = metrics.to_dict()
|
|
169
|
+
>>> d["total_introspection_ms"]
|
|
170
|
+
25.0
|
|
171
|
+
>>> d["method_count"]
|
|
172
|
+
15
|
|
173
|
+
"""
|
|
174
|
+
return {
|
|
175
|
+
"get_capabilities_ms": self.get_capabilities_ms,
|
|
176
|
+
"discover_capabilities_ms": self.discover_capabilities_ms,
|
|
177
|
+
"get_endpoints_ms": self.get_endpoints_ms,
|
|
178
|
+
"get_current_state_ms": self.get_current_state_ms,
|
|
179
|
+
"total_introspection_ms": self.total_introspection_ms,
|
|
180
|
+
"cache_hit": self.cache_hit,
|
|
181
|
+
"method_count": self.method_count,
|
|
182
|
+
"threshold_exceeded": self.threshold_exceeded,
|
|
183
|
+
"slow_operations": list(self.slow_operations),
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@classmethod
|
|
187
|
+
def from_dataclass(cls, metrics: object) -> ModelIntrospectionMetrics:
|
|
188
|
+
"""Create ModelIntrospectionMetrics from a dataclass instance.
|
|
189
|
+
|
|
190
|
+
This factory method converts existing IntrospectionPerformanceMetrics
|
|
191
|
+
dataclass instances to the new Pydantic model, enabling gradual
|
|
192
|
+
migration without breaking existing code.
|
|
193
|
+
|
|
194
|
+
.. versionadded:: 0.6.0
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
metrics: A dataclass instance with compatible fields. Expected to have
|
|
198
|
+
the following attributes: get_capabilities_ms, discover_capabilities_ms,
|
|
199
|
+
get_endpoints_ms, get_current_state_ms, total_introspection_ms,
|
|
200
|
+
cache_hit, method_count, threshold_exceeded, slow_operations.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
A new ModelIntrospectionMetrics instance with values copied from
|
|
204
|
+
the input dataclass.
|
|
205
|
+
|
|
206
|
+
Raises:
|
|
207
|
+
pydantic.ValidationError: If any attribute has an incompatible type.
|
|
208
|
+
|
|
209
|
+
Note:
|
|
210
|
+
Missing attributes fall back to sensible defaults (0.0 / 0 / False / []),
|
|
211
|
+
making this factory tolerant of partially-populated legacy dataclasses.
|
|
212
|
+
|
|
213
|
+
Example:
|
|
214
|
+
>>> from dataclasses import dataclass, field
|
|
215
|
+
>>> @dataclass
|
|
216
|
+
... class IntrospectionPerformanceMetrics:
|
|
217
|
+
... get_capabilities_ms: float = 0.0
|
|
218
|
+
... discover_capabilities_ms: float = 0.0
|
|
219
|
+
... get_endpoints_ms: float = 0.0
|
|
220
|
+
... get_current_state_ms: float = 0.0
|
|
221
|
+
... total_introspection_ms: float = 0.0
|
|
222
|
+
... cache_hit: bool = False
|
|
223
|
+
... method_count: int = 0
|
|
224
|
+
... threshold_exceeded: bool = False
|
|
225
|
+
... slow_operations: list[str] = field(default_factory=list)
|
|
226
|
+
>>> dc = IntrospectionPerformanceMetrics(
|
|
227
|
+
... total_introspection_ms=42.0,
|
|
228
|
+
... cache_hit=True,
|
|
229
|
+
... )
|
|
230
|
+
>>> model = ModelIntrospectionMetrics.from_dataclass(dc)
|
|
231
|
+
>>> model.total_introspection_ms
|
|
232
|
+
42.0
|
|
233
|
+
>>> model.cache_hit
|
|
234
|
+
True
|
|
235
|
+
"""
|
|
236
|
+
# Extract slow_operations with defensive copy to avoid mutation
|
|
237
|
+
slow_ops = getattr(metrics, "slow_operations", [])
|
|
238
|
+
slow_ops_copy = list(slow_ops) if slow_ops else []
|
|
239
|
+
|
|
240
|
+
return cls(
|
|
241
|
+
get_capabilities_ms=getattr(metrics, "get_capabilities_ms", 0.0),
|
|
242
|
+
discover_capabilities_ms=getattr(metrics, "discover_capabilities_ms", 0.0),
|
|
243
|
+
get_endpoints_ms=getattr(metrics, "get_endpoints_ms", 0.0),
|
|
244
|
+
get_current_state_ms=getattr(metrics, "get_current_state_ms", 0.0),
|
|
245
|
+
total_introspection_ms=getattr(metrics, "total_introspection_ms", 0.0),
|
|
246
|
+
cache_hit=getattr(metrics, "cache_hit", False),
|
|
247
|
+
method_count=getattr(metrics, "method_count", 0),
|
|
248
|
+
threshold_exceeded=getattr(metrics, "threshold_exceeded", False),
|
|
249
|
+
slow_operations=slow_ops_copy,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
__all__ = ["ModelIntrospectionMetrics"]
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Capabilities Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeCapabilities for strongly-typed node capabilities
|
|
6
|
+
in the ONEX 2-way registration pattern.
|
|
7
|
+
|
|
8
|
+
Note:
|
|
9
|
+
This model does NOT use MixinDictLikeAccessors because it requires custom
|
|
10
|
+
logic to differentiate between known model fields (model_fields) and custom
|
|
11
|
+
capabilities stored in model_extra. The mixin's simple hasattr/getattr pattern
|
|
12
|
+
would not correctly handle this distinction.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
16
|
+
|
|
17
|
+
from omnibase_core.types import JsonType
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ModelNodeCapabilities(BaseModel):
|
|
21
|
+
"""Strongly-typed node capabilities model.
|
|
22
|
+
|
|
23
|
+
Uses explicit capability fields instead of generic dictionaries.
|
|
24
|
+
Uses extra="allow" to support custom capabilities while
|
|
25
|
+
providing type safety for known fields.
|
|
26
|
+
|
|
27
|
+
Known capability fields are typed explicitly. Additional custom
|
|
28
|
+
capabilities can be added via the extra="allow" config, and they
|
|
29
|
+
will be stored as model extra fields accessible via model_extra.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
postgres: Whether node has PostgreSQL capability.
|
|
33
|
+
read: Whether node has read capability.
|
|
34
|
+
write: Whether node has write capability.
|
|
35
|
+
database: Whether node has generic database capability.
|
|
36
|
+
processing: Whether node has processing capability.
|
|
37
|
+
batch_size: Optional batch size limit.
|
|
38
|
+
max_batch: Optional maximum batch size.
|
|
39
|
+
supported_types: List of supported data types.
|
|
40
|
+
routing: Whether node has routing capability.
|
|
41
|
+
config: Nested configuration dictionary (JSON-serializable values only).
|
|
42
|
+
transactions: Whether node supports transactions.
|
|
43
|
+
feature: Generic feature flag.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
>>> caps = ModelNodeCapabilities(
|
|
47
|
+
... postgres=True,
|
|
48
|
+
... read=True,
|
|
49
|
+
... write=True,
|
|
50
|
+
... )
|
|
51
|
+
>>> caps.postgres
|
|
52
|
+
True
|
|
53
|
+
|
|
54
|
+
>>> # Custom capabilities via extra="allow"
|
|
55
|
+
>>> caps = ModelNodeCapabilities(
|
|
56
|
+
... custom_capability=True, # type: ignore[call-arg]
|
|
57
|
+
... another_field="value", # type: ignore[call-arg]
|
|
58
|
+
... )
|
|
59
|
+
>>> caps.model_extra["custom_capability"]
|
|
60
|
+
True
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
model_config = ConfigDict(
|
|
64
|
+
extra="allow", # Accept additional fields not explicitly defined
|
|
65
|
+
frozen=False, # Allow updates (ModelNodeRegistration is mutable)
|
|
66
|
+
from_attributes=True,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Database capabilities
|
|
70
|
+
postgres: bool = Field(default=False, description="PostgreSQL capability")
|
|
71
|
+
read: bool = Field(default=False, description="Read capability")
|
|
72
|
+
write: bool = Field(default=False, description="Write capability")
|
|
73
|
+
database: bool = Field(default=False, description="Generic database capability")
|
|
74
|
+
transactions: bool = Field(default=False, description="Transaction support")
|
|
75
|
+
|
|
76
|
+
# Processing capabilities
|
|
77
|
+
processing: bool = Field(default=False, description="Processing capability")
|
|
78
|
+
batch_size: int | None = Field(default=None, description="Batch size limit")
|
|
79
|
+
max_batch: int | None = Field(default=None, description="Maximum batch size")
|
|
80
|
+
supported_types: list[str] = Field(
|
|
81
|
+
default_factory=list, description="Supported data types"
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Network capabilities
|
|
85
|
+
routing: bool = Field(default=False, description="Routing capability")
|
|
86
|
+
|
|
87
|
+
# Generic feature flag (used in tests)
|
|
88
|
+
feature: bool = Field(default=False, description="Generic feature flag")
|
|
89
|
+
|
|
90
|
+
# Configuration (nested) - uses JsonType for JSON-serializable values.
|
|
91
|
+
# Supports primitives (str, int, float, bool, None), lists, and nested dicts.
|
|
92
|
+
config: dict[str, JsonType] = Field(
|
|
93
|
+
default_factory=dict,
|
|
94
|
+
description="Nested configuration (JSON-serializable values)",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def __getitem__(self, key: str) -> object:
|
|
98
|
+
"""Enable dict-like access to capabilities.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
key: The capability name to retrieve.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
The capability value (from known field or model_extra).
|
|
105
|
+
|
|
106
|
+
Raises:
|
|
107
|
+
KeyError: If key is not found in known fields or model_extra.
|
|
108
|
+
|
|
109
|
+
Example:
|
|
110
|
+
>>> caps = ModelNodeCapabilities(postgres=True, custom=42)
|
|
111
|
+
>>> caps["postgres"]
|
|
112
|
+
True
|
|
113
|
+
>>> caps["custom"] # Custom capability from model_extra
|
|
114
|
+
42
|
|
115
|
+
"""
|
|
116
|
+
if key in type(self).model_fields:
|
|
117
|
+
return getattr(self, key)
|
|
118
|
+
extra = self.model_extra or {}
|
|
119
|
+
if key in extra:
|
|
120
|
+
return extra[key]
|
|
121
|
+
raise KeyError(key)
|
|
122
|
+
|
|
123
|
+
def __contains__(self, key: object) -> bool:
|
|
124
|
+
"""Enable membership testing for capabilities.
|
|
125
|
+
|
|
126
|
+
Returns True if key is a known field OR exists in model_extra.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
key: The capability name to check.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
True if the key exists as a known field or in model_extra.
|
|
133
|
+
|
|
134
|
+
Example:
|
|
135
|
+
>>> caps = ModelNodeCapabilities(postgres=True, custom=42)
|
|
136
|
+
>>> "postgres" in caps
|
|
137
|
+
True
|
|
138
|
+
>>> "custom" in caps # Custom capability in model_extra
|
|
139
|
+
True
|
|
140
|
+
>>> "unknown" in caps
|
|
141
|
+
False
|
|
142
|
+
"""
|
|
143
|
+
if not isinstance(key, str):
|
|
144
|
+
return False
|
|
145
|
+
|
|
146
|
+
# Check known fields first (access via class to avoid deprecation)
|
|
147
|
+
if key in type(self).model_fields:
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
# Check model_extra for custom capabilities
|
|
151
|
+
return bool(self.model_extra and key in self.model_extra)
|
|
152
|
+
|
|
153
|
+
def get(self, key: str, default: object = None) -> object:
|
|
154
|
+
"""Safely get a capability value with optional default.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
key: The capability name to retrieve.
|
|
158
|
+
default: Value to return if key is not found (defaults to None).
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
The capability value if found, otherwise the default value.
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
>>> caps = ModelNodeCapabilities(postgres=True)
|
|
165
|
+
>>> caps.get("postgres")
|
|
166
|
+
True
|
|
167
|
+
>>> caps.get("unknown", False)
|
|
168
|
+
False
|
|
169
|
+
>>> caps.get("unknown") # Returns None by default
|
|
170
|
+
"""
|
|
171
|
+
try:
|
|
172
|
+
return self[key]
|
|
173
|
+
except KeyError:
|
|
174
|
+
return default
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
__all__ = [
|
|
178
|
+
"ModelNodeCapabilities",
|
|
179
|
+
]
|