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,425 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""In-Memory Effect Idempotency Store with LRU Eviction and TTL.
|
|
4
|
+
|
|
5
|
+
This module provides a bounded in-memory implementation of
|
|
6
|
+
ProtocolEffectIdempotencyStore for tracking completed backends during
|
|
7
|
+
dual-backend Effect operations.
|
|
8
|
+
|
|
9
|
+
Memory Management:
|
|
10
|
+
The store implements two complementary strategies to bound memory:
|
|
11
|
+
|
|
12
|
+
1. LRU Eviction (max_cache_size):
|
|
13
|
+
When the cache exceeds max_cache_size, the least recently accessed
|
|
14
|
+
entries are evicted. Uses OrderedDict for O(1) LRU operations.
|
|
15
|
+
|
|
16
|
+
2. TTL Expiration (cache_ttl_seconds):
|
|
17
|
+
Entries older than TTL are eligible for cleanup. Cleanup is triggered
|
|
18
|
+
on access (lazy) and periodically based on cleanup_interval_seconds.
|
|
19
|
+
|
|
20
|
+
Memory Characteristics:
|
|
21
|
+
- Entry size: ~100 bytes per correlation_id
|
|
22
|
+
- UUID key: 16 bytes
|
|
23
|
+
- set[str] for backends: ~40 bytes (2 backends average)
|
|
24
|
+
- float timestamp: 8 bytes
|
|
25
|
+
- Python object overhead: ~40 bytes
|
|
26
|
+
- Default max (10,000 entries): ~1MB
|
|
27
|
+
|
|
28
|
+
Production Warning:
|
|
29
|
+
This store is NOT suitable for production use:
|
|
30
|
+
- Data is lost on process restart
|
|
31
|
+
- Not distributed (single-process only)
|
|
32
|
+
- Not suitable for long-running operations exceeding TTL
|
|
33
|
+
|
|
34
|
+
For production distributed deployments, implement
|
|
35
|
+
ProtocolEffectIdempotencyStore with a persistent backend.
|
|
36
|
+
|
|
37
|
+
Concurrency Safety:
|
|
38
|
+
All operations are protected by asyncio.Lock for safe concurrent coroutine
|
|
39
|
+
access. Note: This is coroutine-safe, not thread-safe. For multi-threaded
|
|
40
|
+
access, additional synchronization would be required.
|
|
41
|
+
|
|
42
|
+
Related:
|
|
43
|
+
- ProtocolEffectIdempotencyStore: Protocol interface
|
|
44
|
+
- ModelEffectIdempotencyConfig: Configuration model
|
|
45
|
+
- NodeRegistryEffect: Consumes this store for dual-backend idempotency
|
|
46
|
+
- OMN-954: Registry effect idempotency requirements
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
from __future__ import annotations
|
|
50
|
+
|
|
51
|
+
import asyncio
|
|
52
|
+
import time
|
|
53
|
+
from collections import OrderedDict
|
|
54
|
+
from uuid import UUID
|
|
55
|
+
|
|
56
|
+
from omnibase_infra.nodes.effects.models.model_effect_idempotency_config import (
|
|
57
|
+
ModelEffectIdempotencyConfig,
|
|
58
|
+
)
|
|
59
|
+
from omnibase_infra.nodes.effects.protocol_effect_idempotency_store import (
|
|
60
|
+
ProtocolEffectIdempotencyStore,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class CacheEntry:
|
|
65
|
+
"""Internal cache entry with timestamp for TTL tracking.
|
|
66
|
+
|
|
67
|
+
Attributes:
|
|
68
|
+
backends: Set of completed backend identifiers.
|
|
69
|
+
created_at: Monotonic timestamp when entry was created.
|
|
70
|
+
accessed_at: Monotonic timestamp of last access (for LRU).
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
__slots__ = ("accessed_at", "backends", "created_at")
|
|
74
|
+
|
|
75
|
+
def __init__(self, backends: set[str] | None = None) -> None:
|
|
76
|
+
"""Initialize cache entry with optional initial backends.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
backends: Initial set of completed backends.
|
|
80
|
+
"""
|
|
81
|
+
now = time.monotonic()
|
|
82
|
+
self.backends: set[str] = backends if backends is not None else set()
|
|
83
|
+
self.created_at: float = now
|
|
84
|
+
self.accessed_at: float = now
|
|
85
|
+
|
|
86
|
+
def touch(self) -> None:
|
|
87
|
+
"""Update accessed_at timestamp for LRU tracking."""
|
|
88
|
+
self.accessed_at = time.monotonic()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class InMemoryEffectIdempotencyStore(ProtocolEffectIdempotencyStore):
|
|
92
|
+
"""In-memory idempotency store with LRU eviction and TTL expiration.
|
|
93
|
+
|
|
94
|
+
Implements ProtocolEffectIdempotencyStore using an OrderedDict for
|
|
95
|
+
efficient LRU operations and time-based TTL cleanup.
|
|
96
|
+
|
|
97
|
+
Storage Structure:
|
|
98
|
+
Uses OrderedDict[UUID, CacheEntry] where:
|
|
99
|
+
- Key: correlation_id (UUID)
|
|
100
|
+
- Value: CacheEntry with backends set and timestamps
|
|
101
|
+
|
|
102
|
+
Eviction Strategy:
|
|
103
|
+
1. On each write, check if cache exceeds max_cache_size
|
|
104
|
+
2. If exceeded, evict oldest entries (LRU order) until under limit
|
|
105
|
+
3. Periodically cleanup expired entries (TTL-based)
|
|
106
|
+
|
|
107
|
+
Concurrency Safety:
|
|
108
|
+
All operations are protected by asyncio.Lock for atomic access.
|
|
109
|
+
Safe for concurrent async access from multiple coroutines. Note:
|
|
110
|
+
This is coroutine-safe, not thread-safe.
|
|
111
|
+
|
|
112
|
+
Memory Characteristics:
|
|
113
|
+
- Per-entry overhead: ~100 bytes
|
|
114
|
+
- max_cache_size=10000 (default): ~1MB
|
|
115
|
+
- max_cache_size=100000: ~10MB
|
|
116
|
+
- Memory formula: total = max_cache_size * 100 bytes + ~50KB overhead
|
|
117
|
+
|
|
118
|
+
Performance Characteristics:
|
|
119
|
+
All core operations are O(1) amortized:
|
|
120
|
+
- mark_completed: O(1) - hash lookup + set add + OrderedDict.move_to_end
|
|
121
|
+
- is_completed: O(1) - hash lookup + set contains
|
|
122
|
+
- get_completed_backends: O(k) - where k = backends per entry (typically 2)
|
|
123
|
+
- clear: O(1) - hash delete
|
|
124
|
+
- LRU eviction: O(1) - OrderedDict.popitem(last=False)
|
|
125
|
+
- TTL cleanup: O(n) - but runs lazily on configurable interval
|
|
126
|
+
|
|
127
|
+
Throughput (measured with mocks):
|
|
128
|
+
- Sequential: > 500 ops/sec
|
|
129
|
+
- Concurrent (10 workers): > 10,000 ops/sec
|
|
130
|
+
- Sustained single-worker: > 5,000 ops/sec
|
|
131
|
+
|
|
132
|
+
Scalability Limits:
|
|
133
|
+
- Maximum practical size: 1,000,000 entries (~100MB)
|
|
134
|
+
- Beyond this, consider persistent backend for durability anyway
|
|
135
|
+
- TTL cleanup may cause brief latency spikes at very high entry counts
|
|
136
|
+
|
|
137
|
+
Production Warning:
|
|
138
|
+
This implementation is NOT persistent and NOT distributed.
|
|
139
|
+
Data is lost on process restart. For production deployments:
|
|
140
|
+
- Use a persistent backend (Redis, PostgreSQL)
|
|
141
|
+
- Consider the existing StoreIdempotencyPostgres for full persistence
|
|
142
|
+
- Multi-instance deployments MUST use a shared backend
|
|
143
|
+
|
|
144
|
+
Example:
|
|
145
|
+
>>> config = ModelEffectIdempotencyConfig(
|
|
146
|
+
... max_cache_size=5000,
|
|
147
|
+
... cache_ttl_seconds=1800.0,
|
|
148
|
+
... )
|
|
149
|
+
>>> store = InMemoryEffectIdempotencyStore(config)
|
|
150
|
+
>>> await store.mark_completed(correlation_id, "consul")
|
|
151
|
+
>>> assert await store.is_completed(correlation_id, "consul")
|
|
152
|
+
|
|
153
|
+
See Also:
|
|
154
|
+
- ProtocolEffectIdempotencyStore: Protocol interface definition
|
|
155
|
+
- ModelEffectIdempotencyConfig: Configuration model
|
|
156
|
+
- NodeRegistryEffect: Primary consumer of this store
|
|
157
|
+
- README.md: Comprehensive documentation with configuration guide
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
def __init__(
|
|
161
|
+
self,
|
|
162
|
+
config: ModelEffectIdempotencyConfig | None = None,
|
|
163
|
+
) -> None:
|
|
164
|
+
"""Initialize the in-memory store with configuration.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
config: Optional configuration. Uses defaults if not provided.
|
|
168
|
+
"""
|
|
169
|
+
self._config = config or ModelEffectIdempotencyConfig()
|
|
170
|
+
self._cache: OrderedDict[UUID, CacheEntry] = OrderedDict()
|
|
171
|
+
self._lock = asyncio.Lock()
|
|
172
|
+
self._last_cleanup: float = time.monotonic()
|
|
173
|
+
|
|
174
|
+
@property
|
|
175
|
+
def max_cache_size(self) -> int:
|
|
176
|
+
"""Maximum number of entries before LRU eviction."""
|
|
177
|
+
return self._config.max_cache_size
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
def cache_ttl_seconds(self) -> float:
|
|
181
|
+
"""Time-to-live for entries in seconds."""
|
|
182
|
+
return self._config.cache_ttl_seconds
|
|
183
|
+
|
|
184
|
+
async def mark_completed(self, correlation_id: UUID, backend: str) -> None:
|
|
185
|
+
"""Mark a backend as completed for a correlation ID.
|
|
186
|
+
|
|
187
|
+
Records completion and maintains cache bounds via LRU eviction.
|
|
188
|
+
Updates LRU order by moving entry to end of OrderedDict.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
correlation_id: Unique identifier for the operation.
|
|
192
|
+
backend: Backend identifier (e.g., "consul", "postgres").
|
|
193
|
+
"""
|
|
194
|
+
async with self._lock:
|
|
195
|
+
# Check for TTL cleanup opportunity (sync - lock already held)
|
|
196
|
+
self._maybe_cleanup_expired()
|
|
197
|
+
|
|
198
|
+
if correlation_id in self._cache:
|
|
199
|
+
# Update existing entry and move to end (most recently used)
|
|
200
|
+
entry = self._cache[correlation_id]
|
|
201
|
+
entry.backends.add(backend)
|
|
202
|
+
entry.touch()
|
|
203
|
+
self._cache.move_to_end(correlation_id)
|
|
204
|
+
else:
|
|
205
|
+
# Create new entry
|
|
206
|
+
self._cache[correlation_id] = CacheEntry(backends={backend})
|
|
207
|
+
# Evict LRU entries if over capacity (sync - lock already held)
|
|
208
|
+
self._evict_lru_if_needed()
|
|
209
|
+
|
|
210
|
+
async def is_completed(self, correlation_id: UUID, backend: str) -> bool:
|
|
211
|
+
"""Check if a backend is completed for a correlation ID.
|
|
212
|
+
|
|
213
|
+
Updates LRU order on access (read-through updates).
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
correlation_id: Unique identifier for the operation.
|
|
217
|
+
backend: Backend identifier to check.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
True if the backend is completed, False otherwise.
|
|
221
|
+
"""
|
|
222
|
+
async with self._lock:
|
|
223
|
+
entry = self._cache.get(correlation_id)
|
|
224
|
+
if entry is None:
|
|
225
|
+
return False
|
|
226
|
+
|
|
227
|
+
# Check if entry is expired
|
|
228
|
+
if self._is_expired(entry):
|
|
229
|
+
# Expired entries return False but aren't immediately deleted
|
|
230
|
+
# to avoid modifying cache during read
|
|
231
|
+
return False
|
|
232
|
+
|
|
233
|
+
# Update LRU order
|
|
234
|
+
entry.touch()
|
|
235
|
+
self._cache.move_to_end(correlation_id)
|
|
236
|
+
|
|
237
|
+
return backend in entry.backends
|
|
238
|
+
|
|
239
|
+
async def get_completed_backends(self, correlation_id: UUID) -> set[str]:
|
|
240
|
+
"""Get all completed backends for a correlation ID.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
correlation_id: Unique identifier for the operation.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Copy of completed backend set. Empty set if none or expired.
|
|
247
|
+
"""
|
|
248
|
+
async with self._lock:
|
|
249
|
+
entry = self._cache.get(correlation_id)
|
|
250
|
+
if entry is None:
|
|
251
|
+
return set()
|
|
252
|
+
|
|
253
|
+
# Check if entry is expired
|
|
254
|
+
if self._is_expired(entry):
|
|
255
|
+
return set()
|
|
256
|
+
|
|
257
|
+
# Update LRU order
|
|
258
|
+
entry.touch()
|
|
259
|
+
self._cache.move_to_end(correlation_id)
|
|
260
|
+
|
|
261
|
+
# Return copy to prevent external mutation
|
|
262
|
+
return entry.backends.copy()
|
|
263
|
+
|
|
264
|
+
async def clear(self, correlation_id: UUID) -> None:
|
|
265
|
+
"""Clear completed backends for a correlation ID.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
correlation_id: The correlation ID to clear.
|
|
269
|
+
"""
|
|
270
|
+
async with self._lock:
|
|
271
|
+
self._cache.pop(correlation_id, None)
|
|
272
|
+
|
|
273
|
+
async def clear_all(self) -> None:
|
|
274
|
+
"""Clear all entries from the cache.
|
|
275
|
+
|
|
276
|
+
Test utility method for resetting state between tests.
|
|
277
|
+
"""
|
|
278
|
+
async with self._lock:
|
|
279
|
+
self._cache.clear()
|
|
280
|
+
self._last_cleanup = time.monotonic()
|
|
281
|
+
|
|
282
|
+
async def get_cache_size(self) -> int:
|
|
283
|
+
"""Get current number of entries in cache.
|
|
284
|
+
|
|
285
|
+
Test utility for assertions on cache size.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
Number of entries currently in cache.
|
|
289
|
+
"""
|
|
290
|
+
async with self._lock:
|
|
291
|
+
return len(self._cache)
|
|
292
|
+
|
|
293
|
+
async def cleanup_expired(self) -> int:
|
|
294
|
+
"""Force cleanup of all expired entries.
|
|
295
|
+
|
|
296
|
+
Removes all entries that have exceeded the TTL.
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
Number of entries removed.
|
|
300
|
+
"""
|
|
301
|
+
async with self._lock:
|
|
302
|
+
return self._cleanup_expired_entries()
|
|
303
|
+
|
|
304
|
+
async def get_estimated_memory_bytes(self) -> int:
|
|
305
|
+
"""Get estimated memory usage of the cache in bytes.
|
|
306
|
+
|
|
307
|
+
Calculates approximate memory consumption based on:
|
|
308
|
+
- UUID key: 16 bytes
|
|
309
|
+
- CacheEntry object overhead: ~40 bytes
|
|
310
|
+
- set[str] for backends: ~40 bytes (assumes 2 backends average)
|
|
311
|
+
- float timestamps (created_at, accessed_at): 16 bytes
|
|
312
|
+
- Python object overhead per entry: ~40 bytes
|
|
313
|
+
|
|
314
|
+
Total estimated per entry: ~152 bytes (rounded to 150 for estimation)
|
|
315
|
+
|
|
316
|
+
This is an approximation useful for monitoring and capacity planning.
|
|
317
|
+
Actual memory usage may vary based on:
|
|
318
|
+
- Number of backends per entry
|
|
319
|
+
- Backend string lengths
|
|
320
|
+
- Python version and implementation
|
|
321
|
+
- Memory allocator behavior
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Estimated memory usage in bytes.
|
|
325
|
+
|
|
326
|
+
Example:
|
|
327
|
+
>>> store = InMemoryEffectIdempotencyStore()
|
|
328
|
+
>>> await store.mark_completed(uuid4(), "consul")
|
|
329
|
+
>>> memory = await store.get_estimated_memory_bytes()
|
|
330
|
+
>>> assert memory > 0
|
|
331
|
+
"""
|
|
332
|
+
# Constants for memory estimation (in bytes)
|
|
333
|
+
base_overhead = 200 # OrderedDict base overhead
|
|
334
|
+
per_entry_bytes = 150 # Estimated bytes per cache entry
|
|
335
|
+
|
|
336
|
+
async with self._lock:
|
|
337
|
+
entry_count = len(self._cache)
|
|
338
|
+
|
|
339
|
+
# Calculate additional backend string memory
|
|
340
|
+
total_backend_bytes = 0
|
|
341
|
+
for entry in self._cache.values():
|
|
342
|
+
# Each backend string: ~50 bytes average (object + chars)
|
|
343
|
+
total_backend_bytes += len(entry.backends) * 50
|
|
344
|
+
|
|
345
|
+
return base_overhead + (entry_count * per_entry_bytes) + total_backend_bytes
|
|
346
|
+
|
|
347
|
+
def _is_expired(self, entry: CacheEntry) -> bool:
|
|
348
|
+
"""Check if an entry has exceeded TTL.
|
|
349
|
+
|
|
350
|
+
Args:
|
|
351
|
+
entry: Cache entry to check.
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
True if entry is expired, False otherwise.
|
|
355
|
+
"""
|
|
356
|
+
now = time.monotonic()
|
|
357
|
+
age = now - entry.created_at
|
|
358
|
+
return age > self._config.cache_ttl_seconds
|
|
359
|
+
|
|
360
|
+
def _maybe_cleanup_expired(self) -> None:
|
|
361
|
+
"""Cleanup expired entries if cleanup interval has passed.
|
|
362
|
+
|
|
363
|
+
Called during write operations to lazily maintain cache hygiene.
|
|
364
|
+
Only runs if cleanup_interval_seconds has passed since last cleanup.
|
|
365
|
+
|
|
366
|
+
Note:
|
|
367
|
+
This is a synchronous method because it performs only in-memory
|
|
368
|
+
operations (dict iteration, timestamp checks, deletions). It must
|
|
369
|
+
be called with self._lock held by the caller. The lock provides
|
|
370
|
+
thread safety; async is not needed for CPU-bound dict operations.
|
|
371
|
+
"""
|
|
372
|
+
now = time.monotonic()
|
|
373
|
+
if now - self._last_cleanup >= self._config.cleanup_interval_seconds:
|
|
374
|
+
self._cleanup_expired_entries()
|
|
375
|
+
self._last_cleanup = now
|
|
376
|
+
|
|
377
|
+
def _cleanup_expired_entries(self) -> int:
|
|
378
|
+
"""Remove all expired entries from cache.
|
|
379
|
+
|
|
380
|
+
Note:
|
|
381
|
+
This is a synchronous method because it performs only in-memory
|
|
382
|
+
operations (dict iteration, timestamp checks, deletions). It must
|
|
383
|
+
be called with self._lock held by the caller. The lock provides
|
|
384
|
+
thread safety; async is not needed for CPU-bound dict operations.
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
Number of entries removed.
|
|
388
|
+
"""
|
|
389
|
+
now = time.monotonic()
|
|
390
|
+
expired_keys: list[UUID] = []
|
|
391
|
+
|
|
392
|
+
for key, entry in self._cache.items():
|
|
393
|
+
if now - entry.created_at > self._config.cache_ttl_seconds:
|
|
394
|
+
expired_keys.append(key)
|
|
395
|
+
|
|
396
|
+
for key in expired_keys:
|
|
397
|
+
del self._cache[key]
|
|
398
|
+
|
|
399
|
+
return len(expired_keys)
|
|
400
|
+
|
|
401
|
+
def _evict_lru_if_needed(self) -> int:
|
|
402
|
+
"""Evict least recently used entries if over capacity.
|
|
403
|
+
|
|
404
|
+
Removes oldest entries (front of OrderedDict) until cache size
|
|
405
|
+
is within max_cache_size limit.
|
|
406
|
+
|
|
407
|
+
Note:
|
|
408
|
+
This is a synchronous method because it performs only in-memory
|
|
409
|
+
operations (len check, dict popitem). It must be called with
|
|
410
|
+
self._lock held by the caller. The lock provides thread safety;
|
|
411
|
+
async is not needed for CPU-bound dict operations.
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
Number of entries evicted.
|
|
415
|
+
"""
|
|
416
|
+
evicted = 0
|
|
417
|
+
while len(self._cache) > self._config.max_cache_size:
|
|
418
|
+
# popitem(last=False) removes from front (oldest/LRU)
|
|
419
|
+
self._cache.popitem(last=False)
|
|
420
|
+
evicted += 1
|
|
421
|
+
|
|
422
|
+
return evicted
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
__all__ = ["InMemoryEffectIdempotencyStore"]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Consul Handler - Service discovery and KV store operations
|
|
4
|
+
name: "handler_consul"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "HashiCorp Consul handler for service discovery and KV store operations"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "consul"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerConsul"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_consul"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "consul.kv_get"
|
|
30
|
+
- "consul.kv_put"
|
|
31
|
+
- "consul.register"
|
|
32
|
+
- "consul.deregister"
|
|
33
|
+
operation_bindings:
|
|
34
|
+
version:
|
|
35
|
+
major: 1
|
|
36
|
+
minor: 0
|
|
37
|
+
patch: 0
|
|
38
|
+
global_bindings:
|
|
39
|
+
- parameter_name: "correlation_id"
|
|
40
|
+
expression: "${envelope.correlation_id}"
|
|
41
|
+
required: true
|
|
42
|
+
bindings:
|
|
43
|
+
"consul.kv_get":
|
|
44
|
+
- parameter_name: "key"
|
|
45
|
+
expression: "${payload.key}"
|
|
46
|
+
required: true
|
|
47
|
+
"consul.kv_put":
|
|
48
|
+
- parameter_name: "key"
|
|
49
|
+
expression: "${payload.key}"
|
|
50
|
+
required: true
|
|
51
|
+
- parameter_name: "value"
|
|
52
|
+
expression: "${payload.value}"
|
|
53
|
+
required: true
|
|
54
|
+
"consul.register":
|
|
55
|
+
- parameter_name: "service_id"
|
|
56
|
+
expression: "${payload.service_id}"
|
|
57
|
+
required: true
|
|
58
|
+
- parameter_name: "service_name"
|
|
59
|
+
expression: "${payload.service_name}"
|
|
60
|
+
required: true
|
|
61
|
+
- parameter_name: "address"
|
|
62
|
+
expression: "${payload.address}"
|
|
63
|
+
required: false
|
|
64
|
+
- parameter_name: "port"
|
|
65
|
+
expression: "${payload.port}"
|
|
66
|
+
required: false
|
|
67
|
+
- parameter_name: "tags"
|
|
68
|
+
expression: "${payload.tags}"
|
|
69
|
+
required: false
|
|
70
|
+
"consul.deregister":
|
|
71
|
+
- parameter_name: "service_id"
|
|
72
|
+
expression: "${payload.service_id}"
|
|
73
|
+
required: true
|
|
74
|
+
metadata:
|
|
75
|
+
handler_id: "consul-handler"
|
|
76
|
+
handler_type: "infra_handler"
|
|
77
|
+
handler_category: "effect"
|
|
78
|
+
transport_type: "consul"
|
|
79
|
+
security_features:
|
|
80
|
+
- "SecretStr protection for ACL tokens"
|
|
81
|
+
- "Sanitized error messages"
|
|
82
|
+
resilience_features:
|
|
83
|
+
- "Circuit breaker pattern"
|
|
84
|
+
- "Exponential backoff retry"
|
|
85
|
+
- "Thread pool management"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Database Handler - PostgreSQL database operations
|
|
4
|
+
name: "handler_db"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "PostgreSQL database handler for query and execute operations using asyncpg"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "db"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerDb"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_db"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "db.query"
|
|
30
|
+
- "db.execute"
|
|
31
|
+
operation_bindings:
|
|
32
|
+
version:
|
|
33
|
+
major: 1
|
|
34
|
+
minor: 0
|
|
35
|
+
patch: 0
|
|
36
|
+
# Guardrail overrides (optional) - customize limits for this handler
|
|
37
|
+
# Defaults: max_expression_length=256, max_path_segments=20
|
|
38
|
+
# Bounds: expression_length=[32,1024], path_segments=[3,50]
|
|
39
|
+
max_expression_length: 512 # Allow longer expressions for complex SQL bindings
|
|
40
|
+
max_path_segments: 25 # Allow deeper nested paths for complex payloads
|
|
41
|
+
global_bindings:
|
|
42
|
+
- parameter_name: "correlation_id"
|
|
43
|
+
expression: "${envelope.correlation_id}"
|
|
44
|
+
required: true
|
|
45
|
+
bindings:
|
|
46
|
+
"db.query":
|
|
47
|
+
- parameter_name: "sql"
|
|
48
|
+
expression: "${payload.sql}"
|
|
49
|
+
required: true
|
|
50
|
+
- parameter_name: "parameters"
|
|
51
|
+
expression: "${payload.parameters}"
|
|
52
|
+
required: false
|
|
53
|
+
"db.execute":
|
|
54
|
+
- parameter_name: "sql"
|
|
55
|
+
expression: "${payload.sql}"
|
|
56
|
+
required: true
|
|
57
|
+
- parameter_name: "parameters"
|
|
58
|
+
expression: "${payload.parameters}"
|
|
59
|
+
required: false
|
|
60
|
+
metadata:
|
|
61
|
+
handler_id: "db-handler"
|
|
62
|
+
handler_type: "infra_handler"
|
|
63
|
+
handler_category: "effect"
|
|
64
|
+
transport_type: "database"
|
|
65
|
+
security_features:
|
|
66
|
+
- "Parameterized queries for SQL injection protection"
|
|
67
|
+
- "DSN credential sanitization"
|
|
68
|
+
- "Single-statement SQL enforcement"
|
|
69
|
+
resilience_features:
|
|
70
|
+
- "Circuit breaker pattern"
|
|
71
|
+
- "Connection pooling (fixed size: 5)"
|
|
72
|
+
- "Intelligent error classification (transient vs permanent)"
|