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,255 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# ONEX Node Contract - Contract Registry Reducer Node
|
|
4
|
+
#
|
|
5
|
+
# This reducer follows the pure function pattern for contract registry workflows:
|
|
6
|
+
# reduce(state, event) -> ModelReducerOutput[state + intents]
|
|
7
|
+
#
|
|
8
|
+
# The FSM defines state transitions for the contract registry lifecycle:
|
|
9
|
+
# ready -> processing -> ready (simple cycle for event processing)
|
|
10
|
+
#
|
|
11
|
+
# All state transition logic is driven by this contract.
|
|
12
|
+
# =============================================================================
|
|
13
|
+
contract_version:
|
|
14
|
+
major: 1
|
|
15
|
+
minor: 0
|
|
16
|
+
patch: 0
|
|
17
|
+
node_version: "1.0.0"
|
|
18
|
+
name: "contract_registry_reducer"
|
|
19
|
+
node_type: "REDUCER_GENERIC"
|
|
20
|
+
# Enum Usage (CLAUDE.md reference):
|
|
21
|
+
# - node_type uses EnumNodeOutputType.REDUCER for validation
|
|
22
|
+
# - Reducer outputs are PROJECTION type (state + intents) via EnumNodeOutputType
|
|
23
|
+
# - Incoming messages are routed via EnumMessageCategory (EVENT/COMMAND)
|
|
24
|
+
# - PROJECTION exists only in EnumNodeOutputType and is only valid for REDUCER nodes
|
|
25
|
+
# - See: docs/decisions/adr-enum-message-category-vs-node-output-type.md
|
|
26
|
+
description: |
|
|
27
|
+
Reducer node that consumes contract registration events from Kafka
|
|
28
|
+
and materializes them to Postgres for discovery and observability.
|
|
29
|
+
|
|
30
|
+
This reducer tracks:
|
|
31
|
+
- Contract registrations from nodes on startup
|
|
32
|
+
- Contract deregistrations for graceful shutdown
|
|
33
|
+
- Node heartbeats for liveness tracking and last_seen_at updates
|
|
34
|
+
- Runtime ticks for staleness computation (marking stale contracts inactive)
|
|
35
|
+
|
|
36
|
+
The reducer emits intents for PostgreSQL writes via the Effect layer,
|
|
37
|
+
following the pure reducer pattern where state changes and side effects
|
|
38
|
+
are separated.
|
|
39
|
+
# Event Consumption Configuration
|
|
40
|
+
# ================================
|
|
41
|
+
# Topics follow 5-segment naming: {env}.onex.{category}.{domain}.{event-name}.v{version}
|
|
42
|
+
# Categories: evt (external events), int (internal events), cmd (commands)
|
|
43
|
+
consumed_events:
|
|
44
|
+
- topic: "{env}.onex.evt.platform.contract-registered.v1"
|
|
45
|
+
event_type: "ModelContractRegisteredEvent"
|
|
46
|
+
description: "Contract registration from nodes on startup"
|
|
47
|
+
- topic: "{env}.onex.evt.platform.contract-deregistered.v1"
|
|
48
|
+
event_type: "ModelContractDeregisteredEvent"
|
|
49
|
+
description: "Explicit contract deregistration on graceful shutdown"
|
|
50
|
+
- topic: "{env}.onex.evt.platform.node-heartbeat.v1"
|
|
51
|
+
event_type: "ModelNodeHeartbeatEvent"
|
|
52
|
+
description: "Heartbeat for liveness tracking and last_seen_at updates"
|
|
53
|
+
- topic: "{env}.onex.int.platform.runtime-tick.v1"
|
|
54
|
+
event_type: "ModelRuntimeTick"
|
|
55
|
+
internal: true
|
|
56
|
+
description: "Periodic tick for staleness computation - marks contracts as stale/inactive"
|
|
57
|
+
# Input/Output Model Configuration
|
|
58
|
+
# =================================
|
|
59
|
+
input_model:
|
|
60
|
+
name: "ModelReducerInput"
|
|
61
|
+
module: "omnibase_core.models.reducer.model_reducer_input"
|
|
62
|
+
description: "Reducer input containing contract event and trigger."
|
|
63
|
+
output_model:
|
|
64
|
+
name: "ModelReducerOutput"
|
|
65
|
+
module: "omnibase_core.models.reducer.model_reducer_output"
|
|
66
|
+
description: "Reducer output containing new state and PostgreSQL intents."
|
|
67
|
+
# FSM State Machine Definition
|
|
68
|
+
# ============================
|
|
69
|
+
# The contract registry reducer uses a simple FSM for event processing.
|
|
70
|
+
# Unlike the registration reducer which tracks a multi-step workflow,
|
|
71
|
+
# this reducer processes individual events and returns to ready state.
|
|
72
|
+
#
|
|
73
|
+
# State Diagram:
|
|
74
|
+
# +-------+ event received +------------+
|
|
75
|
+
# | ready | -----------------> | processing |
|
|
76
|
+
# +-------+ +------------+
|
|
77
|
+
# ^ |
|
|
78
|
+
# | event processed |
|
|
79
|
+
# +------------------------------+
|
|
80
|
+
#
|
|
81
|
+
state_machine:
|
|
82
|
+
state_machine_name: "contract_registry_fsm"
|
|
83
|
+
initial_state: "ready"
|
|
84
|
+
states:
|
|
85
|
+
- state_name: "ready"
|
|
86
|
+
description: "Ready to process contract events"
|
|
87
|
+
entry_actions: []
|
|
88
|
+
exit_actions: []
|
|
89
|
+
required_data: []
|
|
90
|
+
- state_name: "processing"
|
|
91
|
+
description: "Currently processing a contract event"
|
|
92
|
+
entry_actions: []
|
|
93
|
+
exit_actions: []
|
|
94
|
+
required_data:
|
|
95
|
+
- "event_id"
|
|
96
|
+
- "correlation_id"
|
|
97
|
+
transitions:
|
|
98
|
+
# ready -> processing: On any contract event
|
|
99
|
+
- from_state: "ready"
|
|
100
|
+
to_state: "processing"
|
|
101
|
+
trigger: "contract_event_received"
|
|
102
|
+
description: "Start processing contract registration event"
|
|
103
|
+
conditions:
|
|
104
|
+
- expression: "event_id is_present"
|
|
105
|
+
required: true
|
|
106
|
+
actions:
|
|
107
|
+
- action_name: "process_contract_event"
|
|
108
|
+
action_type: "intent_emission"
|
|
109
|
+
# processing -> ready: After event processed
|
|
110
|
+
- from_state: "processing"
|
|
111
|
+
to_state: "ready"
|
|
112
|
+
trigger: "event_processed"
|
|
113
|
+
description: "Return to ready state after processing"
|
|
114
|
+
actions: []
|
|
115
|
+
persistence_enabled: true
|
|
116
|
+
terminal_states: []
|
|
117
|
+
# Intent Emission Configuration
|
|
118
|
+
# ============================
|
|
119
|
+
# The reducer emits intents for Effect layer execution.
|
|
120
|
+
# These intents are NOT executed by the reducer - they are returned
|
|
121
|
+
# in the ModelReducerOutput for the Runtime to publish.
|
|
122
|
+
intent_emission:
|
|
123
|
+
enabled: true
|
|
124
|
+
# Intent Type Clarification:
|
|
125
|
+
# These intent_type values (e.g., "postgres.upsert_contract") are PAYLOAD intent types,
|
|
126
|
+
# stored in `payload.intent_type` on typed payload models like ModelPayloadUpsertContract.
|
|
127
|
+
# The outer ModelIntent.intent_type is always "extension" for extension-based intents.
|
|
128
|
+
# Effect layer routing uses payload.intent_type to dispatch to the correct handler.
|
|
129
|
+
# See: CLAUDE.md "Intent Model Architecture" for the two-layer intent pattern.
|
|
130
|
+
intents:
|
|
131
|
+
- intent_type: "postgres.upsert_contract"
|
|
132
|
+
target_pattern: "postgres://contracts/{contract_id}"
|
|
133
|
+
payload_model: "ModelPayloadUpsertContract"
|
|
134
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_upsert_contract"
|
|
135
|
+
description: "Upsert contract record in PostgreSQL"
|
|
136
|
+
- intent_type: "postgres.update_topic"
|
|
137
|
+
target_pattern: "postgres://topics/{topic_suffix}"
|
|
138
|
+
payload_model: "ModelPayloadUpdateTopic"
|
|
139
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_update_topic"
|
|
140
|
+
description: "Update topic record in PostgreSQL"
|
|
141
|
+
- intent_type: "postgres.mark_stale"
|
|
142
|
+
target_pattern: "postgres://contracts/stale"
|
|
143
|
+
payload_model: "ModelPayloadMarkStale"
|
|
144
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_mark_stale"
|
|
145
|
+
description: "Mark stale contracts as inactive"
|
|
146
|
+
- intent_type: "postgres.update_heartbeat"
|
|
147
|
+
target_pattern: "postgres://contracts/{contract_id}/heartbeat"
|
|
148
|
+
payload_model: "ModelPayloadUpdateHeartbeat"
|
|
149
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_update_heartbeat"
|
|
150
|
+
description: "Update last_seen_at timestamp from heartbeat"
|
|
151
|
+
- intent_type: "postgres.deactivate_contract"
|
|
152
|
+
target_pattern: "postgres://contracts/{contract_id}"
|
|
153
|
+
payload_model: "ModelPayloadDeactivateContract"
|
|
154
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_deactivate_contract"
|
|
155
|
+
description: "Mark contract as inactive on deregistration"
|
|
156
|
+
- intent_type: "postgres.cleanup_topic_references"
|
|
157
|
+
target_pattern: "postgres://topics/cleanup/{contract_id}"
|
|
158
|
+
payload_model: "ModelPayloadCleanupTopicReferences"
|
|
159
|
+
payload_module: "omnibase_infra.nodes.contract_registry_reducer.models.model_payload_cleanup_topic_references"
|
|
160
|
+
description: "Remove contract references from topics on deregistration"
|
|
161
|
+
# State Model Configuration
|
|
162
|
+
# =========================
|
|
163
|
+
# The reducer uses ModelContractRegistryState for immutable state management.
|
|
164
|
+
state_model:
|
|
165
|
+
name: "ModelContractRegistryState"
|
|
166
|
+
module: "omnibase_infra.nodes.contract_registry_reducer.models.model_contract_registry_state"
|
|
167
|
+
description: "Immutable state model for contract registry reducer"
|
|
168
|
+
# Validation Configuration
|
|
169
|
+
# ========================
|
|
170
|
+
# Event validation rules applied before state transitions.
|
|
171
|
+
validation:
|
|
172
|
+
enabled: true
|
|
173
|
+
rules:
|
|
174
|
+
- field: "contract_id"
|
|
175
|
+
required: true
|
|
176
|
+
error_code: "missing_contract_id"
|
|
177
|
+
error_message: "contract_id is required for contract identity"
|
|
178
|
+
- field: "node_id"
|
|
179
|
+
required: true
|
|
180
|
+
error_code: "missing_node_id"
|
|
181
|
+
error_message: "node_id is required to associate contract with source node"
|
|
182
|
+
- field: "node_type"
|
|
183
|
+
required: false
|
|
184
|
+
valid_values:
|
|
185
|
+
- "effect"
|
|
186
|
+
- "compute"
|
|
187
|
+
- "reducer"
|
|
188
|
+
- "orchestrator"
|
|
189
|
+
invalid_error_code: "invalid_node_type"
|
|
190
|
+
error_message: "node_type must be a valid ONEX node archetype"
|
|
191
|
+
# Performance Configuration
|
|
192
|
+
# =========================
|
|
193
|
+
# Performance thresholds for monitoring.
|
|
194
|
+
# Values can be overridden via environment variables.
|
|
195
|
+
performance:
|
|
196
|
+
thresholds:
|
|
197
|
+
reduce_ms:
|
|
198
|
+
default: 300.0
|
|
199
|
+
env_var: "ONEX_PERF_THRESHOLD_CONTRACT_REDUCE_MS"
|
|
200
|
+
description: "Target processing time for reduce() method"
|
|
201
|
+
intent_build_ms:
|
|
202
|
+
default: 50.0
|
|
203
|
+
env_var: "ONEX_PERF_THRESHOLD_CONTRACT_INTENT_BUILD_MS"
|
|
204
|
+
description: "Target processing time for intent building"
|
|
205
|
+
staleness_check_ms:
|
|
206
|
+
default: 100.0
|
|
207
|
+
env_var: "ONEX_PERF_THRESHOLD_STALENESS_CHECK_MS"
|
|
208
|
+
description: "Target processing time for staleness computation on tick"
|
|
209
|
+
# Idempotency Configuration
|
|
210
|
+
# =========================
|
|
211
|
+
# The reducer supports idempotent event processing via Kafka offset tracking.
|
|
212
|
+
idempotency:
|
|
213
|
+
enabled: true
|
|
214
|
+
strategy: "kafka_offset_tracking"
|
|
215
|
+
derivation: "topic_partition_offset"
|
|
216
|
+
tracking_fields:
|
|
217
|
+
- "topic"
|
|
218
|
+
- "partition"
|
|
219
|
+
- "offset"
|
|
220
|
+
description: "Skip duplicate events based on Kafka position (topic:partition -> offset). State tracks last processed offset per (topic, partition) for multi-topic idempotency."
|
|
221
|
+
# Staleness Configuration
|
|
222
|
+
# =======================
|
|
223
|
+
# Configuration for staleness computation on runtime-tick events.
|
|
224
|
+
staleness:
|
|
225
|
+
threshold_seconds: 300 # 5 minutes without heartbeat = stale
|
|
226
|
+
env_var: "ONEX_CONTRACT_STALENESS_THRESHOLD_SECONDS"
|
|
227
|
+
description: "Contracts without heartbeat for this duration are marked stale"
|
|
228
|
+
# Dependencies
|
|
229
|
+
# ============
|
|
230
|
+
dependencies:
|
|
231
|
+
- name: "container"
|
|
232
|
+
type: "ModelONEXContainer"
|
|
233
|
+
module: "omnibase_core.models.container.model_onex_container"
|
|
234
|
+
description: "ONEX dependency injection container"
|
|
235
|
+
# Health Check
|
|
236
|
+
# ============
|
|
237
|
+
health_check:
|
|
238
|
+
enabled: true
|
|
239
|
+
endpoint: "/health"
|
|
240
|
+
interval_seconds: 30
|
|
241
|
+
# Metadata
|
|
242
|
+
# ========
|
|
243
|
+
metadata:
|
|
244
|
+
author: "OmniNode Team"
|
|
245
|
+
created: "2026-01-29"
|
|
246
|
+
updated: "2026-01-29"
|
|
247
|
+
tags:
|
|
248
|
+
- "reducer"
|
|
249
|
+
- "contract-registry"
|
|
250
|
+
- "fsm"
|
|
251
|
+
- "pure-function"
|
|
252
|
+
- "kafka-consumer"
|
|
253
|
+
- "postgres-projector"
|
|
254
|
+
related_tickets:
|
|
255
|
+
- "OMN-1653"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Models for the contract registry reducer node.
|
|
4
|
+
|
|
5
|
+
This module exports the state model and intent payloads used by NodeContractRegistryReducer.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_contract_registry_state import (
|
|
9
|
+
ModelContractRegistryState,
|
|
10
|
+
)
|
|
11
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_cleanup_topic_references import (
|
|
12
|
+
ModelPayloadCleanupTopicReferences,
|
|
13
|
+
)
|
|
14
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_deactivate_contract import (
|
|
15
|
+
ModelPayloadDeactivateContract,
|
|
16
|
+
)
|
|
17
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_mark_stale import (
|
|
18
|
+
ModelPayloadMarkStale,
|
|
19
|
+
)
|
|
20
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_update_heartbeat import (
|
|
21
|
+
ModelPayloadUpdateHeartbeat,
|
|
22
|
+
)
|
|
23
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_update_topic import (
|
|
24
|
+
ModelPayloadUpdateTopic,
|
|
25
|
+
)
|
|
26
|
+
from omnibase_infra.nodes.contract_registry_reducer.models.model_payload_upsert_contract import (
|
|
27
|
+
ModelPayloadUpsertContract,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"ModelContractRegistryState",
|
|
32
|
+
"ModelPayloadCleanupTopicReferences",
|
|
33
|
+
"ModelPayloadDeactivateContract",
|
|
34
|
+
"ModelPayloadMarkStale",
|
|
35
|
+
"ModelPayloadUpdateHeartbeat",
|
|
36
|
+
"ModelPayloadUpdateTopic",
|
|
37
|
+
"ModelPayloadUpsertContract",
|
|
38
|
+
]
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Immutable state model for contract registry reducer.
|
|
4
|
+
|
|
5
|
+
This module provides ModelContractRegistryState, an immutable state model for the
|
|
6
|
+
contract registry projection reducer. The state follows the pure reducer pattern
|
|
7
|
+
where state is passed in and returned from reduce(), with no internal mutation.
|
|
8
|
+
|
|
9
|
+
Architecture:
|
|
10
|
+
ModelContractRegistryState is designed for projection to PostgreSQL. The reducer
|
|
11
|
+
processes contract registration events and emits intents for persistence. The state
|
|
12
|
+
tracks:
|
|
13
|
+
|
|
14
|
+
- Processed positions per (topic, partition) for multi-topic idempotency
|
|
15
|
+
- Last processed event ID (for correlation/debugging)
|
|
16
|
+
- Staleness tracking (for TTL-based garbage collection)
|
|
17
|
+
- Processing statistics (for observability)
|
|
18
|
+
|
|
19
|
+
State transitions are performed via `with_*` methods that return new instances,
|
|
20
|
+
ensuring the reducer remains pure and deterministic.
|
|
21
|
+
|
|
22
|
+
Idempotency:
|
|
23
|
+
The state uses Kafka-based idempotency (topic, partition, offset) rather than
|
|
24
|
+
event ID-based idempotency. This is more robust for replay scenarios since
|
|
25
|
+
Kafka guarantees ordering within a partition.
|
|
26
|
+
|
|
27
|
+
**Multi-Topic Support**: The reducer consumes from 4 different Kafka topics
|
|
28
|
+
(contract-registered, contract-deregistered, heartbeat, runtime-tick). The state
|
|
29
|
+
tracks the last processed offset **per (topic, partition)** to correctly detect
|
|
30
|
+
duplicates even when events arrive interleaved from different topics.
|
|
31
|
+
|
|
32
|
+
The `is_duplicate_event` method checks if an event was already processed by
|
|
33
|
+
looking up the (topic, partition) key in `processed_positions` and comparing
|
|
34
|
+
offsets.
|
|
35
|
+
|
|
36
|
+
Related:
|
|
37
|
+
- NodeContractRegistryReducer: Declarative reducer that uses this state model
|
|
38
|
+
- OMN-1653: Contract registry reducer implementation
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
from __future__ import annotations
|
|
42
|
+
|
|
43
|
+
from datetime import datetime
|
|
44
|
+
from uuid import UUID
|
|
45
|
+
|
|
46
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ModelContractRegistryState(BaseModel):
|
|
50
|
+
"""Immutable state for contract registry projection.
|
|
51
|
+
|
|
52
|
+
This state tracks processed positions per (topic, partition) for multi-topic
|
|
53
|
+
idempotency and provides statistics for observability. The actual registry
|
|
54
|
+
data lives in PostgreSQL (this reducer projects to it).
|
|
55
|
+
|
|
56
|
+
The state is immutable (frozen=True) to enforce the pure reducer pattern.
|
|
57
|
+
All state transitions create new instances via `with_*` methods.
|
|
58
|
+
|
|
59
|
+
Multi-Topic Idempotency:
|
|
60
|
+
The reducer consumes from 4 different Kafka topics. A naive single-position
|
|
61
|
+
tracker would fail when events arrive interleaved:
|
|
62
|
+
|
|
63
|
+
1. Process topic A, partition 0, offset 100 -> track (A, 0, 100)
|
|
64
|
+
2. Process topic B, partition 0, offset 50 -> track (B, 0, 50)
|
|
65
|
+
3. Replay topic A, partition 0, offset 100 -> NOT detected as duplicate!
|
|
66
|
+
|
|
67
|
+
This model uses `processed_positions` to track the last offset per
|
|
68
|
+
(topic, partition) combination, ensuring correct duplicate detection
|
|
69
|
+
across all consumed topics.
|
|
70
|
+
|
|
71
|
+
Persistence Integration:
|
|
72
|
+
This model is persisted to PostgreSQL by the Projector component:
|
|
73
|
+
|
|
74
|
+
- **Stored**: By Runtime calling Projector.persist() after reduce() returns
|
|
75
|
+
- **Retrieved**: By Orchestrator via ProtocolProjectionReader before reduce()
|
|
76
|
+
- **Idempotency**: Kafka offset tracking enables duplicate detection
|
|
77
|
+
|
|
78
|
+
The reducer does NOT persist state directly - it returns the new state
|
|
79
|
+
in ModelReducerOutput.result. The Runtime handles persistence.
|
|
80
|
+
|
|
81
|
+
Immutability:
|
|
82
|
+
This model uses frozen=True to enforce strict immutability:
|
|
83
|
+
|
|
84
|
+
- All fields are immutable after construction
|
|
85
|
+
- Transition methods (with_*) return NEW instances
|
|
86
|
+
- Original state is never modified
|
|
87
|
+
- Safe for concurrent access and comparison
|
|
88
|
+
|
|
89
|
+
Attributes:
|
|
90
|
+
last_event_id: UUID of last processed event (for correlation/debugging).
|
|
91
|
+
processed_positions: Dict mapping "topic:partition" to last processed offset.
|
|
92
|
+
last_staleness_check_at: Timestamp of last staleness check run.
|
|
93
|
+
contracts_processed: Count of contract registration events processed.
|
|
94
|
+
heartbeats_processed: Count of heartbeat events processed.
|
|
95
|
+
deregistrations_processed: Count of deregistration events processed.
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
>>> from uuid import uuid4
|
|
99
|
+
>>> state = ModelContractRegistryState() # Initial state
|
|
100
|
+
>>> state.contracts_processed
|
|
101
|
+
0
|
|
102
|
+
>>> state = state.with_event_processed(
|
|
103
|
+
... uuid4(), "contracts", 0, 1
|
|
104
|
+
... ).with_contract_registered()
|
|
105
|
+
>>> state.contracts_processed
|
|
106
|
+
1
|
|
107
|
+
>>> # Multi-topic: positions are tracked independently
|
|
108
|
+
>>> state = state.with_event_processed(uuid4(), "heartbeats", 0, 50)
|
|
109
|
+
>>> state.is_duplicate_event("contracts", 0, 1) # Still detected
|
|
110
|
+
True
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
114
|
+
|
|
115
|
+
# Last processed event ID (for correlation/debugging only, not idempotency)
|
|
116
|
+
last_event_id: UUID | None = Field(
|
|
117
|
+
default=None,
|
|
118
|
+
description="UUID of the last processed event for correlation",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Multi-topic idempotency: track last offset per (topic, partition)
|
|
122
|
+
# Key format: "topic:partition" -> last processed offset
|
|
123
|
+
processed_positions: dict[str, int] = Field(
|
|
124
|
+
default_factory=dict,
|
|
125
|
+
description="Last processed offset per (topic:partition) for multi-topic idempotency",
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Staleness tracking
|
|
129
|
+
last_staleness_check_at: datetime | None = Field(
|
|
130
|
+
default=None,
|
|
131
|
+
description="Timestamp of the last staleness check run",
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Statistics (for observability)
|
|
135
|
+
contracts_processed: int = Field(
|
|
136
|
+
default=0,
|
|
137
|
+
description="Count of contract registration events processed",
|
|
138
|
+
)
|
|
139
|
+
heartbeats_processed: int = Field(
|
|
140
|
+
default=0,
|
|
141
|
+
description="Count of heartbeat events processed",
|
|
142
|
+
)
|
|
143
|
+
deregistrations_processed: int = Field(
|
|
144
|
+
default=0,
|
|
145
|
+
description="Count of deregistration events processed",
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
def _position_key(topic: str, partition: int) -> str:
|
|
150
|
+
"""Generate dict key for (topic, partition) combination.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
topic: Kafka topic name.
|
|
154
|
+
partition: Kafka partition number.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
String key in format "topic:partition".
|
|
158
|
+
"""
|
|
159
|
+
return f"{topic}:{partition}"
|
|
160
|
+
|
|
161
|
+
def is_duplicate_event(self, topic: str, partition: int, offset: int) -> bool:
|
|
162
|
+
"""Check if event was already processed (Kafka-based idempotency).
|
|
163
|
+
|
|
164
|
+
Uses per-(topic, partition) offset tracking for duplicate detection.
|
|
165
|
+
An event is considered a duplicate if:
|
|
166
|
+
- The (topic, partition) has been processed before
|
|
167
|
+
- The event's offset is <= the last processed offset for that combination
|
|
168
|
+
|
|
169
|
+
This correctly handles multi-topic consumption where events from different
|
|
170
|
+
topics arrive interleaved.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
topic: Kafka topic of the event.
|
|
174
|
+
partition: Kafka partition of the event.
|
|
175
|
+
offset: Kafka offset of the event.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
True if this event was already processed (is a duplicate).
|
|
179
|
+
"""
|
|
180
|
+
key = self._position_key(topic, partition)
|
|
181
|
+
last_offset = self.processed_positions.get(key)
|
|
182
|
+
if last_offset is None:
|
|
183
|
+
return False
|
|
184
|
+
return offset <= last_offset
|
|
185
|
+
|
|
186
|
+
def with_event_processed(
|
|
187
|
+
self,
|
|
188
|
+
event_id: UUID,
|
|
189
|
+
topic: str,
|
|
190
|
+
partition: int,
|
|
191
|
+
offset: int,
|
|
192
|
+
) -> ModelContractRegistryState:
|
|
193
|
+
"""Return new state with event marked as processed.
|
|
194
|
+
|
|
195
|
+
Creates a new immutable state instance with the Kafka offset tracking
|
|
196
|
+
updated for the specific (topic, partition) combination. Statistics are
|
|
197
|
+
preserved; use the specific `with_*` methods to increment them.
|
|
198
|
+
|
|
199
|
+
Multi-Topic Support:
|
|
200
|
+
Each (topic, partition) combination has its own tracked offset.
|
|
201
|
+
This ensures correct idempotency when the reducer consumes from
|
|
202
|
+
multiple topics (contract-registered, contract-deregistered,
|
|
203
|
+
heartbeat, runtime-tick).
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
event_id: UUID of the processed event.
|
|
207
|
+
topic: Kafka topic of the event.
|
|
208
|
+
partition: Kafka partition of the event.
|
|
209
|
+
offset: Kafka offset of the event.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
New ModelContractRegistryState with updated offset tracking.
|
|
213
|
+
"""
|
|
214
|
+
key = self._position_key(topic, partition)
|
|
215
|
+
# Create new dict with updated position (immutable pattern)
|
|
216
|
+
new_positions = {**self.processed_positions, key: offset}
|
|
217
|
+
return self.model_copy(
|
|
218
|
+
update={
|
|
219
|
+
"last_event_id": event_id,
|
|
220
|
+
"processed_positions": new_positions,
|
|
221
|
+
}
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def with_contract_registered(self) -> ModelContractRegistryState:
|
|
225
|
+
"""Return new state with contract registration count incremented.
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
New ModelContractRegistryState with contracts_processed + 1.
|
|
229
|
+
"""
|
|
230
|
+
return self.model_copy(
|
|
231
|
+
update={"contracts_processed": self.contracts_processed + 1}
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
def with_heartbeat_processed(self) -> ModelContractRegistryState:
|
|
235
|
+
"""Return new state with heartbeat count incremented.
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
New ModelContractRegistryState with heartbeats_processed + 1.
|
|
239
|
+
"""
|
|
240
|
+
return self.model_copy(
|
|
241
|
+
update={"heartbeats_processed": self.heartbeats_processed + 1}
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
def with_deregistration_processed(self) -> ModelContractRegistryState:
|
|
245
|
+
"""Return new state with deregistration count incremented.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
New ModelContractRegistryState with deregistrations_processed + 1.
|
|
249
|
+
"""
|
|
250
|
+
return self.model_copy(
|
|
251
|
+
update={"deregistrations_processed": self.deregistrations_processed + 1}
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
def with_staleness_check(self, check_time: datetime) -> ModelContractRegistryState:
|
|
255
|
+
"""Return new state with staleness check timestamp updated.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
check_time: Timestamp of the staleness check.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
New ModelContractRegistryState with updated staleness check time.
|
|
262
|
+
"""
|
|
263
|
+
return self.model_copy(update={"last_staleness_check_at": check_time})
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
__all__ = ["ModelContractRegistryState"]
|
omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Cleanup topic references intent payload model.
|
|
4
|
+
|
|
5
|
+
Related:
|
|
6
|
+
- OMN-1653: Contract Registry Reducer implementation
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from typing import Literal
|
|
13
|
+
from uuid import UUID
|
|
14
|
+
|
|
15
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelPayloadCleanupTopicReferences(BaseModel):
|
|
19
|
+
"""Payload for PostgreSQL cleanup topic references intents.
|
|
20
|
+
|
|
21
|
+
Used when a contract-deregistered event is processed to remove
|
|
22
|
+
the contract_id from all topics.contract_ids JSONB arrays.
|
|
23
|
+
|
|
24
|
+
Note: contract_id is a derived natural key (node_name:major.minor.patch),
|
|
25
|
+
not a UUID. This is intentional per the contract registry design.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
intent_type: Routing discriminator. Always "postgres.cleanup_topic_references".
|
|
29
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
30
|
+
contract_id: Contract ID to remove from all topic references.
|
|
31
|
+
node_name: Contract node name (for logging/debugging).
|
|
32
|
+
cleaned_at: Cleanup timestamp.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
36
|
+
|
|
37
|
+
intent_type: Literal["postgres.cleanup_topic_references"] = Field(
|
|
38
|
+
default="postgres.cleanup_topic_references",
|
|
39
|
+
description="Routing discriminator for intent dispatch.",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
correlation_id: UUID = Field(
|
|
43
|
+
..., description="Correlation ID for distributed tracing."
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# ONEX_EXCLUDE: pattern_validator - contract_id is a derived natural key (name:version), not UUID
|
|
47
|
+
contract_id: str = Field(..., description="Contract ID to remove from topics.")
|
|
48
|
+
|
|
49
|
+
# ONEX_EXCLUDE: pattern_validator - node_name is the contract name, not an entity reference
|
|
50
|
+
node_name: str = Field(..., description="Contract node name.")
|
|
51
|
+
|
|
52
|
+
cleaned_at: datetime = Field(..., description="Cleanup timestamp.")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
__all__ = ["ModelPayloadCleanupTopicReferences"]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Deactivate contract intent payload model.
|
|
4
|
+
|
|
5
|
+
Related:
|
|
6
|
+
- OMN-1653: Contract Registry Reducer implementation
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from typing import Literal
|
|
13
|
+
from uuid import UUID
|
|
14
|
+
|
|
15
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelPayloadDeactivateContract(BaseModel):
|
|
19
|
+
"""Payload for PostgreSQL deactivate contract intents.
|
|
20
|
+
|
|
21
|
+
Used when a contract-deregistered event is processed to mark the
|
|
22
|
+
contract as inactive (soft delete).
|
|
23
|
+
|
|
24
|
+
Note: contract_id is a derived natural key (node_name:major.minor.patch),
|
|
25
|
+
not a UUID. This is intentional per the contract registry design.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
intent_type: Routing discriminator. Always "postgres.deactivate_contract".
|
|
29
|
+
correlation_id: Correlation ID for distributed tracing.
|
|
30
|
+
contract_id: Contract to deactivate.
|
|
31
|
+
node_name: Contract node name.
|
|
32
|
+
reason: Deregistration reason (shutdown, upgrade, manual).
|
|
33
|
+
deactivated_at: Deactivation timestamp.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
model_config = ConfigDict(frozen=True, extra="forbid", from_attributes=True)
|
|
37
|
+
|
|
38
|
+
intent_type: Literal["postgres.deactivate_contract"] = Field(
|
|
39
|
+
default="postgres.deactivate_contract",
|
|
40
|
+
description="Routing discriminator for intent dispatch.",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
correlation_id: UUID = Field(
|
|
44
|
+
..., description="Correlation ID for distributed tracing."
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# ONEX_EXCLUDE: pattern_validator - contract_id is a derived natural key (name:version), not UUID
|
|
48
|
+
contract_id: str = Field(..., description="Contract to deactivate.")
|
|
49
|
+
|
|
50
|
+
# ONEX_EXCLUDE: pattern_validator - node_name is the contract name, not an entity reference
|
|
51
|
+
node_name: str = Field(..., description="Contract node name.")
|
|
52
|
+
|
|
53
|
+
reason: str = Field(..., description="Deregistration reason.")
|
|
54
|
+
|
|
55
|
+
deactivated_at: datetime = Field(..., description="Deactivation timestamp.")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
__all__ = ["ModelPayloadDeactivateContract"]
|