omnibase_infra 0.2.5__py3-none-any.whl → 0.2.7__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.
Files changed (139) hide show
  1. omnibase_infra/constants_topic_patterns.py +26 -0
  2. omnibase_infra/enums/__init__.py +3 -0
  3. omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
  4. omnibase_infra/enums/enum_handler_source_mode.py +16 -2
  5. omnibase_infra/errors/__init__.py +4 -0
  6. omnibase_infra/errors/error_binding_resolution.py +128 -0
  7. omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +0 -2
  8. omnibase_infra/event_bus/event_bus_inmemory.py +64 -10
  9. omnibase_infra/event_bus/event_bus_kafka.py +105 -47
  10. omnibase_infra/event_bus/mixin_kafka_broadcast.py +3 -7
  11. omnibase_infra/event_bus/mixin_kafka_dlq.py +12 -6
  12. omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +0 -81
  13. omnibase_infra/event_bus/testing/__init__.py +26 -0
  14. omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
  15. omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
  16. omnibase_infra/handlers/handler_consul.py +2 -0
  17. omnibase_infra/handlers/mixins/__init__.py +5 -0
  18. omnibase_infra/handlers/mixins/mixin_consul_service.py +274 -10
  19. omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
  20. omnibase_infra/handlers/models/model_filesystem_config.py +4 -4
  21. omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
  22. omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
  23. omnibase_infra/mixins/mixin_node_introspection.py +189 -19
  24. omnibase_infra/models/__init__.py +8 -0
  25. omnibase_infra/models/bindings/__init__.py +59 -0
  26. omnibase_infra/models/bindings/constants.py +144 -0
  27. omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
  28. omnibase_infra/models/bindings/model_operation_binding.py +44 -0
  29. omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
  30. omnibase_infra/models/bindings/model_parsed_binding.py +52 -0
  31. omnibase_infra/models/discovery/model_introspection_config.py +25 -17
  32. omnibase_infra/models/dispatch/__init__.py +8 -0
  33. omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
  34. omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
  35. omnibase_infra/models/handlers/model_handler_source_config.py +1 -1
  36. omnibase_infra/models/model_node_identity.py +126 -0
  37. omnibase_infra/models/projection/model_snapshot_topic_config.py +3 -2
  38. omnibase_infra/models/registration/__init__.py +9 -0
  39. omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
  40. omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
  41. omnibase_infra/models/registration/model_node_introspection_event.py +11 -0
  42. omnibase_infra/models/runtime/__init__.py +9 -0
  43. omnibase_infra/models/validation/model_coverage_metrics.py +2 -2
  44. omnibase_infra/nodes/__init__.py +9 -0
  45. omnibase_infra/nodes/contract_registry_reducer/__init__.py +29 -0
  46. omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
  47. omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
  48. omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
  49. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
  50. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
  51. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
  52. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
  53. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
  54. omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
  55. omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
  56. omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
  57. omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
  58. omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
  59. omnibase_infra/nodes/handlers/consul/contract.yaml +85 -0
  60. omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
  61. omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
  62. omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
  63. omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
  64. omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
  65. omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
  66. omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
  67. omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
  68. omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
  69. omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
  70. omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
  71. omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
  72. omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
  73. omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
  74. omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
  75. omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
  76. omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
  77. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
  78. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
  79. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
  80. omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
  81. omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
  82. omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
  83. omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
  84. omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
  85. omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -0
  86. omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +7 -5
  87. omnibase_infra/nodes/reducers/models/__init__.py +7 -2
  88. omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +11 -0
  89. omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
  90. omnibase_infra/nodes/reducers/registration_reducer.py +1 -0
  91. omnibase_infra/protocols/__init__.py +3 -0
  92. omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
  93. omnibase_infra/runtime/__init__.py +60 -0
  94. omnibase_infra/runtime/binding_resolver.py +753 -0
  95. omnibase_infra/runtime/constants_security.py +70 -0
  96. omnibase_infra/runtime/contract_loaders/__init__.py +9 -0
  97. omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
  98. omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
  99. omnibase_infra/runtime/emit_daemon/cli.py +844 -0
  100. omnibase_infra/runtime/emit_daemon/client.py +811 -0
  101. omnibase_infra/runtime/emit_daemon/config.py +535 -0
  102. omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
  103. omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
  104. omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
  105. omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
  106. omnibase_infra/runtime/emit_daemon/queue.py +618 -0
  107. omnibase_infra/runtime/event_bus_subcontract_wiring.py +466 -0
  108. omnibase_infra/runtime/handler_source_resolver.py +43 -2
  109. omnibase_infra/runtime/kafka_contract_source.py +984 -0
  110. omnibase_infra/runtime/models/__init__.py +13 -0
  111. omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
  112. omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
  113. omnibase_infra/runtime/models/model_runtime_scheduler_config.py +4 -3
  114. omnibase_infra/runtime/models/model_security_config.py +109 -0
  115. omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
  116. omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
  117. omnibase_infra/runtime/service_kernel.py +76 -6
  118. omnibase_infra/runtime/service_message_dispatch_engine.py +558 -15
  119. omnibase_infra/runtime/service_runtime_host_process.py +770 -20
  120. omnibase_infra/runtime/transition_notification_publisher.py +3 -2
  121. omnibase_infra/runtime/util_wiring.py +206 -62
  122. omnibase_infra/services/mcp/service_mcp_tool_sync.py +27 -9
  123. omnibase_infra/services/session/config_consumer.py +25 -8
  124. omnibase_infra/services/session/config_store.py +2 -2
  125. omnibase_infra/services/session/consumer.py +1 -1
  126. omnibase_infra/topics/__init__.py +45 -0
  127. omnibase_infra/topics/platform_topic_suffixes.py +140 -0
  128. omnibase_infra/topics/util_topic_composition.py +95 -0
  129. omnibase_infra/types/typed_dict/__init__.py +9 -1
  130. omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
  131. omnibase_infra/utils/__init__.py +9 -0
  132. omnibase_infra/utils/util_consumer_group.py +232 -0
  133. omnibase_infra/validation/infra_validators.py +18 -1
  134. omnibase_infra/validation/validation_exemptions.yaml +192 -0
  135. {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/METADATA +3 -3
  136. {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/RECORD +139 -52
  137. {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/entry_points.txt +1 -0
  138. {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/WHEEL +0 -0
  139. {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,191 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2025 OmniNode Team
3
+ """Daemon response models for emit daemon protocol.
4
+
5
+ This module defines the strongly-typed response models for the emit daemon
6
+ Unix socket protocol. Using Pydantic models instead of dict[str, object]
7
+ provides compile-time type safety and eliminates runtime isinstance checks.
8
+
9
+ Response Types:
10
+ - ModelDaemonPingResponse: Health check response with queue status
11
+ - ModelDaemonQueuedResponse: Event successfully queued
12
+ - ModelDaemonErrorResponse: Error response with reason
13
+
14
+ Protocol:
15
+ Responses are JSON-encoded and sent as newline-delimited messages over
16
+ the Unix socket. The "status" field discriminates between response types:
17
+ - "ok": Ping response with queue/spool sizes
18
+ - "queued": Event emission success with event_id
19
+ - "error": Error with reason string
20
+
21
+ Related Tickets:
22
+ - OMN-1610: Hook Event Daemon MVP
23
+
24
+ .. versionadded:: 0.2.6
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ from typing import Annotated, Literal
30
+
31
+ from pydantic import BaseModel, ConfigDict, Field
32
+
33
+
34
+ class ModelDaemonPingResponse(BaseModel):
35
+ """Response model for successful ping command.
36
+
37
+ Contains daemon health status and current queue metrics.
38
+
39
+ Attributes:
40
+ status: Always "ok" for successful ping
41
+ queue_size: Number of events in memory queue
42
+ spool_size: Number of events spooled to disk
43
+
44
+ Example:
45
+ ```python
46
+ response = ModelDaemonPingResponse(queue_size=5, spool_size=10)
47
+ # Serializes to: {"status": "ok", "queue_size": 5, "spool_size": 10}
48
+ ```
49
+ """
50
+
51
+ model_config = ConfigDict(
52
+ frozen=True,
53
+ extra="forbid",
54
+ )
55
+
56
+ status: Literal["ok"] = Field(
57
+ default="ok",
58
+ description="Status indicator for successful ping",
59
+ )
60
+
61
+ queue_size: int = Field(
62
+ ...,
63
+ ge=0,
64
+ description="Number of events currently in memory queue",
65
+ )
66
+
67
+ spool_size: int = Field(
68
+ ...,
69
+ ge=0,
70
+ description="Number of events currently spooled to disk",
71
+ )
72
+
73
+
74
+ class ModelDaemonQueuedResponse(BaseModel):
75
+ """Response model for successfully queued event.
76
+
77
+ Returned when an event has been accepted and queued for
78
+ asynchronous publishing to Kafka.
79
+
80
+ Attributes:
81
+ status: Always "queued" for successful event submission
82
+ event_id: UUID assigned to the queued event for tracking
83
+
84
+ Example:
85
+ ```python
86
+ response = ModelDaemonQueuedResponse(
87
+ event_id="550e8400-e29b-41d4-a716-446655440000"
88
+ )
89
+ ```
90
+ """
91
+
92
+ model_config = ConfigDict(
93
+ frozen=True,
94
+ extra="forbid",
95
+ )
96
+
97
+ status: Literal["queued"] = Field(
98
+ default="queued",
99
+ description="Status indicator for queued event",
100
+ )
101
+
102
+ event_id: str = Field(
103
+ ...,
104
+ description="UUID assigned to the queued event",
105
+ min_length=1,
106
+ )
107
+
108
+
109
+ class ModelDaemonErrorResponse(BaseModel):
110
+ """Response model for daemon errors.
111
+
112
+ Returned when an error occurs processing a request.
113
+
114
+ Attributes:
115
+ status: Always "error" for error responses
116
+ reason: Human-readable error description
117
+
118
+ Example:
119
+ ```python
120
+ response = ModelDaemonErrorResponse(
121
+ reason="Unknown event type: invalid.event"
122
+ )
123
+ ```
124
+ """
125
+
126
+ model_config = ConfigDict(
127
+ frozen=True,
128
+ extra="forbid",
129
+ )
130
+
131
+ status: Literal["error"] = Field(
132
+ default="error",
133
+ description="Status indicator for error response",
134
+ )
135
+
136
+ reason: str = Field(
137
+ ...,
138
+ description="Human-readable error description",
139
+ min_length=1,
140
+ )
141
+
142
+
143
+ # Type alias for discriminated union of all response types
144
+ # Discriminated by "status" field:
145
+ # - "ok" -> ModelDaemonPingResponse
146
+ # - "queued" -> ModelDaemonQueuedResponse
147
+ # - "error" -> ModelDaemonErrorResponse
148
+ ModelDaemonResponse = Annotated[
149
+ ModelDaemonPingResponse | ModelDaemonQueuedResponse | ModelDaemonErrorResponse,
150
+ Field(discriminator="status", description="Union of all daemon response types"),
151
+ ]
152
+
153
+
154
+ def parse_daemon_response(
155
+ data: dict[str, object],
156
+ ) -> ModelDaemonPingResponse | ModelDaemonQueuedResponse | ModelDaemonErrorResponse:
157
+ """Parse raw dict into typed response model.
158
+
159
+ Discriminates between response types based on "status" field:
160
+ - "ok" -> ModelDaemonPingResponse
161
+ - "queued" -> ModelDaemonQueuedResponse
162
+ - "error" -> ModelDaemonErrorResponse
163
+
164
+ Args:
165
+ data: Raw response dict from JSON parsing
166
+
167
+ Returns:
168
+ Typed response model
169
+
170
+ Raises:
171
+ ValueError: If response format is invalid or status unknown
172
+ """
173
+ status = data.get("status")
174
+
175
+ if status == "ok":
176
+ return ModelDaemonPingResponse.model_validate(data)
177
+ elif status == "queued":
178
+ return ModelDaemonQueuedResponse.model_validate(data)
179
+ elif status == "error":
180
+ return ModelDaemonErrorResponse.model_validate(data)
181
+ else:
182
+ raise ValueError(f"Unknown response status: {status}")
183
+
184
+
185
+ __all__: list[str] = [
186
+ "ModelDaemonErrorResponse",
187
+ "ModelDaemonPingResponse",
188
+ "ModelDaemonQueuedResponse",
189
+ "ModelDaemonResponse",
190
+ "parse_daemon_response",
191
+ ]