omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Handler Contract Source for Filesystem Discovery.
|
|
4
|
+
|
|
5
|
+
This module provides HandlerContractSource, which discovers handler contracts
|
|
6
|
+
from the filesystem by recursively scanning configured paths for
|
|
7
|
+
handler_contract.yaml files, parsing them, and transforming them into
|
|
8
|
+
ModelHandlerDescriptor instances wrapped in ModelContractDiscoveryResult.
|
|
9
|
+
|
|
10
|
+
Part of OMN-1097: HandlerContractSource + Filesystem Discovery.
|
|
11
|
+
|
|
12
|
+
The source implements ProtocolContractSource and supports two operation modes:
|
|
13
|
+
- Strict mode (default): Raises on first error encountered
|
|
14
|
+
- Graceful mode: Collects errors, continues discovery
|
|
15
|
+
|
|
16
|
+
Both modes return ModelContractDiscoveryResult for a consistent interface.
|
|
17
|
+
In strict mode, validation_errors will be empty since errors raise exceptions.
|
|
18
|
+
|
|
19
|
+
See Also:
|
|
20
|
+
- ProtocolContractSource: Protocol definition for handler sources
|
|
21
|
+
- ModelHandlerContract: Contract model from omnibase_core
|
|
22
|
+
- ModelHandlerValidationError: Structured error model for validation failures
|
|
23
|
+
- ModelContractDiscoveryResult: Result model containing descriptors and errors
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.6.2
|
|
26
|
+
Created as part of OMN-1097 filesystem handler discovery.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import logging
|
|
32
|
+
import time
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
import yaml
|
|
36
|
+
from pydantic import ValidationError
|
|
37
|
+
|
|
38
|
+
from omnibase_core.models.contracts.model_handler_contract import ModelHandlerContract
|
|
39
|
+
from omnibase_core.models.errors.model_onex_error import ModelOnexError
|
|
40
|
+
from omnibase_infra.enums import EnumHandlerErrorType, EnumHandlerSourceType
|
|
41
|
+
from omnibase_infra.models.errors import ModelHandlerValidationError
|
|
42
|
+
from omnibase_infra.models.handlers import (
|
|
43
|
+
ModelContractDiscoveryResult,
|
|
44
|
+
ModelHandlerDescriptor,
|
|
45
|
+
ModelHandlerIdentifier,
|
|
46
|
+
)
|
|
47
|
+
from omnibase_infra.runtime.protocol_contract_source import ProtocolContractSource
|
|
48
|
+
|
|
49
|
+
# Rebuild ModelContractDiscoveryResult to resolve the forward reference
|
|
50
|
+
# to ModelHandlerValidationError. This must happen after ModelHandlerValidationError
|
|
51
|
+
# is imported to make the type available for Pydantic validation.
|
|
52
|
+
#
|
|
53
|
+
# Why this pattern is used:
|
|
54
|
+
# ModelContractDiscoveryResult has a field typed as list[ModelHandlerValidationError].
|
|
55
|
+
# ModelHandlerValidationError imports ModelHandlerIdentifier from models.handlers.
|
|
56
|
+
# If ModelContractDiscoveryResult directly imported ModelHandlerValidationError,
|
|
57
|
+
# it would cause a circular import because models.handlers.__init__.py imports
|
|
58
|
+
# ModelContractDiscoveryResult.
|
|
59
|
+
#
|
|
60
|
+
# The solution:
|
|
61
|
+
# 1. ModelContractDiscoveryResult uses TYPE_CHECKING to defer the import
|
|
62
|
+
# 2. With PEP 563 (from __future__ import annotations), the annotation becomes
|
|
63
|
+
# a string at runtime, avoiding the circular import
|
|
64
|
+
# 3. model_rebuild() resolves the string annotation to the actual type after
|
|
65
|
+
# both classes are defined
|
|
66
|
+
#
|
|
67
|
+
# This is tested in: tests/unit/runtime/test_handler_contract_source.py
|
|
68
|
+
ModelContractDiscoveryResult.model_rebuild()
|
|
69
|
+
|
|
70
|
+
logger = logging.getLogger(__name__)
|
|
71
|
+
|
|
72
|
+
# File pattern for handler contracts
|
|
73
|
+
HANDLER_CONTRACT_FILENAME = "handler_contract.yaml"
|
|
74
|
+
|
|
75
|
+
# Maximum contract file size (10MB) to prevent memory exhaustion
|
|
76
|
+
MAX_CONTRACT_SIZE = 10 * 1024 * 1024
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# =============================================================================
|
|
80
|
+
# HandlerContractSource Implementation
|
|
81
|
+
# =============================================================================
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class HandlerContractSource(ProtocolContractSource):
|
|
85
|
+
"""Handler source that discovers contracts from the filesystem.
|
|
86
|
+
|
|
87
|
+
This class implements ProtocolContractSource by recursively scanning
|
|
88
|
+
configured paths for handler_contract.yaml files, parsing them with
|
|
89
|
+
YAML and validating against ModelHandlerContract from omnibase_core.
|
|
90
|
+
|
|
91
|
+
Protocol Compliance:
|
|
92
|
+
This class explicitly inherits from ProtocolContractSource and implements
|
|
93
|
+
all required protocol methods: discover_handlers() async method and
|
|
94
|
+
source_type property. Protocol compliance is verified at runtime through
|
|
95
|
+
Python's structural subtyping and enforced by type checkers (mypy/pyright).
|
|
96
|
+
|
|
97
|
+
The source supports two operation modes:
|
|
98
|
+
- Strict mode (default): Raises ModelOnexError on first error
|
|
99
|
+
- Graceful mode: Collects all errors, continues discovery
|
|
100
|
+
|
|
101
|
+
Both modes return ModelContractDiscoveryResult for a consistent interface.
|
|
102
|
+
In strict mode, validation_errors will always be empty since errors raise
|
|
103
|
+
exceptions instead of being collected.
|
|
104
|
+
|
|
105
|
+
Attributes:
|
|
106
|
+
source_type: Returns "CONTRACT" as the source type identifier.
|
|
107
|
+
|
|
108
|
+
Example:
|
|
109
|
+
>>> # Strict mode discovery (raises on error)
|
|
110
|
+
>>> source = HandlerContractSource(contract_paths=[Path("./handlers")])
|
|
111
|
+
>>> result = await source.discover_handlers()
|
|
112
|
+
>>> print(f"Found {len(result.descriptors)} handlers")
|
|
113
|
+
>>> # result.validation_errors is always empty in strict mode
|
|
114
|
+
|
|
115
|
+
>>> # Graceful mode with error collection
|
|
116
|
+
>>> source = HandlerContractSource(
|
|
117
|
+
... contract_paths=[Path("./handlers")],
|
|
118
|
+
... graceful_mode=True,
|
|
119
|
+
... )
|
|
120
|
+
>>> result = await source.discover_handlers()
|
|
121
|
+
>>> print(f"Found {len(result.descriptors)} handlers")
|
|
122
|
+
>>> print(f"Encountered {len(result.validation_errors)} errors")
|
|
123
|
+
|
|
124
|
+
Performance Characteristics:
|
|
125
|
+
- File system scanning is O(n) where n is total files in paths
|
|
126
|
+
- YAML parsing is synchronous (consider aiofiles for high-throughput)
|
|
127
|
+
- Typical performance: 100-500 contracts/second on SSD
|
|
128
|
+
- Memory: ~1KB per contract descriptor retained
|
|
129
|
+
|
|
130
|
+
.. versionadded:: 0.6.2
|
|
131
|
+
Created as part of OMN-1097 filesystem handler discovery.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def __init__(
|
|
135
|
+
self,
|
|
136
|
+
contract_paths: list[Path],
|
|
137
|
+
graceful_mode: bool = False,
|
|
138
|
+
) -> None:
|
|
139
|
+
"""Initialize the handler contract source.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
contract_paths: List of paths to scan for handler_contract.yaml files.
|
|
143
|
+
Must not be empty.
|
|
144
|
+
graceful_mode: If True, collect errors and continue discovery.
|
|
145
|
+
If False (default), raise on first error.
|
|
146
|
+
|
|
147
|
+
Raises:
|
|
148
|
+
ModelOnexError: If contract_paths is empty.
|
|
149
|
+
"""
|
|
150
|
+
if not contract_paths:
|
|
151
|
+
raise ModelOnexError(
|
|
152
|
+
"contract_paths is required and cannot be empty",
|
|
153
|
+
error_code="HANDLER_SOURCE_001",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self._contract_paths = contract_paths
|
|
157
|
+
self._graceful_mode = graceful_mode
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def source_type(self) -> str:
|
|
161
|
+
"""Return the source type identifier.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
"CONTRACT" as the source type.
|
|
165
|
+
"""
|
|
166
|
+
return "CONTRACT"
|
|
167
|
+
|
|
168
|
+
def _sanitize_path_for_logging(self, path: Path) -> str:
|
|
169
|
+
"""Sanitize a file path for safe inclusion in logs and error messages.
|
|
170
|
+
|
|
171
|
+
In production environments, full paths may leak sensitive information
|
|
172
|
+
about directory structure. This method returns only the filename and
|
|
173
|
+
parent directory to provide context without exposing full paths.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
path: The full path to sanitize.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Sanitized path string showing only parent/filename.
|
|
180
|
+
For example: "/home/user/code/handlers/handler_contract.yaml"
|
|
181
|
+
becomes "handlers/handler_contract.yaml".
|
|
182
|
+
"""
|
|
183
|
+
# Return parent directory name + filename for context
|
|
184
|
+
# This provides enough info for debugging without full path exposure
|
|
185
|
+
try:
|
|
186
|
+
return str(Path(path.parent.name) / path.name)
|
|
187
|
+
except (ValueError, AttributeError):
|
|
188
|
+
# Fallback to just filename if parent extraction fails
|
|
189
|
+
return path.name
|
|
190
|
+
|
|
191
|
+
async def discover_handlers(
|
|
192
|
+
self,
|
|
193
|
+
) -> ModelContractDiscoveryResult:
|
|
194
|
+
"""Discover handler contracts from configured paths.
|
|
195
|
+
|
|
196
|
+
Recursively scans all configured paths for handler_contract.yaml files,
|
|
197
|
+
parses them, validates against ModelHandlerContract, and transforms
|
|
198
|
+
them into ModelHandlerDescriptor instances.
|
|
199
|
+
|
|
200
|
+
In strict mode (default), raises on the first error encountered.
|
|
201
|
+
In graceful mode, collects all errors and continues discovery.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
ModelContractDiscoveryResult containing discovered descriptors and
|
|
205
|
+
any validation errors. In strict mode, validation_errors will be
|
|
206
|
+
empty (errors raise exceptions instead of being collected).
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
ModelOnexError: In strict mode, if a path doesn't exist or
|
|
210
|
+
a contract fails to parse/validate.
|
|
211
|
+
|
|
212
|
+
Performance:
|
|
213
|
+
Discovery is synchronous and scales linearly with the number
|
|
214
|
+
of files. Telemetry is logged including duration_seconds and
|
|
215
|
+
contracts_per_second for monitoring.
|
|
216
|
+
"""
|
|
217
|
+
start_time = time.perf_counter()
|
|
218
|
+
descriptors: list[ModelHandlerDescriptor] = []
|
|
219
|
+
validation_errors: list[ModelHandlerValidationError] = []
|
|
220
|
+
# Track discovered files to avoid duplicates when paths overlap
|
|
221
|
+
discovered_paths: set[Path] = set()
|
|
222
|
+
|
|
223
|
+
logger.debug(
|
|
224
|
+
"Starting handler contract discovery",
|
|
225
|
+
extra={
|
|
226
|
+
"paths_scanned": len(self._contract_paths),
|
|
227
|
+
"graceful_mode": self._graceful_mode,
|
|
228
|
+
"contract_paths": [str(p) for p in self._contract_paths],
|
|
229
|
+
},
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
for base_path in self._contract_paths:
|
|
233
|
+
# Check if path exists (strict mode raises, graceful collects)
|
|
234
|
+
if not base_path.exists():
|
|
235
|
+
error_msg = f"Contract path does not exist: {base_path}"
|
|
236
|
+
if not self._graceful_mode:
|
|
237
|
+
raise ModelOnexError(
|
|
238
|
+
error_msg,
|
|
239
|
+
error_code="HANDLER_SOURCE_002",
|
|
240
|
+
)
|
|
241
|
+
# In graceful mode, log and continue
|
|
242
|
+
logger.warning(
|
|
243
|
+
"Contract path does not exist, skipping: %s",
|
|
244
|
+
base_path,
|
|
245
|
+
extra={
|
|
246
|
+
"path": str(base_path),
|
|
247
|
+
"graceful_mode": self._graceful_mode,
|
|
248
|
+
"paths_scanned": len(self._contract_paths),
|
|
249
|
+
},
|
|
250
|
+
)
|
|
251
|
+
continue
|
|
252
|
+
|
|
253
|
+
# Discover contract files
|
|
254
|
+
contract_files = self._find_contract_files(base_path)
|
|
255
|
+
logger.debug(
|
|
256
|
+
"Scanned path for contracts: %s",
|
|
257
|
+
base_path,
|
|
258
|
+
extra={
|
|
259
|
+
"base_path": str(base_path),
|
|
260
|
+
"contracts_found": len(contract_files),
|
|
261
|
+
"graceful_mode": self._graceful_mode,
|
|
262
|
+
"paths_scanned": len(self._contract_paths),
|
|
263
|
+
},
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
for contract_file in contract_files:
|
|
267
|
+
# Deduplicate using resolved path to handle overlapping search paths
|
|
268
|
+
resolved_path = contract_file.resolve()
|
|
269
|
+
if resolved_path in discovered_paths:
|
|
270
|
+
continue
|
|
271
|
+
|
|
272
|
+
# Symlink protection: verify resolved path is within configured paths
|
|
273
|
+
# This prevents symlink-based path traversal attacks where a symlink
|
|
274
|
+
# inside a configured path points to files outside allowed directories
|
|
275
|
+
is_within_allowed = any(
|
|
276
|
+
resolved_path.is_relative_to(base.resolve())
|
|
277
|
+
for base in self._contract_paths
|
|
278
|
+
)
|
|
279
|
+
if not is_within_allowed:
|
|
280
|
+
logger.warning(
|
|
281
|
+
"Skipping contract file outside allowed paths: %s (resolved to %s)",
|
|
282
|
+
contract_file,
|
|
283
|
+
resolved_path,
|
|
284
|
+
extra={
|
|
285
|
+
"contract_file": str(contract_file),
|
|
286
|
+
"resolved_path": str(resolved_path),
|
|
287
|
+
"graceful_mode": self._graceful_mode,
|
|
288
|
+
"reason": "symlink_outside_allowed_paths",
|
|
289
|
+
},
|
|
290
|
+
)
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
discovered_paths.add(resolved_path)
|
|
294
|
+
|
|
295
|
+
try:
|
|
296
|
+
descriptor = self._parse_contract_file(contract_file)
|
|
297
|
+
descriptors.append(descriptor)
|
|
298
|
+
logger.debug(
|
|
299
|
+
"Successfully parsed contract: %s",
|
|
300
|
+
contract_file,
|
|
301
|
+
extra={
|
|
302
|
+
"contract_file": str(contract_file),
|
|
303
|
+
"handler_id": descriptor.handler_id,
|
|
304
|
+
"handler_name": descriptor.name,
|
|
305
|
+
"handler_version": descriptor.version,
|
|
306
|
+
"graceful_mode": self._graceful_mode,
|
|
307
|
+
},
|
|
308
|
+
)
|
|
309
|
+
except yaml.YAMLError as e:
|
|
310
|
+
error = self._create_parse_error(contract_file, e)
|
|
311
|
+
if not self._graceful_mode:
|
|
312
|
+
raise ModelOnexError(
|
|
313
|
+
f"Failed to parse YAML contract at {contract_file}: {e}",
|
|
314
|
+
error_code="HANDLER_SOURCE_003",
|
|
315
|
+
) from e
|
|
316
|
+
logger.warning(
|
|
317
|
+
"Failed to parse YAML contract in %s, continuing in graceful mode",
|
|
318
|
+
self._sanitize_path_for_logging(contract_file),
|
|
319
|
+
extra={
|
|
320
|
+
"contract_file": str(contract_file),
|
|
321
|
+
"error_type": "yaml_parse_error",
|
|
322
|
+
"graceful_mode": self._graceful_mode,
|
|
323
|
+
"paths_scanned": len(self._contract_paths),
|
|
324
|
+
},
|
|
325
|
+
)
|
|
326
|
+
validation_errors.append(error)
|
|
327
|
+
except ValidationError as e:
|
|
328
|
+
error = self._create_validation_error(contract_file, e)
|
|
329
|
+
if not self._graceful_mode:
|
|
330
|
+
raise ModelOnexError(
|
|
331
|
+
f"Contract validation failed at {contract_file}: {e}",
|
|
332
|
+
error_code="HANDLER_SOURCE_004",
|
|
333
|
+
) from e
|
|
334
|
+
logger.warning(
|
|
335
|
+
"Contract validation failed in %s, continuing in graceful mode",
|
|
336
|
+
self._sanitize_path_for_logging(contract_file),
|
|
337
|
+
extra={
|
|
338
|
+
"contract_file": str(contract_file),
|
|
339
|
+
"error_type": "validation_error",
|
|
340
|
+
"error_count": len(e.errors()),
|
|
341
|
+
"graceful_mode": self._graceful_mode,
|
|
342
|
+
"paths_scanned": len(self._contract_paths),
|
|
343
|
+
},
|
|
344
|
+
)
|
|
345
|
+
validation_errors.append(error)
|
|
346
|
+
except ModelOnexError as e:
|
|
347
|
+
# Handle known ModelOnexError types in graceful mode
|
|
348
|
+
if not self._graceful_mode:
|
|
349
|
+
raise
|
|
350
|
+
|
|
351
|
+
# Only handle file size limit errors (HANDLER_SOURCE_005) gracefully
|
|
352
|
+
# Other ModelOnexError types should be re-raised as they may indicate
|
|
353
|
+
# more serious issues (e.g., configuration errors, programming errors)
|
|
354
|
+
# Defensive check: error_code should always exist on ModelOnexError,
|
|
355
|
+
# but handle the case where it might be None
|
|
356
|
+
error_code = getattr(e, "error_code", None)
|
|
357
|
+
if error_code == "HANDLER_SOURCE_005":
|
|
358
|
+
# Get file size defensively - the original stat() that triggered
|
|
359
|
+
# this error may have succeeded, but the file could have changed
|
|
360
|
+
# (TOCTOU race). Use 0 as fallback if stat() fails now.
|
|
361
|
+
try:
|
|
362
|
+
file_size = contract_file.stat().st_size
|
|
363
|
+
except OSError:
|
|
364
|
+
file_size = 0 # File may have been deleted/changed
|
|
365
|
+
error = self._create_size_limit_error(
|
|
366
|
+
contract_file,
|
|
367
|
+
file_size,
|
|
368
|
+
)
|
|
369
|
+
logger.warning(
|
|
370
|
+
"Contract file %s exceeds size limit, continuing in graceful mode",
|
|
371
|
+
self._sanitize_path_for_logging(contract_file),
|
|
372
|
+
extra={
|
|
373
|
+
"contract_file": str(contract_file),
|
|
374
|
+
"error_type": "size_limit_error",
|
|
375
|
+
"error_code": error_code,
|
|
376
|
+
"graceful_mode": self._graceful_mode,
|
|
377
|
+
"paths_scanned": len(self._contract_paths),
|
|
378
|
+
},
|
|
379
|
+
)
|
|
380
|
+
validation_errors.append(error)
|
|
381
|
+
else:
|
|
382
|
+
# Re-raise unexpected ModelOnexError types even in graceful mode
|
|
383
|
+
# These may indicate configuration or programming errors
|
|
384
|
+
raise
|
|
385
|
+
except OSError as e:
|
|
386
|
+
# Handle file I/O errors (permission denied, file not found, etc.)
|
|
387
|
+
if not self._graceful_mode:
|
|
388
|
+
raise ModelOnexError(
|
|
389
|
+
f"Failed to read contract file at {contract_file}: {e}",
|
|
390
|
+
error_code="HANDLER_SOURCE_006",
|
|
391
|
+
) from e
|
|
392
|
+
error = self._create_io_error(contract_file, e)
|
|
393
|
+
logger.warning(
|
|
394
|
+
"Failed to read contract file, continuing in graceful mode: %s",
|
|
395
|
+
self._sanitize_path_for_logging(contract_file),
|
|
396
|
+
extra={
|
|
397
|
+
"contract_file": str(contract_file),
|
|
398
|
+
"error_type": "io_error",
|
|
399
|
+
"error_message": str(e),
|
|
400
|
+
"graceful_mode": self._graceful_mode,
|
|
401
|
+
},
|
|
402
|
+
)
|
|
403
|
+
validation_errors.append(error)
|
|
404
|
+
|
|
405
|
+
# Calculate duration and log results
|
|
406
|
+
duration_seconds = time.perf_counter() - start_time
|
|
407
|
+
self._log_discovery_results(
|
|
408
|
+
len(descriptors), len(validation_errors), duration_seconds
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
return ModelContractDiscoveryResult(
|
|
412
|
+
descriptors=descriptors,
|
|
413
|
+
validation_errors=validation_errors,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
def _find_contract_files(self, base_path: Path) -> list[Path]:
|
|
417
|
+
"""Find all handler_contract.yaml files under a base path.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
base_path: Directory to scan recursively.
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
List of paths to handler_contract.yaml files.
|
|
424
|
+
"""
|
|
425
|
+
if base_path.is_file():
|
|
426
|
+
# Exact case-sensitive match for file names
|
|
427
|
+
if base_path.name == HANDLER_CONTRACT_FILENAME:
|
|
428
|
+
return [base_path]
|
|
429
|
+
return []
|
|
430
|
+
|
|
431
|
+
# Use rglob and filter for exact case-sensitive match
|
|
432
|
+
# This ensures we don't pick up HANDLER_CONTRACT.yaml or handler_contract.yml
|
|
433
|
+
return [
|
|
434
|
+
f
|
|
435
|
+
for f in base_path.rglob(HANDLER_CONTRACT_FILENAME)
|
|
436
|
+
if f.name == HANDLER_CONTRACT_FILENAME
|
|
437
|
+
]
|
|
438
|
+
|
|
439
|
+
def _parse_contract_file(self, contract_path: Path) -> ModelHandlerDescriptor:
|
|
440
|
+
"""Parse a contract file and return a descriptor.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
contract_path: Path to the handler_contract.yaml file.
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
ModelHandlerDescriptor created from the contract.
|
|
447
|
+
|
|
448
|
+
Raises:
|
|
449
|
+
ModelOnexError: If contract file exceeds MAX_CONTRACT_SIZE (10MB).
|
|
450
|
+
yaml.YAMLError: If YAML parsing fails.
|
|
451
|
+
ValidationError: If contract validation fails.
|
|
452
|
+
"""
|
|
453
|
+
# TODO [OMN-1352]: Replace direct file I/O with FileRegistry abstraction
|
|
454
|
+
#
|
|
455
|
+
# Why direct file operations are used here:
|
|
456
|
+
# RegistryFileBased (or FileRegistry) does not yet exist in omnibase_core.
|
|
457
|
+
# This is a temporary implementation that will be replaced once the
|
|
458
|
+
# registry abstraction is available, providing:
|
|
459
|
+
# - Consistent file loading across the codebase
|
|
460
|
+
# - Caching and performance optimizations
|
|
461
|
+
# - Unified error handling for file operations
|
|
462
|
+
#
|
|
463
|
+
# See: docs/architecture/RUNTIME_HOST_IMPLEMENTATION_PLAN.md
|
|
464
|
+
|
|
465
|
+
# Validate file size before reading to prevent memory exhaustion
|
|
466
|
+
file_size = contract_path.stat().st_size
|
|
467
|
+
if file_size > MAX_CONTRACT_SIZE:
|
|
468
|
+
raise ModelOnexError(
|
|
469
|
+
f"Contract file exceeds size limit: {file_size} bytes "
|
|
470
|
+
f"(max: {MAX_CONTRACT_SIZE} bytes)",
|
|
471
|
+
error_code="HANDLER_SOURCE_005",
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
with contract_path.open("r", encoding="utf-8") as f:
|
|
475
|
+
raw_data = yaml.safe_load(f)
|
|
476
|
+
|
|
477
|
+
# Validate against ModelHandlerContract
|
|
478
|
+
contract = ModelHandlerContract.model_validate(raw_data)
|
|
479
|
+
|
|
480
|
+
# Transform to descriptor
|
|
481
|
+
return ModelHandlerDescriptor(
|
|
482
|
+
handler_id=contract.handler_id,
|
|
483
|
+
name=contract.name,
|
|
484
|
+
version=contract.version,
|
|
485
|
+
handler_kind=contract.descriptor.handler_kind,
|
|
486
|
+
input_model=contract.input_model,
|
|
487
|
+
output_model=contract.output_model,
|
|
488
|
+
description=contract.description,
|
|
489
|
+
contract_path=str(contract_path),
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
def _create_parse_error(
|
|
493
|
+
self,
|
|
494
|
+
contract_path: Path,
|
|
495
|
+
error: yaml.YAMLError,
|
|
496
|
+
) -> ModelHandlerValidationError:
|
|
497
|
+
"""Create a validation error for YAML parse failures.
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
contract_path: Path to the failing contract file.
|
|
501
|
+
error: The YAML parsing error.
|
|
502
|
+
|
|
503
|
+
Returns:
|
|
504
|
+
ModelHandlerValidationError with parse error details.
|
|
505
|
+
"""
|
|
506
|
+
handler_identity = ModelHandlerIdentifier.from_handler_id(
|
|
507
|
+
f"unknown@{contract_path.name}"
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
return ModelHandlerValidationError(
|
|
511
|
+
error_type=EnumHandlerErrorType.CONTRACT_PARSE_ERROR,
|
|
512
|
+
rule_id="CONTRACT-001",
|
|
513
|
+
handler_identity=handler_identity,
|
|
514
|
+
source_type=EnumHandlerSourceType.CONTRACT,
|
|
515
|
+
message=f"Failed to parse YAML in {self._sanitize_path_for_logging(contract_path)}: {error}",
|
|
516
|
+
remediation_hint="Check YAML syntax and ensure proper indentation",
|
|
517
|
+
file_path=str(contract_path),
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
def _create_validation_error(
|
|
521
|
+
self,
|
|
522
|
+
contract_path: Path,
|
|
523
|
+
error: ValidationError,
|
|
524
|
+
) -> ModelHandlerValidationError:
|
|
525
|
+
"""Create a validation error for contract validation failures.
|
|
526
|
+
|
|
527
|
+
Args:
|
|
528
|
+
contract_path: Path to the failing contract file.
|
|
529
|
+
error: The Pydantic validation error.
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
ModelHandlerValidationError with validation details.
|
|
533
|
+
"""
|
|
534
|
+
handler_identity = ModelHandlerIdentifier.from_handler_id(
|
|
535
|
+
f"unknown@{contract_path.name}"
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
# Extract first error detail for remediation hint
|
|
539
|
+
error_details = error.errors()
|
|
540
|
+
if error_details:
|
|
541
|
+
first_error = error_details[0]
|
|
542
|
+
field_loc = " -> ".join(str(x) for x in first_error.get("loc", ()))
|
|
543
|
+
error_msg = str(first_error.get("msg", "validation failed"))
|
|
544
|
+
else:
|
|
545
|
+
field_loc = "unknown"
|
|
546
|
+
error_msg = "validation failed"
|
|
547
|
+
|
|
548
|
+
return ModelHandlerValidationError(
|
|
549
|
+
error_type=EnumHandlerErrorType.CONTRACT_VALIDATION_ERROR,
|
|
550
|
+
rule_id="CONTRACT-002",
|
|
551
|
+
handler_identity=handler_identity,
|
|
552
|
+
source_type=EnumHandlerSourceType.CONTRACT,
|
|
553
|
+
message=f"Contract validation failed in {self._sanitize_path_for_logging(contract_path)}: {error_msg} at {field_loc}",
|
|
554
|
+
remediation_hint=f"Check the '{field_loc}' field in the contract",
|
|
555
|
+
file_path=str(contract_path),
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
def _create_size_limit_error(
|
|
559
|
+
self,
|
|
560
|
+
contract_path: Path,
|
|
561
|
+
file_size: int,
|
|
562
|
+
) -> ModelHandlerValidationError:
|
|
563
|
+
"""Create a validation error for file size limit violations.
|
|
564
|
+
|
|
565
|
+
Args:
|
|
566
|
+
contract_path: Path to the oversized contract file.
|
|
567
|
+
file_size: The actual file size in bytes.
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
ModelHandlerValidationError with size limit details.
|
|
571
|
+
"""
|
|
572
|
+
handler_identity = ModelHandlerIdentifier.from_handler_id(
|
|
573
|
+
f"unknown@{contract_path.name}"
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
return ModelHandlerValidationError(
|
|
577
|
+
error_type=EnumHandlerErrorType.CONTRACT_VALIDATION_ERROR,
|
|
578
|
+
rule_id="CONTRACT-003",
|
|
579
|
+
handler_identity=handler_identity,
|
|
580
|
+
source_type=EnumHandlerSourceType.CONTRACT,
|
|
581
|
+
message=(
|
|
582
|
+
f"Contract file {self._sanitize_path_for_logging(contract_path)} exceeds size limit: "
|
|
583
|
+
f"{file_size} bytes (max: {MAX_CONTRACT_SIZE} bytes)"
|
|
584
|
+
),
|
|
585
|
+
remediation_hint=(
|
|
586
|
+
f"Reduce contract file size to under {MAX_CONTRACT_SIZE // (1024 * 1024)}MB. "
|
|
587
|
+
"Consider splitting into multiple contracts if needed."
|
|
588
|
+
),
|
|
589
|
+
file_path=str(contract_path),
|
|
590
|
+
)
|
|
591
|
+
|
|
592
|
+
def _create_io_error(
|
|
593
|
+
self,
|
|
594
|
+
contract_path: Path,
|
|
595
|
+
error: OSError,
|
|
596
|
+
) -> ModelHandlerValidationError:
|
|
597
|
+
"""Create a validation error for I/O failures.
|
|
598
|
+
|
|
599
|
+
Args:
|
|
600
|
+
contract_path: Path to the contract file that failed to read.
|
|
601
|
+
error: The I/O error encountered.
|
|
602
|
+
|
|
603
|
+
Returns:
|
|
604
|
+
ModelHandlerValidationError with I/O error details.
|
|
605
|
+
"""
|
|
606
|
+
handler_identity = ModelHandlerIdentifier.from_handler_id(
|
|
607
|
+
f"unknown@{contract_path.name}"
|
|
608
|
+
)
|
|
609
|
+
|
|
610
|
+
# OSError.strerror may be None for some error types (e.g., custom subclasses),
|
|
611
|
+
# so use str(error) as a fallback to ensure we always have an error message
|
|
612
|
+
error_message = error.strerror or str(error)
|
|
613
|
+
|
|
614
|
+
return ModelHandlerValidationError(
|
|
615
|
+
error_type=EnumHandlerErrorType.CONTRACT_PARSE_ERROR,
|
|
616
|
+
rule_id="CONTRACT-004",
|
|
617
|
+
handler_identity=handler_identity,
|
|
618
|
+
source_type=EnumHandlerSourceType.CONTRACT,
|
|
619
|
+
message=f"Failed to read contract file: {error_message}",
|
|
620
|
+
remediation_hint="Check file permissions and ensure the file exists",
|
|
621
|
+
file_path=str(contract_path),
|
|
622
|
+
)
|
|
623
|
+
|
|
624
|
+
def _log_discovery_results(
|
|
625
|
+
self,
|
|
626
|
+
discovered_count: int,
|
|
627
|
+
failure_count: int,
|
|
628
|
+
duration_seconds: float,
|
|
629
|
+
) -> None:
|
|
630
|
+
"""Log the discovery results with structured counts and timing.
|
|
631
|
+
|
|
632
|
+
Args:
|
|
633
|
+
discovered_count: Number of successfully discovered contracts.
|
|
634
|
+
failure_count: Number of validation failures.
|
|
635
|
+
duration_seconds: Total discovery duration in seconds.
|
|
636
|
+
"""
|
|
637
|
+
contracts_per_sec = (
|
|
638
|
+
discovered_count / duration_seconds if duration_seconds > 0 else 0.0
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
logger.info(
|
|
642
|
+
"Handler contract discovery completed: "
|
|
643
|
+
"discovered_contract_count=%d, validation_failure_count=%d, "
|
|
644
|
+
"paths_scanned=%d, graceful_mode=%s, "
|
|
645
|
+
"duration_seconds=%.3f, contracts_per_second=%.1f",
|
|
646
|
+
discovered_count,
|
|
647
|
+
failure_count,
|
|
648
|
+
len(self._contract_paths),
|
|
649
|
+
self._graceful_mode,
|
|
650
|
+
duration_seconds,
|
|
651
|
+
contracts_per_sec,
|
|
652
|
+
extra={
|
|
653
|
+
"discovered_contract_count": discovered_count,
|
|
654
|
+
"validation_failure_count": failure_count,
|
|
655
|
+
"paths_scanned": len(self._contract_paths),
|
|
656
|
+
"graceful_mode": self._graceful_mode,
|
|
657
|
+
"contract_paths": [str(p) for p in self._contract_paths],
|
|
658
|
+
"duration_seconds": duration_seconds,
|
|
659
|
+
"contracts_per_second": contracts_per_sec,
|
|
660
|
+
},
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
__all__ = [
|
|
665
|
+
"HandlerContractSource",
|
|
666
|
+
"MAX_CONTRACT_SIZE",
|
|
667
|
+
"ModelContractDiscoveryResult",
|
|
668
|
+
"ModelHandlerDescriptor",
|
|
669
|
+
]
|