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,133 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 OmniNode Team <info@omninode.ai>
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
"""
|
|
5
|
+
Capture configuration model for corpus capture service.
|
|
6
|
+
|
|
7
|
+
.. versionadded:: 0.5.0
|
|
8
|
+
Added for CorpusCapture (OMN-1203)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from collections.abc import Sequence
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
15
|
+
|
|
16
|
+
from omnibase_infra.enums.enum_dedupe_strategy import EnumDedupeStrategy
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ModelCaptureConfig(BaseModel):
|
|
20
|
+
"""
|
|
21
|
+
Configuration for corpus capture.
|
|
22
|
+
|
|
23
|
+
Controls filtering, deduplication, and limits for captured executions.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> config = ModelCaptureConfig(
|
|
27
|
+
... corpus_display_name="regression-suite-v1",
|
|
28
|
+
... max_executions=50,
|
|
29
|
+
... sample_rate=0.5,
|
|
30
|
+
... handler_filter=("compute-handler", "effect-handler"),
|
|
31
|
+
... )
|
|
32
|
+
|
|
33
|
+
.. versionadded:: 0.5.0
|
|
34
|
+
Added for CorpusCapture (OMN-1203)
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
38
|
+
|
|
39
|
+
corpus_display_name: str = Field(
|
|
40
|
+
...,
|
|
41
|
+
min_length=1,
|
|
42
|
+
max_length=255,
|
|
43
|
+
description="Human-readable display name for the corpus.",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
max_executions: int = Field(
|
|
47
|
+
default=50,
|
|
48
|
+
ge=1,
|
|
49
|
+
le=10000,
|
|
50
|
+
description="Maximum number of executions to capture. "
|
|
51
|
+
"Recommended max is 50 for manageable corpus sizes.",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
sample_rate: float = Field(
|
|
55
|
+
default=1.0,
|
|
56
|
+
ge=0.0,
|
|
57
|
+
le=1.0,
|
|
58
|
+
description="Probability of capturing each execution. "
|
|
59
|
+
"1.0 = capture all, 0.1 = capture 10%.",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
handler_filter: tuple[str, ...] | None = Field(
|
|
63
|
+
default=None,
|
|
64
|
+
description="Whitelist of handler IDs to capture. "
|
|
65
|
+
"If None, all handlers are captured.",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
time_window_start: datetime | None = Field(
|
|
69
|
+
default=None,
|
|
70
|
+
description="Start of time window for capture (inclusive). "
|
|
71
|
+
"Executions before this time are skipped.",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
time_window_end: datetime | None = Field(
|
|
75
|
+
default=None,
|
|
76
|
+
description="End of time window for capture (inclusive). "
|
|
77
|
+
"Executions after this time are skipped.",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
dedupe_strategy: EnumDedupeStrategy = Field(
|
|
81
|
+
default=EnumDedupeStrategy.INPUT_HASH,
|
|
82
|
+
description="Strategy for detecting duplicate executions.",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
capture_timeout_ms: float = Field(
|
|
86
|
+
default=50.0,
|
|
87
|
+
ge=1.0,
|
|
88
|
+
le=5000.0,
|
|
89
|
+
description="Maximum time to wait for capture operation (ms). "
|
|
90
|
+
"If exceeded, capture is skipped and recorded as missed.",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@field_validator("handler_filter", mode="before")
|
|
94
|
+
@classmethod
|
|
95
|
+
def _convert_list_to_tuple(cls, v: Sequence[str] | None) -> tuple[str, ...] | None:
|
|
96
|
+
"""Convert sequence to tuple for immutability."""
|
|
97
|
+
if v is None:
|
|
98
|
+
return None
|
|
99
|
+
return tuple(v)
|
|
100
|
+
|
|
101
|
+
def has_time_window(self) -> bool:
|
|
102
|
+
"""Check if a time window filter is configured."""
|
|
103
|
+
return self.time_window_start is not None or self.time_window_end is not None
|
|
104
|
+
|
|
105
|
+
def is_in_time_window(self, timestamp: datetime) -> bool:
|
|
106
|
+
"""
|
|
107
|
+
Check if a timestamp falls within the configured time window.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
timestamp: The timestamp to check.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
True if within window (or no window configured).
|
|
114
|
+
"""
|
|
115
|
+
if self.time_window_start is not None and timestamp < self.time_window_start:
|
|
116
|
+
return False
|
|
117
|
+
if self.time_window_end is not None and timestamp > self.time_window_end:
|
|
118
|
+
return False
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
def is_handler_allowed(self, handler_id: str) -> bool:
|
|
122
|
+
"""
|
|
123
|
+
Check if a handler is in the whitelist.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
handler_id: The handler ID to check.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
True if allowed (or no filter configured).
|
|
130
|
+
"""
|
|
131
|
+
if self.handler_filter is None:
|
|
132
|
+
return True
|
|
133
|
+
return handler_id in self.handler_filter
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 OmniNode Team <info@omninode.ai>
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
"""
|
|
5
|
+
Capture result model for corpus capture service.
|
|
6
|
+
|
|
7
|
+
.. versionadded:: 0.5.0
|
|
8
|
+
Added for CorpusCapture (OMN-1203)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from uuid import UUID
|
|
13
|
+
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
15
|
+
|
|
16
|
+
from omnibase_infra.enums.enum_capture_outcome import EnumCaptureOutcome
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ModelCaptureResult(BaseModel):
|
|
20
|
+
"""
|
|
21
|
+
Result of a single capture attempt.
|
|
22
|
+
|
|
23
|
+
Tracks whether an execution was captured or skipped, and why.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.5.0
|
|
26
|
+
Added for CorpusCapture (OMN-1203)
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
30
|
+
|
|
31
|
+
manifest_id: UUID = Field(
|
|
32
|
+
...,
|
|
33
|
+
description="ID of the manifest that was processed.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
outcome: EnumCaptureOutcome = Field(
|
|
37
|
+
...,
|
|
38
|
+
description="Result of the capture attempt.",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
captured_at: datetime | None = Field(
|
|
42
|
+
default=None,
|
|
43
|
+
description="Timestamp when captured (None if skipped).",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
dedupe_hash: str | None = Field(
|
|
47
|
+
default=None,
|
|
48
|
+
description="Hash used for deduplication (if computed).",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
duration_ms: float = Field(
|
|
52
|
+
default=0.0,
|
|
53
|
+
ge=0.0,
|
|
54
|
+
description="Time taken to process the capture attempt.",
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
error_message: str | None = Field(
|
|
58
|
+
default=None,
|
|
59
|
+
description="Error message if capture failed.",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def __bool__(self) -> bool:
|
|
63
|
+
"""
|
|
64
|
+
Return True if the execution was captured.
|
|
65
|
+
|
|
66
|
+
Warning:
|
|
67
|
+
This is non-standard Pydantic behavior. Normally ``bool(model)``
|
|
68
|
+
returns True for any model instance. This override enables
|
|
69
|
+
idiomatic ``if result:`` checks for capture success.
|
|
70
|
+
"""
|
|
71
|
+
return self.outcome == EnumCaptureOutcome.CAPTURED
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def was_captured(self) -> bool:
|
|
75
|
+
"""Check if the execution was captured."""
|
|
76
|
+
return self.outcome == EnumCaptureOutcome.CAPTURED
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def was_skipped(self) -> bool:
|
|
80
|
+
"""Check if the execution was skipped (intentionally not captured)."""
|
|
81
|
+
return self.outcome.value.startswith("skipped_")
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def was_failed(self) -> bool:
|
|
85
|
+
"""Check if the capture failed due to an error."""
|
|
86
|
+
return self.outcome == EnumCaptureOutcome.FAILED
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Copyright 2025 OmniNode Team. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
"""Discovery models for node introspection and capability reporting.
|
|
4
|
+
|
|
5
|
+
Note:
|
|
6
|
+
ModelNodeIntrospectionEvent has been moved to omnibase_infra.models.registration.
|
|
7
|
+
Import it from there for new code.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from omnibase_infra.models.discovery.model_dependency_spec import ModelDependencySpec
|
|
11
|
+
from omnibase_infra.models.discovery.model_discovered_capabilities import (
|
|
12
|
+
ModelDiscoveredCapabilities,
|
|
13
|
+
)
|
|
14
|
+
from omnibase_infra.models.discovery.model_introspection_config import (
|
|
15
|
+
DEFAULT_HEARTBEAT_TOPIC,
|
|
16
|
+
DEFAULT_INTROSPECTION_TOPIC,
|
|
17
|
+
DEFAULT_REQUEST_INTROSPECTION_TOPIC,
|
|
18
|
+
INVALID_TOPIC_CHARS,
|
|
19
|
+
TOPIC_PATTERN,
|
|
20
|
+
VERSION_SUFFIX_PATTERN,
|
|
21
|
+
ModelIntrospectionConfig,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.models.discovery.model_introspection_performance_metrics import (
|
|
24
|
+
ModelIntrospectionPerformanceMetrics,
|
|
25
|
+
)
|
|
26
|
+
from omnibase_infra.models.discovery.model_introspection_task_config import (
|
|
27
|
+
ModelIntrospectionTaskConfig,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"DEFAULT_HEARTBEAT_TOPIC",
|
|
32
|
+
"DEFAULT_INTROSPECTION_TOPIC",
|
|
33
|
+
"DEFAULT_REQUEST_INTROSPECTION_TOPIC",
|
|
34
|
+
"INVALID_TOPIC_CHARS",
|
|
35
|
+
"TOPIC_PATTERN",
|
|
36
|
+
"VERSION_SUFFIX_PATTERN",
|
|
37
|
+
"ModelDependencySpec",
|
|
38
|
+
"ModelDiscoveredCapabilities",
|
|
39
|
+
"ModelIntrospectionConfig",
|
|
40
|
+
"ModelIntrospectionPerformanceMetrics",
|
|
41
|
+
"ModelIntrospectionTaskConfig",
|
|
42
|
+
]
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Dependency Specification Model.
|
|
4
|
+
|
|
5
|
+
Defines the specification for declaring dependencies by capability rather than
|
|
6
|
+
by concrete implementation. This enables capability-based auto-configuration
|
|
7
|
+
where nodes declare what they need, not who provides it.
|
|
8
|
+
|
|
9
|
+
Core Principle: "I'm interested in what you do, not what you are."
|
|
10
|
+
|
|
11
|
+
Related Tickets:
|
|
12
|
+
- OMN-1135: ServiceCapabilityQuery for capability-based discovery
|
|
13
|
+
- Design: DESIGN_CAPABILITY_BASED_AUTO_CONFIGURATION.md
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
>>> spec = ModelDependencySpec(
|
|
17
|
+
... name="storage_effect",
|
|
18
|
+
... type="node",
|
|
19
|
+
... capability="postgres.storage",
|
|
20
|
+
... contract_type="effect",
|
|
21
|
+
... intent_types=["postgres.upsert_registration"],
|
|
22
|
+
... )
|
|
23
|
+
>>> # System auto-discovers which node provides this capability
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from typing import Literal
|
|
29
|
+
|
|
30
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
31
|
+
|
|
32
|
+
from omnibase_infra.enums import EnumRegistrationState, EnumSelectionStrategy
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ModelDependencySpec(BaseModel):
|
|
36
|
+
"""Dependency specification - declares what is needed, not who provides it.
|
|
37
|
+
|
|
38
|
+
This model specifies a dependency by capability attributes (capability tags,
|
|
39
|
+
intent types, protocols) rather than by concrete module paths. The runtime
|
|
40
|
+
uses ServiceCapabilityQuery to resolve these specifications to actual nodes.
|
|
41
|
+
|
|
42
|
+
Discovery Strategy (in priority order):
|
|
43
|
+
1. If capability specified -> find by capability tag
|
|
44
|
+
2. If intent_types specified -> find by intent type
|
|
45
|
+
3. If protocol specified -> find by protocol
|
|
46
|
+
|
|
47
|
+
Selection Strategy (when multiple matches):
|
|
48
|
+
- first: Return first candidate (deterministic, fast)
|
|
49
|
+
- random: Random selection (load distribution)
|
|
50
|
+
- round_robin: Cycle through candidates (even distribution)
|
|
51
|
+
- least_loaded: RESERVED FOR FUTURE USE - not yet implemented
|
|
52
|
+
|
|
53
|
+
Attributes:
|
|
54
|
+
name: Dependency name for reference in code
|
|
55
|
+
type: Dependency type (node or protocol)
|
|
56
|
+
capability: Capability tag (e.g., "consul.registration", "postgres.storage")
|
|
57
|
+
intent_types: Intent types the dependency must handle
|
|
58
|
+
protocol: Protocol the dependency must implement
|
|
59
|
+
contract_type: Filter by contract type (effect, compute, reducer, orchestrator)
|
|
60
|
+
state: Filter by registration state (default: ACTIVE)
|
|
61
|
+
selection_strategy: Strategy for selecting among multiple matches
|
|
62
|
+
fallback_module: Reserved for future - fallback module if auto-discovery fails
|
|
63
|
+
description: Human-readable description of the dependency
|
|
64
|
+
|
|
65
|
+
Example - Capability-based:
|
|
66
|
+
>>> spec = ModelDependencySpec(
|
|
67
|
+
... name="registry_effect",
|
|
68
|
+
... type="node",
|
|
69
|
+
... capability="consul.registration",
|
|
70
|
+
... contract_type="effect",
|
|
71
|
+
... )
|
|
72
|
+
|
|
73
|
+
Example - Intent-based:
|
|
74
|
+
>>> spec = ModelDependencySpec(
|
|
75
|
+
... name="storage_effect",
|
|
76
|
+
... type="node",
|
|
77
|
+
... intent_types=["postgres.upsert_registration", "postgres.query"],
|
|
78
|
+
... )
|
|
79
|
+
|
|
80
|
+
Example - Protocol-based:
|
|
81
|
+
>>> spec = ModelDependencySpec(
|
|
82
|
+
... name="reducer",
|
|
83
|
+
... type="protocol",
|
|
84
|
+
... protocol="ProtocolReducer",
|
|
85
|
+
... contract_type="reducer",
|
|
86
|
+
... )
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
model_config = ConfigDict(
|
|
90
|
+
frozen=True,
|
|
91
|
+
extra="forbid",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Identity
|
|
95
|
+
name: str = Field(
|
|
96
|
+
...,
|
|
97
|
+
min_length=1,
|
|
98
|
+
max_length=256,
|
|
99
|
+
description="Dependency name for reference in code",
|
|
100
|
+
)
|
|
101
|
+
type: Literal["node", "protocol"] = Field(
|
|
102
|
+
...,
|
|
103
|
+
description="Dependency type (node or protocol)",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Capability-based discovery (choose one or combine)
|
|
107
|
+
capability: str | None = Field(
|
|
108
|
+
default=None,
|
|
109
|
+
min_length=1,
|
|
110
|
+
max_length=256,
|
|
111
|
+
description="Capability tag (e.g., 'consul.registration', 'postgres.storage')",
|
|
112
|
+
)
|
|
113
|
+
intent_types: list[str] | None = Field(
|
|
114
|
+
default=None,
|
|
115
|
+
description="Intent types the dependency must handle",
|
|
116
|
+
)
|
|
117
|
+
protocol: str | None = Field(
|
|
118
|
+
default=None,
|
|
119
|
+
min_length=1,
|
|
120
|
+
max_length=256,
|
|
121
|
+
description="Protocol the dependency must implement",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Filters
|
|
125
|
+
contract_type: Literal["effect", "compute", "reducer", "orchestrator"] | None = (
|
|
126
|
+
Field(
|
|
127
|
+
default=None,
|
|
128
|
+
description="Filter by contract type",
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
state: EnumRegistrationState = Field(
|
|
132
|
+
default=EnumRegistrationState.ACTIVE,
|
|
133
|
+
description="Filter by registration state",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Selection strategy (when multiple matches)
|
|
137
|
+
selection_strategy: EnumSelectionStrategy = Field(
|
|
138
|
+
default=EnumSelectionStrategy.FIRST,
|
|
139
|
+
description=(
|
|
140
|
+
"Strategy for selecting among multiple matches. "
|
|
141
|
+
"Valid values: 'first', 'random', 'round_robin'. "
|
|
142
|
+
"Note: 'least_loaded' is reserved for future use and not yet implemented."
|
|
143
|
+
),
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Fallback (if capability not found)
|
|
147
|
+
# NOTE: Reserved for future implementation. When auto-discovery fails to find
|
|
148
|
+
# any matching nodes, this module path could be dynamically imported and
|
|
149
|
+
# instantiated as a last resort. Currently NOT used by ServiceCapabilityQuery.
|
|
150
|
+
# See: resolve_dependency() returns None when no candidates found.
|
|
151
|
+
# Future implementation would involve: importlib.import_module + class instantiation.
|
|
152
|
+
fallback_module: str | None = Field(
|
|
153
|
+
default=None,
|
|
154
|
+
description=(
|
|
155
|
+
"Reserved for future implementation. Module path to import if "
|
|
156
|
+
"auto-discovery fails (e.g., 'mypackage.adapters.FallbackAdapter'). "
|
|
157
|
+
"Currently not used by ServiceCapabilityQuery - returns None instead."
|
|
158
|
+
),
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Documentation
|
|
162
|
+
description: str | None = Field(
|
|
163
|
+
default=None,
|
|
164
|
+
max_length=1024,
|
|
165
|
+
description="Human-readable description of the dependency",
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
@field_validator("intent_types", mode="before")
|
|
169
|
+
@classmethod
|
|
170
|
+
def normalize_empty_intent_types(
|
|
171
|
+
cls, v: list[str] | list[object] | None
|
|
172
|
+
) -> list[str] | list[object] | None:
|
|
173
|
+
"""Normalize empty intent_types list to None.
|
|
174
|
+
|
|
175
|
+
This ensures consistent behavior: both None and [] mean "no intent filter".
|
|
176
|
+
The has_intent_filter() method can then simply check for None.
|
|
177
|
+
|
|
178
|
+
Note:
|
|
179
|
+
With mode="before", input may be any JSON-compatible value. The type
|
|
180
|
+
hint accepts list[object] to handle unvalidated input. Pydantic will
|
|
181
|
+
validate the list contents in the "after" phase.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
v: The intent_types value - may be list, None, or other raw input.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
None if v is None or empty list, otherwise the original value for
|
|
188
|
+
further validation by Pydantic.
|
|
189
|
+
"""
|
|
190
|
+
if isinstance(v, list) and len(v) == 0:
|
|
191
|
+
return None
|
|
192
|
+
return v
|
|
193
|
+
|
|
194
|
+
@field_validator("selection_strategy", mode="before")
|
|
195
|
+
@classmethod
|
|
196
|
+
def normalize_selection_strategy(
|
|
197
|
+
cls, v: str | EnumSelectionStrategy
|
|
198
|
+
) -> str | EnumSelectionStrategy:
|
|
199
|
+
"""Normalize selection strategy input to handle case variations.
|
|
200
|
+
|
|
201
|
+
Accepts both string and enum input for flexibility. String inputs
|
|
202
|
+
are normalized to lowercase for case-insensitive matching.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
v: The selection strategy value (string or enum).
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Normalized string (lowercase) or the original enum value.
|
|
209
|
+
|
|
210
|
+
Example:
|
|
211
|
+
>>> # These all work:
|
|
212
|
+
>>> spec = ModelDependencySpec(name="test", type="node", capability="cap",
|
|
213
|
+
... selection_strategy="FIRST") # normalized to "first"
|
|
214
|
+
>>> spec = ModelDependencySpec(name="test", type="node", capability="cap",
|
|
215
|
+
... selection_strategy="First") # normalized to "first"
|
|
216
|
+
>>> spec = ModelDependencySpec(name="test", type="node", capability="cap",
|
|
217
|
+
... selection_strategy=EnumSelectionStrategy.FIRST) # enum preserved
|
|
218
|
+
"""
|
|
219
|
+
if isinstance(v, str):
|
|
220
|
+
return v.lower()
|
|
221
|
+
return v
|
|
222
|
+
|
|
223
|
+
@field_validator("selection_strategy", mode="after")
|
|
224
|
+
@classmethod
|
|
225
|
+
def validate_selection_strategy_implemented(
|
|
226
|
+
cls, v: EnumSelectionStrategy
|
|
227
|
+
) -> EnumSelectionStrategy:
|
|
228
|
+
"""Validate that the selection strategy is implemented.
|
|
229
|
+
|
|
230
|
+
The 'least_loaded' strategy is reserved for future use and requires
|
|
231
|
+
load metrics infrastructure that is not yet available. This validator
|
|
232
|
+
provides fail-fast behavior at model creation time rather than at
|
|
233
|
+
runtime during node selection.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
v: The selection strategy enum value to validate.
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
The validated selection strategy enum value.
|
|
240
|
+
|
|
241
|
+
Raises:
|
|
242
|
+
ValueError: If LEAST_LOADED is specified.
|
|
243
|
+
|
|
244
|
+
Example:
|
|
245
|
+
>>> spec = ModelDependencySpec(
|
|
246
|
+
... name="test",
|
|
247
|
+
... type="node",
|
|
248
|
+
... capability="test.cap",
|
|
249
|
+
... selection_strategy="least_loaded",
|
|
250
|
+
... )
|
|
251
|
+
ValueError: LEAST_LOADED selection strategy is not yet implemented...
|
|
252
|
+
"""
|
|
253
|
+
if v == EnumSelectionStrategy.LEAST_LOADED:
|
|
254
|
+
raise ValueError(
|
|
255
|
+
"LEAST_LOADED selection strategy is not yet implemented. "
|
|
256
|
+
"Use 'first', 'random', or 'round_robin' instead."
|
|
257
|
+
)
|
|
258
|
+
return v
|
|
259
|
+
|
|
260
|
+
@model_validator(mode="after")
|
|
261
|
+
def validate_has_filter(self) -> ModelDependencySpec:
|
|
262
|
+
"""Validate that at least one discovery filter is specified.
|
|
263
|
+
|
|
264
|
+
A dependency spec must have at least one of: capability, intent_types, or protocol.
|
|
265
|
+
Without any filter, the dependency cannot be resolved.
|
|
266
|
+
|
|
267
|
+
Raises:
|
|
268
|
+
ValueError: If no discovery filter is specified.
|
|
269
|
+
"""
|
|
270
|
+
if not self.has_any_filter():
|
|
271
|
+
raise ValueError(
|
|
272
|
+
f"Dependency spec '{self.name}' must have at least one discovery filter: "
|
|
273
|
+
"capability, intent_types, or protocol. "
|
|
274
|
+
"Cannot resolve a dependency without any filter specified."
|
|
275
|
+
)
|
|
276
|
+
return self
|
|
277
|
+
|
|
278
|
+
def has_capability_filter(self) -> bool:
|
|
279
|
+
"""Check if capability-based discovery is specified.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
True if capability tag is specified, False otherwise.
|
|
283
|
+
"""
|
|
284
|
+
return self.capability is not None
|
|
285
|
+
|
|
286
|
+
def has_intent_filter(self) -> bool:
|
|
287
|
+
"""Check if intent-based discovery is specified.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
True if intent_types are specified, False otherwise.
|
|
291
|
+
|
|
292
|
+
Note:
|
|
293
|
+
Empty lists are normalized to None by the normalize_empty_intent_types
|
|
294
|
+
validator, so we only need to check for None.
|
|
295
|
+
"""
|
|
296
|
+
return self.intent_types is not None
|
|
297
|
+
|
|
298
|
+
def has_protocol_filter(self) -> bool:
|
|
299
|
+
"""Check if protocol-based discovery is specified.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
True if protocol is specified, False otherwise.
|
|
303
|
+
"""
|
|
304
|
+
return self.protocol is not None
|
|
305
|
+
|
|
306
|
+
def has_any_filter(self) -> bool:
|
|
307
|
+
"""Check if any discovery filter is specified.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
True if at least one filter is specified, False otherwise.
|
|
311
|
+
"""
|
|
312
|
+
return (
|
|
313
|
+
self.has_capability_filter()
|
|
314
|
+
or self.has_intent_filter()
|
|
315
|
+
or self.has_protocol_filter()
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
__all__: list[str] = ["ModelDependencySpec"]
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Model for capabilities discovered via runtime reflection."""
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
6
|
+
|
|
7
|
+
from omnibase_core.types import JsonType
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ModelDiscoveredCapabilities(BaseModel):
|
|
11
|
+
"""Capabilities discovered via runtime reflection.
|
|
12
|
+
|
|
13
|
+
This model represents what introspection discovers about a node at runtime,
|
|
14
|
+
as opposed to ModelNodeCapabilities which represents declared/contract capabilities.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
operations: Method names matching operation keywords (execute, handle, process).
|
|
18
|
+
has_fsm: Whether the node has FSM state management.
|
|
19
|
+
method_signatures: Mapping of method names to their signature strings.
|
|
20
|
+
attributes: Additional discovered attributes (flexible JSON storage).
|
|
21
|
+
|
|
22
|
+
Example:
|
|
23
|
+
>>> caps = ModelDiscoveredCapabilities(
|
|
24
|
+
... operations=("execute", "query", "batch_execute"),
|
|
25
|
+
... has_fsm=True,
|
|
26
|
+
... method_signatures={"execute": "(query: str) -> list[dict]"},
|
|
27
|
+
... )
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
31
|
+
|
|
32
|
+
operations: tuple[str, ...] = Field(
|
|
33
|
+
default=(),
|
|
34
|
+
description="Method names matching operation keywords (execute, handle, process)",
|
|
35
|
+
)
|
|
36
|
+
has_fsm: bool = Field(
|
|
37
|
+
default=False,
|
|
38
|
+
description="Whether the node has FSM state management",
|
|
39
|
+
)
|
|
40
|
+
method_signatures: dict[str, str] = Field(
|
|
41
|
+
default_factory=dict,
|
|
42
|
+
description="Mapping of method names to their signature strings",
|
|
43
|
+
)
|
|
44
|
+
attributes: dict[str, JsonType] = Field(
|
|
45
|
+
default_factory=dict,
|
|
46
|
+
description="Additional discovered attributes",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
__all__ = ["ModelDiscoveredCapabilities"]
|