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,320 @@
|
|
|
1
|
+
-- ONEX Registration Projection Schema
|
|
2
|
+
-- Ticket: OMN-944 (F1: Implement Registration Projection Schema)
|
|
3
|
+
-- Version: 1.0.0
|
|
4
|
+
--
|
|
5
|
+
-- Design Notes:
|
|
6
|
+
-- - (entity_id, domain) = composite primary key for multi-domain support
|
|
7
|
+
-- - Indexes optimized for orchestrator query patterns:
|
|
8
|
+
-- 1. Deadline scanning (ack_deadline, liveness_deadline)
|
|
9
|
+
-- 2. State filtering (current_state)
|
|
10
|
+
-- 3. Domain + state queries
|
|
11
|
+
-- 4. Idempotency checks (last_applied_event_id)
|
|
12
|
+
-- - JSONB for capabilities (flexible schema, GIN indexable)
|
|
13
|
+
-- - All timestamps are timezone-aware (TIMESTAMPTZ)
|
|
14
|
+
-- - This schema is idempotent (IF NOT EXISTS used throughout)
|
|
15
|
+
--
|
|
16
|
+
-- Usage:
|
|
17
|
+
-- Execute this SQL file to create or update the projection schema.
|
|
18
|
+
-- The schema is designed to be re-run safely (idempotent).
|
|
19
|
+
--
|
|
20
|
+
-- Related Tickets:
|
|
21
|
+
-- - OMN-940 (F0): Projector Execution Model
|
|
22
|
+
-- - OMN-932 (C2): Durable Timeout Handling
|
|
23
|
+
-- - OMN-888 (C1): Registration Orchestrator
|
|
24
|
+
|
|
25
|
+
-- =============================================================================
|
|
26
|
+
-- ENUM TYPES
|
|
27
|
+
-- =============================================================================
|
|
28
|
+
|
|
29
|
+
-- Create enum type for registration states (matches EnumRegistrationState in Python)
|
|
30
|
+
-- Note: PostgreSQL enums are immutable - to add values, use ALTER TYPE ... ADD VALUE
|
|
31
|
+
DO $$
|
|
32
|
+
BEGIN
|
|
33
|
+
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'registration_state') THEN
|
|
34
|
+
CREATE TYPE registration_state AS ENUM (
|
|
35
|
+
'pending_registration',
|
|
36
|
+
'accepted',
|
|
37
|
+
'awaiting_ack',
|
|
38
|
+
'rejected',
|
|
39
|
+
'ack_timed_out',
|
|
40
|
+
'ack_received',
|
|
41
|
+
'active',
|
|
42
|
+
'liveness_expired'
|
|
43
|
+
);
|
|
44
|
+
END IF;
|
|
45
|
+
END$$;
|
|
46
|
+
|
|
47
|
+
-- =============================================================================
|
|
48
|
+
-- MAIN TABLE
|
|
49
|
+
-- =============================================================================
|
|
50
|
+
|
|
51
|
+
CREATE TABLE IF NOT EXISTS registration_projections (
|
|
52
|
+
-- Identity (composite primary key)
|
|
53
|
+
entity_id UUID NOT NULL,
|
|
54
|
+
domain VARCHAR(128) NOT NULL DEFAULT 'registration',
|
|
55
|
+
|
|
56
|
+
-- FSM State
|
|
57
|
+
current_state registration_state NOT NULL,
|
|
58
|
+
|
|
59
|
+
-- Node Information (snapshot at registration time)
|
|
60
|
+
node_type VARCHAR(64) NOT NULL,
|
|
61
|
+
node_version VARCHAR(32) NOT NULL DEFAULT '1.0.0',
|
|
62
|
+
capabilities JSONB NOT NULL DEFAULT '{}',
|
|
63
|
+
|
|
64
|
+
-- Capability fields for fast discovery queries (OMN-1134)
|
|
65
|
+
-- Denormalized from capabilities for GIN-indexed array queries
|
|
66
|
+
contract_type TEXT, -- effect, compute, reducer, orchestrator
|
|
67
|
+
intent_types TEXT[] DEFAULT ARRAY[]::TEXT[], -- Array of intent types this node handles
|
|
68
|
+
protocols TEXT[] DEFAULT ARRAY[]::TEXT[], -- Array of protocols this node implements
|
|
69
|
+
capability_tags TEXT[] DEFAULT ARRAY[]::TEXT[], -- Array of capability tags for discovery
|
|
70
|
+
contract_version TEXT, -- Contract version string
|
|
71
|
+
|
|
72
|
+
-- Timeout Deadlines (for durable timeout handling per C2)
|
|
73
|
+
ack_deadline TIMESTAMPTZ,
|
|
74
|
+
liveness_deadline TIMESTAMPTZ,
|
|
75
|
+
last_heartbeat_at TIMESTAMPTZ,
|
|
76
|
+
|
|
77
|
+
-- Timeout Emission Markers (for deduplication per C2)
|
|
78
|
+
-- These prevent emitting duplicate timeout events during replay
|
|
79
|
+
ack_timeout_emitted_at TIMESTAMPTZ,
|
|
80
|
+
liveness_timeout_emitted_at TIMESTAMPTZ,
|
|
81
|
+
|
|
82
|
+
-- Idempotency and Ordering (per F1 requirements)
|
|
83
|
+
-- These fields enable replay correctness and stale update rejection
|
|
84
|
+
last_applied_event_id UUID NOT NULL,
|
|
85
|
+
last_applied_offset BIGINT NOT NULL DEFAULT 0,
|
|
86
|
+
last_applied_sequence BIGINT,
|
|
87
|
+
last_applied_partition VARCHAR(128),
|
|
88
|
+
|
|
89
|
+
-- Timestamps
|
|
90
|
+
registered_at TIMESTAMPTZ NOT NULL,
|
|
91
|
+
updated_at TIMESTAMPTZ NOT NULL,
|
|
92
|
+
|
|
93
|
+
-- Tracing
|
|
94
|
+
correlation_id UUID,
|
|
95
|
+
|
|
96
|
+
-- Constraints
|
|
97
|
+
PRIMARY KEY (entity_id, domain),
|
|
98
|
+
-- UNIQUE constraint on entity_id enables ON CONFLICT (entity_id) upserts.
|
|
99
|
+
-- Required because omnibase-core's ModelProjectorContract only supports single-column
|
|
100
|
+
-- upsert_key, but we need composite PK for multi-domain support.
|
|
101
|
+
-- See: registration_projector.yaml behavior.upsert_key comment for details.
|
|
102
|
+
UNIQUE (entity_id),
|
|
103
|
+
CONSTRAINT valid_offset CHECK (last_applied_offset >= 0),
|
|
104
|
+
CONSTRAINT valid_sequence CHECK (last_applied_sequence IS NULL OR last_applied_sequence >= 0),
|
|
105
|
+
-- Node types MUST match omnibase_core.enums.EnumNodeKind values (lowercase serialized form)
|
|
106
|
+
-- Source of truth: omnibase_core/enums/enum_node_kind.py
|
|
107
|
+
-- When EnumNodeKind changes, this constraint MUST be updated to match
|
|
108
|
+
CONSTRAINT valid_node_type CHECK (node_type IN ('effect', 'compute', 'reducer', 'orchestrator')),
|
|
109
|
+
-- Contract type validation (same valid values as node_type, but nullable)
|
|
110
|
+
CONSTRAINT valid_contract_type CHECK (
|
|
111
|
+
contract_type IS NULL
|
|
112
|
+
OR contract_type IN ('effect', 'compute', 'reducer', 'orchestrator')
|
|
113
|
+
)
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
-- =============================================================================
|
|
117
|
+
-- INDEXES FOR ORCHESTRATION QUERIES
|
|
118
|
+
-- =============================================================================
|
|
119
|
+
|
|
120
|
+
-- Index for ack deadline scanning (C2: orchestrator queries for overdue ack)
|
|
121
|
+
-- Partial index: only index rows with non-null ack_deadline
|
|
122
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
123
|
+
-- WHERE ack_deadline < :now
|
|
124
|
+
-- AND ack_timeout_emitted_at IS NULL
|
|
125
|
+
-- AND current_state = 'awaiting_ack'
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_registration_ack_deadline
|
|
127
|
+
ON registration_projections (ack_deadline)
|
|
128
|
+
WHERE ack_deadline IS NOT NULL;
|
|
129
|
+
|
|
130
|
+
-- Index for liveness deadline scanning (C2: orchestrator queries for overdue liveness)
|
|
131
|
+
-- Partial index: only index active nodes with non-null liveness_deadline
|
|
132
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
133
|
+
-- WHERE liveness_deadline < :now
|
|
134
|
+
-- AND liveness_timeout_emitted_at IS NULL
|
|
135
|
+
-- AND current_state = 'active'
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_registration_liveness_deadline
|
|
137
|
+
ON registration_projections (liveness_deadline)
|
|
138
|
+
WHERE liveness_deadline IS NOT NULL;
|
|
139
|
+
|
|
140
|
+
-- Index for state filtering (common orchestrator query pattern)
|
|
141
|
+
-- Query pattern: SELECT * FROM registration_projections WHERE current_state = 'active'
|
|
142
|
+
CREATE INDEX IF NOT EXISTS idx_registration_current_state
|
|
143
|
+
ON registration_projections (current_state);
|
|
144
|
+
|
|
145
|
+
-- Index for state + domain filtering (multi-domain queries)
|
|
146
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
147
|
+
-- WHERE domain = :domain AND current_state = :state
|
|
148
|
+
CREATE INDEX IF NOT EXISTS idx_registration_domain_state
|
|
149
|
+
ON registration_projections (domain, current_state);
|
|
150
|
+
|
|
151
|
+
-- Index for idempotency checks (fast lookup by event_id)
|
|
152
|
+
-- Query pattern: SELECT 1 FROM registration_projections
|
|
153
|
+
-- WHERE last_applied_event_id = :event_id
|
|
154
|
+
CREATE INDEX IF NOT EXISTS idx_registration_last_event_id
|
|
155
|
+
ON registration_projections (last_applied_event_id);
|
|
156
|
+
|
|
157
|
+
-- Index for capability queries (GIN index on JSONB)
|
|
158
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
159
|
+
-- WHERE capabilities @> '{"postgres": true}'
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_registration_capabilities
|
|
161
|
+
ON registration_projections USING GIN (capabilities);
|
|
162
|
+
|
|
163
|
+
-- =============================================================================
|
|
164
|
+
-- GIN INDEXES FOR CAPABILITY ARRAY QUERIES (OMN-1134)
|
|
165
|
+
-- =============================================================================
|
|
166
|
+
|
|
167
|
+
-- GIN index for capability_tags array queries
|
|
168
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
169
|
+
-- WHERE capability_tags @> ARRAY['postgres.storage']
|
|
170
|
+
CREATE INDEX IF NOT EXISTS idx_registration_capability_tags
|
|
171
|
+
ON registration_projections USING GIN (capability_tags);
|
|
172
|
+
|
|
173
|
+
-- GIN index for intent_types array queries
|
|
174
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
175
|
+
-- WHERE intent_types @> ARRAY['postgres.upsert']
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_registration_intent_types
|
|
177
|
+
ON registration_projections USING GIN (intent_types);
|
|
178
|
+
|
|
179
|
+
-- GIN index for protocols array queries
|
|
180
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
181
|
+
-- WHERE protocols @> ARRAY['ProtocolDatabaseAdapter']
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_registration_protocols
|
|
183
|
+
ON registration_projections USING GIN (protocols);
|
|
184
|
+
|
|
185
|
+
-- B-tree index for contract_type + state queries
|
|
186
|
+
-- Query pattern: SELECT * FROM registration_projections
|
|
187
|
+
-- WHERE contract_type = 'effect' AND current_state = 'active'
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_registration_contract_type_state
|
|
189
|
+
ON registration_projections (contract_type, current_state);
|
|
190
|
+
|
|
191
|
+
-- Composite index for deadline + emission marker scans
|
|
192
|
+
-- Optimizes the most common timeout check query
|
|
193
|
+
CREATE INDEX IF NOT EXISTS idx_registration_ack_timeout_scan
|
|
194
|
+
ON registration_projections (ack_deadline, ack_timeout_emitted_at)
|
|
195
|
+
WHERE ack_deadline IS NOT NULL AND ack_timeout_emitted_at IS NULL;
|
|
196
|
+
|
|
197
|
+
CREATE INDEX IF NOT EXISTS idx_registration_liveness_timeout_scan
|
|
198
|
+
ON registration_projections (current_state, liveness_deadline, liveness_timeout_emitted_at)
|
|
199
|
+
WHERE current_state = 'active' AND liveness_deadline IS NOT NULL AND liveness_timeout_emitted_at IS NULL;
|
|
200
|
+
|
|
201
|
+
-- =============================================================================
|
|
202
|
+
-- TABLE AND COLUMN COMMENTS
|
|
203
|
+
-- =============================================================================
|
|
204
|
+
|
|
205
|
+
COMMENT ON TABLE registration_projections IS
|
|
206
|
+
'Materialized registration state for orchestrator queries (OMN-944/F1). '
|
|
207
|
+
'Stores current FSM state, timeout deadlines, and idempotency tracking fields.';
|
|
208
|
+
|
|
209
|
+
COMMENT ON COLUMN registration_projections.entity_id IS
|
|
210
|
+
'Node UUID - partition key for per-entity ordering. Combined with domain forms primary key.';
|
|
211
|
+
|
|
212
|
+
COMMENT ON COLUMN registration_projections.domain IS
|
|
213
|
+
'Domain namespace for multi-domain support. Default: "registration".';
|
|
214
|
+
|
|
215
|
+
COMMENT ON COLUMN registration_projections.current_state IS
|
|
216
|
+
'Current FSM state. Used by orchestrators to determine workflow progression.';
|
|
217
|
+
|
|
218
|
+
COMMENT ON COLUMN registration_projections.ack_deadline IS
|
|
219
|
+
'Deadline for node acknowledgment. Orchestrator emits timeout event when passed.';
|
|
220
|
+
|
|
221
|
+
COMMENT ON COLUMN registration_projections.liveness_deadline IS
|
|
222
|
+
'Deadline for next heartbeat. Orchestrator emits liveness expired event when passed.';
|
|
223
|
+
|
|
224
|
+
COMMENT ON COLUMN registration_projections.last_heartbeat_at IS
|
|
225
|
+
'Timestamp of last received heartbeat from the node. Updated on each HeartbeatReceived event.';
|
|
226
|
+
|
|
227
|
+
COMMENT ON COLUMN registration_projections.ack_timeout_emitted_at IS
|
|
228
|
+
'Marker indicating ack timeout event was already emitted. Prevents duplicates during replay.';
|
|
229
|
+
|
|
230
|
+
COMMENT ON COLUMN registration_projections.liveness_timeout_emitted_at IS
|
|
231
|
+
'Marker indicating liveness timeout event was already emitted. Prevents duplicates during replay.';
|
|
232
|
+
|
|
233
|
+
COMMENT ON COLUMN registration_projections.last_applied_event_id IS
|
|
234
|
+
'message_id of last applied event - used for idempotency checks.';
|
|
235
|
+
|
|
236
|
+
COMMENT ON COLUMN registration_projections.last_applied_offset IS
|
|
237
|
+
'Kafka offset of last applied event - canonical ordering for replay correctness.';
|
|
238
|
+
|
|
239
|
+
COMMENT ON COLUMN registration_projections.last_applied_sequence IS
|
|
240
|
+
'Sequence number for non-Kafka transports (optional). Used when offset is not applicable.';
|
|
241
|
+
|
|
242
|
+
COMMENT ON COLUMN registration_projections.last_applied_partition IS
|
|
243
|
+
'Kafka partition of last applied event. Used with offset for global ordering.';
|
|
244
|
+
|
|
245
|
+
-- =============================================================================
|
|
246
|
+
-- INDEX STRATEGY DOCUMENTATION
|
|
247
|
+
-- =============================================================================
|
|
248
|
+
--
|
|
249
|
+
-- This schema defines multiple indexes for different query patterns. Some indexes
|
|
250
|
+
-- may appear redundant but serve distinct purposes due to partial WHERE clauses.
|
|
251
|
+
--
|
|
252
|
+
-- ACK DEADLINE INDEXES:
|
|
253
|
+
-- ---------------------
|
|
254
|
+
-- 1. idx_registration_ack_deadline:
|
|
255
|
+
-- - Single-column index on ack_deadline
|
|
256
|
+
-- - WHERE: ack_deadline IS NOT NULL
|
|
257
|
+
-- - Use case: General queries filtering by ack_deadline regardless of emission status
|
|
258
|
+
-- - Example: SELECT * FROM registration_projections WHERE ack_deadline < :now
|
|
259
|
+
--
|
|
260
|
+
-- 2. idx_registration_ack_timeout_scan:
|
|
261
|
+
-- - Composite index on (ack_deadline, ack_timeout_emitted_at)
|
|
262
|
+
-- - WHERE: ack_deadline IS NOT NULL AND ack_timeout_emitted_at IS NULL
|
|
263
|
+
-- - Use case: Timeout scanner queries that need un-emitted timeouts only
|
|
264
|
+
-- - Example: SELECT * FROM registration_projections
|
|
265
|
+
-- WHERE ack_deadline < :now AND ack_timeout_emitted_at IS NULL
|
|
266
|
+
--
|
|
267
|
+
-- WHY BOTH INDEXES EXIST:
|
|
268
|
+
-- The partial WHERE clauses differ significantly:
|
|
269
|
+
-- - idx_registration_ack_deadline includes ALL rows with non-null deadlines
|
|
270
|
+
-- - idx_registration_ack_timeout_scan ONLY includes rows awaiting timeout emission
|
|
271
|
+
--
|
|
272
|
+
-- PostgreSQL's query planner selects the most selective index. For timeout scans
|
|
273
|
+
-- (the common orchestrator query), idx_registration_ack_timeout_scan is optimal
|
|
274
|
+
-- because it pre-filters to only candidate rows. For other deadline queries that
|
|
275
|
+
-- don't filter on emission status, idx_registration_ack_deadline is used.
|
|
276
|
+
--
|
|
277
|
+
-- LIVENESS DEADLINE INDEXES:
|
|
278
|
+
-- --------------------------
|
|
279
|
+
-- Similar rationale applies to liveness indexes:
|
|
280
|
+
-- - idx_registration_liveness_deadline: All rows with liveness deadlines
|
|
281
|
+
-- - idx_registration_liveness_timeout_scan: Only active nodes awaiting emission
|
|
282
|
+
--
|
|
283
|
+
-- =============================================================================
|
|
284
|
+
-- UPSERT ORDERING ENFORCEMENT PATTERN
|
|
285
|
+
-- =============================================================================
|
|
286
|
+
--
|
|
287
|
+
-- The projector (projector_registration.py) uses an atomic INSERT-or-UPDATE with
|
|
288
|
+
-- sequence validation to enforce event ordering and reject stale updates.
|
|
289
|
+
--
|
|
290
|
+
-- KEY CONCEPT: Stale Update Rejection
|
|
291
|
+
-- ------------------------------------
|
|
292
|
+
-- "Stale" means the incoming event is older than what we've already processed.
|
|
293
|
+
-- The upsert's WHERE clause compares sequence/offset numbers to ensure we never
|
|
294
|
+
-- regress projection state. If the incoming event is older, PostgreSQL skips
|
|
295
|
+
-- the UPDATE entirely - the existing row remains unchanged.
|
|
296
|
+
--
|
|
297
|
+
-- ORDERING MODES (mutually exclusive):
|
|
298
|
+
-- ------------------------------------
|
|
299
|
+
-- 1. KAFKA-BASED ORDERING (partition IS NOT NULL):
|
|
300
|
+
-- Uses last_applied_offset for ordering within a partition.
|
|
301
|
+
-- Kafka guarantees ordering within a partition, so (partition, offset)
|
|
302
|
+
-- provides a total order for events affecting the same entity.
|
|
303
|
+
--
|
|
304
|
+
-- 2. SEQUENCE-BASED ORDERING (partition IS NULL):
|
|
305
|
+
-- Falls back to last_applied_sequence for non-Kafka transports (e.g., HTTP).
|
|
306
|
+
-- Used when the event source doesn't provide Kafka-style partition/offset.
|
|
307
|
+
--
|
|
308
|
+
-- IDEMPOTENCY FIELDS:
|
|
309
|
+
-- -------------------
|
|
310
|
+
-- - last_applied_event_id: Message UUID for exact duplicate detection
|
|
311
|
+
-- - last_applied_offset: Kafka offset for Kafka-based ordering
|
|
312
|
+
-- - last_applied_sequence: Generic sequence for non-Kafka ordering
|
|
313
|
+
-- - last_applied_partition: Kafka partition for partitioned ordering context
|
|
314
|
+
--
|
|
315
|
+
-- These fields together enable:
|
|
316
|
+
-- 1. Replay correctness: Replaying events produces identical projection state
|
|
317
|
+
-- 2. Stale rejection: Out-of-order events don't regress state
|
|
318
|
+
-- 3. Idempotency: Duplicate events are handled gracefully
|
|
319
|
+
--
|
|
320
|
+
-- See projector_registration.py for the complete upsert SQL implementation.
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
-- SPDX-License-Identifier: MIT
|
|
2
|
+
-- Copyright (c) 2025 OmniNode Team
|
|
3
|
+
--
|
|
4
|
+
-- Transition Notification Outbox Schema
|
|
5
|
+
-- Ticket: OMN-1139 (TransitionNotificationOutbox implementation)
|
|
6
|
+
-- Version: 1.0.0
|
|
7
|
+
--
|
|
8
|
+
-- Design Notes:
|
|
9
|
+
-- - Implements the outbox pattern for guaranteed notification delivery
|
|
10
|
+
-- - Stores notifications in same transaction as projections for atomicity
|
|
11
|
+
-- - Supports concurrent processing via SELECT FOR UPDATE SKIP LOCKED
|
|
12
|
+
-- - Includes retry tracking with error recording
|
|
13
|
+
-- - Indexes optimized for processor query patterns:
|
|
14
|
+
-- 1. Pending notification queries (processed_at IS NULL)
|
|
15
|
+
-- 2. Aggregate-specific queries (aggregate_type, aggregate_id)
|
|
16
|
+
-- 3. Retry processing (high retry counts for monitoring)
|
|
17
|
+
-- 4. Cleanup of old processed records
|
|
18
|
+
-- - All timestamps are timezone-aware (TIMESTAMPTZ)
|
|
19
|
+
-- - This schema is idempotent (IF NOT EXISTS used throughout)
|
|
20
|
+
--
|
|
21
|
+
-- Usage:
|
|
22
|
+
-- Execute this SQL file to create or update the outbox schema.
|
|
23
|
+
-- The schema is designed to be re-run safely (idempotent).
|
|
24
|
+
--
|
|
25
|
+
-- Related:
|
|
26
|
+
-- - TransitionNotificationOutbox: src/omnibase_infra/runtime/transition_notification_outbox.py
|
|
27
|
+
-- - ModelStateTransitionNotification: omnibase_core.models.notifications
|
|
28
|
+
-- - ProtocolTransitionNotificationPublisher: omnibase_core.protocols.notifications
|
|
29
|
+
|
|
30
|
+
-- =============================================================================
|
|
31
|
+
-- MAIN TABLE
|
|
32
|
+
-- =============================================================================
|
|
33
|
+
|
|
34
|
+
CREATE TABLE IF NOT EXISTS transition_notification_outbox (
|
|
35
|
+
-- Identity
|
|
36
|
+
id BIGSERIAL PRIMARY KEY,
|
|
37
|
+
|
|
38
|
+
-- Notification Payload (serialized ModelStateTransitionNotification)
|
|
39
|
+
notification_data JSONB NOT NULL,
|
|
40
|
+
|
|
41
|
+
-- Timestamps
|
|
42
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
43
|
+
-- processed_at encodes both "pending" and "processed" states in a single column:
|
|
44
|
+
-- NULL = pending (not yet processed, eligible for processing)
|
|
45
|
+
-- non-NULL = processed (successfully published, timestamp of completion)
|
|
46
|
+
-- Note: No separate "processed_implies_no_pending" constraint is needed because
|
|
47
|
+
-- the single-column semantic makes the states mutually exclusive by design -
|
|
48
|
+
-- a row cannot be both pending (NULL) and processed (non-NULL) simultaneously.
|
|
49
|
+
processed_at TIMESTAMPTZ,
|
|
50
|
+
|
|
51
|
+
-- Retry Tracking
|
|
52
|
+
retry_count INT NOT NULL DEFAULT 0,
|
|
53
|
+
last_error TEXT, -- Most recent error message (sanitized, max 1000 chars)
|
|
54
|
+
|
|
55
|
+
-- Aggregate Information (for queries and debugging)
|
|
56
|
+
aggregate_type TEXT NOT NULL,
|
|
57
|
+
aggregate_id UUID NOT NULL,
|
|
58
|
+
|
|
59
|
+
-- Constraints
|
|
60
|
+
CONSTRAINT valid_retry_count CHECK (retry_count >= 0)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- =============================================================================
|
|
64
|
+
-- INDEXES FOR OUTBOX PROCESSING
|
|
65
|
+
-- =============================================================================
|
|
66
|
+
|
|
67
|
+
-- Index for efficient pending notification queries (PRIMARY query pattern)
|
|
68
|
+
-- The processor uses: SELECT ... WHERE processed_at IS NULL ORDER BY created_at
|
|
69
|
+
-- Partial index: only index rows with NULL processed_at (pending notifications)
|
|
70
|
+
-- Query pattern: SELECT id, notification_data FROM transition_notification_outbox
|
|
71
|
+
-- WHERE processed_at IS NULL ORDER BY created_at LIMIT :batch_size
|
|
72
|
+
-- FOR UPDATE SKIP LOCKED
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_pending
|
|
74
|
+
ON transition_notification_outbox (created_at)
|
|
75
|
+
WHERE processed_at IS NULL;
|
|
76
|
+
|
|
77
|
+
-- Index for aggregate-specific queries (debugging and monitoring)
|
|
78
|
+
-- Enables queries like "show all notifications for entity X"
|
|
79
|
+
-- Query pattern: SELECT * FROM transition_notification_outbox
|
|
80
|
+
-- WHERE aggregate_type = :type AND aggregate_id = :id
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_aggregate
|
|
82
|
+
ON transition_notification_outbox (aggregate_type, aggregate_id);
|
|
83
|
+
|
|
84
|
+
-- Index for retry monitoring (identify stuck/failing notifications)
|
|
85
|
+
-- Partial index: only pending notifications with retries
|
|
86
|
+
-- Query pattern: SELECT * FROM transition_notification_outbox
|
|
87
|
+
-- WHERE processed_at IS NULL AND retry_count > :threshold
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_retry_pending
|
|
89
|
+
ON transition_notification_outbox (retry_count, created_at)
|
|
90
|
+
WHERE processed_at IS NULL AND retry_count > 0;
|
|
91
|
+
|
|
92
|
+
-- Index for cleanup queries (delete old processed records)
|
|
93
|
+
-- Enables efficient deletion of processed records older than a threshold
|
|
94
|
+
-- Query pattern: DELETE FROM transition_notification_outbox
|
|
95
|
+
-- WHERE processed_at IS NOT NULL AND processed_at < :cutoff_time
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_cleanup
|
|
97
|
+
ON transition_notification_outbox (processed_at)
|
|
98
|
+
WHERE processed_at IS NOT NULL;
|
|
99
|
+
|
|
100
|
+
-- Index for aggregate type filtering with pending status
|
|
101
|
+
-- Useful for monitoring specific aggregate types
|
|
102
|
+
-- Query pattern: SELECT COUNT(*) FROM transition_notification_outbox
|
|
103
|
+
-- WHERE aggregate_type = :type AND processed_at IS NULL
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_aggregate_type_pending
|
|
105
|
+
ON transition_notification_outbox (aggregate_type)
|
|
106
|
+
WHERE processed_at IS NULL;
|
|
107
|
+
|
|
108
|
+
-- =============================================================================
|
|
109
|
+
-- TABLE AND COLUMN COMMENTS
|
|
110
|
+
-- =============================================================================
|
|
111
|
+
|
|
112
|
+
COMMENT ON TABLE transition_notification_outbox IS
|
|
113
|
+
'Outbox pattern table for guaranteed state transition notification delivery (OMN-1139). '
|
|
114
|
+
'Stores notifications in same transaction as projections for atomicity. '
|
|
115
|
+
'Background processor publishes pending notifications asynchronously.';
|
|
116
|
+
|
|
117
|
+
COMMENT ON COLUMN transition_notification_outbox.id IS
|
|
118
|
+
'Auto-incrementing primary key. Used for efficient row locking with FOR UPDATE SKIP LOCKED.';
|
|
119
|
+
|
|
120
|
+
COMMENT ON COLUMN transition_notification_outbox.notification_data IS
|
|
121
|
+
'Serialized ModelStateTransitionNotification as JSONB. Contains all notification fields: '
|
|
122
|
+
'aggregate_type, aggregate_id, transition (from_state, to_state, event_type), '
|
|
123
|
+
'correlation_id, timestamp, and optional metadata.';
|
|
124
|
+
|
|
125
|
+
COMMENT ON COLUMN transition_notification_outbox.created_at IS
|
|
126
|
+
'Timestamp when notification was stored in outbox. Used for FIFO ordering of pending notifications.';
|
|
127
|
+
|
|
128
|
+
COMMENT ON COLUMN transition_notification_outbox.processed_at IS
|
|
129
|
+
'Timestamp when notification was successfully published. NULL indicates pending status.';
|
|
130
|
+
|
|
131
|
+
COMMENT ON COLUMN transition_notification_outbox.retry_count IS
|
|
132
|
+
'Number of failed publish attempts. Incremented on each failure, not reset on success. '
|
|
133
|
+
'Use for monitoring and alerting on stuck notifications.';
|
|
134
|
+
|
|
135
|
+
COMMENT ON COLUMN transition_notification_outbox.last_error IS
|
|
136
|
+
'Most recent error message from failed publish attempt (sanitized, max 1000 chars). '
|
|
137
|
+
'Updated on each failure for debugging. May contain value even when processed_at is set '
|
|
138
|
+
'if earlier retries failed before final success.';
|
|
139
|
+
|
|
140
|
+
COMMENT ON COLUMN transition_notification_outbox.aggregate_type IS
|
|
141
|
+
'Type of aggregate this notification is for (e.g., "registration", "workflow"). '
|
|
142
|
+
'Denormalized from notification_data for efficient indexing and filtering.';
|
|
143
|
+
|
|
144
|
+
COMMENT ON COLUMN transition_notification_outbox.aggregate_id IS
|
|
145
|
+
'UUID of the aggregate entity this notification is for. '
|
|
146
|
+
'Denormalized from notification_data for efficient indexing and aggregate-specific queries.';
|
|
147
|
+
|
|
148
|
+
-- =============================================================================
|
|
149
|
+
-- INDEX STRATEGY DOCUMENTATION
|
|
150
|
+
-- =============================================================================
|
|
151
|
+
--
|
|
152
|
+
-- This schema defines multiple indexes optimized for different query patterns
|
|
153
|
+
-- used by the TransitionNotificationOutbox processor and operators.
|
|
154
|
+
--
|
|
155
|
+
-- PENDING NOTIFICATION PROCESSING:
|
|
156
|
+
-- --------------------------------
|
|
157
|
+
-- 1. idx_outbox_pending:
|
|
158
|
+
-- - Single-column index on created_at
|
|
159
|
+
-- - WHERE: processed_at IS NULL
|
|
160
|
+
-- - Use case: Main processor query - fetch pending notifications in FIFO order
|
|
161
|
+
-- - Critical for: process_pending() batch retrieval
|
|
162
|
+
--
|
|
163
|
+
-- The partial WHERE clause keeps this index small and fast by excluding
|
|
164
|
+
-- all processed records.
|
|
165
|
+
--
|
|
166
|
+
-- AGGREGATE QUERIES (Debugging):
|
|
167
|
+
-- ------------------------------
|
|
168
|
+
-- 2. idx_outbox_aggregate:
|
|
169
|
+
-- - Composite index on (aggregate_type, aggregate_id)
|
|
170
|
+
-- - Use case: Query notifications for a specific entity
|
|
171
|
+
-- - Example: "Show all notifications for registration entity X"
|
|
172
|
+
--
|
|
173
|
+
-- RETRY MONITORING:
|
|
174
|
+
-- -----------------
|
|
175
|
+
-- 3. idx_outbox_retry_pending:
|
|
176
|
+
-- - Composite index on (retry_count, created_at)
|
|
177
|
+
-- - WHERE: processed_at IS NULL AND retry_count > 0
|
|
178
|
+
-- - Use case: Identify stuck or failing notifications
|
|
179
|
+
-- - Example: Alert when retry_count > 5 for pending notifications
|
|
180
|
+
--
|
|
181
|
+
-- CLEANUP OPERATIONS:
|
|
182
|
+
-- -------------------
|
|
183
|
+
-- 4. idx_outbox_cleanup:
|
|
184
|
+
-- - Single-column index on processed_at
|
|
185
|
+
-- - WHERE: processed_at IS NOT NULL
|
|
186
|
+
-- - Use case: Efficient deletion of old processed records
|
|
187
|
+
-- - Example: DELETE ... WHERE processed_at < NOW() - INTERVAL '7 days'
|
|
188
|
+
--
|
|
189
|
+
-- TYPE-SPECIFIC MONITORING:
|
|
190
|
+
-- -------------------------
|
|
191
|
+
-- 5. idx_outbox_aggregate_type_pending:
|
|
192
|
+
-- - Single-column index on aggregate_type
|
|
193
|
+
-- - WHERE: processed_at IS NULL
|
|
194
|
+
-- - Use case: Count pending notifications by type for monitoring dashboards
|
|
195
|
+
--
|
|
196
|
+
-- =============================================================================
|
|
197
|
+
-- CONCURRENT PROCESSING PATTERN
|
|
198
|
+
-- =============================================================================
|
|
199
|
+
--
|
|
200
|
+
-- The outbox processor uses SELECT FOR UPDATE SKIP LOCKED to enable safe
|
|
201
|
+
-- concurrent processing by multiple instances:
|
|
202
|
+
--
|
|
203
|
+
-- SELECT id, notification_data
|
|
204
|
+
-- FROM transition_notification_outbox
|
|
205
|
+
-- WHERE processed_at IS NULL
|
|
206
|
+
-- ORDER BY created_at
|
|
207
|
+
-- LIMIT :batch_size
|
|
208
|
+
-- FOR UPDATE SKIP LOCKED;
|
|
209
|
+
--
|
|
210
|
+
-- SKIP LOCKED ensures that if another processor has locked a row, this query
|
|
211
|
+
-- skips it rather than blocking. This prevents:
|
|
212
|
+
-- - Duplicate processing
|
|
213
|
+
-- - Deadlocks between processors
|
|
214
|
+
-- - Head-of-line blocking
|
|
215
|
+
--
|
|
216
|
+
-- The id column (BIGSERIAL PRIMARY KEY) provides an efficient row lock target.
|
|
217
|
+
--
|
|
218
|
+
-- =============================================================================
|
|
219
|
+
-- CLEANUP RECOMMENDATIONS
|
|
220
|
+
-- =============================================================================
|
|
221
|
+
--
|
|
222
|
+
-- Processed records should be periodically deleted to prevent table bloat.
|
|
223
|
+
-- Recommended cleanup query (run periodically via cron or pg_cron):
|
|
224
|
+
--
|
|
225
|
+
-- DELETE FROM transition_notification_outbox
|
|
226
|
+
-- WHERE processed_at IS NOT NULL
|
|
227
|
+
-- AND processed_at < NOW() - INTERVAL '7 days';
|
|
228
|
+
--
|
|
229
|
+
-- Alternatively, implement as a PostgreSQL function:
|
|
230
|
+
--
|
|
231
|
+
-- CREATE OR REPLACE FUNCTION cleanup_outbox(retention_interval INTERVAL)
|
|
232
|
+
-- RETURNS BIGINT AS $$
|
|
233
|
+
-- DECLARE
|
|
234
|
+
-- deleted_count BIGINT;
|
|
235
|
+
-- BEGIN
|
|
236
|
+
-- DELETE FROM transition_notification_outbox
|
|
237
|
+
-- WHERE processed_at IS NOT NULL
|
|
238
|
+
-- AND processed_at < NOW() - retention_interval;
|
|
239
|
+
-- GET DIAGNOSTICS deleted_count = ROW_COUNT;
|
|
240
|
+
-- RETURN deleted_count;
|
|
241
|
+
-- END;
|
|
242
|
+
-- $$ LANGUAGE plpgsql;
|
|
243
|
+
--
|
|
244
|
+
-- Usage: SELECT cleanup_outbox(INTERVAL '7 days');
|
|
245
|
+
--
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""ONEX Infrastructure Services Module.
|
|
4
|
+
|
|
5
|
+
Provides high-level services that compose infrastructure components for
|
|
6
|
+
use by orchestrators and runtime hosts. Services provide clean interfaces
|
|
7
|
+
for common operations and encapsulate complexity.
|
|
8
|
+
|
|
9
|
+
Exports:
|
|
10
|
+
DEFAULT_SELECTION_KEY: Default key for round-robin state tracking
|
|
11
|
+
EnumSelectionStrategy: Selection strategies for capability-based discovery
|
|
12
|
+
ModelTimeoutEmissionConfig: Configuration for timeout emitter
|
|
13
|
+
ModelTimeoutEmissionResult: Result model for timeout emission processing
|
|
14
|
+
ModelTimeoutQueryResult: Result model for timeout queries
|
|
15
|
+
ServiceCapabilityQuery: Query nodes by capability, not by name
|
|
16
|
+
ServiceNodeSelector: Select nodes from candidates using various strategies
|
|
17
|
+
ServiceSnapshot: Generic snapshot service for point-in-time state capture
|
|
18
|
+
ServiceTimeoutEmitter: Emitter for timeout events with markers
|
|
19
|
+
ServiceTimeoutScanner: Scanner for querying overdue registration entities
|
|
20
|
+
StoreSnapshotInMemory: In-memory snapshot store for testing
|
|
21
|
+
StoreSnapshotPostgres: PostgreSQL snapshot store for production
|
|
22
|
+
TimeoutEmitter: Alias for ServiceTimeoutEmitter
|
|
23
|
+
TimeoutScanner: Alias for ServiceTimeoutScanner
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from omnibase_infra.enums import EnumSelectionStrategy
|
|
27
|
+
from omnibase_infra.services.corpus_capture import CorpusCapture
|
|
28
|
+
from omnibase_infra.services.service_capability_query import ServiceCapabilityQuery
|
|
29
|
+
from omnibase_infra.services.service_node_selector import (
|
|
30
|
+
DEFAULT_SELECTION_KEY,
|
|
31
|
+
ServiceNodeSelector,
|
|
32
|
+
)
|
|
33
|
+
from omnibase_infra.services.service_timeout_emitter import (
|
|
34
|
+
ModelTimeoutEmissionConfig,
|
|
35
|
+
ModelTimeoutEmissionResult,
|
|
36
|
+
ServiceTimeoutEmitter,
|
|
37
|
+
)
|
|
38
|
+
from omnibase_infra.services.service_timeout_scanner import (
|
|
39
|
+
ModelTimeoutQueryResult,
|
|
40
|
+
ServiceTimeoutScanner,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Session services (moved from omniclaude in OMN-1526)
|
|
44
|
+
from omnibase_infra.services.session import (
|
|
45
|
+
ConfigSessionConsumer,
|
|
46
|
+
ConfigSessionStorage,
|
|
47
|
+
ConsumerMetrics,
|
|
48
|
+
EnumCircuitState,
|
|
49
|
+
ProtocolSessionAggregator,
|
|
50
|
+
SessionEventConsumer,
|
|
51
|
+
SessionSnapshotStore,
|
|
52
|
+
SessionStoreNotInitializedError,
|
|
53
|
+
)
|
|
54
|
+
from omnibase_infra.services.snapshot import (
|
|
55
|
+
ServiceSnapshot,
|
|
56
|
+
StoreSnapshotInMemory,
|
|
57
|
+
StoreSnapshotPostgres,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Aliases for convenience
|
|
61
|
+
TimeoutEmitter = ServiceTimeoutEmitter
|
|
62
|
+
TimeoutScanner = ServiceTimeoutScanner
|
|
63
|
+
|
|
64
|
+
__all__ = [
|
|
65
|
+
"DEFAULT_SELECTION_KEY",
|
|
66
|
+
"EnumSelectionStrategy",
|
|
67
|
+
"ModelTimeoutEmissionConfig",
|
|
68
|
+
"ModelTimeoutEmissionResult",
|
|
69
|
+
"ModelTimeoutQueryResult",
|
|
70
|
+
"ServiceCapabilityQuery",
|
|
71
|
+
"CorpusCapture",
|
|
72
|
+
"ServiceNodeSelector",
|
|
73
|
+
"ServiceSnapshot",
|
|
74
|
+
"ServiceTimeoutEmitter",
|
|
75
|
+
"ServiceTimeoutScanner",
|
|
76
|
+
"StoreSnapshotInMemory",
|
|
77
|
+
"StoreSnapshotPostgres",
|
|
78
|
+
"TimeoutEmitter",
|
|
79
|
+
"TimeoutScanner",
|
|
80
|
+
# Session services (OMN-1526)
|
|
81
|
+
"ConfigSessionConsumer",
|
|
82
|
+
"ConfigSessionStorage",
|
|
83
|
+
"ConsumerMetrics",
|
|
84
|
+
"EnumCircuitState",
|
|
85
|
+
"ProtocolSessionAggregator",
|
|
86
|
+
"SessionEventConsumer",
|
|
87
|
+
"SessionSnapshotStore",
|
|
88
|
+
"SessionStoreNotInitializedError",
|
|
89
|
+
]
|