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,190 @@
|
|
|
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 __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
18
|
+
|
|
19
|
+
from omnibase_core.types import JsonType
|
|
20
|
+
from omnibase_infra.models.mcp.model_mcp_contract_config import ModelMCPContractConfig
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelNodeCapabilities(BaseModel):
|
|
24
|
+
"""Strongly-typed node capabilities model.
|
|
25
|
+
|
|
26
|
+
Uses explicit capability fields instead of generic dictionaries.
|
|
27
|
+
Uses extra="allow" to support custom capabilities while
|
|
28
|
+
providing type safety for known fields.
|
|
29
|
+
|
|
30
|
+
Known capability fields are typed explicitly. Additional custom
|
|
31
|
+
capabilities can be added via the extra="allow" config, and they
|
|
32
|
+
will be stored as model extra fields accessible via model_extra.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
postgres: Whether node has PostgreSQL capability.
|
|
36
|
+
read: Whether node has read capability.
|
|
37
|
+
write: Whether node has write capability.
|
|
38
|
+
database: Whether node has generic database capability.
|
|
39
|
+
processing: Whether node has processing capability.
|
|
40
|
+
batch_size: Optional batch size limit.
|
|
41
|
+
max_batch: Optional maximum batch size.
|
|
42
|
+
supported_types: List of supported data types.
|
|
43
|
+
routing: Whether node has routing capability.
|
|
44
|
+
config: Nested configuration dictionary (JSON-serializable values only).
|
|
45
|
+
transactions: Whether node supports transactions.
|
|
46
|
+
feature: Generic feature flag.
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
>>> caps = ModelNodeCapabilities(
|
|
50
|
+
... postgres=True,
|
|
51
|
+
... read=True,
|
|
52
|
+
... write=True,
|
|
53
|
+
... )
|
|
54
|
+
>>> caps.postgres
|
|
55
|
+
True
|
|
56
|
+
|
|
57
|
+
>>> # Custom capabilities via extra="allow"
|
|
58
|
+
>>> caps = ModelNodeCapabilities(
|
|
59
|
+
... custom_capability=True, # type: ignore[call-arg]
|
|
60
|
+
... another_field="value", # type: ignore[call-arg]
|
|
61
|
+
... )
|
|
62
|
+
>>> caps.model_extra["custom_capability"]
|
|
63
|
+
True
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
model_config = ConfigDict(
|
|
67
|
+
extra="allow", # Accept additional fields not explicitly defined
|
|
68
|
+
frozen=False, # Allow updates (ModelNodeRegistration is mutable)
|
|
69
|
+
from_attributes=True,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Database capabilities
|
|
73
|
+
postgres: bool = Field(default=False, description="PostgreSQL capability")
|
|
74
|
+
read: bool = Field(default=False, description="Read capability")
|
|
75
|
+
write: bool = Field(default=False, description="Write capability")
|
|
76
|
+
database: bool = Field(default=False, description="Generic database capability")
|
|
77
|
+
transactions: bool = Field(default=False, description="Transaction support")
|
|
78
|
+
|
|
79
|
+
# Processing capabilities
|
|
80
|
+
processing: bool = Field(default=False, description="Processing capability")
|
|
81
|
+
batch_size: int | None = Field(default=None, description="Batch size limit")
|
|
82
|
+
max_batch: int | None = Field(default=None, description="Maximum batch size")
|
|
83
|
+
supported_types: list[str] = Field(
|
|
84
|
+
default_factory=list, description="Supported data types"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Network capabilities
|
|
88
|
+
routing: bool = Field(default=False, description="Routing capability")
|
|
89
|
+
|
|
90
|
+
# Generic feature flag (used in tests)
|
|
91
|
+
feature: bool = Field(default=False, description="Generic feature flag")
|
|
92
|
+
|
|
93
|
+
# Configuration (nested) - uses JsonType for JSON-serializable values.
|
|
94
|
+
# Supports primitives (str, int, float, bool, None), lists, and nested dicts.
|
|
95
|
+
config: dict[str, JsonType] = Field(
|
|
96
|
+
default_factory=dict,
|
|
97
|
+
description="Nested configuration (JSON-serializable values)",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# MCP configuration for exposing node as AI agent tool
|
|
101
|
+
# Only valid for ORCHESTRATOR nodes - ignored for other node types
|
|
102
|
+
mcp: ModelMCPContractConfig | None = Field(
|
|
103
|
+
default=None,
|
|
104
|
+
description="MCP configuration for exposing node as AI agent tool. "
|
|
105
|
+
"Only valid for ORCHESTRATOR_GENERIC nodes.",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def __getitem__(self, key: str) -> object:
|
|
109
|
+
"""Enable dict-like access to capabilities.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
key: The capability name to retrieve.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
The capability value (from known field or model_extra).
|
|
116
|
+
|
|
117
|
+
Raises:
|
|
118
|
+
KeyError: If key is not found in known fields or model_extra.
|
|
119
|
+
|
|
120
|
+
Example:
|
|
121
|
+
>>> caps = ModelNodeCapabilities(postgres=True, custom=42)
|
|
122
|
+
>>> caps["postgres"]
|
|
123
|
+
True
|
|
124
|
+
>>> caps["custom"] # Custom capability from model_extra
|
|
125
|
+
42
|
|
126
|
+
"""
|
|
127
|
+
if key in type(self).model_fields:
|
|
128
|
+
return getattr(self, key)
|
|
129
|
+
extra = self.model_extra or {}
|
|
130
|
+
if key in extra:
|
|
131
|
+
return extra[key]
|
|
132
|
+
raise KeyError(key)
|
|
133
|
+
|
|
134
|
+
def __contains__(self, key: object) -> bool:
|
|
135
|
+
"""Enable membership testing for capabilities.
|
|
136
|
+
|
|
137
|
+
Returns True if key is a known field OR exists in model_extra.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
key: The capability name to check.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
True if the key exists as a known field or in model_extra.
|
|
144
|
+
|
|
145
|
+
Example:
|
|
146
|
+
>>> caps = ModelNodeCapabilities(postgres=True, custom=42)
|
|
147
|
+
>>> "postgres" in caps
|
|
148
|
+
True
|
|
149
|
+
>>> "custom" in caps # Custom capability in model_extra
|
|
150
|
+
True
|
|
151
|
+
>>> "unknown" in caps
|
|
152
|
+
False
|
|
153
|
+
"""
|
|
154
|
+
if not isinstance(key, str):
|
|
155
|
+
return False
|
|
156
|
+
|
|
157
|
+
# Check known fields first (access via class to avoid deprecation)
|
|
158
|
+
if key in type(self).model_fields:
|
|
159
|
+
return True
|
|
160
|
+
|
|
161
|
+
# Check model_extra for custom capabilities
|
|
162
|
+
return bool(self.model_extra and key in self.model_extra)
|
|
163
|
+
|
|
164
|
+
def get(self, key: str, default: object = None) -> object:
|
|
165
|
+
"""Safely get a capability value with optional default.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
key: The capability name to retrieve.
|
|
169
|
+
default: Value to return if key is not found (defaults to None).
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
The capability value if found, otherwise the default value.
|
|
173
|
+
|
|
174
|
+
Example:
|
|
175
|
+
>>> caps = ModelNodeCapabilities(postgres=True)
|
|
176
|
+
>>> caps.get("postgres")
|
|
177
|
+
True
|
|
178
|
+
>>> caps.get("unknown", False)
|
|
179
|
+
False
|
|
180
|
+
>>> caps.get("unknown") # Returns None by default
|
|
181
|
+
"""
|
|
182
|
+
try:
|
|
183
|
+
return self[key]
|
|
184
|
+
except KeyError:
|
|
185
|
+
return default
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
__all__ = [
|
|
189
|
+
"ModelNodeCapabilities",
|
|
190
|
+
]
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Event Bus Configuration Model.
|
|
4
|
+
|
|
5
|
+
This module provides the model for a node's resolved event bus configuration,
|
|
6
|
+
containing lists of topics the node subscribes to and publishes to.
|
|
7
|
+
|
|
8
|
+
Key Design Decisions:
|
|
9
|
+
1. Topics stored as environment-qualified strings (e.g., "dev.onex.evt.intent-classified.v1")
|
|
10
|
+
2. Metadata fields are tooling-only; routing uses ONLY topic strings
|
|
11
|
+
3. Property methods extract topic strings only for routing lookups
|
|
12
|
+
4. Model is frozen (immutable) with extra="forbid" for safety
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
>>> from omnibase_infra.models.registration import (
|
|
16
|
+
... ModelEventBusTopicEntry,
|
|
17
|
+
... ModelNodeEventBusConfig,
|
|
18
|
+
... )
|
|
19
|
+
>>> entry = ModelEventBusTopicEntry(
|
|
20
|
+
... topic="dev.onex.evt.intent-classified.v1",
|
|
21
|
+
... event_type="ModelIntentClassified",
|
|
22
|
+
... )
|
|
23
|
+
>>> config = ModelNodeEventBusConfig(subscribe_topics=[entry])
|
|
24
|
+
>>> config.subscribe_topic_strings
|
|
25
|
+
['dev.onex.evt.intent-classified.v1']
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
31
|
+
|
|
32
|
+
from omnibase_infra.models.registration.model_event_bus_topic_entry import (
|
|
33
|
+
ModelEventBusTopicEntry,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ModelNodeEventBusConfig(BaseModel):
|
|
38
|
+
"""Resolved event bus configuration for registry storage.
|
|
39
|
+
|
|
40
|
+
This model holds the resolved, environment-qualified topic strings
|
|
41
|
+
that a node subscribes to and publishes to. It is designed for
|
|
42
|
+
storage in the registry to enable dynamic topic-based routing.
|
|
43
|
+
|
|
44
|
+
The property methods (subscribe_topic_strings, publish_topic_strings)
|
|
45
|
+
extract only the topic strings for routing lookups, ignoring all
|
|
46
|
+
metadata fields.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
subscribe_topics: List of topics the node subscribes to.
|
|
50
|
+
publish_topics: List of topics the node publishes to.
|
|
51
|
+
|
|
52
|
+
Example:
|
|
53
|
+
>>> config = ModelNodeEventBusConfig(
|
|
54
|
+
... subscribe_topics=[
|
|
55
|
+
... ModelEventBusTopicEntry(topic="dev.onex.evt.input.v1"),
|
|
56
|
+
... ],
|
|
57
|
+
... publish_topics=[
|
|
58
|
+
... ModelEventBusTopicEntry(topic="dev.onex.evt.output.v1"),
|
|
59
|
+
... ],
|
|
60
|
+
... )
|
|
61
|
+
>>> config.subscribe_topic_strings
|
|
62
|
+
['dev.onex.evt.input.v1']
|
|
63
|
+
>>> config.publish_topic_strings
|
|
64
|
+
['dev.onex.evt.output.v1']
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
68
|
+
|
|
69
|
+
subscribe_topics: list[ModelEventBusTopicEntry] = Field(
|
|
70
|
+
default_factory=list,
|
|
71
|
+
description="List of topics the node subscribes to.",
|
|
72
|
+
)
|
|
73
|
+
publish_topics: list[ModelEventBusTopicEntry] = Field(
|
|
74
|
+
default_factory=list,
|
|
75
|
+
description="List of topics the node publishes to.",
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def subscribe_topic_strings(self) -> list[str]:
|
|
80
|
+
"""Extract topic strings only, for routing lookups.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
List of environment-qualified topic strings from subscribe_topics.
|
|
84
|
+
Metadata fields are ignored.
|
|
85
|
+
"""
|
|
86
|
+
return [entry.topic for entry in self.subscribe_topics]
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def publish_topic_strings(self) -> list[str]:
|
|
90
|
+
"""Extract topic strings only, for routing lookups.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
List of environment-qualified topic strings from publish_topics.
|
|
94
|
+
Metadata fields are ignored.
|
|
95
|
+
"""
|
|
96
|
+
return [entry.topic for entry in self.publish_topics]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
__all__ = ["ModelNodeEventBusConfig"]
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Heartbeat Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeHeartbeatEvent for periodic node heartbeat broadcasts
|
|
6
|
+
in the ONEX 2-way registration pattern.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from uuid import UUID
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
15
|
+
|
|
16
|
+
from omnibase_core.enums import EnumNodeKind
|
|
17
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
18
|
+
from omnibase_infra.utils import validate_timezone_aware_datetime
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ModelNodeHeartbeatEvent(BaseModel):
|
|
22
|
+
"""Event model for periodic node heartbeat broadcasts.
|
|
23
|
+
|
|
24
|
+
Nodes publish this event periodically to indicate they are alive and
|
|
25
|
+
report current health metrics. Used by the Registry node to detect
|
|
26
|
+
node failures and track resource usage.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
node_id: Node identifier.
|
|
30
|
+
node_type: ONEX node type (EnumNodeKind).
|
|
31
|
+
node_version: Semantic version of the node emitting this event.
|
|
32
|
+
uptime_seconds: Node uptime in seconds (must be >= 0).
|
|
33
|
+
active_operations_count: Number of active operations (must be >= 0).
|
|
34
|
+
memory_usage_mb: Optional memory usage in megabytes.
|
|
35
|
+
cpu_usage_percent: Optional CPU usage percentage (0-100).
|
|
36
|
+
correlation_id: Request correlation ID for tracing.
|
|
37
|
+
timestamp: Event timestamp.
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
>>> from datetime import UTC, datetime
|
|
41
|
+
>>> from uuid import uuid4
|
|
42
|
+
>>> from omnibase_core.enums import EnumNodeKind
|
|
43
|
+
>>> from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
44
|
+
>>> event = ModelNodeHeartbeatEvent(
|
|
45
|
+
... node_id=uuid4(),
|
|
46
|
+
... node_type=EnumNodeKind.EFFECT,
|
|
47
|
+
... node_version=ModelSemVer(major=1, minor=2, patch=3),
|
|
48
|
+
... uptime_seconds=3600.5,
|
|
49
|
+
... active_operations_count=5,
|
|
50
|
+
... memory_usage_mb=256.0,
|
|
51
|
+
... cpu_usage_percent=15.5,
|
|
52
|
+
... timestamp=datetime(2025, 1, 15, 12, 0, 0, tzinfo=UTC),
|
|
53
|
+
... )
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
model_config = ConfigDict(
|
|
57
|
+
frozen=True,
|
|
58
|
+
extra="forbid",
|
|
59
|
+
from_attributes=True,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Required fields
|
|
63
|
+
node_id: UUID = Field(..., description="Node identifier")
|
|
64
|
+
# Design Note: node_type uses EnumNodeKind for type consistency across the codebase.
|
|
65
|
+
# This aligns with ModelNodeIntrospectionEvent which also uses EnumNodeKind, ensuring
|
|
66
|
+
# consistent type handling for all node-related events. The previous relaxed `str`
|
|
67
|
+
# validation was speculative support for experimental/plugin nodes that never existed.
|
|
68
|
+
node_type: EnumNodeKind = Field(..., description="ONEX node type")
|
|
69
|
+
node_version: ModelSemVer = Field(
|
|
70
|
+
default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
|
|
71
|
+
description="Semantic version of the node emitting this event",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
@field_validator("node_version", mode="before")
|
|
75
|
+
@classmethod
|
|
76
|
+
def parse_node_version(cls, v: ModelSemVer | str) -> ModelSemVer:
|
|
77
|
+
"""Parse node_version from string or ModelSemVer.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
v: Either a ModelSemVer instance or a semver string.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Validated ModelSemVer instance.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
ValueError: If the string is not a valid semantic version.
|
|
87
|
+
"""
|
|
88
|
+
if isinstance(v, str):
|
|
89
|
+
try:
|
|
90
|
+
return ModelSemVer.parse(v)
|
|
91
|
+
except Exception as e:
|
|
92
|
+
raise ValueError(f"node_version: {e!s}") from e
|
|
93
|
+
return v
|
|
94
|
+
|
|
95
|
+
# Health metrics
|
|
96
|
+
uptime_seconds: float = Field(..., ge=0, description="Node uptime in seconds")
|
|
97
|
+
active_operations_count: int = Field(
|
|
98
|
+
default=0, ge=0, description="Number of active operations"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Resource usage (optional)
|
|
102
|
+
memory_usage_mb: float | None = Field(
|
|
103
|
+
default=None, ge=0, description="Memory usage in megabytes"
|
|
104
|
+
)
|
|
105
|
+
cpu_usage_percent: float | None = Field(
|
|
106
|
+
default=None, ge=0, le=100, description="CPU usage percentage (0-100)"
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# Metadata
|
|
110
|
+
correlation_id: UUID | None = Field(
|
|
111
|
+
default=None, description="Request correlation ID for tracing"
|
|
112
|
+
)
|
|
113
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
114
|
+
timestamp: datetime = Field(..., description="Event timestamp")
|
|
115
|
+
|
|
116
|
+
@field_validator("timestamp")
|
|
117
|
+
@classmethod
|
|
118
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
119
|
+
"""Validate that timestamp is timezone-aware.
|
|
120
|
+
|
|
121
|
+
Delegates to shared utility for consistent validation across all models.
|
|
122
|
+
"""
|
|
123
|
+
return validate_timezone_aware_datetime(v)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
__all__ = ["ModelNodeHeartbeatEvent"]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Unified Node Introspection Event Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeIntrospectionEvent for node introspection broadcasts
|
|
6
|
+
in the ONEX registration and discovery patterns.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from uuid import UUID
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
15
|
+
|
|
16
|
+
from omnibase_core.enums import EnumNodeKind
|
|
17
|
+
from omnibase_core.models.capabilities import ModelContractCapabilities
|
|
18
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
19
|
+
from omnibase_infra.enums import EnumIntrospectionReason
|
|
20
|
+
from omnibase_infra.models.discovery.model_discovered_capabilities import (
|
|
21
|
+
ModelDiscoveredCapabilities,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.models.discovery.model_introspection_performance_metrics import (
|
|
24
|
+
ModelIntrospectionPerformanceMetrics,
|
|
25
|
+
)
|
|
26
|
+
from omnibase_infra.models.registration.model_node_capabilities import (
|
|
27
|
+
ModelNodeCapabilities,
|
|
28
|
+
)
|
|
29
|
+
from omnibase_infra.models.registration.model_node_event_bus_config import (
|
|
30
|
+
ModelNodeEventBusConfig,
|
|
31
|
+
)
|
|
32
|
+
from omnibase_infra.models.registration.model_node_metadata import ModelNodeMetadata
|
|
33
|
+
from omnibase_infra.utils import (
|
|
34
|
+
validate_endpoint_urls_dict,
|
|
35
|
+
validate_timezone_aware_datetime,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ModelNodeIntrospectionEvent(BaseModel):
|
|
40
|
+
"""Unified event model for node introspection broadcasts.
|
|
41
|
+
|
|
42
|
+
Nodes publish this event to announce their presence, capabilities,
|
|
43
|
+
and endpoints to the cluster. Used by the Registry node to maintain
|
|
44
|
+
a live catalog of available nodes and by introspection for service discovery.
|
|
45
|
+
|
|
46
|
+
This model co-locates both declared capabilities (from contract) and
|
|
47
|
+
discovered capabilities (from reflection) - they are NOT unified as they
|
|
48
|
+
represent fundamentally different data.
|
|
49
|
+
|
|
50
|
+
Attributes:
|
|
51
|
+
node_id: Unique node identifier.
|
|
52
|
+
node_type: ONEX node type (EFFECT, COMPUTE, REDUCER, ORCHESTRATOR).
|
|
53
|
+
node_version: Semantic version of the node.
|
|
54
|
+
declared_capabilities: Contract-declared capabilities (feature flags).
|
|
55
|
+
discovered_capabilities: Runtime-discovered capabilities (reflection).
|
|
56
|
+
contract_capabilities: Contract-derived capabilities (design-time truth).
|
|
57
|
+
Populated from the node's contract when available, None otherwise.
|
|
58
|
+
endpoints: Dictionary of exposed endpoints (name -> URL).
|
|
59
|
+
current_state: Current FSM state if the node has state management.
|
|
60
|
+
reason: Why this introspection event was emitted.
|
|
61
|
+
correlation_id: Required correlation ID for tracing and idempotency.
|
|
62
|
+
timestamp: Event timestamp (must be timezone-aware).
|
|
63
|
+
node_role: Optional role descriptor (registry, adapter, etc).
|
|
64
|
+
metadata: Additional node metadata.
|
|
65
|
+
network_id: Network/cluster identifier.
|
|
66
|
+
deployment_id: Deployment/release identifier.
|
|
67
|
+
epoch: Registration epoch for ordering.
|
|
68
|
+
performance_metrics: Optional metrics from introspection operation.
|
|
69
|
+
event_bus: Resolved event bus topic configuration for registry-driven routing.
|
|
70
|
+
If None, node is NOT included in dynamic topic routing lookups.
|
|
71
|
+
|
|
72
|
+
Example:
|
|
73
|
+
>>> from uuid import uuid4
|
|
74
|
+
>>> from datetime import datetime, timezone
|
|
75
|
+
>>> from omnibase_core.enums import EnumNodeKind
|
|
76
|
+
>>> from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
77
|
+
>>> event = ModelNodeIntrospectionEvent(
|
|
78
|
+
... node_id=uuid4(),
|
|
79
|
+
... node_type=EnumNodeKind.EFFECT,
|
|
80
|
+
... node_version=ModelSemVer(major=1, minor=2, patch=3),
|
|
81
|
+
... correlation_id=uuid4(),
|
|
82
|
+
... timestamp=datetime.now(timezone.utc),
|
|
83
|
+
... )
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
model_config = ConfigDict(
|
|
87
|
+
frozen=True,
|
|
88
|
+
extra="forbid",
|
|
89
|
+
from_attributes=True,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Core identity (required, strongly typed)
|
|
93
|
+
node_id: UUID = Field(..., description="Unique node identifier")
|
|
94
|
+
node_type: EnumNodeKind = Field(..., description="ONEX node type")
|
|
95
|
+
node_version: ModelSemVer = Field(
|
|
96
|
+
default_factory=lambda: ModelSemVer(major=1, minor=0, patch=0),
|
|
97
|
+
description="Semantic version of the node",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Co-located capabilities (different purposes, different structures)
|
|
101
|
+
declared_capabilities: ModelNodeCapabilities = Field(
|
|
102
|
+
default_factory=ModelNodeCapabilities,
|
|
103
|
+
description="Node-declared capabilities from contract (feature flags)",
|
|
104
|
+
)
|
|
105
|
+
discovered_capabilities: ModelDiscoveredCapabilities = Field(
|
|
106
|
+
default_factory=ModelDiscoveredCapabilities,
|
|
107
|
+
description="Capabilities discovered via runtime reflection",
|
|
108
|
+
)
|
|
109
|
+
contract_capabilities: ModelContractCapabilities | None = Field(
|
|
110
|
+
default=None,
|
|
111
|
+
description="Contract-derived capabilities (design-time truth, deterministic). "
|
|
112
|
+
"Populated by ContractCapabilityExtractor from the node's contract. "
|
|
113
|
+
"None when contract is not available or extraction fails.",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Endpoints and state
|
|
117
|
+
endpoints: dict[str, str] = Field(
|
|
118
|
+
default_factory=dict,
|
|
119
|
+
description="Exposed endpoints (name -> URL)",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
@field_validator("endpoints")
|
|
123
|
+
@classmethod
|
|
124
|
+
def validate_endpoint_urls(cls, v: dict[str, str]) -> dict[str, str]:
|
|
125
|
+
"""Validate that all endpoint values are valid URLs.
|
|
126
|
+
|
|
127
|
+
Delegates to shared utility for consistent validation across all models.
|
|
128
|
+
"""
|
|
129
|
+
return validate_endpoint_urls_dict(v)
|
|
130
|
+
|
|
131
|
+
current_state: str | None = Field(
|
|
132
|
+
default=None,
|
|
133
|
+
description="Current FSM state if node has state management",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Event metadata (strongly typed)
|
|
137
|
+
reason: EnumIntrospectionReason = Field(
|
|
138
|
+
default=EnumIntrospectionReason.STARTUP,
|
|
139
|
+
description="Why this introspection event was emitted",
|
|
140
|
+
)
|
|
141
|
+
correlation_id: UUID = Field(
|
|
142
|
+
...,
|
|
143
|
+
description="Request correlation ID for tracing (required for idempotency)",
|
|
144
|
+
)
|
|
145
|
+
timestamp: datetime = Field(
|
|
146
|
+
...,
|
|
147
|
+
description="Event timestamp (must be timezone-aware)",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
@field_validator("timestamp")
|
|
151
|
+
@classmethod
|
|
152
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
153
|
+
"""Validate that timestamp is timezone-aware.
|
|
154
|
+
|
|
155
|
+
Delegates to shared utility for consistent validation across all models.
|
|
156
|
+
"""
|
|
157
|
+
return validate_timezone_aware_datetime(v)
|
|
158
|
+
|
|
159
|
+
# Optional registration fields
|
|
160
|
+
node_role: str | None = Field(
|
|
161
|
+
default=None,
|
|
162
|
+
description="Node role (registry, adapter, etc)",
|
|
163
|
+
)
|
|
164
|
+
metadata: ModelNodeMetadata = Field(
|
|
165
|
+
default_factory=ModelNodeMetadata,
|
|
166
|
+
description="Additional node metadata",
|
|
167
|
+
)
|
|
168
|
+
network_id: str | None = Field(
|
|
169
|
+
default=None,
|
|
170
|
+
description="Network/cluster identifier",
|
|
171
|
+
)
|
|
172
|
+
deployment_id: str | None = Field(
|
|
173
|
+
default=None,
|
|
174
|
+
description="Deployment/release identifier",
|
|
175
|
+
)
|
|
176
|
+
epoch: int | None = Field(
|
|
177
|
+
default=None,
|
|
178
|
+
ge=0,
|
|
179
|
+
description="Registration epoch for ordering (monotonically increasing)",
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Optional discovery fields
|
|
183
|
+
performance_metrics: ModelIntrospectionPerformanceMetrics | None = Field(
|
|
184
|
+
default=None,
|
|
185
|
+
description="Performance metrics from introspection operation",
|
|
186
|
+
)
|
|
187
|
+
event_bus: ModelNodeEventBusConfig | None = Field(
|
|
188
|
+
default=None,
|
|
189
|
+
description="Resolved event bus topic configuration. "
|
|
190
|
+
"Contains environment-qualified topic strings for registry-driven routing. "
|
|
191
|
+
"If None, node is NOT included in dynamic topic routing lookups.",
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
__all__ = ["ModelNodeIntrospectionEvent"]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Node Metadata Model.
|
|
4
|
+
|
|
5
|
+
This module provides ModelNodeMetadata for strongly-typed node metadata
|
|
6
|
+
in the ONEX 2-way registration pattern.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelNodeMetadata(BaseModel):
|
|
15
|
+
"""Strongly-typed node metadata model.
|
|
16
|
+
|
|
17
|
+
Replaces dict[str, Any] with explicit metadata fields.
|
|
18
|
+
Uses extra="allow" to support custom metadata while
|
|
19
|
+
providing type safety for known fields.
|
|
20
|
+
|
|
21
|
+
Known metadata fields are typed explicitly. Additional custom
|
|
22
|
+
metadata can be added via the extra="allow" config, and they
|
|
23
|
+
will be stored as model extra fields accessible via model_extra.
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
version: Software version string.
|
|
27
|
+
environment: Deployment environment (e.g., production, staging).
|
|
28
|
+
region: Geographic region identifier.
|
|
29
|
+
cluster: Cluster identifier.
|
|
30
|
+
description: Human-readable description (supports Unicode).
|
|
31
|
+
priority: Priority level for scheduling/routing.
|
|
32
|
+
key: Generic key field (used in tests).
|
|
33
|
+
key1: Generic key field (used in tests).
|
|
34
|
+
meta: Generic meta field (used in tests).
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
>>> meta = ModelNodeMetadata(
|
|
38
|
+
... version="1.0.0",
|
|
39
|
+
... environment="production",
|
|
40
|
+
... region="us-west-2",
|
|
41
|
+
... )
|
|
42
|
+
>>> meta.environment
|
|
43
|
+
'production'
|
|
44
|
+
|
|
45
|
+
>>> # Unicode support
|
|
46
|
+
>>> meta = ModelNodeMetadata(description="Узел обработки")
|
|
47
|
+
>>> meta.description
|
|
48
|
+
'Узел обработки'
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
model_config = ConfigDict(
|
|
52
|
+
extra="allow", # Accept additional fields not explicitly defined
|
|
53
|
+
frozen=False, # Allow updates (ModelNodeRegistration is mutable)
|
|
54
|
+
from_attributes=True,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Common metadata fields
|
|
58
|
+
version: str | None = Field(default=None, description="Software version string")
|
|
59
|
+
environment: str | None = Field(
|
|
60
|
+
default=None, description="Deployment environment (production, staging, etc.)"
|
|
61
|
+
)
|
|
62
|
+
region: str | None = Field(default=None, description="Geographic region identifier")
|
|
63
|
+
cluster: str | None = Field(default=None, description="Cluster identifier")
|
|
64
|
+
description: str | None = Field(
|
|
65
|
+
default=None, description="Human-readable description (supports Unicode)"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Scheduling/routing metadata
|
|
69
|
+
priority: int | None = Field(
|
|
70
|
+
default=None, description="Priority level for scheduling/routing"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Generic fields used in tests - using constrained types
|
|
74
|
+
key: str | None = Field(default=None, description="Generic key field")
|
|
75
|
+
key1: str | None = Field(default=None, description="Generic key1 field")
|
|
76
|
+
meta: str | None = Field(default=None, description="Generic meta field")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
__all__ = ["ModelNodeMetadata"]
|