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,352 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatcher Registration Model.
|
|
5
|
+
|
|
6
|
+
Represents metadata about a registered dispatcher in the dispatch engine.
|
|
7
|
+
Dispatchers are the execution units that process messages after routing.
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
ModelDispatcherRegistration is a pure data model that captures dispatcher metadata:
|
|
11
|
+
- Dispatcher identity (unique ID, human-readable name)
|
|
12
|
+
- Dispatcher capabilities (what message categories/types it can handle)
|
|
13
|
+
- Dispatcher configuration (timeout, concurrency limits)
|
|
14
|
+
- Health and status information
|
|
15
|
+
|
|
16
|
+
This model is used by the dispatch engine to:
|
|
17
|
+
1. Register dispatchers during startup
|
|
18
|
+
2. Validate that routes reference valid dispatchers
|
|
19
|
+
3. Track dispatcher health and availability
|
|
20
|
+
4. Configure dispatcher execution parameters
|
|
21
|
+
|
|
22
|
+
Thread Safety:
|
|
23
|
+
ModelDispatcherRegistration is immutable (frozen=True) after creation,
|
|
24
|
+
making it thread-safe for concurrent read access.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
>>> from omnibase_infra.models.dispatch import ModelDispatcherRegistration
|
|
28
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
29
|
+
>>> from omnibase_core.enums.enum_node_kind import EnumNodeKind
|
|
30
|
+
>>> from datetime import datetime, timezone
|
|
31
|
+
>>>
|
|
32
|
+
>>> # Register a dispatcher for user events
|
|
33
|
+
>>> dispatcher = ModelDispatcherRegistration(
|
|
34
|
+
... dispatcher_id="user-event-dispatcher",
|
|
35
|
+
... dispatcher_name="User Event Dispatcher",
|
|
36
|
+
... node_kind=EnumNodeKind.REDUCER,
|
|
37
|
+
... supported_categories=[EnumMessageCategory.EVENT],
|
|
38
|
+
... timeout_seconds=30,
|
|
39
|
+
... max_concurrent=10,
|
|
40
|
+
... registered_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=timezone.utc),
|
|
41
|
+
... )
|
|
42
|
+
|
|
43
|
+
See Also:
|
|
44
|
+
omnibase_infra.models.dispatch.ModelDispatchRoute: Uses dispatcher_id to reference dispatchers
|
|
45
|
+
omnibase_infra.models.dispatch.ModelDispatchResult: Reports dispatcher execution results
|
|
46
|
+
omnibase_core.enums.EnumNodeKind: Node type classification
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
from datetime import UTC, datetime
|
|
50
|
+
from uuid import UUID
|
|
51
|
+
|
|
52
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
53
|
+
|
|
54
|
+
from omnibase_core.enums import EnumNodeKind
|
|
55
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
56
|
+
from omnibase_infra.models.dispatch.model_dispatch_metadata import ModelDispatchMetadata
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ModelDispatcherRegistration(BaseModel):
|
|
60
|
+
"""
|
|
61
|
+
Metadata about a registered dispatcher in the dispatch engine.
|
|
62
|
+
|
|
63
|
+
Captures all information needed to configure and manage a dispatcher,
|
|
64
|
+
including its capabilities, configuration, and health status.
|
|
65
|
+
|
|
66
|
+
Attributes:
|
|
67
|
+
dispatcher_id: Unique identifier for this dispatcher (referenced by routes).
|
|
68
|
+
dispatcher_name: Human-readable name for the dispatcher.
|
|
69
|
+
node_kind: The ONEX node kind this dispatcher represents.
|
|
70
|
+
node_id: Optional UUID of the node instance implementing this dispatcher.
|
|
71
|
+
supported_categories: Message categories this dispatcher can process.
|
|
72
|
+
supported_message_types: Specific message types this dispatcher accepts.
|
|
73
|
+
When empty, accepts all message types in supported categories.
|
|
74
|
+
timeout_seconds: Maximum execution time before timeout.
|
|
75
|
+
max_concurrent: Maximum concurrent executions allowed.
|
|
76
|
+
max_retries: Maximum retry attempts for failed executions.
|
|
77
|
+
enabled: Whether this dispatcher is currently accepting messages.
|
|
78
|
+
healthy: Whether this dispatcher is currently healthy.
|
|
79
|
+
last_health_check: Timestamp of the last health check.
|
|
80
|
+
registered_at: Timestamp when this dispatcher was registered.
|
|
81
|
+
version: Dispatcher version string for compatibility tracking.
|
|
82
|
+
description: Human-readable description of the dispatcher's purpose.
|
|
83
|
+
tags: Optional tags for categorization and filtering.
|
|
84
|
+
metadata: Optional additional metadata about the dispatcher.
|
|
85
|
+
|
|
86
|
+
Example:
|
|
87
|
+
>>> from datetime import datetime, timezone
|
|
88
|
+
>>> dispatcher = ModelDispatcherRegistration(
|
|
89
|
+
... dispatcher_id="order-processor",
|
|
90
|
+
... dispatcher_name="Order Processing Dispatcher",
|
|
91
|
+
... node_kind=EnumNodeKind.ORCHESTRATOR,
|
|
92
|
+
... supported_categories=[EnumMessageCategory.COMMAND],
|
|
93
|
+
... supported_message_types=["CreateOrderCommand", "CancelOrderCommand"],
|
|
94
|
+
... timeout_seconds=60,
|
|
95
|
+
... max_concurrent=5,
|
|
96
|
+
... description="Processes order commands and coordinates fulfillment",
|
|
97
|
+
... registered_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=timezone.utc),
|
|
98
|
+
... )
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
model_config = ConfigDict(
|
|
102
|
+
frozen=True,
|
|
103
|
+
extra="forbid",
|
|
104
|
+
from_attributes=True,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# ---- Dispatcher Identity ----
|
|
108
|
+
dispatcher_id: str = Field(
|
|
109
|
+
...,
|
|
110
|
+
description="Unique identifier for this dispatcher (referenced by routes).",
|
|
111
|
+
min_length=1,
|
|
112
|
+
max_length=200,
|
|
113
|
+
)
|
|
114
|
+
dispatcher_name: str = Field(
|
|
115
|
+
...,
|
|
116
|
+
description="Human-readable name for the dispatcher.",
|
|
117
|
+
min_length=1,
|
|
118
|
+
max_length=200,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# ---- Node Information ----
|
|
122
|
+
node_kind: EnumNodeKind = Field(
|
|
123
|
+
...,
|
|
124
|
+
description="The ONEX node kind this dispatcher represents.",
|
|
125
|
+
)
|
|
126
|
+
node_id: UUID | None = Field(
|
|
127
|
+
default=None,
|
|
128
|
+
description="Optional UUID of the node instance implementing this dispatcher.",
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# ---- Capabilities ----
|
|
132
|
+
supported_categories: list[EnumMessageCategory] = Field(
|
|
133
|
+
...,
|
|
134
|
+
description="Message categories this dispatcher can process.",
|
|
135
|
+
min_length=1,
|
|
136
|
+
)
|
|
137
|
+
supported_message_types: list[str] = Field(
|
|
138
|
+
default_factory=list,
|
|
139
|
+
description=(
|
|
140
|
+
"Specific message types this dispatcher accepts. "
|
|
141
|
+
"When empty, accepts all message types in supported categories."
|
|
142
|
+
),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# ---- Execution Configuration ----
|
|
146
|
+
timeout_seconds: int = Field(
|
|
147
|
+
default=30,
|
|
148
|
+
description="Maximum execution time before timeout.",
|
|
149
|
+
ge=1,
|
|
150
|
+
le=3600,
|
|
151
|
+
)
|
|
152
|
+
max_concurrent: int = Field(
|
|
153
|
+
default=10,
|
|
154
|
+
description="Maximum concurrent executions allowed.",
|
|
155
|
+
ge=1,
|
|
156
|
+
le=1000,
|
|
157
|
+
)
|
|
158
|
+
max_retries: int = Field(
|
|
159
|
+
default=3,
|
|
160
|
+
description="Maximum retry attempts for failed executions.",
|
|
161
|
+
ge=0,
|
|
162
|
+
le=10,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# ---- Status ----
|
|
166
|
+
enabled: bool = Field(
|
|
167
|
+
default=True,
|
|
168
|
+
description="Whether this dispatcher is currently accepting messages.",
|
|
169
|
+
)
|
|
170
|
+
healthy: bool = Field(
|
|
171
|
+
default=True,
|
|
172
|
+
description="Whether this dispatcher is currently healthy.",
|
|
173
|
+
)
|
|
174
|
+
last_health_check: datetime | None = Field(
|
|
175
|
+
default=None,
|
|
176
|
+
description="Timestamp of the last health check (UTC).",
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# ---- Registration Metadata ----
|
|
180
|
+
# Timestamps - MUST be explicitly injected (no default_factory for testability)
|
|
181
|
+
registered_at: datetime = Field(
|
|
182
|
+
...,
|
|
183
|
+
description="Timestamp when this dispatcher was registered (UTC, must be explicitly provided).",
|
|
184
|
+
)
|
|
185
|
+
version: str | None = Field(
|
|
186
|
+
default=None,
|
|
187
|
+
description="Dispatcher version string for compatibility tracking.",
|
|
188
|
+
max_length=50,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# ---- Documentation ----
|
|
192
|
+
description: str | None = Field(
|
|
193
|
+
default=None,
|
|
194
|
+
description="Human-readable description of the dispatcher's purpose.",
|
|
195
|
+
max_length=1000,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# ---- Optional Metadata ----
|
|
199
|
+
tags: list[str] | None = Field(
|
|
200
|
+
default=None,
|
|
201
|
+
description="Optional tags for categorization and filtering.",
|
|
202
|
+
)
|
|
203
|
+
metadata: ModelDispatchMetadata | None = Field(
|
|
204
|
+
default=None,
|
|
205
|
+
description="Optional additional metadata about the dispatcher.",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
def supports_category(self, category: EnumMessageCategory) -> bool:
|
|
209
|
+
"""
|
|
210
|
+
Check if this dispatcher supports the given message category.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
category: The message category to check
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if the dispatcher supports this category, False otherwise
|
|
217
|
+
|
|
218
|
+
Example:
|
|
219
|
+
>>> from datetime import datetime, timezone
|
|
220
|
+
>>> dispatcher = ModelDispatcherRegistration(
|
|
221
|
+
... dispatcher_id="test",
|
|
222
|
+
... dispatcher_name="Test Dispatcher",
|
|
223
|
+
... node_kind=EnumNodeKind.REDUCER,
|
|
224
|
+
... supported_categories=[EnumMessageCategory.EVENT],
|
|
225
|
+
... registered_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=timezone.utc),
|
|
226
|
+
... )
|
|
227
|
+
>>> dispatcher.supports_category(EnumMessageCategory.EVENT)
|
|
228
|
+
True
|
|
229
|
+
>>> dispatcher.supports_category(EnumMessageCategory.COMMAND)
|
|
230
|
+
False
|
|
231
|
+
"""
|
|
232
|
+
return category in self.supported_categories
|
|
233
|
+
|
|
234
|
+
def supports_message_type(self, message_type: str) -> bool:
|
|
235
|
+
"""
|
|
236
|
+
Check if this dispatcher supports the given message type.
|
|
237
|
+
|
|
238
|
+
If supported_message_types is empty, accepts all message types.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
message_type: The message type to check
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
True if the dispatcher supports this message type, False otherwise
|
|
245
|
+
|
|
246
|
+
Example:
|
|
247
|
+
>>> from datetime import datetime, timezone
|
|
248
|
+
>>> dispatcher = ModelDispatcherRegistration(
|
|
249
|
+
... dispatcher_id="test",
|
|
250
|
+
... dispatcher_name="Test Dispatcher",
|
|
251
|
+
... node_kind=EnumNodeKind.REDUCER,
|
|
252
|
+
... supported_categories=[EnumMessageCategory.EVENT],
|
|
253
|
+
... supported_message_types=["UserCreated", "UserUpdated"],
|
|
254
|
+
... registered_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=timezone.utc),
|
|
255
|
+
... )
|
|
256
|
+
>>> dispatcher.supports_message_type("UserCreated")
|
|
257
|
+
True
|
|
258
|
+
>>> dispatcher.supports_message_type("OrderCreated")
|
|
259
|
+
False
|
|
260
|
+
"""
|
|
261
|
+
if not self.supported_message_types:
|
|
262
|
+
# Empty list means all message types are supported
|
|
263
|
+
return True
|
|
264
|
+
return message_type in self.supported_message_types
|
|
265
|
+
|
|
266
|
+
def can_accept_message(
|
|
267
|
+
self,
|
|
268
|
+
category: EnumMessageCategory,
|
|
269
|
+
message_type: str | None = None,
|
|
270
|
+
) -> bool:
|
|
271
|
+
"""
|
|
272
|
+
Check if this dispatcher can accept a message with the given category and type.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
category: The message category
|
|
276
|
+
message_type: Optional message type
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
True if the dispatcher can accept this message, False otherwise
|
|
280
|
+
|
|
281
|
+
Example:
|
|
282
|
+
>>> from datetime import datetime, timezone
|
|
283
|
+
>>> dispatcher = ModelDispatcherRegistration(
|
|
284
|
+
... dispatcher_id="test",
|
|
285
|
+
... dispatcher_name="Test Dispatcher",
|
|
286
|
+
... node_kind=EnumNodeKind.REDUCER,
|
|
287
|
+
... supported_categories=[EnumMessageCategory.EVENT],
|
|
288
|
+
... supported_message_types=["UserCreated"],
|
|
289
|
+
... registered_at=datetime(2025, 1, 15, 12, 0, 0, tzinfo=timezone.utc),
|
|
290
|
+
... )
|
|
291
|
+
>>> dispatcher.can_accept_message(EnumMessageCategory.EVENT, "UserCreated")
|
|
292
|
+
True
|
|
293
|
+
>>> dispatcher.can_accept_message(EnumMessageCategory.EVENT, "OrderCreated")
|
|
294
|
+
False
|
|
295
|
+
"""
|
|
296
|
+
if not self.enabled:
|
|
297
|
+
return False
|
|
298
|
+
if not self.healthy:
|
|
299
|
+
return False
|
|
300
|
+
if not self.supports_category(category):
|
|
301
|
+
return False
|
|
302
|
+
if message_type is not None and not self.supports_message_type(message_type):
|
|
303
|
+
return False
|
|
304
|
+
return True
|
|
305
|
+
|
|
306
|
+
def is_available(self) -> bool:
|
|
307
|
+
"""
|
|
308
|
+
Check if this dispatcher is available to accept messages.
|
|
309
|
+
|
|
310
|
+
A dispatcher is available if it is both enabled and healthy.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
True if the dispatcher is available, False otherwise
|
|
314
|
+
"""
|
|
315
|
+
return self.enabled and self.healthy
|
|
316
|
+
|
|
317
|
+
def with_health_status(
|
|
318
|
+
self,
|
|
319
|
+
healthy: bool,
|
|
320
|
+
check_time: datetime | None = None,
|
|
321
|
+
) -> "ModelDispatcherRegistration":
|
|
322
|
+
"""
|
|
323
|
+
Create a new registration with updated health status.
|
|
324
|
+
|
|
325
|
+
Args:
|
|
326
|
+
healthy: The new health status
|
|
327
|
+
check_time: Optional timestamp for the health check (defaults to now)
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
New ModelDispatcherRegistration with updated health status
|
|
331
|
+
"""
|
|
332
|
+
return self.model_copy(
|
|
333
|
+
update={
|
|
334
|
+
"healthy": healthy,
|
|
335
|
+
"last_health_check": check_time or datetime.now(UTC),
|
|
336
|
+
}
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
def with_enabled(self, enabled: bool) -> "ModelDispatcherRegistration":
|
|
340
|
+
"""
|
|
341
|
+
Create a new registration with updated enabled status.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
enabled: The new enabled status
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
New ModelDispatcherRegistration with updated enabled status
|
|
348
|
+
"""
|
|
349
|
+
return self.model_copy(update={"enabled": enabled})
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
__all__ = ["ModelDispatcherRegistration"]
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Materialized dispatch message model.
|
|
4
|
+
|
|
5
|
+
This module defines the canonical runtime contract for dispatched messages.
|
|
6
|
+
All handlers receive a materialized dict that conforms to this shape.
|
|
7
|
+
|
|
8
|
+
Design Rationale:
|
|
9
|
+
The dispatch boundary is a **serialization boundary**. This model enforces
|
|
10
|
+
that all data crossing the dispatch layer is transport-safe:
|
|
11
|
+
- JSON-serializable (can be logged, replayed, transported to Kafka)
|
|
12
|
+
- Deterministic (same input produces same serialized output)
|
|
13
|
+
- Inspectable (can be examined offline without Python runtime)
|
|
14
|
+
|
|
15
|
+
Handlers that need rich Pydantic models should hydrate them locally:
|
|
16
|
+
``ModelFoo.model_validate(dispatch["payload"])``
|
|
17
|
+
|
|
18
|
+
This separation keeps the runtime decoupled from handler internals and
|
|
19
|
+
enables distributed dispatch, event replay, and observability tooling.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.2.6
|
|
22
|
+
Added as part of OMN-1518 - Declarative operation bindings.
|
|
23
|
+
|
|
24
|
+
.. versionchanged:: 0.2.8
|
|
25
|
+
Changed to strict JSON-safe contract:
|
|
26
|
+
- Removed arbitrary_types_allowed
|
|
27
|
+
- Changed payload/bindings to JsonType
|
|
28
|
+
- Renamed __debug_original_envelope to __debug_trace (serialized snapshot)
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
34
|
+
|
|
35
|
+
from omnibase_core.types import JsonType
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ModelMaterializedDispatch(BaseModel):
|
|
39
|
+
"""Canonical dispatch message shape (strictly JSON-safe).
|
|
40
|
+
|
|
41
|
+
This is the runtime contract for all handlers. After materialization,
|
|
42
|
+
every handler receives a dict that conforms to this structure:
|
|
43
|
+
|
|
44
|
+
- ``payload``: The event payload as a JSON-safe dict (required)
|
|
45
|
+
- ``__bindings``: Resolved binding parameters (always present, may be empty)
|
|
46
|
+
- ``__debug_trace``: Serialized trace metadata snapshot (debug only)
|
|
47
|
+
|
|
48
|
+
The double-underscore prefix on ``__bindings`` and ``__debug_trace``
|
|
49
|
+
signals that these are infrastructure-level fields, not business data.
|
|
50
|
+
|
|
51
|
+
Transport Safety:
|
|
52
|
+
All fields are JSON-serializable. This enables:
|
|
53
|
+
- Event replay from logs or Kafka
|
|
54
|
+
- Distributed dispatch across processes
|
|
55
|
+
- Observability tooling (logging, tracing, dashboards)
|
|
56
|
+
- Offline inspection and debugging
|
|
57
|
+
|
|
58
|
+
Handler Hydration:
|
|
59
|
+
Handlers that need typed Pydantic models should hydrate locally:
|
|
60
|
+
|
|
61
|
+
>>> payload = dispatch["payload"]
|
|
62
|
+
>>> event = UserCreatedEvent.model_validate(payload)
|
|
63
|
+
|
|
64
|
+
This keeps the dispatch boundary clean and transport-safe.
|
|
65
|
+
|
|
66
|
+
Warning:
|
|
67
|
+
``__debug_trace`` is provided ONLY for debugging and observability.
|
|
68
|
+
It is a serialized snapshot of trace metadata, NOT the live envelope.
|
|
69
|
+
|
|
70
|
+
**DO NOT**:
|
|
71
|
+
- Use ``__debug_trace`` for business logic
|
|
72
|
+
- Assume ``__debug_trace`` reflects complete envelope state
|
|
73
|
+
- Depend on specific fields being present
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
>>> materialized = {
|
|
77
|
+
... "payload": {"user_id": "123", "action": "login"},
|
|
78
|
+
... "__bindings": {"user_id": "123", "timestamp": "2025-01-27T12:00:00Z"},
|
|
79
|
+
... "__debug_trace": {
|
|
80
|
+
... "correlation_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
81
|
+
... "topic": "dev.user.events.v1",
|
|
82
|
+
... },
|
|
83
|
+
... }
|
|
84
|
+
>>> validated = ModelMaterializedDispatch.model_validate(materialized)
|
|
85
|
+
>>> validated.payload
|
|
86
|
+
{'user_id': '123', 'action': 'login'}
|
|
87
|
+
|
|
88
|
+
Attributes:
|
|
89
|
+
payload: The event payload as a JSON-safe dict. Handlers that need
|
|
90
|
+
typed models should call ``model_validate()`` on this dict.
|
|
91
|
+
Primitives are wrapped under ``{"_raw": value}`` to maintain
|
|
92
|
+
dict structure (this is a last-resort escape hatch).
|
|
93
|
+
bindings: Resolved binding parameters from contract.yaml operation_bindings.
|
|
94
|
+
Always present (empty dict if no bindings configured). All values
|
|
95
|
+
are JSON-safe (UUIDs and datetimes are serialized to strings).
|
|
96
|
+
debug_trace: Serialized trace metadata snapshot for debugging.
|
|
97
|
+
Contains correlation_id, trace_id, topic, etc. as strings.
|
|
98
|
+
This is NOT authoritative data and should NOT be used for
|
|
99
|
+
business logic. Excluded from repr() to prevent log bloat.
|
|
100
|
+
|
|
101
|
+
.. versionadded:: 0.2.6
|
|
102
|
+
|
|
103
|
+
.. versionchanged:: 0.2.8
|
|
104
|
+
Changed to strict JSON-safe contract. See module docstring.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
model_config = ConfigDict(
|
|
108
|
+
frozen=True,
|
|
109
|
+
populate_by_name=True,
|
|
110
|
+
extra="forbid",
|
|
111
|
+
# NOTE: arbitrary_types_allowed is intentionally NOT set (defaults to False).
|
|
112
|
+
# This enforces that all data crossing the dispatch boundary is JSON-safe.
|
|
113
|
+
# See module docstring for design rationale.
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
payload: JsonType = Field(
|
|
117
|
+
...,
|
|
118
|
+
description=(
|
|
119
|
+
"Event payload as JSON-safe dict. "
|
|
120
|
+
"Handlers should hydrate typed models via model_validate()."
|
|
121
|
+
),
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
bindings: dict[str, JsonType] = Field(
|
|
125
|
+
default_factory=dict,
|
|
126
|
+
alias="__bindings",
|
|
127
|
+
description=(
|
|
128
|
+
"Resolved binding parameters. Always present, may be empty dict. "
|
|
129
|
+
"Values are JSON-safe (UUIDs/datetimes serialized to strings)."
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
debug_trace: dict[str, str | None] | None = Field(
|
|
134
|
+
default=None,
|
|
135
|
+
alias="__debug_trace",
|
|
136
|
+
description=(
|
|
137
|
+
"Serialized trace metadata snapshot for debugging only. "
|
|
138
|
+
"NOT authoritative. Do NOT use for business logic."
|
|
139
|
+
),
|
|
140
|
+
repr=False, # Prevent log bloat when stringifying model
|
|
141
|
+
)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Parsed Topic Model.
|
|
5
|
+
|
|
6
|
+
Provides structured representation of parsed topic information for
|
|
7
|
+
deterministic routing in the ONEX message dispatch engine.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from omnibase_core.enums import EnumTopicType
|
|
13
|
+
from omnibase_infra.enums import EnumMessageCategory, EnumTopicStandard
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ModelParsedTopic(BaseModel):
|
|
17
|
+
"""
|
|
18
|
+
Structured result of parsing a topic string.
|
|
19
|
+
|
|
20
|
+
Contains all extracted components from a topic name along with
|
|
21
|
+
validation status and error information. This model enables
|
|
22
|
+
deterministic routing by providing consistent access to topic
|
|
23
|
+
metadata regardless of the original topic format.
|
|
24
|
+
|
|
25
|
+
Attributes:
|
|
26
|
+
raw_topic: The original topic string that was parsed.
|
|
27
|
+
standard: The detected topic naming standard.
|
|
28
|
+
domain: The domain extracted from the topic (e.g., 'registration').
|
|
29
|
+
category: The message category (EVENT, COMMAND, INTENT) if detected.
|
|
30
|
+
topic_type: The topic type (events, commands, intents, snapshots) if detected.
|
|
31
|
+
environment: The environment prefix (e.g., 'dev', 'prod') if present.
|
|
32
|
+
version: The version suffix (e.g., 'v1', 'v2') if present.
|
|
33
|
+
is_valid: Whether the topic successfully parsed. For UNKNOWN-standard topics,
|
|
34
|
+
is_valid=True indicates a message category could be extracted (sufficient
|
|
35
|
+
for routing), even if the topic doesn't match a known standard exactly.
|
|
36
|
+
validation_error: Error message if parsing failed.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
>>> parsed = ModelParsedTopic(
|
|
40
|
+
... raw_topic="onex.registration.events",
|
|
41
|
+
... standard=EnumTopicStandard.ONEX_KAFKA,
|
|
42
|
+
... domain="registration",
|
|
43
|
+
... category=EnumMessageCategory.EVENT,
|
|
44
|
+
... topic_type=EnumTopicType.EVENTS,
|
|
45
|
+
... is_valid=True,
|
|
46
|
+
... )
|
|
47
|
+
>>> parsed.is_valid
|
|
48
|
+
True
|
|
49
|
+
>>> parsed.domain
|
|
50
|
+
'registration'
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
model_config = ConfigDict(
|
|
54
|
+
frozen=True,
|
|
55
|
+
extra="forbid",
|
|
56
|
+
from_attributes=True,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# ---- Source ----
|
|
60
|
+
raw_topic: str = Field(
|
|
61
|
+
...,
|
|
62
|
+
description="The original topic string that was parsed.",
|
|
63
|
+
min_length=1,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# ---- Detected Standard ----
|
|
67
|
+
standard: EnumTopicStandard = Field(
|
|
68
|
+
...,
|
|
69
|
+
description="The detected topic naming standard.",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# ---- Extracted Components ----
|
|
73
|
+
domain: str | None = Field(
|
|
74
|
+
default=None,
|
|
75
|
+
description="The domain extracted from the topic (e.g., 'registration').",
|
|
76
|
+
)
|
|
77
|
+
category: EnumMessageCategory | None = Field(
|
|
78
|
+
default=None,
|
|
79
|
+
description="The message category (EVENT, COMMAND, INTENT) if detected.",
|
|
80
|
+
)
|
|
81
|
+
topic_type: EnumTopicType | None = Field(
|
|
82
|
+
default=None,
|
|
83
|
+
description="The topic type (events, commands, intents, snapshots) if detected.",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# ---- Environment-Aware Components ----
|
|
87
|
+
environment: str | None = Field(
|
|
88
|
+
default=None,
|
|
89
|
+
description="The environment prefix (e.g., 'dev', 'prod') if present.",
|
|
90
|
+
)
|
|
91
|
+
version: str | None = Field(
|
|
92
|
+
default=None,
|
|
93
|
+
description="The version suffix (e.g., 'v1', 'v2') if present.",
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# ---- Validation Status ----
|
|
97
|
+
is_valid: bool = Field(
|
|
98
|
+
default=False,
|
|
99
|
+
description=(
|
|
100
|
+
"Whether the topic successfully parsed according to its standard. "
|
|
101
|
+
"For UNKNOWN-standard topics, is_valid=True indicates that a message "
|
|
102
|
+
"category could be extracted (enabling routing), even though the topic "
|
|
103
|
+
"does not match a known standard exactly. Use is_routable() to check "
|
|
104
|
+
"if the topic has sufficient information for dispatch routing."
|
|
105
|
+
),
|
|
106
|
+
)
|
|
107
|
+
validation_error: str | None = Field(
|
|
108
|
+
default=None,
|
|
109
|
+
description="Error message if parsing failed.",
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def is_routable(self) -> bool:
|
|
113
|
+
"""
|
|
114
|
+
Check if this parsed topic has sufficient information for routing.
|
|
115
|
+
|
|
116
|
+
A topic is routable if it has a valid category, which enables
|
|
117
|
+
deterministic routing to the appropriate dispatcher type.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
True if the topic can be used for routing, False otherwise
|
|
121
|
+
|
|
122
|
+
Example:
|
|
123
|
+
>>> parsed = ModelParsedTopic(
|
|
124
|
+
... raw_topic="onex.registration.events",
|
|
125
|
+
... standard=EnumTopicStandard.ONEX_KAFKA,
|
|
126
|
+
... category=EnumMessageCategory.EVENT,
|
|
127
|
+
... is_valid=True,
|
|
128
|
+
... )
|
|
129
|
+
>>> parsed.is_routable()
|
|
130
|
+
True
|
|
131
|
+
"""
|
|
132
|
+
return self.is_valid and self.category is not None
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
__all__ = ["ModelParsedTopic"]
|