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,270 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Generic Snapshot Model for Point-in-Time State Capture.
|
|
4
|
+
|
|
5
|
+
Provides a generic, immutable snapshot model for capturing point-in-time state
|
|
6
|
+
of any entity. Snapshots support versioning, content hashing for idempotency,
|
|
7
|
+
and lineage tracking via parent references.
|
|
8
|
+
|
|
9
|
+
Thread Safety:
|
|
10
|
+
This model is frozen (immutable) for safe sharing across threads.
|
|
11
|
+
Use with_mutations() to create new snapshots from existing ones.
|
|
12
|
+
|
|
13
|
+
Related Tickets:
|
|
14
|
+
- OMN-1246: ServiceSnapshot Infrastructure Primitive
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import hashlib
|
|
20
|
+
import json
|
|
21
|
+
from datetime import UTC, datetime
|
|
22
|
+
from uuid import UUID, uuid4
|
|
23
|
+
|
|
24
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
25
|
+
|
|
26
|
+
from omnibase_core.types import JsonType
|
|
27
|
+
from omnibase_infra.models.snapshot.model_subject_ref import ModelSubjectRef
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ModelSnapshot(BaseModel):
|
|
31
|
+
"""Generic snapshot for point-in-time state capture.
|
|
32
|
+
|
|
33
|
+
Snapshots are immutable captures of entity state at a specific point in time.
|
|
34
|
+
They support:
|
|
35
|
+
- Subject-based grouping via ModelSubjectRef
|
|
36
|
+
- Sequence-based ordering within a subject
|
|
37
|
+
- Content hashing for idempotency checks
|
|
38
|
+
- Lineage tracking via parent_id for fork scenarios
|
|
39
|
+
|
|
40
|
+
Design Notes:
|
|
41
|
+
- Frozen (immutable): Create new snapshots via with_mutations()
|
|
42
|
+
- Sequence numbers: For ordering within a subject, not globally unique
|
|
43
|
+
- Content hash: Deterministic hash of data for idempotency
|
|
44
|
+
- Version: For optimistic locking in storage backends
|
|
45
|
+
|
|
46
|
+
Attributes:
|
|
47
|
+
id: Unique identifier for this snapshot.
|
|
48
|
+
subject: Reference to the subject this snapshot belongs to.
|
|
49
|
+
data: The actual snapshot payload as JSON-compatible dict.
|
|
50
|
+
sequence_number: Ordering number within the subject.
|
|
51
|
+
version: Version for optimistic locking (default: 1).
|
|
52
|
+
content_hash: SHA-256 hash of data for idempotency checks.
|
|
53
|
+
created_at: Timestamp when snapshot was created.
|
|
54
|
+
parent_id: Optional parent snapshot ID for lineage tracking.
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
>>> from uuid import uuid4
|
|
58
|
+
>>> subject = ModelSubjectRef(subject_type="agent", subject_id=uuid4())
|
|
59
|
+
>>> snapshot = ModelSnapshot(
|
|
60
|
+
... subject=subject,
|
|
61
|
+
... data={"status": "active", "config": {"timeout": 30}},
|
|
62
|
+
... sequence_number=1,
|
|
63
|
+
... )
|
|
64
|
+
>>> snapshot.content_hash is not None
|
|
65
|
+
True
|
|
66
|
+
|
|
67
|
+
>>> # Create a fork with mutations
|
|
68
|
+
>>> new_snapshot = snapshot.with_mutations(
|
|
69
|
+
... mutations={"status": "paused"},
|
|
70
|
+
... sequence_number=2,
|
|
71
|
+
... )
|
|
72
|
+
>>> new_snapshot.parent_id == snapshot.id
|
|
73
|
+
True
|
|
74
|
+
>>> new_snapshot.data["status"]
|
|
75
|
+
'paused'
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
model_config = ConfigDict(
|
|
79
|
+
frozen=True,
|
|
80
|
+
extra="forbid",
|
|
81
|
+
from_attributes=True,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Identity
|
|
85
|
+
id: UUID = Field(
|
|
86
|
+
default_factory=uuid4,
|
|
87
|
+
description="Unique identifier for this snapshot",
|
|
88
|
+
)
|
|
89
|
+
subject: ModelSubjectRef = Field(
|
|
90
|
+
...,
|
|
91
|
+
description="Reference to the subject this snapshot belongs to",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Data
|
|
95
|
+
data: dict[str, JsonType] = Field(
|
|
96
|
+
default_factory=dict,
|
|
97
|
+
description="The actual snapshot payload as JSON-compatible dict",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Versioning & ordering
|
|
101
|
+
sequence_number: int = Field(
|
|
102
|
+
...,
|
|
103
|
+
ge=0,
|
|
104
|
+
description="Ordering number within the subject",
|
|
105
|
+
)
|
|
106
|
+
version: int = Field(
|
|
107
|
+
default=1,
|
|
108
|
+
ge=1,
|
|
109
|
+
description="Version for optimistic locking",
|
|
110
|
+
)
|
|
111
|
+
content_hash: str | None = Field(
|
|
112
|
+
default=None,
|
|
113
|
+
description="SHA-256 hash of data for idempotency checks",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Timestamps
|
|
117
|
+
created_at: datetime = Field(
|
|
118
|
+
default_factory=lambda: datetime.now(UTC),
|
|
119
|
+
description="Timestamp when snapshot was created",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Lineage
|
|
123
|
+
parent_id: UUID | None = Field(
|
|
124
|
+
default=None,
|
|
125
|
+
description="Parent snapshot ID for lineage/fork tracking",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def model_post_init(self, _context: object) -> None:
|
|
129
|
+
"""Compute content hash after initialization if not provided.
|
|
130
|
+
|
|
131
|
+
Pydantic's frozen models don't allow attribute assignment after init,
|
|
132
|
+
so we use object.__setattr__ to set the computed hash.
|
|
133
|
+
"""
|
|
134
|
+
if self.content_hash is None:
|
|
135
|
+
computed_hash = self.compute_content_hash(self.data)
|
|
136
|
+
object.__setattr__(self, "content_hash", computed_hash)
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def compute_content_hash(cls, data: dict[str, JsonType]) -> str:
|
|
140
|
+
"""Compute deterministic SHA-256 hash of snapshot data.
|
|
141
|
+
|
|
142
|
+
Uses JSON serialization with sorted keys to ensure deterministic
|
|
143
|
+
output regardless of dict key ordering.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
data: The data dictionary to hash.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Hexadecimal SHA-256 hash string.
|
|
150
|
+
|
|
151
|
+
Example:
|
|
152
|
+
>>> hash1 = ModelSnapshot.compute_content_hash({"b": 2, "a": 1})
|
|
153
|
+
>>> hash2 = ModelSnapshot.compute_content_hash({"a": 1, "b": 2})
|
|
154
|
+
>>> hash1 == hash2 # Same content, same hash
|
|
155
|
+
True
|
|
156
|
+
"""
|
|
157
|
+
# Use sort_keys for deterministic ordering
|
|
158
|
+
json_bytes = json.dumps(data, sort_keys=True, separators=(",", ":")).encode(
|
|
159
|
+
"utf-8"
|
|
160
|
+
)
|
|
161
|
+
return hashlib.sha256(json_bytes).hexdigest()
|
|
162
|
+
|
|
163
|
+
def with_mutations(
|
|
164
|
+
self,
|
|
165
|
+
mutations: dict[str, JsonType],
|
|
166
|
+
sequence_number: int,
|
|
167
|
+
*,
|
|
168
|
+
new_id: UUID | None = None,
|
|
169
|
+
created_at: datetime | None = None,
|
|
170
|
+
) -> ModelSnapshot:
|
|
171
|
+
"""Create new snapshot with applied mutations (for fork).
|
|
172
|
+
|
|
173
|
+
Creates a new snapshot by merging mutations into the current data.
|
|
174
|
+
The new snapshot tracks lineage via parent_id pointing to this snapshot.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
mutations: Dictionary of changes to apply to data.
|
|
178
|
+
sequence_number: Sequence number for the new snapshot.
|
|
179
|
+
new_id: Optional UUID for new snapshot (auto-generated if None).
|
|
180
|
+
created_at: Optional creation timestamp (now if None).
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
A new ModelSnapshot with mutations applied and parent_id set.
|
|
184
|
+
|
|
185
|
+
Example:
|
|
186
|
+
>>> from uuid import uuid4
|
|
187
|
+
>>> subject = ModelSubjectRef(subject_type="config", subject_id=uuid4())
|
|
188
|
+
>>> original = ModelSnapshot(
|
|
189
|
+
... subject=subject,
|
|
190
|
+
... data={"timeout": 30, "retries": 3},
|
|
191
|
+
... sequence_number=1,
|
|
192
|
+
... )
|
|
193
|
+
>>> updated = original.with_mutations(
|
|
194
|
+
... mutations={"timeout": 60},
|
|
195
|
+
... sequence_number=2,
|
|
196
|
+
... )
|
|
197
|
+
>>> updated.data["timeout"]
|
|
198
|
+
60
|
|
199
|
+
>>> updated.data["retries"] # Unchanged
|
|
200
|
+
3
|
|
201
|
+
>>> updated.parent_id == original.id
|
|
202
|
+
True
|
|
203
|
+
"""
|
|
204
|
+
# Merge mutations into existing data
|
|
205
|
+
new_data = {**self.data, **mutations}
|
|
206
|
+
|
|
207
|
+
return ModelSnapshot(
|
|
208
|
+
id=new_id if new_id is not None else uuid4(),
|
|
209
|
+
subject=self.subject,
|
|
210
|
+
data=new_data,
|
|
211
|
+
sequence_number=sequence_number,
|
|
212
|
+
version=1, # Reset version for new snapshot
|
|
213
|
+
content_hash=None, # Will be computed in model_post_init
|
|
214
|
+
created_at=created_at if created_at is not None else datetime.now(UTC),
|
|
215
|
+
parent_id=self.id, # Track lineage
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
def to_kafka_key(self) -> str:
|
|
219
|
+
"""Generate Kafka compaction key for this snapshot.
|
|
220
|
+
|
|
221
|
+
Uses the subject reference key for topic compaction, ensuring
|
|
222
|
+
only the latest snapshot per subject is retained.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Compaction key from subject reference.
|
|
226
|
+
|
|
227
|
+
Example:
|
|
228
|
+
>>> from uuid import UUID
|
|
229
|
+
>>> subject = ModelSubjectRef(
|
|
230
|
+
... subject_type="agent",
|
|
231
|
+
... subject_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
|
|
232
|
+
... )
|
|
233
|
+
>>> snapshot = ModelSnapshot(subject=subject, data={}, sequence_number=1)
|
|
234
|
+
>>> snapshot.to_kafka_key()
|
|
235
|
+
'agent:550e8400-e29b-41d4-a716-446655440000'
|
|
236
|
+
"""
|
|
237
|
+
return self.subject.to_key()
|
|
238
|
+
|
|
239
|
+
def is_content_equal(self, other: ModelSnapshot) -> bool:
|
|
240
|
+
"""Check if two snapshots have identical content.
|
|
241
|
+
|
|
242
|
+
Compares content hashes for efficient equality check without
|
|
243
|
+
deep comparison of data structures.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
other: Another snapshot to compare against.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
True if both snapshots have non-None content hashes that match,
|
|
250
|
+
False otherwise (including when either hash is None).
|
|
251
|
+
|
|
252
|
+
Note:
|
|
253
|
+
Returns False when either snapshot has a None content_hash,
|
|
254
|
+
since we cannot reliably compare content without hashes.
|
|
255
|
+
|
|
256
|
+
Example:
|
|
257
|
+
>>> from uuid import uuid4
|
|
258
|
+
>>> subject = ModelSubjectRef(subject_type="test", subject_id=uuid4())
|
|
259
|
+
>>> snap1 = ModelSnapshot(subject=subject, data={"a": 1}, sequence_number=1)
|
|
260
|
+
>>> snap2 = ModelSnapshot(subject=subject, data={"a": 1}, sequence_number=2)
|
|
261
|
+
>>> snap1.is_content_equal(snap2)
|
|
262
|
+
True
|
|
263
|
+
"""
|
|
264
|
+
# Cannot compare content if either hash is None
|
|
265
|
+
if self.content_hash is None or other.content_hash is None:
|
|
266
|
+
return False
|
|
267
|
+
return self.content_hash == other.content_hash
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
__all__: list[str] = ["ModelSnapshot"]
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Snapshot Diff Model for Structural Comparison.
|
|
4
|
+
|
|
5
|
+
Provides a model for representing structural differences between two snapshots.
|
|
6
|
+
This is a structural diff (not semantic) - it identifies which keys were added,
|
|
7
|
+
removed, or changed between two data dictionaries.
|
|
8
|
+
|
|
9
|
+
Thread Safety:
|
|
10
|
+
This model is frozen (immutable) for safe sharing across threads.
|
|
11
|
+
|
|
12
|
+
Related Tickets:
|
|
13
|
+
- OMN-1246: ServiceSnapshot Infrastructure Primitive
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from typing import Self
|
|
19
|
+
from uuid import UUID
|
|
20
|
+
|
|
21
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
22
|
+
|
|
23
|
+
from omnibase_core.types import JsonType
|
|
24
|
+
from omnibase_infra.models.snapshot.model_field_change import ModelFieldChange
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ModelSnapshotDiff(BaseModel):
|
|
28
|
+
"""Structural diff between two snapshots.
|
|
29
|
+
|
|
30
|
+
Represents the structural differences between a base snapshot and a target
|
|
31
|
+
snapshot. This is a shallow diff that operates on top-level keys only -
|
|
32
|
+
nested changes within a key are captured as a single ModelFieldChange.
|
|
33
|
+
|
|
34
|
+
Design Notes:
|
|
35
|
+
- Shallow comparison: Only top-level keys are compared
|
|
36
|
+
- Structural, not semantic: No interpretation of what changes mean
|
|
37
|
+
- Immutable: Diffs are point-in-time calculations
|
|
38
|
+
|
|
39
|
+
Attributes:
|
|
40
|
+
base_id: UUID of the base (original) snapshot.
|
|
41
|
+
target_id: UUID of the target (new) snapshot.
|
|
42
|
+
added: List of keys present in target but not in base.
|
|
43
|
+
removed: List of keys present in base but not in target.
|
|
44
|
+
changed: Dictionary mapping changed keys to their ModelFieldChange.
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
>>> from uuid import uuid4
|
|
48
|
+
>>> base_data = {"name": "alice", "status": "pending"}
|
|
49
|
+
>>> target_data = {"name": "alice", "status": "active", "score": 100}
|
|
50
|
+
>>> diff = ModelSnapshotDiff.compute(
|
|
51
|
+
... base_data=base_data,
|
|
52
|
+
... target_data=target_data,
|
|
53
|
+
... base_id=uuid4(),
|
|
54
|
+
... target_id=uuid4(),
|
|
55
|
+
... )
|
|
56
|
+
>>> diff.added
|
|
57
|
+
['score']
|
|
58
|
+
>>> diff.removed
|
|
59
|
+
[]
|
|
60
|
+
>>> diff.changed["status"].from_value
|
|
61
|
+
'pending'
|
|
62
|
+
>>> diff.changed["status"].to_value
|
|
63
|
+
'active'
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
model_config = ConfigDict(
|
|
67
|
+
frozen=True,
|
|
68
|
+
extra="forbid",
|
|
69
|
+
from_attributes=True,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
base_id: UUID = Field(
|
|
73
|
+
...,
|
|
74
|
+
description="UUID of the base (original) snapshot",
|
|
75
|
+
)
|
|
76
|
+
target_id: UUID = Field(
|
|
77
|
+
...,
|
|
78
|
+
description="UUID of the target (new) snapshot",
|
|
79
|
+
)
|
|
80
|
+
added: list[str] = Field(
|
|
81
|
+
default_factory=list,
|
|
82
|
+
description="Keys present in target but not in base",
|
|
83
|
+
)
|
|
84
|
+
removed: list[str] = Field(
|
|
85
|
+
default_factory=list,
|
|
86
|
+
description="Keys present in base but not in target",
|
|
87
|
+
)
|
|
88
|
+
changed: dict[str, ModelFieldChange] = Field(
|
|
89
|
+
default_factory=dict,
|
|
90
|
+
description="Keys with different values, mapped to their changes",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def compute(
|
|
95
|
+
cls,
|
|
96
|
+
base_data: dict[str, JsonType],
|
|
97
|
+
target_data: dict[str, JsonType],
|
|
98
|
+
base_id: UUID,
|
|
99
|
+
target_id: UUID,
|
|
100
|
+
) -> Self:
|
|
101
|
+
"""Compute structural diff between two data dictionaries.
|
|
102
|
+
|
|
103
|
+
Performs a shallow comparison of top-level keys between base and target
|
|
104
|
+
data dictionaries, identifying which keys were added, removed, or changed.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
base_data: The base (original) data dictionary.
|
|
108
|
+
target_data: The target (new) data dictionary.
|
|
109
|
+
base_id: UUID of the base snapshot.
|
|
110
|
+
target_id: UUID of the target snapshot.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
A new ModelSnapshotDiff capturing the structural differences.
|
|
114
|
+
|
|
115
|
+
Example:
|
|
116
|
+
>>> from uuid import uuid4
|
|
117
|
+
>>> base = {"a": 1, "b": 2, "c": 3}
|
|
118
|
+
>>> target = {"a": 1, "b": 99, "d": 4}
|
|
119
|
+
>>> diff = ModelSnapshotDiff.compute(
|
|
120
|
+
... base_data=base,
|
|
121
|
+
... target_data=target,
|
|
122
|
+
... base_id=uuid4(),
|
|
123
|
+
... target_id=uuid4(),
|
|
124
|
+
... )
|
|
125
|
+
>>> sorted(diff.added)
|
|
126
|
+
['d']
|
|
127
|
+
>>> sorted(diff.removed)
|
|
128
|
+
['c']
|
|
129
|
+
>>> diff.changed["b"].from_value
|
|
130
|
+
2
|
|
131
|
+
>>> diff.changed["b"].to_value
|
|
132
|
+
99
|
|
133
|
+
"""
|
|
134
|
+
base_keys = set(base_data.keys())
|
|
135
|
+
target_keys = set(target_data.keys())
|
|
136
|
+
|
|
137
|
+
# Keys only in target (added)
|
|
138
|
+
added = sorted(target_keys - base_keys)
|
|
139
|
+
|
|
140
|
+
# Keys only in base (removed)
|
|
141
|
+
removed = sorted(base_keys - target_keys)
|
|
142
|
+
|
|
143
|
+
# Keys in both - check for value changes
|
|
144
|
+
changed: dict[str, ModelFieldChange] = {}
|
|
145
|
+
common_keys = base_keys & target_keys
|
|
146
|
+
for key in sorted(common_keys):
|
|
147
|
+
base_value = base_data[key]
|
|
148
|
+
target_value = target_data[key]
|
|
149
|
+
if base_value != target_value:
|
|
150
|
+
changed[key] = ModelFieldChange(
|
|
151
|
+
from_value=base_value,
|
|
152
|
+
to_value=target_value,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
return cls(
|
|
156
|
+
base_id=base_id,
|
|
157
|
+
target_id=target_id,
|
|
158
|
+
added=added,
|
|
159
|
+
removed=removed,
|
|
160
|
+
changed=changed,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
def is_empty(self) -> bool:
|
|
164
|
+
"""Check if the diff contains no changes.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
True if there are no additions, removals, or changes.
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
>>> from uuid import uuid4
|
|
171
|
+
>>> diff = ModelSnapshotDiff.compute(
|
|
172
|
+
... base_data={"a": 1},
|
|
173
|
+
... target_data={"a": 1},
|
|
174
|
+
... base_id=uuid4(),
|
|
175
|
+
... target_id=uuid4(),
|
|
176
|
+
... )
|
|
177
|
+
>>> diff.is_empty()
|
|
178
|
+
True
|
|
179
|
+
"""
|
|
180
|
+
return not self.added and not self.removed and not self.changed
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def total_changes(self) -> int:
|
|
184
|
+
"""Count total number of changes (added + removed + changed).
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Total count of all changes.
|
|
188
|
+
|
|
189
|
+
Example:
|
|
190
|
+
>>> from uuid import uuid4
|
|
191
|
+
>>> diff = ModelSnapshotDiff.compute(
|
|
192
|
+
... base_data={"a": 1, "b": 2},
|
|
193
|
+
... target_data={"a": 99, "c": 3},
|
|
194
|
+
... base_id=uuid4(),
|
|
195
|
+
... target_id=uuid4(),
|
|
196
|
+
... )
|
|
197
|
+
>>> diff.total_changes # 1 added (c), 1 removed (b), 1 changed (a)
|
|
198
|
+
3
|
|
199
|
+
"""
|
|
200
|
+
return len(self.added) + len(self.removed) + len(self.changed)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
__all__: list[str] = ["ModelSnapshotDiff"]
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Subject Reference Model for Snapshot Grouping.
|
|
4
|
+
|
|
5
|
+
Provides a reference model for identifying subjects (entities) that snapshots
|
|
6
|
+
belong to. Enables grouping and retrieval of snapshots by subject type and ID.
|
|
7
|
+
|
|
8
|
+
Thread Safety:
|
|
9
|
+
This model is frozen (immutable) for safe sharing across threads.
|
|
10
|
+
|
|
11
|
+
Related Tickets:
|
|
12
|
+
- OMN-1246: ServiceSnapshot Infrastructure Primitive
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from uuid import UUID
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ModelSubjectRef(BaseModel):
|
|
23
|
+
"""Reference to a subject for snapshot grouping.
|
|
24
|
+
|
|
25
|
+
A subject reference identifies the entity that a snapshot belongs to,
|
|
26
|
+
enabling efficient grouping and retrieval of related snapshots.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
subject_type: Type identifier for the subject (e.g., "agent", "workflow", "config").
|
|
30
|
+
subject_id: Unique identifier for the subject instance.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
>>> from uuid import uuid4
|
|
34
|
+
>>> ref = ModelSubjectRef(
|
|
35
|
+
... subject_type="agent",
|
|
36
|
+
... subject_id=uuid4(),
|
|
37
|
+
... )
|
|
38
|
+
>>> ref.to_key()
|
|
39
|
+
'agent:550e8400-e29b-41d4-a716-446655440000'
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
model_config = ConfigDict(
|
|
43
|
+
frozen=True,
|
|
44
|
+
extra="forbid",
|
|
45
|
+
from_attributes=True,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
subject_type: str = Field(
|
|
49
|
+
...,
|
|
50
|
+
min_length=1,
|
|
51
|
+
max_length=128,
|
|
52
|
+
pattern=r"^[a-z][a-z0-9_]*$",
|
|
53
|
+
description="Type identifier for the subject (e.g., 'agent', 'workflow', 'config')",
|
|
54
|
+
)
|
|
55
|
+
subject_id: UUID = Field(
|
|
56
|
+
...,
|
|
57
|
+
description="Unique identifier for the subject instance",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def to_key(self) -> str:
|
|
61
|
+
"""Generate storage key for this subject reference.
|
|
62
|
+
|
|
63
|
+
Returns a string key suitable for use in storage systems, caches,
|
|
64
|
+
or Kafka topic compaction.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Key in format "{subject_type}:{subject_id}"
|
|
68
|
+
|
|
69
|
+
Example:
|
|
70
|
+
>>> from uuid import UUID
|
|
71
|
+
>>> ref = ModelSubjectRef(
|
|
72
|
+
... subject_type="agent",
|
|
73
|
+
... subject_id=UUID("550e8400-e29b-41d4-a716-446655440000"),
|
|
74
|
+
... )
|
|
75
|
+
>>> ref.to_key()
|
|
76
|
+
'agent:550e8400-e29b-41d4-a716-446655440000'
|
|
77
|
+
"""
|
|
78
|
+
return f"{self.subject_type}:{self.subject_id!s}"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
__all__: list[str] = ["ModelSubjectRef"]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Shared type aliases for omnibase_infra models.
|
|
4
|
+
|
|
5
|
+
This module re-exports JSON type aliases from omnibase_core.types and adds
|
|
6
|
+
infrastructure-specific type aliases.
|
|
7
|
+
|
|
8
|
+
Types from omnibase_core:
|
|
9
|
+
- JsonPrimitive: Atomic JSON values (str, int, float, bool, None, UUID, datetime)
|
|
10
|
+
- JsonType: Full recursive JSON type (now fixed via TypeAlias pattern)
|
|
11
|
+
|
|
12
|
+
Local types:
|
|
13
|
+
- JsonDict: ``dict[str, object]`` for JSON object operations
|
|
14
|
+
- JsonValue: ``object`` alias for generic JSON-like data in function signatures
|
|
15
|
+
|
|
16
|
+
JsonType Recursion Fix (OMN-1274) - Type Selection Guide:
|
|
17
|
+
The original ``JsonType`` recursive type alias caused Pydantic 2.x recursion
|
|
18
|
+
errors at class definition time. This has been fixed in omnibase_core v0.6.3+
|
|
19
|
+
using the TypeAlias pattern. Here is how to choose the right type:
|
|
20
|
+
|
|
21
|
+
**Use JsonType** (from ``omnibase_core.types``) when:
|
|
22
|
+
- The field can be ANY valid JSON value (object, array, string, number, etc.)
|
|
23
|
+
- Example: HTTP response body, generic JSON payloads
|
|
24
|
+
- ``from omnibase_core.types import JsonType``
|
|
25
|
+
|
|
26
|
+
**Use dict[str, object]** when:
|
|
27
|
+
- The field is specifically a dictionary with string keys
|
|
28
|
+
- Example: Error details, database rows, configuration dicts
|
|
29
|
+
- Provides correct semantics without recursion
|
|
30
|
+
|
|
31
|
+
**Use object** when:
|
|
32
|
+
- In function signatures for generic payloads
|
|
33
|
+
- NEVER use ``Any`` - per ONEX guidelines, use ``object`` instead
|
|
34
|
+
- ``def process(data: object) -> object:``
|
|
35
|
+
|
|
36
|
+
**Technical Background:**
|
|
37
|
+
The original ``JsonType`` was defined as::
|
|
38
|
+
|
|
39
|
+
JsonType = dict[str, "JsonType"] | list["JsonType"] | str | int | float | bool | None
|
|
40
|
+
|
|
41
|
+
Pydantic 2.x performs eager schema generation at class definition time,
|
|
42
|
+
causing infinite recursion when expanding this type alias. The fix in
|
|
43
|
+
omnibase_core v0.6.3 uses ``TypeAlias`` to prevent this::
|
|
44
|
+
|
|
45
|
+
JsonType: TypeAlias = "dict[str, JsonType] | list[JsonType] | str | ..."
|
|
46
|
+
|
|
47
|
+
See Also:
|
|
48
|
+
- ADR: ``docs/decisions/adr-any-type-pydantic-workaround.md`` (historical)
|
|
49
|
+
- Pydantic issue: https://github.com/pydantic/pydantic/issues/3278
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
from omnibase_core.types import JsonPrimitive, JsonType
|
|
53
|
+
|
|
54
|
+
# JsonDict is a more specific type for functions that work with JSON objects.
|
|
55
|
+
# Use this when you need dict operations like .get(), indexing, or `in` checks.
|
|
56
|
+
# Preferred over JsonType when the value is known to be a dictionary.
|
|
57
|
+
JsonDict = dict[str, object]
|
|
58
|
+
|
|
59
|
+
# JsonValue is an alias for generic JSON-like data in function signatures.
|
|
60
|
+
# Use this instead of Any per ONEX guidelines - object is the proper "unknown type"
|
|
61
|
+
# marker in Python's type system.
|
|
62
|
+
# For Pydantic model fields requiring full JSON support, use JsonType from
|
|
63
|
+
# omnibase_core.types instead.
|
|
64
|
+
JsonValue = object
|
|
65
|
+
|
|
66
|
+
__all__ = [
|
|
67
|
+
"JsonDict",
|
|
68
|
+
"JsonPrimitive",
|
|
69
|
+
"JsonType",
|
|
70
|
+
"JsonValue",
|
|
71
|
+
]
|