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.
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/enums/__init__.py +3 -0
- omnibase_infra/enums/enum_consumer_group_purpose.py +92 -0
- omnibase_infra/enums/enum_handler_source_mode.py +16 -2
- omnibase_infra/errors/__init__.py +4 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +0 -2
- omnibase_infra/event_bus/event_bus_inmemory.py +64 -10
- omnibase_infra/event_bus/event_bus_kafka.py +105 -47
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +3 -7
- omnibase_infra/event_bus/mixin_kafka_dlq.py +12 -6
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +0 -81
- 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/handlers/handler_consul.py +2 -0
- omnibase_infra/handlers/mixins/__init__.py +5 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +274 -10
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +4 -4
- omnibase_infra/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/mixin_node_introspection.py +189 -19
- omnibase_infra/models/__init__.py +8 -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/discovery/model_introspection_config.py +25 -17
- omnibase_infra/models/dispatch/__init__.py +8 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -0
- omnibase_infra/models/dispatch/model_materialized_dispatch.py +141 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +1 -1
- omnibase_infra/models/model_node_identity.py +126 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +3 -2
- omnibase_infra/models/registration/__init__.py +9 -0
- omnibase_infra/models/registration/model_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +11 -0
- omnibase_infra/models/runtime/__init__.py +9 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +2 -2
- omnibase_infra/nodes/__init__.py +9 -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/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_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/registry/registry_infra_node_registration_orchestrator.py +7 -5
- omnibase_infra/nodes/reducers/models/__init__.py +7 -2
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +11 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1 -0
- omnibase_infra/protocols/__init__.py +3 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -0
- omnibase_infra/runtime/__init__.py +60 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +9 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -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/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_source_resolver.py +43 -2
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/models/__init__.py +13 -0
- omnibase_infra/runtime/models/model_contract_load_result.py +224 -0
- omnibase_infra/runtime/models/model_runtime_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +4 -3
- omnibase_infra/runtime/models/model_security_config.py +109 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/service_kernel.py +76 -6
- omnibase_infra/runtime/service_message_dispatch_engine.py +558 -15
- omnibase_infra/runtime/service_runtime_host_process.py +770 -20
- omnibase_infra/runtime/transition_notification_publisher.py +3 -2
- omnibase_infra/runtime/util_wiring.py +206 -62
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +27 -9
- omnibase_infra/services/session/config_consumer.py +25 -8
- omnibase_infra/services/session/config_store.py +2 -2
- omnibase_infra/services/session/consumer.py +1 -1
- 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/typed_dict/__init__.py +9 -1
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -0
- omnibase_infra/utils/__init__.py +9 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/validation/infra_validators.py +18 -1
- omnibase_infra/validation/validation_exemptions.yaml +192 -0
- {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/METADATA +3 -3
- {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/RECORD +139 -52
- {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/entry_points.txt +1 -0
- {omnibase_infra-0.2.5.dist-info → omnibase_infra-0.2.7.dist-info}/WHEEL +0 -0
- {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
|
+
]
|