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,789 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Loader for operation_bindings section of contract.yaml.
|
|
4
|
+
|
|
5
|
+
Validates at load time with explicit error codes. Parses expressions
|
|
6
|
+
into pre-compiled ModelParsedBinding instances for fast resolution.
|
|
7
|
+
|
|
8
|
+
Part of OMN-1518: Declarative operation bindings.
|
|
9
|
+
|
|
10
|
+
Contract Structure:
|
|
11
|
+
The contract.yaml uses a nested structure for operation bindings::
|
|
12
|
+
|
|
13
|
+
operation_bindings:
|
|
14
|
+
version: { major: 1, minor: 0, patch: 0 }
|
|
15
|
+
global_bindings:
|
|
16
|
+
- parameter_name: "correlation_id"
|
|
17
|
+
expression: "${envelope.correlation_id}"
|
|
18
|
+
bindings:
|
|
19
|
+
"db.query":
|
|
20
|
+
- parameter_name: "sql"
|
|
21
|
+
expression: "${payload.sql}"
|
|
22
|
+
- parameter_name: "timestamp"
|
|
23
|
+
expression: "${context.now_iso}"
|
|
24
|
+
required: false
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
```python
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
30
|
+
load_operation_bindings_subcontract,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Load bindings from contract.yaml
|
|
34
|
+
contract_path = Path("nodes/my_handler/contract.yaml")
|
|
35
|
+
bindings = load_operation_bindings_subcontract(contract_path)
|
|
36
|
+
|
|
37
|
+
# Access parsed bindings
|
|
38
|
+
for operation, binding_list in bindings.bindings.items():
|
|
39
|
+
for binding in binding_list:
|
|
40
|
+
print(f"{operation}: {binding.parameter_name} <- {binding.original_expression}")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
See Also:
|
|
44
|
+
- ModelOperationBindingsSubcontract: Model for bindings configuration
|
|
45
|
+
- ModelParsedBinding: Model for individual pre-parsed bindings
|
|
46
|
+
- ModelOperationBinding: Raw binding entry from YAML
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
from __future__ import annotations
|
|
50
|
+
|
|
51
|
+
import logging
|
|
52
|
+
import re
|
|
53
|
+
from pathlib import Path
|
|
54
|
+
from typing import Final, Literal
|
|
55
|
+
|
|
56
|
+
import yaml
|
|
57
|
+
|
|
58
|
+
from omnibase_core.models.primitives.model_semver import ModelSemVer
|
|
59
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
60
|
+
from omnibase_infra.errors import ModelInfraErrorContext, ProtocolConfigurationError
|
|
61
|
+
from omnibase_infra.models.bindings import (
|
|
62
|
+
MAX_EXPRESSION_LENGTH,
|
|
63
|
+
MAX_PATH_SEGMENTS,
|
|
64
|
+
VALID_CONTEXT_PATHS,
|
|
65
|
+
VALID_SOURCES,
|
|
66
|
+
ModelOperationBinding,
|
|
67
|
+
ModelOperationBindingsSubcontract,
|
|
68
|
+
ModelParsedBinding,
|
|
69
|
+
)
|
|
70
|
+
from omnibase_infra.runtime.binding_resolver import (
|
|
71
|
+
BindingExpressionParseError,
|
|
72
|
+
BindingExpressionParser,
|
|
73
|
+
EnumBindingParseErrorCode,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
logger = logging.getLogger(__name__)
|
|
77
|
+
|
|
78
|
+
# =============================================================================
|
|
79
|
+
# Security Constants (Loader-specific)
|
|
80
|
+
# =============================================================================
|
|
81
|
+
|
|
82
|
+
# Maximum allowed file size for contract.yaml files (10MB)
|
|
83
|
+
# Security control to prevent memory exhaustion via large YAML files
|
|
84
|
+
# Error code: FILE_SIZE_EXCEEDED (BINDING_LOADER_050)
|
|
85
|
+
MAX_CONTRACT_FILE_SIZE_BYTES: int = 10 * 1024 * 1024 # 10MB
|
|
86
|
+
|
|
87
|
+
# =============================================================================
|
|
88
|
+
# Error Codes
|
|
89
|
+
# =============================================================================
|
|
90
|
+
|
|
91
|
+
# Expression validation errors (010-019)
|
|
92
|
+
ERROR_CODE_EXPRESSION_MALFORMED = "BINDING_LOADER_010"
|
|
93
|
+
ERROR_CODE_INVALID_SOURCE = "BINDING_LOADER_011"
|
|
94
|
+
ERROR_CODE_PATH_TOO_DEEP = "BINDING_LOADER_012"
|
|
95
|
+
ERROR_CODE_EXPRESSION_TOO_LONG = "BINDING_LOADER_013"
|
|
96
|
+
ERROR_CODE_EMPTY_PATH_SEGMENT = "BINDING_LOADER_014"
|
|
97
|
+
ERROR_CODE_MISSING_PATH_SEGMENT = "BINDING_LOADER_015"
|
|
98
|
+
ERROR_CODE_INVALID_CONTEXT_PATH = "BINDING_LOADER_016"
|
|
99
|
+
|
|
100
|
+
# Binding validation errors (020-029)
|
|
101
|
+
ERROR_CODE_UNKNOWN_OPERATION = "BINDING_LOADER_020"
|
|
102
|
+
ERROR_CODE_DUPLICATE_PARAMETER = "BINDING_LOADER_021"
|
|
103
|
+
ERROR_CODE_INVALID_CONTEXT_PATH_NAME = "BINDING_LOADER_022"
|
|
104
|
+
"""Invalid context path name format.
|
|
105
|
+
|
|
106
|
+
Context path names must:
|
|
107
|
+
- Start with a lowercase letter
|
|
108
|
+
- Contain only lowercase letters, numbers, and underscores
|
|
109
|
+
- Not be empty
|
|
110
|
+
- Not contain dots (used for path traversal)
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
# =============================================================================
|
|
114
|
+
# Context Path Validation Pattern
|
|
115
|
+
# =============================================================================
|
|
116
|
+
|
|
117
|
+
CONTEXT_PATH_NAME_PATTERN: Final[re.Pattern[str]] = re.compile(r"^[a-z][a-z0-9_]*$")
|
|
118
|
+
"""Pattern for valid context path names.
|
|
119
|
+
|
|
120
|
+
Context paths must:
|
|
121
|
+
- Start with a lowercase letter
|
|
122
|
+
- Contain only lowercase letters (a-z), numbers (0-9), and underscores
|
|
123
|
+
- Be at least 1 character long
|
|
124
|
+
|
|
125
|
+
Examples:
|
|
126
|
+
- Valid: ``tenant_id``, ``request_id``, ``user123``
|
|
127
|
+
- Invalid: ``TenantId`` (uppercase), ``123abc`` (starts with number),
|
|
128
|
+
``tenant.id`` (contains dot), ``tenant-id`` (contains dash)
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
# File/contract errors (030-039)
|
|
132
|
+
ERROR_CODE_CONTRACT_NOT_FOUND = "BINDING_LOADER_030"
|
|
133
|
+
ERROR_CODE_YAML_PARSE_ERROR = "BINDING_LOADER_031"
|
|
134
|
+
|
|
135
|
+
# Security errors (050-059)
|
|
136
|
+
ERROR_CODE_FILE_SIZE_EXCEEDED = "BINDING_LOADER_050"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _check_file_size(contract_path: Path, operation: str) -> None:
|
|
140
|
+
"""Check that contract file does not exceed maximum allowed size.
|
|
141
|
+
|
|
142
|
+
This is a security control to prevent memory exhaustion attacks via
|
|
143
|
+
oversized YAML files. Per CLAUDE.md Handler Plugin Loader security patterns,
|
|
144
|
+
a 10MB file size limit is enforced.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
contract_path: Path to the contract.yaml file.
|
|
148
|
+
operation: Name of the operation for error context.
|
|
149
|
+
|
|
150
|
+
Raises:
|
|
151
|
+
ProtocolConfigurationError: If file exceeds MAX_CONTRACT_FILE_SIZE_BYTES.
|
|
152
|
+
Error code: FILE_SIZE_EXCEEDED (BINDING_LOADER_050).
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
file_size = contract_path.stat().st_size
|
|
156
|
+
except FileNotFoundError:
|
|
157
|
+
# Let the caller handle FileNotFoundError with its own error message
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
if file_size > MAX_CONTRACT_FILE_SIZE_BYTES:
|
|
161
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
162
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
163
|
+
operation=operation,
|
|
164
|
+
target_name=str(contract_path),
|
|
165
|
+
)
|
|
166
|
+
logger.error(
|
|
167
|
+
"Contract file exceeds maximum size: %d bytes > %d bytes at %s",
|
|
168
|
+
file_size,
|
|
169
|
+
MAX_CONTRACT_FILE_SIZE_BYTES,
|
|
170
|
+
contract_path,
|
|
171
|
+
)
|
|
172
|
+
raise ProtocolConfigurationError(
|
|
173
|
+
f"Contract file exceeds maximum size: {file_size} bytes > "
|
|
174
|
+
f"{MAX_CONTRACT_FILE_SIZE_BYTES} bytes. "
|
|
175
|
+
f"Reduce the contract.yaml file size or split into multiple contracts. "
|
|
176
|
+
f"Error code: FILE_SIZE_EXCEEDED ({ERROR_CODE_FILE_SIZE_EXCEEDED})",
|
|
177
|
+
context=ctx,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _parse_expression(
|
|
182
|
+
expression: str,
|
|
183
|
+
contract_path: Path,
|
|
184
|
+
max_expression_length: int | None = None,
|
|
185
|
+
max_path_segments: int | None = None,
|
|
186
|
+
additional_context_paths: frozenset[str] | None = None,
|
|
187
|
+
) -> tuple[Literal["payload", "envelope", "context"], tuple[str, ...]]:
|
|
188
|
+
"""Parse and validate binding expression at load time.
|
|
189
|
+
|
|
190
|
+
Delegates to BindingExpressionParser.parse() for validation and parsing,
|
|
191
|
+
then wraps any BindingExpressionParseError with ProtocolConfigurationError
|
|
192
|
+
and appropriate error codes for loader-level diagnostics.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
expression: Expression in ${source.path.to.field} format.
|
|
196
|
+
contract_path: Path for error context.
|
|
197
|
+
max_expression_length: Override default expression length limit.
|
|
198
|
+
If None, uses the default MAX_EXPRESSION_LENGTH (256).
|
|
199
|
+
max_path_segments: Override default path segment limit.
|
|
200
|
+
If None, uses the default MAX_PATH_SEGMENTS (20).
|
|
201
|
+
additional_context_paths: Additional valid context paths beyond
|
|
202
|
+
the base VALID_CONTEXT_PATHS set.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Tuple of (source, path_segments) where:
|
|
206
|
+
- source: One of "payload", "envelope", "context"
|
|
207
|
+
- path_segments: Tuple of field names to traverse
|
|
208
|
+
|
|
209
|
+
Raises:
|
|
210
|
+
ProtocolConfigurationError: With specific error code for:
|
|
211
|
+
- BINDING_LOADER_010: Malformed expression syntax
|
|
212
|
+
- BINDING_LOADER_011: Invalid source
|
|
213
|
+
- BINDING_LOADER_012: Path too deep
|
|
214
|
+
- BINDING_LOADER_013: Expression too long
|
|
215
|
+
- BINDING_LOADER_014: Empty path segment
|
|
216
|
+
- BINDING_LOADER_016: Invalid context path
|
|
217
|
+
|
|
218
|
+
.. versionchanged:: 0.2.7
|
|
219
|
+
Added max_expression_length, max_path_segments, and additional_context_paths
|
|
220
|
+
parameters for per-contract guardrail overrides.
|
|
221
|
+
"""
|
|
222
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
223
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
224
|
+
operation="parse_binding_expression",
|
|
225
|
+
target_name=str(contract_path),
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
parser = BindingExpressionParser()
|
|
229
|
+
|
|
230
|
+
try:
|
|
231
|
+
return parser.parse(
|
|
232
|
+
expression,
|
|
233
|
+
max_expression_length=max_expression_length,
|
|
234
|
+
max_path_segments=max_path_segments,
|
|
235
|
+
additional_context_paths=additional_context_paths,
|
|
236
|
+
)
|
|
237
|
+
except BindingExpressionParseError as e:
|
|
238
|
+
# Use typed error code from the exception - no string matching needed
|
|
239
|
+
error_code = e.error_code.value
|
|
240
|
+
code_name = e.error_code.name
|
|
241
|
+
error_msg = e.message
|
|
242
|
+
|
|
243
|
+
# Log with appropriate context based on error type
|
|
244
|
+
if e.error_code == EnumBindingParseErrorCode.EXPRESSION_TOO_LONG:
|
|
245
|
+
logger.exception(
|
|
246
|
+
"Expression exceeds max length: %s in %s",
|
|
247
|
+
expression,
|
|
248
|
+
contract_path,
|
|
249
|
+
)
|
|
250
|
+
user_msg = f"{error_msg}. Error code: {code_name} ({error_code})"
|
|
251
|
+
|
|
252
|
+
elif e.error_code == EnumBindingParseErrorCode.EXPRESSION_MALFORMED:
|
|
253
|
+
# Array access or invalid syntax
|
|
254
|
+
if "Array access" in error_msg:
|
|
255
|
+
logger.exception(
|
|
256
|
+
"Array access not allowed in expressions: %s in %s",
|
|
257
|
+
expression,
|
|
258
|
+
contract_path,
|
|
259
|
+
)
|
|
260
|
+
user_msg = (
|
|
261
|
+
f"Array access not allowed in expressions: {expression}. "
|
|
262
|
+
f"Use path-based access only (e.g., ${{payload.items}} not "
|
|
263
|
+
f"${{payload.items[0]}}). "
|
|
264
|
+
f"Error code: {code_name} ({error_code})"
|
|
265
|
+
)
|
|
266
|
+
else:
|
|
267
|
+
logger.exception(
|
|
268
|
+
"Invalid expression syntax: %s in %s. Expected ${{source.path.to.field}}",
|
|
269
|
+
expression,
|
|
270
|
+
contract_path,
|
|
271
|
+
)
|
|
272
|
+
user_msg = (
|
|
273
|
+
f"Invalid expression syntax: {expression}. "
|
|
274
|
+
f"Expected format: ${{source.path.to.field}}. "
|
|
275
|
+
f"Error code: {code_name} ({error_code})"
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
elif e.error_code == EnumBindingParseErrorCode.INVALID_SOURCE:
|
|
279
|
+
logger.exception(
|
|
280
|
+
"Invalid source in expression %s at %s: %s",
|
|
281
|
+
expression,
|
|
282
|
+
contract_path,
|
|
283
|
+
error_msg,
|
|
284
|
+
)
|
|
285
|
+
user_msg = f"{error_msg}. Error code: {code_name} ({error_code})"
|
|
286
|
+
|
|
287
|
+
elif e.error_code == EnumBindingParseErrorCode.EMPTY_PATH_SEGMENT:
|
|
288
|
+
logger.exception(
|
|
289
|
+
"Empty path segment in expression: %s at %s",
|
|
290
|
+
expression,
|
|
291
|
+
contract_path,
|
|
292
|
+
)
|
|
293
|
+
user_msg = (
|
|
294
|
+
f"Empty path segment in expression: {expression}. "
|
|
295
|
+
f"Path segments cannot be empty. "
|
|
296
|
+
f"Error code: {code_name} ({error_code})"
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
elif e.error_code == EnumBindingParseErrorCode.PATH_TOO_DEEP:
|
|
300
|
+
logger.exception(
|
|
301
|
+
"Path exceeds max segments in expression: %s at %s",
|
|
302
|
+
expression,
|
|
303
|
+
contract_path,
|
|
304
|
+
)
|
|
305
|
+
user_msg = f"{error_msg}. Error code: {code_name} ({error_code})"
|
|
306
|
+
|
|
307
|
+
elif e.error_code == EnumBindingParseErrorCode.INVALID_CONTEXT_PATH:
|
|
308
|
+
logger.exception(
|
|
309
|
+
"Invalid context path in expression %s at %s: %s",
|
|
310
|
+
expression,
|
|
311
|
+
contract_path,
|
|
312
|
+
error_msg,
|
|
313
|
+
)
|
|
314
|
+
user_msg = f"{error_msg}. Error code: {code_name} ({error_code})"
|
|
315
|
+
|
|
316
|
+
else:
|
|
317
|
+
# Fallback for any unhandled error code (should not happen)
|
|
318
|
+
logger.exception(
|
|
319
|
+
"Expression parsing failed: %s in %s - %s",
|
|
320
|
+
expression,
|
|
321
|
+
contract_path,
|
|
322
|
+
error_msg,
|
|
323
|
+
)
|
|
324
|
+
user_msg = (
|
|
325
|
+
f"Expression parsing failed: {expression}. {error_msg}. "
|
|
326
|
+
f"Error code: {code_name} ({error_code})"
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
raise ProtocolConfigurationError(user_msg, context=ctx) from e
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _parse_binding_entry(
|
|
333
|
+
raw_binding: dict[str, object],
|
|
334
|
+
contract_path: Path,
|
|
335
|
+
max_expression_length: int | None = None,
|
|
336
|
+
max_path_segments: int | None = None,
|
|
337
|
+
additional_context_paths: frozenset[str] | None = None,
|
|
338
|
+
) -> ModelParsedBinding:
|
|
339
|
+
"""Parse a raw binding dict into ModelParsedBinding.
|
|
340
|
+
|
|
341
|
+
First validates the raw YAML structure using ModelOperationBinding,
|
|
342
|
+
then parses the expression into pre-compiled components.
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
raw_binding: Raw binding dict from YAML.
|
|
346
|
+
contract_path: Path for error context.
|
|
347
|
+
max_expression_length: Override default expression length limit.
|
|
348
|
+
max_path_segments: Override default path segment limit.
|
|
349
|
+
additional_context_paths: Additional valid context paths beyond
|
|
350
|
+
the base VALID_CONTEXT_PATHS set.
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
ModelParsedBinding with pre-parsed expression components.
|
|
354
|
+
|
|
355
|
+
Raises:
|
|
356
|
+
ProtocolConfigurationError: If binding or expression is invalid.
|
|
357
|
+
ValidationError: If raw binding doesn't match ModelOperationBinding schema.
|
|
358
|
+
|
|
359
|
+
.. versionchanged:: 0.2.7
|
|
360
|
+
Added max_expression_length, max_path_segments, and additional_context_paths
|
|
361
|
+
parameters for per-contract guardrail overrides.
|
|
362
|
+
"""
|
|
363
|
+
# First validate as ModelOperationBinding (raw YAML structure)
|
|
364
|
+
# This validates required fields and types
|
|
365
|
+
operation_binding = ModelOperationBinding(**raw_binding)
|
|
366
|
+
|
|
367
|
+
# Parse the expression into components
|
|
368
|
+
source, path_segments = _parse_expression(
|
|
369
|
+
operation_binding.expression,
|
|
370
|
+
contract_path,
|
|
371
|
+
max_expression_length=max_expression_length,
|
|
372
|
+
max_path_segments=max_path_segments,
|
|
373
|
+
additional_context_paths=additional_context_paths,
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
return ModelParsedBinding(
|
|
377
|
+
parameter_name=operation_binding.parameter_name,
|
|
378
|
+
source=source,
|
|
379
|
+
path_segments=path_segments,
|
|
380
|
+
required=operation_binding.required,
|
|
381
|
+
default=operation_binding.default,
|
|
382
|
+
original_expression=operation_binding.expression,
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def _validate_additional_context_paths(
|
|
387
|
+
paths: list[str],
|
|
388
|
+
contract_path: Path,
|
|
389
|
+
) -> frozenset[str]:
|
|
390
|
+
"""Validate additional context path names and return as frozenset.
|
|
391
|
+
|
|
392
|
+
Context path names must:
|
|
393
|
+
- Start with a lowercase letter
|
|
394
|
+
- Contain only lowercase letters (a-z), numbers (0-9), and underscores
|
|
395
|
+
- Not be empty
|
|
396
|
+
- Not contain dots (reserved for path traversal)
|
|
397
|
+
- Not duplicate base context paths (now_iso, dispatcher_id, correlation_id)
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
paths: List of additional context path names from contract.yaml.
|
|
401
|
+
contract_path: Path for error context.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
Frozenset of validated context path names.
|
|
405
|
+
|
|
406
|
+
Raises:
|
|
407
|
+
ProtocolConfigurationError: If any path name is invalid.
|
|
408
|
+
Error code: INVALID_CONTEXT_PATH_NAME (BINDING_LOADER_022).
|
|
409
|
+
"""
|
|
410
|
+
if not paths:
|
|
411
|
+
return frozenset()
|
|
412
|
+
|
|
413
|
+
validated: set[str] = set()
|
|
414
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
415
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
416
|
+
operation="validate_additional_context_paths",
|
|
417
|
+
target_name=str(contract_path),
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
for path in paths:
|
|
421
|
+
# Check for empty string
|
|
422
|
+
if not path:
|
|
423
|
+
logger.error(
|
|
424
|
+
"Empty string in additional_context_paths at %s",
|
|
425
|
+
contract_path,
|
|
426
|
+
)
|
|
427
|
+
raise ProtocolConfigurationError(
|
|
428
|
+
f"Empty string in additional_context_paths. "
|
|
429
|
+
f"Context path names cannot be empty. "
|
|
430
|
+
f"Error code: INVALID_CONTEXT_PATH_NAME ({ERROR_CODE_INVALID_CONTEXT_PATH_NAME})",
|
|
431
|
+
context=ctx,
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
# Check pattern
|
|
435
|
+
if not CONTEXT_PATH_NAME_PATTERN.match(path):
|
|
436
|
+
logger.error(
|
|
437
|
+
"Invalid context path name '%s' in additional_context_paths at %s: "
|
|
438
|
+
"must match pattern ^[a-z][a-z0-9_]*$",
|
|
439
|
+
path,
|
|
440
|
+
contract_path,
|
|
441
|
+
)
|
|
442
|
+
raise ProtocolConfigurationError(
|
|
443
|
+
f"Invalid context path name '{path}' in additional_context_paths. "
|
|
444
|
+
f"Names must start with a lowercase letter and contain only "
|
|
445
|
+
f"lowercase letters, numbers, and underscores. "
|
|
446
|
+
f"Error code: INVALID_CONTEXT_PATH_NAME ({ERROR_CODE_INVALID_CONTEXT_PATH_NAME})",
|
|
447
|
+
context=ctx,
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
# Check for dots (reserved for path traversal)
|
|
451
|
+
if "." in path:
|
|
452
|
+
logger.error(
|
|
453
|
+
"Context path name '%s' contains dot at %s: dots are reserved for path traversal",
|
|
454
|
+
path,
|
|
455
|
+
contract_path,
|
|
456
|
+
)
|
|
457
|
+
raise ProtocolConfigurationError(
|
|
458
|
+
f"Context path name '{path}' contains a dot. "
|
|
459
|
+
f"Dots are reserved for path traversal in expressions. "
|
|
460
|
+
f"Use underscores instead (e.g., 'tenant_id' not 'tenant.id'). "
|
|
461
|
+
f"Error code: INVALID_CONTEXT_PATH_NAME ({ERROR_CODE_INVALID_CONTEXT_PATH_NAME})",
|
|
462
|
+
context=ctx,
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Check for collision with base context paths
|
|
466
|
+
if path in VALID_CONTEXT_PATHS:
|
|
467
|
+
logger.error(
|
|
468
|
+
"Context path name '%s' duplicates base context path at %s",
|
|
469
|
+
path,
|
|
470
|
+
contract_path,
|
|
471
|
+
)
|
|
472
|
+
raise ProtocolConfigurationError(
|
|
473
|
+
f"Context path name '{path}' duplicates a base context path. "
|
|
474
|
+
f"Base context paths ({sorted(VALID_CONTEXT_PATHS)}) are automatically available. "
|
|
475
|
+
f"Error code: INVALID_CONTEXT_PATH_NAME ({ERROR_CODE_INVALID_CONTEXT_PATH_NAME})",
|
|
476
|
+
context=ctx,
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
# Check for duplicates within the list
|
|
480
|
+
if path in validated:
|
|
481
|
+
logger.error(
|
|
482
|
+
"Duplicate context path name '%s' in additional_context_paths at %s",
|
|
483
|
+
path,
|
|
484
|
+
contract_path,
|
|
485
|
+
)
|
|
486
|
+
raise ProtocolConfigurationError(
|
|
487
|
+
f"Duplicate context path name '{path}' in additional_context_paths. "
|
|
488
|
+
f"Each context path name must be unique. "
|
|
489
|
+
f"Error code: INVALID_CONTEXT_PATH_NAME ({ERROR_CODE_INVALID_CONTEXT_PATH_NAME})",
|
|
490
|
+
context=ctx,
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
validated.add(path)
|
|
494
|
+
|
|
495
|
+
return frozenset(validated)
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def _check_duplicate_parameters(
|
|
499
|
+
bindings: list[ModelParsedBinding],
|
|
500
|
+
scope: str,
|
|
501
|
+
contract_path: Path,
|
|
502
|
+
) -> None:
|
|
503
|
+
"""Check for duplicate parameter names within a binding list.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
bindings: List of parsed bindings to check.
|
|
507
|
+
scope: Description of scope for error message (e.g., "global_bindings").
|
|
508
|
+
contract_path: Path for error context.
|
|
509
|
+
|
|
510
|
+
Raises:
|
|
511
|
+
ProtocolConfigurationError: If duplicate parameter name found.
|
|
512
|
+
Error code: DUPLICATE_PARAMETER (BINDING_LOADER_021).
|
|
513
|
+
"""
|
|
514
|
+
seen: set[str] = set()
|
|
515
|
+
for binding in bindings:
|
|
516
|
+
if binding.parameter_name in seen:
|
|
517
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
518
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
519
|
+
operation="validate_bindings",
|
|
520
|
+
target_name=str(contract_path),
|
|
521
|
+
)
|
|
522
|
+
logger.error(
|
|
523
|
+
"Duplicate parameter '%s' in %s at %s",
|
|
524
|
+
binding.parameter_name,
|
|
525
|
+
scope,
|
|
526
|
+
contract_path,
|
|
527
|
+
)
|
|
528
|
+
raise ProtocolConfigurationError(
|
|
529
|
+
f"Duplicate parameter '{binding.parameter_name}' in {scope}. "
|
|
530
|
+
f"Each parameter name must be unique within its scope. "
|
|
531
|
+
f"Error code: DUPLICATE_PARAMETER ({ERROR_CODE_DUPLICATE_PARAMETER})",
|
|
532
|
+
context=ctx,
|
|
533
|
+
)
|
|
534
|
+
seen.add(binding.parameter_name)
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def load_operation_bindings_subcontract(
|
|
538
|
+
contract_path: Path,
|
|
539
|
+
io_operations: list[str] | None = None,
|
|
540
|
+
) -> ModelOperationBindingsSubcontract:
|
|
541
|
+
"""Load, parse, and validate operation_bindings from contract.yaml.
|
|
542
|
+
|
|
543
|
+
Loads the operation_bindings section from a contract.yaml file
|
|
544
|
+
and converts it to ModelOperationBindingsSubcontract format with
|
|
545
|
+
pre-parsed expressions. All validation happens at load time.
|
|
546
|
+
|
|
547
|
+
Validation at load time:
|
|
548
|
+
- File size limit (10MB) - security control
|
|
549
|
+
- YAML safe_load - security control
|
|
550
|
+
- Expression syntax validation
|
|
551
|
+
- Source validation (payload/envelope/context)
|
|
552
|
+
- Context path validation (now_iso/dispatcher_id/correlation_id)
|
|
553
|
+
- Duplicate parameter detection per scope
|
|
554
|
+
- io_operations reference validation (if provided)
|
|
555
|
+
|
|
556
|
+
Args:
|
|
557
|
+
contract_path: Path to contract.yaml file.
|
|
558
|
+
io_operations: Optional list of valid operation names. If provided,
|
|
559
|
+
validates that all operation names in bindings exist in this list.
|
|
560
|
+
|
|
561
|
+
Returns:
|
|
562
|
+
ModelOperationBindingsSubcontract with pre-parsed bindings.
|
|
563
|
+
Returns empty subcontract if operation_bindings section is missing.
|
|
564
|
+
|
|
565
|
+
Raises:
|
|
566
|
+
ProtocolConfigurationError: With specific error code for various failures:
|
|
567
|
+
- BINDING_LOADER_030: Contract file not found
|
|
568
|
+
- BINDING_LOADER_031: YAML parse error
|
|
569
|
+
- BINDING_LOADER_050: File size exceeded
|
|
570
|
+
- BINDING_LOADER_010-016: Expression validation errors
|
|
571
|
+
- BINDING_LOADER_020: Unknown operation (not in io_operations)
|
|
572
|
+
- BINDING_LOADER_021: Duplicate parameter name
|
|
573
|
+
|
|
574
|
+
Example:
|
|
575
|
+
```python
|
|
576
|
+
from pathlib import Path
|
|
577
|
+
from omnibase_infra.runtime.contract_loaders import (
|
|
578
|
+
load_operation_bindings_subcontract,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
contract_path = Path(__file__).parent / "contract.yaml"
|
|
582
|
+
bindings = load_operation_bindings_subcontract(
|
|
583
|
+
contract_path,
|
|
584
|
+
io_operations=["db.query", "db.execute"], # Optional validation
|
|
585
|
+
)
|
|
586
|
+
|
|
587
|
+
# Access parsed bindings
|
|
588
|
+
for op_name, binding_list in bindings.bindings.items():
|
|
589
|
+
for binding in binding_list:
|
|
590
|
+
print(f"{op_name}: {binding.parameter_name}")
|
|
591
|
+
```
|
|
592
|
+
"""
|
|
593
|
+
operation = "load_operation_bindings"
|
|
594
|
+
ctx = ModelInfraErrorContext.with_correlation(
|
|
595
|
+
transport_type=EnumInfraTransportType.FILESYSTEM,
|
|
596
|
+
operation=operation,
|
|
597
|
+
target_name=str(contract_path),
|
|
598
|
+
)
|
|
599
|
+
|
|
600
|
+
# Check file exists
|
|
601
|
+
if not contract_path.exists():
|
|
602
|
+
logger.error(
|
|
603
|
+
"Contract file not found: %s - cannot load operation bindings",
|
|
604
|
+
contract_path,
|
|
605
|
+
)
|
|
606
|
+
raise ProtocolConfigurationError(
|
|
607
|
+
f"Contract file not found: {contract_path}. "
|
|
608
|
+
f"Ensure the contract.yaml exists in the handler directory. "
|
|
609
|
+
f"Error code: CONTRACT_NOT_FOUND ({ERROR_CODE_CONTRACT_NOT_FOUND})",
|
|
610
|
+
context=ctx,
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
# Check file size (security control - MUST be before yaml.safe_load)
|
|
614
|
+
_check_file_size(contract_path, operation)
|
|
615
|
+
|
|
616
|
+
# Load YAML safely
|
|
617
|
+
try:
|
|
618
|
+
with contract_path.open("r", encoding="utf-8") as f:
|
|
619
|
+
contract_data = yaml.safe_load(f)
|
|
620
|
+
except yaml.YAMLError as e:
|
|
621
|
+
# Sanitize error message - don't include raw YAML error which may contain file contents
|
|
622
|
+
error_type = type(e).__name__
|
|
623
|
+
logger.exception(
|
|
624
|
+
"Invalid YAML syntax in contract.yaml at %s: %s",
|
|
625
|
+
contract_path,
|
|
626
|
+
error_type,
|
|
627
|
+
)
|
|
628
|
+
raise ProtocolConfigurationError(
|
|
629
|
+
f"Invalid YAML syntax in contract.yaml at {contract_path}: {error_type}. "
|
|
630
|
+
f"Verify the YAML syntax is correct. "
|
|
631
|
+
f"Error code: YAML_PARSE_ERROR ({ERROR_CODE_YAML_PARSE_ERROR})",
|
|
632
|
+
context=ctx,
|
|
633
|
+
) from e
|
|
634
|
+
|
|
635
|
+
if contract_data is None:
|
|
636
|
+
contract_data = {}
|
|
637
|
+
|
|
638
|
+
# Get operation_bindings section (optional - return empty if missing)
|
|
639
|
+
bindings_section = contract_data.get("operation_bindings", {})
|
|
640
|
+
if not bindings_section:
|
|
641
|
+
logger.debug(
|
|
642
|
+
"No operation_bindings section in contract.yaml at %s - returning empty subcontract",
|
|
643
|
+
contract_path,
|
|
644
|
+
)
|
|
645
|
+
return ModelOperationBindingsSubcontract(
|
|
646
|
+
version=ModelSemVer(major=1, minor=0, patch=0),
|
|
647
|
+
bindings={},
|
|
648
|
+
global_bindings=None,
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
# Parse version
|
|
652
|
+
version_data = bindings_section.get("version", {"major": 1, "minor": 0, "patch": 0})
|
|
653
|
+
if isinstance(version_data, dict):
|
|
654
|
+
version = ModelSemVer(**version_data)
|
|
655
|
+
else:
|
|
656
|
+
logger.warning(
|
|
657
|
+
"Invalid version format in operation_bindings section at %s: "
|
|
658
|
+
"expected dict with major/minor/patch, got %s. "
|
|
659
|
+
"Defaulting to 1.0.0. "
|
|
660
|
+
"Use format: version: { major: 1, minor: 0, patch: 0 }",
|
|
661
|
+
contract_path,
|
|
662
|
+
type(version_data).__name__,
|
|
663
|
+
)
|
|
664
|
+
version = ModelSemVer(major=1, minor=0, patch=0)
|
|
665
|
+
|
|
666
|
+
# Parse optional guardrail overrides
|
|
667
|
+
max_expression_length_override: int | None = bindings_section.get(
|
|
668
|
+
"max_expression_length"
|
|
669
|
+
)
|
|
670
|
+
max_path_segments_override: int | None = bindings_section.get("max_path_segments")
|
|
671
|
+
|
|
672
|
+
# Parse and validate additional_context_paths (optional)
|
|
673
|
+
raw_additional_context_paths: list[str] = bindings_section.get(
|
|
674
|
+
"additional_context_paths", []
|
|
675
|
+
)
|
|
676
|
+
additional_context_paths: frozenset[str] = _validate_additional_context_paths(
|
|
677
|
+
raw_additional_context_paths,
|
|
678
|
+
contract_path,
|
|
679
|
+
)
|
|
680
|
+
|
|
681
|
+
if additional_context_paths:
|
|
682
|
+
logger.debug(
|
|
683
|
+
"Loaded %d additional context paths from contract.yaml at %s: %s",
|
|
684
|
+
len(additional_context_paths),
|
|
685
|
+
contract_path,
|
|
686
|
+
sorted(additional_context_paths),
|
|
687
|
+
)
|
|
688
|
+
|
|
689
|
+
# Parse global_bindings (optional)
|
|
690
|
+
global_bindings: list[ModelParsedBinding] | None = None
|
|
691
|
+
raw_global = bindings_section.get("global_bindings", [])
|
|
692
|
+
if raw_global:
|
|
693
|
+
global_bindings = [
|
|
694
|
+
_parse_binding_entry(
|
|
695
|
+
b,
|
|
696
|
+
contract_path,
|
|
697
|
+
max_expression_length=max_expression_length_override,
|
|
698
|
+
max_path_segments=max_path_segments_override,
|
|
699
|
+
additional_context_paths=additional_context_paths or None,
|
|
700
|
+
)
|
|
701
|
+
for b in raw_global
|
|
702
|
+
]
|
|
703
|
+
_check_duplicate_parameters(global_bindings, "global_bindings", contract_path)
|
|
704
|
+
logger.debug(
|
|
705
|
+
"Loaded %d global bindings from contract.yaml at %s",
|
|
706
|
+
len(global_bindings),
|
|
707
|
+
contract_path,
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
# Parse operation-specific bindings
|
|
711
|
+
parsed_bindings: dict[str, list[ModelParsedBinding]] = {}
|
|
712
|
+
raw_bindings = bindings_section.get("bindings", {})
|
|
713
|
+
|
|
714
|
+
for operation_name, operation_binding_list in raw_bindings.items():
|
|
715
|
+
# Validate operation exists in io_operations (if provided)
|
|
716
|
+
if io_operations is not None and operation_name not in io_operations:
|
|
717
|
+
logger.error(
|
|
718
|
+
"Unknown operation '%s' in bindings - not in io_operations at %s",
|
|
719
|
+
operation_name,
|
|
720
|
+
contract_path,
|
|
721
|
+
)
|
|
722
|
+
raise ProtocolConfigurationError(
|
|
723
|
+
f"Unknown operation '{operation_name}' in bindings section. "
|
|
724
|
+
f"Not found in io_operations: {sorted(io_operations)}. "
|
|
725
|
+
f"Error code: UNKNOWN_OPERATION ({ERROR_CODE_UNKNOWN_OPERATION})",
|
|
726
|
+
context=ctx,
|
|
727
|
+
)
|
|
728
|
+
|
|
729
|
+
# Parse all bindings for this operation
|
|
730
|
+
parsed_list = [
|
|
731
|
+
_parse_binding_entry(
|
|
732
|
+
b,
|
|
733
|
+
contract_path,
|
|
734
|
+
max_expression_length=max_expression_length_override,
|
|
735
|
+
max_path_segments=max_path_segments_override,
|
|
736
|
+
additional_context_paths=additional_context_paths or None,
|
|
737
|
+
)
|
|
738
|
+
for b in operation_binding_list
|
|
739
|
+
]
|
|
740
|
+
|
|
741
|
+
# Check for duplicates within this operation's bindings
|
|
742
|
+
_check_duplicate_parameters(
|
|
743
|
+
parsed_list, f"operation '{operation_name}'", contract_path
|
|
744
|
+
)
|
|
745
|
+
|
|
746
|
+
parsed_bindings[operation_name] = parsed_list
|
|
747
|
+
|
|
748
|
+
logger.debug(
|
|
749
|
+
"Loaded %d operation binding groups from contract.yaml at %s",
|
|
750
|
+
len(parsed_bindings),
|
|
751
|
+
contract_path,
|
|
752
|
+
)
|
|
753
|
+
|
|
754
|
+
return ModelOperationBindingsSubcontract(
|
|
755
|
+
version=version,
|
|
756
|
+
additional_context_paths=list(additional_context_paths),
|
|
757
|
+
bindings=parsed_bindings,
|
|
758
|
+
global_bindings=global_bindings,
|
|
759
|
+
max_expression_length=max_expression_length_override or MAX_EXPRESSION_LENGTH,
|
|
760
|
+
max_path_segments=max_path_segments_override or MAX_PATH_SEGMENTS,
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
__all__ = [
|
|
765
|
+
# Loader-specific constants
|
|
766
|
+
"CONTEXT_PATH_NAME_PATTERN",
|
|
767
|
+
"MAX_CONTRACT_FILE_SIZE_BYTES",
|
|
768
|
+
# Re-exported binding constants (canonical source: omnibase_infra.models.bindings)
|
|
769
|
+
"MAX_EXPRESSION_LENGTH",
|
|
770
|
+
"MAX_PATH_SEGMENTS",
|
|
771
|
+
"VALID_CONTEXT_PATHS",
|
|
772
|
+
"VALID_SOURCES",
|
|
773
|
+
# Error codes
|
|
774
|
+
"ERROR_CODE_CONTRACT_NOT_FOUND",
|
|
775
|
+
"ERROR_CODE_DUPLICATE_PARAMETER",
|
|
776
|
+
"ERROR_CODE_EMPTY_PATH_SEGMENT",
|
|
777
|
+
"ERROR_CODE_EXPRESSION_MALFORMED",
|
|
778
|
+
"ERROR_CODE_EXPRESSION_TOO_LONG",
|
|
779
|
+
"ERROR_CODE_FILE_SIZE_EXCEEDED",
|
|
780
|
+
"ERROR_CODE_INVALID_CONTEXT_PATH",
|
|
781
|
+
"ERROR_CODE_INVALID_CONTEXT_PATH_NAME",
|
|
782
|
+
"ERROR_CODE_INVALID_SOURCE",
|
|
783
|
+
"ERROR_CODE_MISSING_PATH_SEGMENT",
|
|
784
|
+
"ERROR_CODE_PATH_TOO_DEEP",
|
|
785
|
+
"ERROR_CODE_UNKNOWN_OPERATION",
|
|
786
|
+
"ERROR_CODE_YAML_PARSE_ERROR",
|
|
787
|
+
# Main function
|
|
788
|
+
"load_operation_bindings_subcontract",
|
|
789
|
+
]
|