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,27 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Compute plugin infrastructure for deterministic business logic.
|
|
4
|
+
|
|
5
|
+
This module provides the foundation for in-process, deterministic computation
|
|
6
|
+
that complements external effect handlers.
|
|
7
|
+
|
|
8
|
+
Components:
|
|
9
|
+
- PluginComputeBase: Abstract base class with validation hooks
|
|
10
|
+
|
|
11
|
+
Architecture:
|
|
12
|
+
Compute plugins perform pure computation with NO side effects:
|
|
13
|
+
- NO external I/O (network, filesystem, database)
|
|
14
|
+
- NO random number generation (unless seeded)
|
|
15
|
+
- NO current time access (unless passed in context)
|
|
16
|
+
- Deterministic: same inputs = same outputs
|
|
17
|
+
- Replayable for debugging and testing
|
|
18
|
+
|
|
19
|
+
See Also:
|
|
20
|
+
- omnibase_infra.protocols.ProtocolPluginCompute for protocol definition
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from omnibase_infra.plugins.plugin_compute_base import PluginComputeBase
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"PluginComputeBase",
|
|
27
|
+
]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Example compute plugins demonstrating deterministic computation patterns.
|
|
2
|
+
|
|
3
|
+
This module contains reference implementations that demonstrate best practices
|
|
4
|
+
for compute plugin development.
|
|
5
|
+
|
|
6
|
+
Available Examples:
|
|
7
|
+
- PluginJsonNormalizer - Deterministic JSON key sorting for comparison
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
```python
|
|
11
|
+
from omnibase_infra.plugins.examples import PluginJsonNormalizer
|
|
12
|
+
|
|
13
|
+
plugin = PluginJsonNormalizer()
|
|
14
|
+
result = plugin.execute(
|
|
15
|
+
input_data={"json": {"z": 3, "a": 1}},
|
|
16
|
+
context={"correlation_id": "123"}
|
|
17
|
+
)
|
|
18
|
+
# result["normalized"] == {"a": 1, "z": 3}
|
|
19
|
+
```
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from omnibase_infra.plugins.examples.plugin_json_normalizer import (
|
|
23
|
+
PluginJsonNormalizer,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"PluginJsonNormalizer",
|
|
28
|
+
]
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"""JSON normalization plugin for deterministic comparison.
|
|
2
|
+
|
|
3
|
+
This plugin recursively sorts JSON object keys to enable consistent comparison
|
|
4
|
+
and hashing. It demonstrates a pure, deterministic compute plugin with no side effects.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TypedDict, cast
|
|
8
|
+
|
|
9
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
10
|
+
from omnibase_core.errors import OnexError
|
|
11
|
+
from omnibase_infra.plugins.plugin_compute_base import PluginComputeBase
|
|
12
|
+
from omnibase_infra.protocols.protocol_plugin_compute import (
|
|
13
|
+
ModelPluginContext,
|
|
14
|
+
ModelPluginInputData,
|
|
15
|
+
ModelPluginOutputData,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class JsonNormalizerInput(TypedDict, total=False):
|
|
20
|
+
"""Type-safe input structure for JSON normalizer.
|
|
21
|
+
|
|
22
|
+
Fields:
|
|
23
|
+
json: The JSON-compatible data structure to normalize.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
json: object
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class JsonNormalizerOutput(TypedDict):
|
|
30
|
+
"""Type-safe output structure for JSON normalizer.
|
|
31
|
+
|
|
32
|
+
Fields:
|
|
33
|
+
normalized: The normalized JSON structure with recursively sorted keys.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
normalized: object
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PluginJsonNormalizer(PluginComputeBase):
|
|
40
|
+
"""Normalizes JSON structures for deterministic comparison.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
MAX_RECURSION_DEPTH: Maximum allowed nesting depth for JSON structures.
|
|
44
|
+
Defaults to 100 levels. Override in subclass if needed.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
__slots__ = () # Enforce statelessness - no instance attributes
|
|
48
|
+
|
|
49
|
+
MAX_RECURSION_DEPTH: int = 100
|
|
50
|
+
|
|
51
|
+
def execute(
|
|
52
|
+
self, input_data: ModelPluginInputData, context: ModelPluginContext
|
|
53
|
+
) -> ModelPluginOutputData:
|
|
54
|
+
"""Execute JSON normalization with type-safe inputs and outputs.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
input_data: Dictionary containing "json" key with data to normalize
|
|
58
|
+
context: Execution context containing:
|
|
59
|
+
- correlation_id: For error tracing
|
|
60
|
+
- max_recursion_depth: Optional override for MAX_RECURSION_DEPTH
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Dictionary with "normalized" key containing sorted JSON
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
OnexError: For all computation failures (with proper error chaining)
|
|
67
|
+
"""
|
|
68
|
+
correlation_id = context.get("correlation_id")
|
|
69
|
+
|
|
70
|
+
# Allow context to override max recursion depth for specific use cases
|
|
71
|
+
max_depth_override = context.get("max_recursion_depth")
|
|
72
|
+
if max_depth_override is not None and isinstance(max_depth_override, int):
|
|
73
|
+
effective_max_depth = max_depth_override
|
|
74
|
+
else:
|
|
75
|
+
effective_max_depth = self.MAX_RECURSION_DEPTH
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
json_data = cast("object", input_data.get("json", {}))
|
|
79
|
+
normalized: object = self._sort_keys_recursively(
|
|
80
|
+
json_data, _max_depth=effective_max_depth
|
|
81
|
+
)
|
|
82
|
+
output: JsonNormalizerOutput = {"normalized": normalized}
|
|
83
|
+
return cast("ModelPluginOutputData", output)
|
|
84
|
+
|
|
85
|
+
except RecursionError as e:
|
|
86
|
+
raise OnexError(
|
|
87
|
+
message="JSON structure too deeply nested for normalization",
|
|
88
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
89
|
+
correlation_id=correlation_id,
|
|
90
|
+
plugin_name=self.__class__.__name__,
|
|
91
|
+
max_recursion_depth=effective_max_depth,
|
|
92
|
+
) from e
|
|
93
|
+
|
|
94
|
+
except Exception as e:
|
|
95
|
+
raise OnexError(
|
|
96
|
+
message=f"Unexpected error during JSON normalization: {e}",
|
|
97
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
98
|
+
correlation_id=correlation_id,
|
|
99
|
+
plugin_name=self.__class__.__name__,
|
|
100
|
+
input_keys=list(input_data.keys())
|
|
101
|
+
if isinstance(input_data, dict)
|
|
102
|
+
else [],
|
|
103
|
+
) from e
|
|
104
|
+
|
|
105
|
+
def _sort_keys_recursively(
|
|
106
|
+
self, obj: object, _depth: int = 0, _max_depth: int | None = None
|
|
107
|
+
) -> object:
|
|
108
|
+
"""Recursively sort dictionary keys with optimized performance and depth protection.
|
|
109
|
+
|
|
110
|
+
Performance Characteristics:
|
|
111
|
+
- Time Complexity: O(n * k log k) where n is total nodes, k is keys per dict
|
|
112
|
+
- Space Complexity: O(d) where d is maximum depth (recursion stack)
|
|
113
|
+
- Optimizations:
|
|
114
|
+
* Early type checking for primitives (most common case)
|
|
115
|
+
* Sorted key iteration for dicts (single pass over items)
|
|
116
|
+
* No redundant operations or object creation
|
|
117
|
+
|
|
118
|
+
Large Structure Performance:
|
|
119
|
+
For JSON with 1000+ keys, this implementation:
|
|
120
|
+
- Minimizes object creation overhead
|
|
121
|
+
- Uses sorted() efficiently (Timsort O(n log k))
|
|
122
|
+
- Avoids redundant type checks
|
|
123
|
+
- Maintains deterministic behavior
|
|
124
|
+
|
|
125
|
+
Depth Protection:
|
|
126
|
+
To prevent stack overflow on deeply nested structures, recursion depth
|
|
127
|
+
is limited to _max_depth (default: MAX_RECURSION_DEPTH = 100 levels).
|
|
128
|
+
This protects against maliciously crafted or malformed JSON that could
|
|
129
|
+
exhaust the Python call stack.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
obj: JSON-compatible object (dict, list, or primitive)
|
|
133
|
+
_depth: Internal depth counter for recursion protection. Do not set
|
|
134
|
+
manually; this is tracked automatically during recursion.
|
|
135
|
+
_max_depth: Maximum allowed recursion depth. If None, uses
|
|
136
|
+
MAX_RECURSION_DEPTH class attribute. Can be overridden via
|
|
137
|
+
context["max_recursion_depth"] in execute().
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Object with recursively sorted keys (if dict), or original value
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
RecursionError: If nesting depth exceeds maximum allowed depth.
|
|
144
|
+
|
|
145
|
+
Note:
|
|
146
|
+
- Dicts: Sorted by key name (alphabetically)
|
|
147
|
+
- Lists: Items processed recursively, order preserved
|
|
148
|
+
- Primitives: Returned unchanged (early exit for performance)
|
|
149
|
+
"""
|
|
150
|
+
effective_max = (
|
|
151
|
+
_max_depth if _max_depth is not None else self.MAX_RECURSION_DEPTH
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# Depth protection to prevent stack overflow on deeply nested structures
|
|
155
|
+
if _depth > effective_max:
|
|
156
|
+
raise RecursionError(
|
|
157
|
+
f"JSON structure exceeds maximum nesting depth of "
|
|
158
|
+
f"{effective_max} levels"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Early exit for primitives (most common case in large structures)
|
|
162
|
+
# This optimization avoids isinstance checks for dict/list on every primitive
|
|
163
|
+
if not isinstance(obj, dict | list):
|
|
164
|
+
return obj
|
|
165
|
+
|
|
166
|
+
if isinstance(obj, dict):
|
|
167
|
+
return {
|
|
168
|
+
k: self._sort_keys_recursively(v, _depth + 1, _max_depth=effective_max)
|
|
169
|
+
for k, v in sorted(obj.items())
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# Must be a list at this point
|
|
173
|
+
return [
|
|
174
|
+
self._sort_keys_recursively(item, _depth + 1, _max_depth=effective_max)
|
|
175
|
+
for item in obj
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
def validate_input(self, input_data: ModelPluginInputData) -> None:
|
|
179
|
+
"""Validate input with runtime type checking and type guards.
|
|
180
|
+
|
|
181
|
+
This method validates input structure before execution. By protocol design,
|
|
182
|
+
context is NOT available during validation - only the raw input_data.
|
|
183
|
+
|
|
184
|
+
Error Handling Contract:
|
|
185
|
+
This method raises TypeError/ValueError for validation failures.
|
|
186
|
+
These are intentionally NOT wrapped in OnexError here because:
|
|
187
|
+
1. Context (with correlation_id) is not available in validate_input
|
|
188
|
+
2. The caller (registry/executor) wraps these in OnexError with context
|
|
189
|
+
3. This follows the ONEX plugin validation hook pattern
|
|
190
|
+
|
|
191
|
+
For example, the plugin executor wraps validation errors:
|
|
192
|
+
```
|
|
193
|
+
try:
|
|
194
|
+
plugin.validate_input(input_data)
|
|
195
|
+
except (TypeError, ValueError) as e:
|
|
196
|
+
raise OnexError(
|
|
197
|
+
message=str(e),
|
|
198
|
+
error_code=EnumCoreErrorCode.VALIDATION_ERROR,
|
|
199
|
+
correlation_id=context.get("correlation_id"),
|
|
200
|
+
) from e
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
input_data: The input data to validate (context not available here)
|
|
205
|
+
|
|
206
|
+
Raises:
|
|
207
|
+
TypeError: If input_data is not a dict. Caller wraps in OnexError.
|
|
208
|
+
ValueError: If "json" key exists but is not JSON-compatible type.
|
|
209
|
+
Caller wraps in OnexError with correlation_id from context.
|
|
210
|
+
OnexError: If JSON structure exceeds maximum nesting depth (direct
|
|
211
|
+
raise since this is an internal error, not a validation error).
|
|
212
|
+
"""
|
|
213
|
+
if not isinstance(input_data, dict):
|
|
214
|
+
raise TypeError(f"input_data must be dict, got {type(input_data).__name__}")
|
|
215
|
+
|
|
216
|
+
if "json" not in input_data:
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
json_data = input_data["json"]
|
|
220
|
+
if not self._is_json_compatible(json_data):
|
|
221
|
+
raise ValueError(
|
|
222
|
+
f"Input 'json' must be JSON-compatible type, got {type(json_data).__name__}"
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
try:
|
|
226
|
+
self._validate_json_structure(json_data)
|
|
227
|
+
except RecursionError as e:
|
|
228
|
+
raise OnexError(
|
|
229
|
+
message="JSON structure too deeply nested for validation",
|
|
230
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
231
|
+
plugin_name=self.__class__.__name__,
|
|
232
|
+
max_recursion_depth=self.MAX_RECURSION_DEPTH,
|
|
233
|
+
) from e
|
|
234
|
+
|
|
235
|
+
def _is_json_compatible(self, value: object) -> bool:
|
|
236
|
+
"""Type guard to check if value is JSON-compatible."""
|
|
237
|
+
return isinstance(value, dict | list | str | int | float | bool | type(None))
|
|
238
|
+
|
|
239
|
+
def _validate_json_structure(self, obj: object, _depth: int = 0) -> None:
|
|
240
|
+
"""Recursively validate JSON structure for non-JSON-compatible types.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
obj: JSON-compatible object to validate
|
|
244
|
+
_depth: Internal depth counter for recursion protection. Do not set
|
|
245
|
+
manually; this is tracked automatically during recursion.
|
|
246
|
+
|
|
247
|
+
Raises:
|
|
248
|
+
ValueError: If non-JSON-compatible types are found
|
|
249
|
+
RecursionError: If nesting depth exceeds MAX_RECURSION_DEPTH levels
|
|
250
|
+
"""
|
|
251
|
+
# Depth protection to prevent stack overflow during validation
|
|
252
|
+
if _depth > self.MAX_RECURSION_DEPTH:
|
|
253
|
+
raise RecursionError(
|
|
254
|
+
f"JSON structure exceeds maximum nesting depth of "
|
|
255
|
+
f"{self.MAX_RECURSION_DEPTH} levels"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
if isinstance(obj, dict):
|
|
259
|
+
for key, value in obj.items():
|
|
260
|
+
if not self._is_json_compatible(value):
|
|
261
|
+
raise ValueError(
|
|
262
|
+
f"Non-JSON-compatible value in dict at key '{key}': {type(value).__name__}"
|
|
263
|
+
)
|
|
264
|
+
self._validate_json_structure(value, _depth + 1)
|
|
265
|
+
elif isinstance(obj, list):
|
|
266
|
+
for index, item in enumerate(obj):
|
|
267
|
+
if not self._is_json_compatible(item):
|
|
268
|
+
raise ValueError(
|
|
269
|
+
f"Non-JSON-compatible value in list at index {index}: {type(item).__name__}"
|
|
270
|
+
)
|
|
271
|
+
self._validate_json_structure(item, _depth + 1)
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""JSON normalization plugin demonstrating ONEX error handling standards.
|
|
2
|
+
|
|
3
|
+
This plugin recursively sorts JSON object keys to enable consistent comparison
|
|
4
|
+
and hashing. It demonstrates a pure, deterministic compute plugin with comprehensive
|
|
5
|
+
error handling following ONEX standards.
|
|
6
|
+
|
|
7
|
+
Error Handling:
|
|
8
|
+
This plugin demonstrates ONEX error handling standards:
|
|
9
|
+
- OnexError chaining for all exceptions
|
|
10
|
+
- Correlation ID propagation from context
|
|
11
|
+
- Never suppress errors silently
|
|
12
|
+
- Preserve full error context for debugging
|
|
13
|
+
|
|
14
|
+
Example Error Scenarios:
|
|
15
|
+
1. Invalid input type (non-JSON-compatible)
|
|
16
|
+
2. Deeply nested structures causing recursion errors
|
|
17
|
+
3. Malformed input data structures
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from typing import cast
|
|
21
|
+
|
|
22
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
23
|
+
from omnibase_core.errors import OnexError
|
|
24
|
+
from omnibase_infra.plugins.plugin_compute_base import PluginComputeBase
|
|
25
|
+
from omnibase_infra.protocols.protocol_plugin_compute import (
|
|
26
|
+
ModelPluginContext,
|
|
27
|
+
ModelPluginInputData,
|
|
28
|
+
ModelPluginOutputData,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PluginJsonNormalizerErrorHandling(PluginComputeBase):
|
|
33
|
+
"""JSON normalizer with comprehensive ONEX error handling.
|
|
34
|
+
|
|
35
|
+
This is an enhanced version of PluginJsonNormalizer that demonstrates
|
|
36
|
+
proper error handling patterns following ONEX standards.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
__slots__ = () # Enforce statelessness - no instance attributes
|
|
40
|
+
|
|
41
|
+
def execute(
|
|
42
|
+
self, input_data: ModelPluginInputData, context: ModelPluginContext
|
|
43
|
+
) -> ModelPluginOutputData:
|
|
44
|
+
"""Execute JSON normalization with comprehensive error handling.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
input_data: Dictionary containing "json" key with data to normalize
|
|
48
|
+
context: Execution context (correlation_id, timestamps, etc.)
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Dictionary with "normalized" key containing sorted JSON
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
OnexError: For all computation failures (with proper error chaining)
|
|
55
|
+
|
|
56
|
+
Error Handling Examples:
|
|
57
|
+
```python
|
|
58
|
+
from omnibase_core.errors import OnexError
|
|
59
|
+
from uuid import uuid4
|
|
60
|
+
|
|
61
|
+
# Example 1: Recursion depth error
|
|
62
|
+
try:
|
|
63
|
+
deeply_nested = create_deeply_nested_dict(depth=1500)
|
|
64
|
+
plugin.execute({"json": deeply_nested}, {"correlation_id": uuid4()})
|
|
65
|
+
except OnexError as e:
|
|
66
|
+
assert e.model.error_code == EnumCoreErrorCode.INTERNAL_ERROR
|
|
67
|
+
assert e.model.correlation_id is not None
|
|
68
|
+
assert e.model.details["max_recursion_depth"] == 1000
|
|
69
|
+
|
|
70
|
+
# Example 2: Unexpected error
|
|
71
|
+
try:
|
|
72
|
+
plugin.execute({"json": valid_data}, {"correlation_id": uuid4()})
|
|
73
|
+
except OnexError as e:
|
|
74
|
+
assert e.model.error_code == EnumCoreErrorCode.INTERNAL_ERROR
|
|
75
|
+
assert "input_keys" in e.model.details
|
|
76
|
+
```
|
|
77
|
+
"""
|
|
78
|
+
# Extract correlation_id for error handling and tracing
|
|
79
|
+
correlation_id = context.get("correlation_id", "unknown")
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
# Retrieve JSON data with safe default
|
|
83
|
+
json_data = cast("object", input_data.get("json", {}))
|
|
84
|
+
|
|
85
|
+
# Perform pure deterministic computation
|
|
86
|
+
normalized = self._sort_keys_recursively(json_data)
|
|
87
|
+
|
|
88
|
+
# Return result with correlation_id for tracing
|
|
89
|
+
return cast(
|
|
90
|
+
"ModelPluginOutputData",
|
|
91
|
+
{
|
|
92
|
+
"normalized": normalized,
|
|
93
|
+
"correlation_id": correlation_id,
|
|
94
|
+
},
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
except RecursionError as e:
|
|
98
|
+
# Handle deeply nested structures exceeding Python's recursion limit
|
|
99
|
+
raise OnexError(
|
|
100
|
+
message="JSON structure too deeply nested for normalization",
|
|
101
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
102
|
+
correlation_id=correlation_id,
|
|
103
|
+
plugin_name=self.__class__.__name__,
|
|
104
|
+
max_recursion_depth=1000, # Python's default recursion limit
|
|
105
|
+
input_depth_estimate="exceeded",
|
|
106
|
+
) from e
|
|
107
|
+
|
|
108
|
+
except TypeError as e:
|
|
109
|
+
# Handle type errors during sorting (e.g., comparing incompatible types)
|
|
110
|
+
raise OnexError(
|
|
111
|
+
message=f"Type error during JSON normalization: {e}",
|
|
112
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
113
|
+
correlation_id=correlation_id,
|
|
114
|
+
plugin_name=self.__class__.__name__,
|
|
115
|
+
input_keys=list(input_data.model_dump().keys()),
|
|
116
|
+
) from e
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
# Catch-all for unexpected errors (should not happen in pure computation)
|
|
120
|
+
raise OnexError(
|
|
121
|
+
message=f"Unexpected error during JSON normalization: {e}",
|
|
122
|
+
error_code=EnumCoreErrorCode.INTERNAL_ERROR,
|
|
123
|
+
correlation_id=correlation_id,
|
|
124
|
+
plugin_name=self.__class__.__name__,
|
|
125
|
+
input_keys=list(input_data.model_dump().keys()),
|
|
126
|
+
exception_type=type(e).__name__,
|
|
127
|
+
) from e
|
|
128
|
+
|
|
129
|
+
def _sort_keys_recursively(self, obj: object) -> object:
|
|
130
|
+
"""Recursively sort dictionary keys.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
obj: JSON-compatible object (dict, list, or primitive)
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
Object with recursively sorted keys (if dict), or original value
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
RecursionError: If nesting exceeds Python's recursion limit
|
|
140
|
+
TypeError: If comparing incompatible types during sorting
|
|
141
|
+
|
|
142
|
+
Note:
|
|
143
|
+
- Dicts: Sorted by key name (alphabetically)
|
|
144
|
+
- Lists: Items processed recursively, order preserved
|
|
145
|
+
- Primitives: Returned unchanged
|
|
146
|
+
- This method does not include explicit depth protection unlike
|
|
147
|
+
the main PluginJsonNormalizer. It relies on Python's default
|
|
148
|
+
recursion limit for simplicity in this error handling example.
|
|
149
|
+
"""
|
|
150
|
+
if isinstance(obj, dict):
|
|
151
|
+
# Sort keys and recursively process values
|
|
152
|
+
# May raise TypeError if keys are incomparable
|
|
153
|
+
return {k: self._sort_keys_recursively(v) for k, v in sorted(obj.items())}
|
|
154
|
+
|
|
155
|
+
if isinstance(obj, list):
|
|
156
|
+
# Recursively process list items, preserve order
|
|
157
|
+
# May raise RecursionError if deeply nested
|
|
158
|
+
return [self._sort_keys_recursively(item) for item in obj]
|
|
159
|
+
|
|
160
|
+
# Primitive values (str, int, float, bool, None) returned unchanged
|
|
161
|
+
return obj
|
|
162
|
+
|
|
163
|
+
def validate_input(self, input_data: ModelPluginInputData) -> None:
|
|
164
|
+
"""Validate that input contains JSON-compatible data.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
input_data: The input data to validate
|
|
168
|
+
|
|
169
|
+
Raises:
|
|
170
|
+
ValueError: If "json" key exists but is not JSON-compatible type.
|
|
171
|
+
Caller should wrap in OnexError with correlation_id.
|
|
172
|
+
|
|
173
|
+
Error Handling:
|
|
174
|
+
This method raises ValueError for invalid input types. The caller
|
|
175
|
+
(node/executor) is responsible for catching and wrapping in OnexError.
|
|
176
|
+
|
|
177
|
+
Example Caller Wrapping:
|
|
178
|
+
```python
|
|
179
|
+
from omnibase_core.errors import OnexError
|
|
180
|
+
from omnibase_core.enums import EnumCoreErrorCode
|
|
181
|
+
|
|
182
|
+
correlation_id = context.get("correlation_id", "unknown")
|
|
183
|
+
|
|
184
|
+
try:
|
|
185
|
+
plugin.validate_input(input_data)
|
|
186
|
+
except ValueError as e:
|
|
187
|
+
raise OnexError(
|
|
188
|
+
message=f"Input validation failed: {e}",
|
|
189
|
+
error_code=EnumCoreErrorCode.INVALID_INPUT,
|
|
190
|
+
correlation_id=correlation_id,
|
|
191
|
+
plugin_name="PluginJsonNormalizerErrorHandling",
|
|
192
|
+
expected_types=["dict", "list", "str", "int", "float", "bool", "None"],
|
|
193
|
+
actual_type=type(input_data.get("json")).__name__,
|
|
194
|
+
) from e
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Note:
|
|
198
|
+
Missing "json" key is valid - plugin returns empty normalized dict.
|
|
199
|
+
"""
|
|
200
|
+
json_data = input_data.get("json")
|
|
201
|
+
if json_data is not None:
|
|
202
|
+
# Ensure it's a JSON-compatible type
|
|
203
|
+
if not isinstance(
|
|
204
|
+
json_data, dict | list | str | int | float | bool | type(None)
|
|
205
|
+
):
|
|
206
|
+
raise ValueError(
|
|
207
|
+
f"Input 'json' must be JSON-compatible type "
|
|
208
|
+
f"(dict, list, str, int, float, bool, None), "
|
|
209
|
+
f"got {type(json_data).__name__}"
|
|
210
|
+
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Pydantic models for compute plugins.
|
|
4
|
+
|
|
5
|
+
This module exports the core data models used by compute plugins:
|
|
6
|
+
- ModelPluginInputData: Base input data model for plugins
|
|
7
|
+
- ModelPluginContext: Execution context model for plugins
|
|
8
|
+
- ModelPluginOutputData: Base output data model for plugins
|
|
9
|
+
|
|
10
|
+
These models replace TypedDict definitions to conform to ONEX coding standards.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from omnibase_infra.plugins.models.model_plugin_context import ModelPluginContext
|
|
14
|
+
from omnibase_infra.plugins.models.model_plugin_input_data import ModelPluginInputData
|
|
15
|
+
from omnibase_infra.plugins.models.model_plugin_output_data import ModelPluginOutputData
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ModelPluginContext",
|
|
19
|
+
"ModelPluginInputData",
|
|
20
|
+
"ModelPluginOutputData",
|
|
21
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Pydantic model for plugin execution context.
|
|
4
|
+
|
|
5
|
+
This module provides the ModelPluginContext Pydantic BaseModel that replaces
|
|
6
|
+
the former PluginContext TypedDict definition.
|
|
7
|
+
|
|
8
|
+
Design Notes:
|
|
9
|
+
- Uses ConfigDict(extra="allow") to support arbitrary fields
|
|
10
|
+
- Supports dict-like access via __getitem__ for flexible API usage
|
|
11
|
+
- Can be instantiated from dicts using model_validate()
|
|
12
|
+
- Follows ONEX naming convention: Model<Name>
|
|
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.mixins import MixinDictLikeAccessors
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ModelPluginContext(MixinDictLikeAccessors, BaseModel):
|
|
24
|
+
"""Base Pydantic model for plugin execution context.
|
|
25
|
+
|
|
26
|
+
This model replaces PluginContext TypedDict and provides structured
|
|
27
|
+
context for plugin execution including correlation IDs and metadata.
|
|
28
|
+
|
|
29
|
+
Common Fields:
|
|
30
|
+
correlation_id: UUID for distributed tracing
|
|
31
|
+
execution_timestamp: When execution started (ISO format string)
|
|
32
|
+
plugin_config: Plugin-specific configuration parameters
|
|
33
|
+
metadata: Additional metadata for observability
|
|
34
|
+
random_seed: Seed for deterministic randomness (optional)
|
|
35
|
+
|
|
36
|
+
Configuration:
|
|
37
|
+
- extra="allow": Accepts arbitrary additional fields
|
|
38
|
+
- frozen=False: Allows mutation (though plugins should not mutate)
|
|
39
|
+
- populate_by_name=True: Allows field access by alias
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
```python
|
|
43
|
+
context = ModelPluginContext(
|
|
44
|
+
correlation_id="test-uuid-123",
|
|
45
|
+
execution_timestamp="2025-01-15T12:00:00Z",
|
|
46
|
+
plugin_config={"max_depth": 10},
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Access with get (dict-like)
|
|
50
|
+
corr_id = context.get("correlation_id", "unknown")
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Note:
|
|
54
|
+
All fields are optional (extra="allow"). Plugins should document
|
|
55
|
+
which context fields they require.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
model_config = ConfigDict(
|
|
59
|
+
extra="allow",
|
|
60
|
+
frozen=False,
|
|
61
|
+
populate_by_name=True,
|
|
62
|
+
from_attributes=True, # pytest-xdist compatibility
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Common context fields - all optional with defaults
|
|
66
|
+
# Note: execution_timestamp uses str for ISO format timestamps
|
|
67
|
+
# Integer epoch timestamps should be converted to ISO strings
|
|
68
|
+
# Using empty string/dict defaults to reduce union count while maintaining optionality
|
|
69
|
+
correlation_id: str = ""
|
|
70
|
+
execution_timestamp: str = ""
|
|
71
|
+
random_seed: int | None = None # Must stay nullable - 0 is a valid seed
|
|
72
|
+
plugin_config: dict[str, JsonType] = Field(default_factory=dict)
|
|
73
|
+
metadata: dict[str, JsonType] = Field(default_factory=dict)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
__all__: list[str] = ["ModelPluginContext"]
|