omnibase_infra 0.2.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +132 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_kafka_acks.py +99 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +693 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +922 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +1051 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +109 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2670 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +330 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +591 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +68 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +49 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +57 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +203 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +106 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +482 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +694 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +220 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +112 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +417 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1138 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +449 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +229 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_notification_config.py +171 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1330 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1514 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +2033 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Model for binding configuration cache statistics.
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 0.8.0
|
|
6
|
+
Initial implementation for OMN-765.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ModelBindingConfigCacheStats(BaseModel):
|
|
15
|
+
"""Cache statistics for BindingConfigResolver observability.
|
|
16
|
+
|
|
17
|
+
Provides metrics for monitoring cache performance and health
|
|
18
|
+
of the binding configuration resolution system.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
total_entries: Current number of cached configurations.
|
|
22
|
+
hits: Total number of cache hits.
|
|
23
|
+
misses: Total number of cache misses.
|
|
24
|
+
refreshes: Total number of cache refreshes (TTL expiration or manual).
|
|
25
|
+
expired_evictions: Total number of entries evicted due to expiration.
|
|
26
|
+
lru_evictions: Total number of entries evicted due to LRU policy.
|
|
27
|
+
file_loads: Total number of configurations loaded from files.
|
|
28
|
+
env_loads: Total number of configurations loaded from environment variables.
|
|
29
|
+
vault_loads: Total number of configurations loaded from Vault.
|
|
30
|
+
async_key_lock_count: Current number of async key locks held.
|
|
31
|
+
async_key_lock_cleanups: Total number of stale lock cleanup operations.
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
>>> stats = ModelBindingConfigCacheStats(hits=100, misses=10)
|
|
35
|
+
>>> stats.hit_rate
|
|
36
|
+
0.909090909090909
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
model_config = ConfigDict(
|
|
40
|
+
strict=True,
|
|
41
|
+
frozen=True,
|
|
42
|
+
extra="forbid",
|
|
43
|
+
from_attributes=True,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
total_entries: int = Field(
|
|
47
|
+
default=0,
|
|
48
|
+
ge=0,
|
|
49
|
+
description="Current number of configurations in the cache.",
|
|
50
|
+
)
|
|
51
|
+
hits: int = Field(
|
|
52
|
+
default=0,
|
|
53
|
+
ge=0,
|
|
54
|
+
description="Total number of cache hits.",
|
|
55
|
+
)
|
|
56
|
+
misses: int = Field(
|
|
57
|
+
default=0,
|
|
58
|
+
ge=0,
|
|
59
|
+
description="Total number of cache misses.",
|
|
60
|
+
)
|
|
61
|
+
refreshes: int = Field(
|
|
62
|
+
default=0,
|
|
63
|
+
ge=0,
|
|
64
|
+
description="Total number of cache refreshes due to TTL expiration or manual.",
|
|
65
|
+
)
|
|
66
|
+
expired_evictions: int = Field(
|
|
67
|
+
default=0,
|
|
68
|
+
ge=0,
|
|
69
|
+
description="Total number of entries evicted due to expiration.",
|
|
70
|
+
)
|
|
71
|
+
lru_evictions: int = Field(
|
|
72
|
+
default=0,
|
|
73
|
+
ge=0,
|
|
74
|
+
description="Total number of entries evicted due to LRU policy when max_cache_entries is reached.",
|
|
75
|
+
)
|
|
76
|
+
file_loads: int = Field(
|
|
77
|
+
default=0,
|
|
78
|
+
ge=0,
|
|
79
|
+
description="Total number of configurations loaded from files.",
|
|
80
|
+
)
|
|
81
|
+
env_loads: int = Field(
|
|
82
|
+
default=0,
|
|
83
|
+
ge=0,
|
|
84
|
+
description="Total number of configurations loaded from environment variables.",
|
|
85
|
+
)
|
|
86
|
+
vault_loads: int = Field(
|
|
87
|
+
default=0,
|
|
88
|
+
ge=0,
|
|
89
|
+
description="Total number of configurations loaded from Vault.",
|
|
90
|
+
)
|
|
91
|
+
async_key_lock_count: int = Field(
|
|
92
|
+
default=0,
|
|
93
|
+
ge=0,
|
|
94
|
+
description="Current number of async key locks held for handler type serialization.",
|
|
95
|
+
)
|
|
96
|
+
async_key_lock_cleanups: int = Field(
|
|
97
|
+
default=0,
|
|
98
|
+
ge=0,
|
|
99
|
+
description="Total number of stale async key lock cleanup operations performed.",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def hit_rate(self) -> float:
|
|
104
|
+
"""Calculate cache hit rate.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Hit rate as a float between 0.0 and 1.0.
|
|
108
|
+
Returns 0.0 if no hits or misses have occurred.
|
|
109
|
+
|
|
110
|
+
Example:
|
|
111
|
+
>>> stats = ModelBindingConfigCacheStats(hits=80, misses=20)
|
|
112
|
+
>>> stats.hit_rate
|
|
113
|
+
0.8
|
|
114
|
+
"""
|
|
115
|
+
total = self.hits + self.misses
|
|
116
|
+
return self.hits / total if total > 0 else 0.0
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def total_loads(self) -> int:
|
|
120
|
+
"""Calculate total configuration loads from all sources.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Sum of file_loads, env_loads, and vault_loads.
|
|
124
|
+
|
|
125
|
+
Example:
|
|
126
|
+
>>> stats = ModelBindingConfigCacheStats(
|
|
127
|
+
... file_loads=10, env_loads=5, vault_loads=3
|
|
128
|
+
... )
|
|
129
|
+
>>> stats.total_loads
|
|
130
|
+
18
|
|
131
|
+
"""
|
|
132
|
+
return self.file_loads + self.env_loads + self.vault_loads
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
__all__: list[str] = ["ModelBindingConfigCacheStats"]
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Configuration model for BindingConfigResolver.
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 0.8.0
|
|
6
|
+
Initial implementation for OMN-765.
|
|
7
|
+
|
|
8
|
+
This module provides the Pydantic configuration model for the BindingConfigResolver,
|
|
9
|
+
which resolves handler-specific configuration from multiple sources (file, env, vault).
|
|
10
|
+
|
|
11
|
+
Example:
|
|
12
|
+
Basic configuration with defaults::
|
|
13
|
+
|
|
14
|
+
from omnibase_infra.runtime.models import ModelBindingConfigResolverConfig
|
|
15
|
+
|
|
16
|
+
# Minimal config - uses sensible defaults
|
|
17
|
+
config = ModelBindingConfigResolverConfig()
|
|
18
|
+
|
|
19
|
+
# Production config with stricter settings
|
|
20
|
+
config = ModelBindingConfigResolverConfig(
|
|
21
|
+
cache_ttl_seconds=600.0,
|
|
22
|
+
env_prefix="ONEX_HANDLER",
|
|
23
|
+
strict_validation=True,
|
|
24
|
+
fail_on_vault_error=True, # Fail on vault: resolution errors
|
|
25
|
+
max_cache_entries=100, # LRU eviction after 100 entries
|
|
26
|
+
)
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import re
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ModelBindingConfigResolverConfig(BaseModel):
|
|
38
|
+
"""Configuration for BindingConfigResolver.
|
|
39
|
+
|
|
40
|
+
Configures the binding configuration resolution system that supports
|
|
41
|
+
multiple configuration sources with priority-based resolution.
|
|
42
|
+
|
|
43
|
+
Supported config_ref Schemes:
|
|
44
|
+
- vault: - Vault secrets (e.g., vault:secret/data/db#password)
|
|
45
|
+
- env: - Environment variables (e.g., env:DB_CONFIG_JSON)
|
|
46
|
+
- file: - File-based configuration (e.g., file:configs/db.yaml)
|
|
47
|
+
|
|
48
|
+
Note:
|
|
49
|
+
The config_ref scheme determines WHERE to load base config from,
|
|
50
|
+
not priority between schemes. Only one config_ref is used per call.
|
|
51
|
+
|
|
52
|
+
Environment Variable Override Pattern:
|
|
53
|
+
When env_prefix is set (e.g., "HANDLER"), the resolver looks for:
|
|
54
|
+
{env_prefix}_{HANDLER_TYPE}_{FIELD} (e.g., HANDLER_DB_POOL_SIZE)
|
|
55
|
+
|
|
56
|
+
Attributes:
|
|
57
|
+
config_dir: Base directory for relative file: paths.
|
|
58
|
+
If None, file: paths must be absolute. Existence is validated at
|
|
59
|
+
use-time (when loading files), not at config construction time.
|
|
60
|
+
enable_caching: Whether to cache resolved configurations.
|
|
61
|
+
cache_ttl_seconds: Time-to-live for cached configurations (0-86400).
|
|
62
|
+
env_prefix: Prefix for environment variable overrides.
|
|
63
|
+
Pattern: {env_prefix}_{HANDLER_TYPE}_{FIELD}
|
|
64
|
+
strict_validation: If True, fail on unknown fields in resolved config.
|
|
65
|
+
If False, ignore unknown fields.
|
|
66
|
+
strict_env_coercion: If True, fail on type conversion errors for env overrides.
|
|
67
|
+
If False, log warning and skip. Default is False.
|
|
68
|
+
allowed_schemes: Set of allowed config_ref URI schemes for security.
|
|
69
|
+
Only these schemes can be used in config_ref values.
|
|
70
|
+
fail_on_vault_error: If True, fail when vault: references cannot be resolved.
|
|
71
|
+
If False, keep placeholder (may be insecure). Default is False.
|
|
72
|
+
max_cache_entries: Maximum cache entries before LRU eviction.
|
|
73
|
+
None means unlimited. Default is None. Only applies when
|
|
74
|
+
enable_caching=True. To disable caching, use enable_caching=False.
|
|
75
|
+
allow_symlinks: If True, allow configuration files that are symlinks.
|
|
76
|
+
If False, reject symlinked config files for security. Default is True.
|
|
77
|
+
async_lock_cleanup_threshold: Number of async key locks that triggers cleanup.
|
|
78
|
+
Default is 200. Prevents unbounded memory growth in long-running processes.
|
|
79
|
+
async_lock_max_age_seconds: Maximum age for async locks before cleanup.
|
|
80
|
+
Default is 3600 (1 hour). Locks older than this are removed if not held.
|
|
81
|
+
|
|
82
|
+
Note:
|
|
83
|
+
SecretResolver is resolved from the container via dependency injection
|
|
84
|
+
in BindingConfigResolver.__init__, following ONEX mandatory container
|
|
85
|
+
injection pattern per CLAUDE.md.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
Minimal configuration with defaults::
|
|
89
|
+
|
|
90
|
+
config = ModelBindingConfigResolverConfig()
|
|
91
|
+
|
|
92
|
+
Production configuration with explicit settings::
|
|
93
|
+
|
|
94
|
+
from pathlib import Path
|
|
95
|
+
|
|
96
|
+
config = ModelBindingConfigResolverConfig(
|
|
97
|
+
config_dir=Path("/etc/onex/handlers"), # Validated at use-time
|
|
98
|
+
cache_ttl_seconds=300.0,
|
|
99
|
+
env_prefix="ONEX_HANDLER",
|
|
100
|
+
strict_validation=True,
|
|
101
|
+
fail_on_vault_error=True, # Fail on vault: resolution errors
|
|
102
|
+
max_cache_entries=100, # LRU eviction after 100 entries
|
|
103
|
+
allow_symlinks=False, # Reject symlinks for security
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
Note: config_dir is optional; if provided, existence is validated at use-time
|
|
107
|
+
(when loading files), not at config construction. This supports dynamic
|
|
108
|
+
directory creation and early config object instantiation.
|
|
109
|
+
When config_dir is None (default), all file: paths must be absolute.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
model_config = ConfigDict(
|
|
113
|
+
strict=True,
|
|
114
|
+
frozen=True,
|
|
115
|
+
extra="forbid",
|
|
116
|
+
from_attributes=True,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Base configuration directory for relative file: paths
|
|
120
|
+
config_dir: Path | None = Field(
|
|
121
|
+
default=None,
|
|
122
|
+
description="Base directory for resolving relative file: paths. "
|
|
123
|
+
"If None, all file: paths must be absolute.",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Cache settings
|
|
127
|
+
enable_caching: bool = Field(
|
|
128
|
+
default=True,
|
|
129
|
+
description="Whether to cache resolved configurations. "
|
|
130
|
+
"Disable for development or when configurations change frequently.",
|
|
131
|
+
)
|
|
132
|
+
cache_ttl_seconds: float = Field(
|
|
133
|
+
default=300.0,
|
|
134
|
+
ge=0.0,
|
|
135
|
+
le=86400.0,
|
|
136
|
+
description="Time-to-live for cached configurations in seconds (0-86400). "
|
|
137
|
+
"Default is 5 minutes.",
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Environment variable override settings
|
|
141
|
+
env_prefix: str = Field(
|
|
142
|
+
default="HANDLER",
|
|
143
|
+
description="Prefix for environment variable overrides. "
|
|
144
|
+
"Pattern: {env_prefix}_{HANDLER_TYPE}_{FIELD}. "
|
|
145
|
+
"Must be a valid Python identifier.",
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# NOTE: SecretResolver is now resolved from container via dependency injection.
|
|
149
|
+
# See BindingConfigResolver.__init__ which resolves SecretResolver from
|
|
150
|
+
# container.service_registry.resolve_service(SecretResolver).
|
|
151
|
+
# This follows ONEX mandatory container injection pattern per CLAUDE.md.
|
|
152
|
+
|
|
153
|
+
# Validation strictness
|
|
154
|
+
strict_validation: bool = Field(
|
|
155
|
+
default=True,
|
|
156
|
+
description="If True, fail on unknown fields in resolved configuration. "
|
|
157
|
+
"If False, ignore unknown fields.",
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Environment variable type coercion strictness
|
|
161
|
+
strict_env_coercion: bool = Field(
|
|
162
|
+
default=False,
|
|
163
|
+
description="If True, raise ProtocolConfigurationError when environment "
|
|
164
|
+
"variable values cannot be converted to the expected type. "
|
|
165
|
+
"If False, log a warning and skip the override. "
|
|
166
|
+
"Default is False for backwards compatibility.",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Allowed config_ref schemes (for security)
|
|
170
|
+
allowed_schemes: frozenset[str] = Field(
|
|
171
|
+
default=frozenset({"file", "env", "vault"}),
|
|
172
|
+
description="Set of allowed config_ref URI schemes for security. "
|
|
173
|
+
"Only these schemes can be used in config_ref values.",
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
# Vault error handling behavior
|
|
177
|
+
fail_on_vault_error: bool = Field(
|
|
178
|
+
default=False,
|
|
179
|
+
description="If True, raise ProtocolConfigurationError when a vault: "
|
|
180
|
+
"reference fails to resolve. If False, log an error and keep the original "
|
|
181
|
+
"placeholder value (which may be insecure). "
|
|
182
|
+
"Set to True in production to prevent silent security fallbacks.",
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Cache size limit with LRU eviction
|
|
186
|
+
max_cache_entries: int | None = Field(
|
|
187
|
+
default=None,
|
|
188
|
+
ge=1,
|
|
189
|
+
description="Maximum number of entries to keep in the configuration cache. "
|
|
190
|
+
"When the limit is reached, the least recently used (LRU) entry is evicted. "
|
|
191
|
+
"None means unlimited cache size. "
|
|
192
|
+
"For typical deployments with 10-50 handler types, leave as None. "
|
|
193
|
+
"Set a limit for environments with many dynamic handler types. "
|
|
194
|
+
"Note: This setting only takes effect when enable_caching=True. "
|
|
195
|
+
"To disable caching entirely, set enable_caching=False instead of using this field.",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Symlink security control
|
|
199
|
+
allow_symlinks: bool = Field(
|
|
200
|
+
default=True,
|
|
201
|
+
description="Whether to allow configuration files that are symlinks. "
|
|
202
|
+
"When False, symlinked config files are rejected for security. "
|
|
203
|
+
"When True, symlinks are followed but still validated against config_dir "
|
|
204
|
+
"to prevent path traversal attacks. "
|
|
205
|
+
"Set to False in high-security environments to prevent symlink attacks.",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Async key lock cleanup configuration
|
|
209
|
+
# These settings control cleanup of per-handler async locks to prevent memory leaks
|
|
210
|
+
# in long-running processes. See PR #168 for design rationale.
|
|
211
|
+
async_lock_cleanup_threshold: int = Field(
|
|
212
|
+
default=200,
|
|
213
|
+
ge=1,
|
|
214
|
+
description="Number of async key locks that triggers cleanup check. "
|
|
215
|
+
"When the lock count exceeds this threshold, stale locks are removed. "
|
|
216
|
+
"Default is 200, suitable for typical deployments with 10-50 handler types. "
|
|
217
|
+
"Lower values increase cleanup frequency but add minor overhead. "
|
|
218
|
+
"Higher values (e.g., 1000) may be appropriate for deployments with many handler types.",
|
|
219
|
+
)
|
|
220
|
+
async_lock_max_age_seconds: float = Field(
|
|
221
|
+
default=3600.0,
|
|
222
|
+
ge=60.0,
|
|
223
|
+
le=86400.0,
|
|
224
|
+
description="Maximum age (in seconds) for async key locks before cleanup. "
|
|
225
|
+
"Locks older than this AND not currently held are eligible for removal. "
|
|
226
|
+
"Default is 3600 (1 hour). Range: 60-86400 seconds. "
|
|
227
|
+
"Lower values free memory faster but may cleanup locks that could be reused.",
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
@field_validator("env_prefix")
|
|
231
|
+
@classmethod
|
|
232
|
+
def validate_env_prefix(cls, value: str) -> str:
|
|
233
|
+
"""Validate env_prefix is a valid identifier.
|
|
234
|
+
|
|
235
|
+
The prefix must be a valid Python identifier (alphanumeric and underscores,
|
|
236
|
+
not starting with a digit) to ensure it can be used in environment variable
|
|
237
|
+
names.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
value: The environment variable prefix.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
The validated prefix (uppercase).
|
|
244
|
+
|
|
245
|
+
Raises:
|
|
246
|
+
ValueError: If prefix is not a valid identifier.
|
|
247
|
+
"""
|
|
248
|
+
if not value:
|
|
249
|
+
msg = "env_prefix cannot be empty"
|
|
250
|
+
raise ValueError(msg)
|
|
251
|
+
|
|
252
|
+
# Check if it's a valid Python identifier
|
|
253
|
+
# Must match: [a-zA-Z_][a-zA-Z0-9_]*
|
|
254
|
+
identifier_pattern = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$")
|
|
255
|
+
if not identifier_pattern.match(value):
|
|
256
|
+
msg = (
|
|
257
|
+
f"env_prefix must be a valid identifier "
|
|
258
|
+
f"(alphanumeric and underscores, not starting with digit), got '{value}'"
|
|
259
|
+
)
|
|
260
|
+
raise ValueError(msg)
|
|
261
|
+
|
|
262
|
+
# Return uppercase for consistency with environment variable conventions
|
|
263
|
+
return value.upper()
|
|
264
|
+
|
|
265
|
+
@field_validator("config_dir")
|
|
266
|
+
@classmethod
|
|
267
|
+
def validate_config_dir(cls, value: Path | None) -> Path | None:
|
|
268
|
+
"""Validate config_dir is a valid path format.
|
|
269
|
+
|
|
270
|
+
Note:
|
|
271
|
+
Existence and directory validation is deferred to use-time in
|
|
272
|
+
BindingConfigResolver._load_from_file() to support:
|
|
273
|
+
- Dynamic directory creation after config construction
|
|
274
|
+
- Early config object creation (e.g., at import time)
|
|
275
|
+
- Test scenarios with mock/temporary directories
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
value: The configuration directory path, or None.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
The validated path, or None.
|
|
282
|
+
|
|
283
|
+
Raises:
|
|
284
|
+
ValueError: If path contains null bytes or other invalid characters.
|
|
285
|
+
"""
|
|
286
|
+
if value is None:
|
|
287
|
+
return None
|
|
288
|
+
|
|
289
|
+
# Validate path doesn't contain null bytes (security concern)
|
|
290
|
+
path_str = str(value)
|
|
291
|
+
if "\x00" in path_str:
|
|
292
|
+
msg = "config_dir contains null byte"
|
|
293
|
+
raise ValueError(msg)
|
|
294
|
+
|
|
295
|
+
return value
|
|
296
|
+
|
|
297
|
+
@field_validator("allowed_schemes")
|
|
298
|
+
@classmethod
|
|
299
|
+
def validate_allowed_schemes(cls, value: frozenset[str]) -> frozenset[str]:
|
|
300
|
+
"""Validate allowed_schemes contains only recognized schemes.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
value: The set of allowed URI schemes.
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
The validated scheme set.
|
|
307
|
+
|
|
308
|
+
Raises:
|
|
309
|
+
ValueError: If set is empty or contains unrecognized schemes.
|
|
310
|
+
"""
|
|
311
|
+
if not value:
|
|
312
|
+
msg = "allowed_schemes cannot be empty"
|
|
313
|
+
raise ValueError(msg)
|
|
314
|
+
|
|
315
|
+
# Known valid schemes
|
|
316
|
+
valid_schemes = {"file", "env", "vault"}
|
|
317
|
+
unknown_schemes = value - valid_schemes
|
|
318
|
+
|
|
319
|
+
if unknown_schemes:
|
|
320
|
+
msg = (
|
|
321
|
+
f"allowed_schemes contains unrecognized schemes: {unknown_schemes}. "
|
|
322
|
+
f"Valid schemes are: {valid_schemes}"
|
|
323
|
+
)
|
|
324
|
+
raise ValueError(msg)
|
|
325
|
+
|
|
326
|
+
return value
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
__all__: list[str] = ["ModelBindingConfigResolverConfig"]
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Model for cached secret entries.
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 0.8.0
|
|
6
|
+
Initial implementation for OMN-764.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from datetime import UTC, datetime, timedelta
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator
|
|
14
|
+
|
|
15
|
+
from omnibase_infra.runtime.models.model_secret_source_spec import SecretSourceType
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelCachedSecret(BaseModel):
|
|
19
|
+
"""Cached secret with TTL tracking.
|
|
20
|
+
|
|
21
|
+
Represents a secret value that has been resolved and cached,
|
|
22
|
+
with metadata for cache invalidation and observability.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
value: The secret value (masked in logs and repr).
|
|
26
|
+
source_type: The source from which the secret was resolved.
|
|
27
|
+
logical_name: The logical name used to request the secret.
|
|
28
|
+
cached_at: Timestamp when the secret was cached.
|
|
29
|
+
expires_at: Timestamp when the cached entry expires.
|
|
30
|
+
hit_count: Number of cache hits for this entry.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
>>> from datetime import UTC, datetime, timedelta
|
|
34
|
+
>>> from pydantic import SecretStr
|
|
35
|
+
>>>
|
|
36
|
+
>>> cached = ModelCachedSecret(
|
|
37
|
+
... value=SecretStr("password123"),
|
|
38
|
+
... source_type="env",
|
|
39
|
+
... logical_name="db.password",
|
|
40
|
+
... cached_at=datetime.now(UTC),
|
|
41
|
+
... expires_at=datetime.now(UTC) + timedelta(hours=24),
|
|
42
|
+
... )
|
|
43
|
+
>>> cached.is_expired()
|
|
44
|
+
False
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
model_config = ConfigDict(
|
|
48
|
+
strict=True,
|
|
49
|
+
frozen=True,
|
|
50
|
+
extra="forbid",
|
|
51
|
+
from_attributes=True,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
value: SecretStr = Field(
|
|
55
|
+
...,
|
|
56
|
+
description="The cached secret value. Automatically masked in logs and repr.",
|
|
57
|
+
)
|
|
58
|
+
source_type: SecretSourceType = Field(
|
|
59
|
+
...,
|
|
60
|
+
description="The source type from which this secret was resolved.",
|
|
61
|
+
)
|
|
62
|
+
logical_name: str = Field(
|
|
63
|
+
...,
|
|
64
|
+
min_length=1,
|
|
65
|
+
description="The logical name used to request this secret.",
|
|
66
|
+
)
|
|
67
|
+
cached_at: datetime = Field(
|
|
68
|
+
...,
|
|
69
|
+
description="UTC timestamp when the secret was cached.",
|
|
70
|
+
)
|
|
71
|
+
expires_at: datetime = Field(
|
|
72
|
+
...,
|
|
73
|
+
description="UTC timestamp when this cached entry expires.",
|
|
74
|
+
)
|
|
75
|
+
hit_count: int = Field(
|
|
76
|
+
default=0,
|
|
77
|
+
ge=0,
|
|
78
|
+
description="Number of cache hits for this entry since caching.",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
@field_validator("cached_at", "expires_at", mode="before")
|
|
82
|
+
@classmethod
|
|
83
|
+
def ensure_utc_aware(cls, v: object) -> object:
|
|
84
|
+
"""Ensure datetime fields are timezone-aware (UTC).
|
|
85
|
+
|
|
86
|
+
This validator prevents naive/aware datetime comparison errors in
|
|
87
|
+
is_expired() by ensuring all datetime fields are UTC-aware.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
v: The input value. In "before" mode, this can be any type.
|
|
91
|
+
Non-datetime values are passed through for Pydantic to validate.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
UTC-aware datetime if input is datetime, otherwise unchanged input.
|
|
95
|
+
Naive datetimes are treated as UTC. Non-UTC timezones are converted.
|
|
96
|
+
|
|
97
|
+
Note:
|
|
98
|
+
- Non-datetime inputs are returned unchanged for Pydantic's type validation
|
|
99
|
+
- Naive datetimes are treated as UTC (v.replace(tzinfo=UTC))
|
|
100
|
+
- Non-UTC timezones are converted to UTC (v.astimezone(UTC))
|
|
101
|
+
- Uses utcoffset() comparison for robust UTC detection across different
|
|
102
|
+
timezone implementations (timezone.utc, datetime.UTC, pytz.UTC, etc.)
|
|
103
|
+
"""
|
|
104
|
+
if not isinstance(v, datetime):
|
|
105
|
+
return v # Let Pydantic handle type validation
|
|
106
|
+
if v.tzinfo is None:
|
|
107
|
+
# Treat naive datetime as UTC
|
|
108
|
+
return v.replace(tzinfo=UTC)
|
|
109
|
+
# Check if already UTC by comparing offset (handles different UTC representations)
|
|
110
|
+
if v.utcoffset() == timedelta(0):
|
|
111
|
+
# Already UTC (or equivalent), normalize to datetime.UTC
|
|
112
|
+
if v.tzinfo is not UTC:
|
|
113
|
+
return v.replace(tzinfo=UTC)
|
|
114
|
+
return v
|
|
115
|
+
# Non-UTC timezone, convert to UTC
|
|
116
|
+
return v.astimezone(UTC)
|
|
117
|
+
|
|
118
|
+
def is_expired(self) -> bool:
|
|
119
|
+
"""Check if this cached entry has expired.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
True if the current UTC time is past the expiration time.
|
|
123
|
+
|
|
124
|
+
Note:
|
|
125
|
+
The field validator ensures expires_at is always UTC-aware,
|
|
126
|
+
so this comparison is always safe.
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
>>> cached = ModelCachedSecret(...)
|
|
130
|
+
>>> if cached.is_expired():
|
|
131
|
+
... # Refresh the secret
|
|
132
|
+
... pass
|
|
133
|
+
"""
|
|
134
|
+
# expires_at is guaranteed UTC-aware by field validator
|
|
135
|
+
return datetime.now(UTC) > self.expires_at
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
__all__: list[str] = ["ModelCachedSecret"]
|