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,9 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry module for NodeContractRegistryReducer."""
|
|
4
|
+
|
|
5
|
+
from omnibase_infra.nodes.contract_registry_reducer.registry.registry_infra_contract_registry_reducer import (
|
|
6
|
+
RegistryInfraContractRegistryReducer,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
__all__ = ["RegistryInfraContractRegistryReducer"]
|
omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Registry for NodeContractRegistryReducer dependencies.
|
|
4
|
+
|
|
5
|
+
This registry provides dependency injection configuration for the
|
|
6
|
+
NodeContractRegistryReducer node, following ONEX container-based DI pattern.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from omnibase_core.models.container.model_onex_container import ModelONEXContainer
|
|
15
|
+
from omnibase_infra.nodes.contract_registry_reducer.node import (
|
|
16
|
+
NodeContractRegistryReducer,
|
|
17
|
+
)
|
|
18
|
+
from omnibase_infra.nodes.contract_registry_reducer.reducer import (
|
|
19
|
+
ContractRegistryReducer,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RegistryInfraContractRegistryReducer:
|
|
24
|
+
"""Registry for NodeContractRegistryReducer dependency injection.
|
|
25
|
+
|
|
26
|
+
Why a class instead of a function?
|
|
27
|
+
ONEX registry pattern (CLAUDE.md) requires registry classes with
|
|
28
|
+
the naming convention ``RegistryInfra<NodeName>``. This enables:
|
|
29
|
+
|
|
30
|
+
- **Future extension**: Additional factory methods can be added
|
|
31
|
+
(e.g., ``create_reducer_with_cache()``, ``create_test_reducer()``)
|
|
32
|
+
- **Service registry resolution**: Classes can be registered in the
|
|
33
|
+
ONEX service registry for container-based resolution
|
|
34
|
+
- **Consistent pattern**: All node registries follow the same class-based
|
|
35
|
+
structure, making the codebase predictable and navigable
|
|
36
|
+
- **Container lifecycle management**: The registry can implement caching,
|
|
37
|
+
scoping, or other lifecycle behaviors in the future
|
|
38
|
+
|
|
39
|
+
Provides factory methods for creating NodeContractRegistryReducer instances
|
|
40
|
+
with properly configured dependencies from the ONEX container.
|
|
41
|
+
|
|
42
|
+
Usage:
|
|
43
|
+
```python
|
|
44
|
+
from omnibase_core.models.container import ModelONEXContainer
|
|
45
|
+
from omnibase_infra.nodes.contract_registry_reducer.registry import (
|
|
46
|
+
RegistryInfraContractRegistryReducer,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Create container and registry
|
|
50
|
+
container = ModelONEXContainer()
|
|
51
|
+
registry = RegistryInfraContractRegistryReducer(container)
|
|
52
|
+
|
|
53
|
+
# Create node instance
|
|
54
|
+
node = registry.create_node()
|
|
55
|
+
|
|
56
|
+
# Or create pure function reducer directly
|
|
57
|
+
reducer = registry.create_reducer()
|
|
58
|
+
|
|
59
|
+
# Use reducer
|
|
60
|
+
result = reducer.reduce(state, event, metadata)
|
|
61
|
+
```
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self, container: ModelONEXContainer) -> None:
|
|
65
|
+
"""Initialize the registry with ONEX container.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
container: ONEX dependency injection container
|
|
69
|
+
"""
|
|
70
|
+
self._container = container
|
|
71
|
+
|
|
72
|
+
def create_node(self) -> NodeContractRegistryReducer:
|
|
73
|
+
"""Create a NodeContractRegistryReducer instance.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Configured NodeContractRegistryReducer instance.
|
|
77
|
+
"""
|
|
78
|
+
from omnibase_infra.nodes.contract_registry_reducer.node import (
|
|
79
|
+
NodeContractRegistryReducer,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return NodeContractRegistryReducer(self._container)
|
|
83
|
+
|
|
84
|
+
def create_reducer(self) -> ContractRegistryReducer:
|
|
85
|
+
"""Create a pure function ContractRegistryReducer instance.
|
|
86
|
+
|
|
87
|
+
The pure reducer implements the reduce(state, event, metadata) pattern
|
|
88
|
+
without ONEX container dependencies, suitable for unit testing and
|
|
89
|
+
standalone use.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
ContractRegistryReducer instance (pure function reducer).
|
|
93
|
+
"""
|
|
94
|
+
from omnibase_infra.nodes.contract_registry_reducer.reducer import (
|
|
95
|
+
ContractRegistryReducer,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return ContractRegistryReducer()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
__all__ = ["RegistryInfraContractRegistryReducer"]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Consul Handler - Service discovery and KV store operations
|
|
4
|
+
name: "handler_consul"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "HashiCorp Consul handler for service discovery and KV store operations"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "consul"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerConsul"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_consul"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "consul.kv_get"
|
|
30
|
+
- "consul.kv_put"
|
|
31
|
+
- "consul.register"
|
|
32
|
+
- "consul.deregister"
|
|
33
|
+
operation_bindings:
|
|
34
|
+
version:
|
|
35
|
+
major: 1
|
|
36
|
+
minor: 0
|
|
37
|
+
patch: 0
|
|
38
|
+
global_bindings:
|
|
39
|
+
- parameter_name: "correlation_id"
|
|
40
|
+
expression: "${envelope.correlation_id}"
|
|
41
|
+
required: true
|
|
42
|
+
bindings:
|
|
43
|
+
"consul.kv_get":
|
|
44
|
+
- parameter_name: "key"
|
|
45
|
+
expression: "${payload.key}"
|
|
46
|
+
required: true
|
|
47
|
+
"consul.kv_put":
|
|
48
|
+
- parameter_name: "key"
|
|
49
|
+
expression: "${payload.key}"
|
|
50
|
+
required: true
|
|
51
|
+
- parameter_name: "value"
|
|
52
|
+
expression: "${payload.value}"
|
|
53
|
+
required: true
|
|
54
|
+
"consul.register":
|
|
55
|
+
- parameter_name: "service_id"
|
|
56
|
+
expression: "${payload.service_id}"
|
|
57
|
+
required: true
|
|
58
|
+
- parameter_name: "service_name"
|
|
59
|
+
expression: "${payload.service_name}"
|
|
60
|
+
required: true
|
|
61
|
+
- parameter_name: "address"
|
|
62
|
+
expression: "${payload.address}"
|
|
63
|
+
required: false
|
|
64
|
+
- parameter_name: "port"
|
|
65
|
+
expression: "${payload.port}"
|
|
66
|
+
required: false
|
|
67
|
+
- parameter_name: "tags"
|
|
68
|
+
expression: "${payload.tags}"
|
|
69
|
+
required: false
|
|
70
|
+
"consul.deregister":
|
|
71
|
+
- parameter_name: "service_id"
|
|
72
|
+
expression: "${payload.service_id}"
|
|
73
|
+
required: true
|
|
74
|
+
metadata:
|
|
75
|
+
handler_id: "consul-handler"
|
|
76
|
+
handler_type: "infra_handler"
|
|
77
|
+
handler_category: "effect"
|
|
78
|
+
transport_type: "consul"
|
|
79
|
+
security_features:
|
|
80
|
+
- "SecretStr protection for ACL tokens"
|
|
81
|
+
- "Sanitized error messages"
|
|
82
|
+
resilience_features:
|
|
83
|
+
- "Circuit breaker pattern"
|
|
84
|
+
- "Exponential backoff retry"
|
|
85
|
+
- "Thread pool management"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Database Handler - PostgreSQL database operations
|
|
4
|
+
name: "handler_db"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "PostgreSQL database handler for query and execute operations using asyncpg"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "db"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerDb"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_db"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "db.query"
|
|
30
|
+
- "db.execute"
|
|
31
|
+
operation_bindings:
|
|
32
|
+
version:
|
|
33
|
+
major: 1
|
|
34
|
+
minor: 0
|
|
35
|
+
patch: 0
|
|
36
|
+
# Guardrail overrides (optional) - customize limits for this handler
|
|
37
|
+
# Defaults: max_expression_length=256, max_path_segments=20
|
|
38
|
+
# Bounds: expression_length=[32,1024], path_segments=[3,50]
|
|
39
|
+
max_expression_length: 512 # Allow longer expressions for complex SQL bindings
|
|
40
|
+
max_path_segments: 25 # Allow deeper nested paths for complex payloads
|
|
41
|
+
global_bindings:
|
|
42
|
+
- parameter_name: "correlation_id"
|
|
43
|
+
expression: "${envelope.correlation_id}"
|
|
44
|
+
required: true
|
|
45
|
+
bindings:
|
|
46
|
+
"db.query":
|
|
47
|
+
- parameter_name: "sql"
|
|
48
|
+
expression: "${payload.sql}"
|
|
49
|
+
required: true
|
|
50
|
+
- parameter_name: "parameters"
|
|
51
|
+
expression: "${payload.parameters}"
|
|
52
|
+
required: false
|
|
53
|
+
"db.execute":
|
|
54
|
+
- parameter_name: "sql"
|
|
55
|
+
expression: "${payload.sql}"
|
|
56
|
+
required: true
|
|
57
|
+
- parameter_name: "parameters"
|
|
58
|
+
expression: "${payload.parameters}"
|
|
59
|
+
required: false
|
|
60
|
+
metadata:
|
|
61
|
+
handler_id: "db-handler"
|
|
62
|
+
handler_type: "infra_handler"
|
|
63
|
+
handler_category: "effect"
|
|
64
|
+
transport_type: "database"
|
|
65
|
+
security_features:
|
|
66
|
+
- "Parameterized queries for SQL injection protection"
|
|
67
|
+
- "DSN credential sanitization"
|
|
68
|
+
- "Single-statement SQL enforcement"
|
|
69
|
+
resilience_features:
|
|
70
|
+
- "Circuit breaker pattern"
|
|
71
|
+
- "Connection pooling (fixed size: 5)"
|
|
72
|
+
- "Intelligent error classification (transient vs permanent)"
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Graph Handler - Neo4j/Memgraph database operations
|
|
4
|
+
name: "handler_graph"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "Graph database handler for Cypher queries via neo4j async driver (Memgraph/Neo4j)"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "graph"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerGraph"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_graph"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "graph.execute_query"
|
|
30
|
+
- "graph.execute_query_batch"
|
|
31
|
+
- "graph.create_node"
|
|
32
|
+
- "graph.create_relationship"
|
|
33
|
+
- "graph.delete_node"
|
|
34
|
+
- "graph.delete_relationship"
|
|
35
|
+
- "graph.traverse"
|
|
36
|
+
operation_bindings:
|
|
37
|
+
version:
|
|
38
|
+
major: 1
|
|
39
|
+
minor: 0
|
|
40
|
+
patch: 0
|
|
41
|
+
global_bindings:
|
|
42
|
+
- parameter_name: "correlation_id"
|
|
43
|
+
expression: "${envelope.correlation_id}"
|
|
44
|
+
required: true
|
|
45
|
+
bindings:
|
|
46
|
+
"graph.execute_query":
|
|
47
|
+
- parameter_name: "query"
|
|
48
|
+
expression: "${payload.query}"
|
|
49
|
+
required: true
|
|
50
|
+
- parameter_name: "parameters"
|
|
51
|
+
expression: "${payload.parameters}"
|
|
52
|
+
required: false
|
|
53
|
+
"graph.execute_query_batch":
|
|
54
|
+
- parameter_name: "queries"
|
|
55
|
+
expression: "${payload.queries}"
|
|
56
|
+
required: true
|
|
57
|
+
- parameter_name: "transaction"
|
|
58
|
+
expression: "${payload.transaction}"
|
|
59
|
+
required: false
|
|
60
|
+
"graph.create_node":
|
|
61
|
+
- parameter_name: "labels"
|
|
62
|
+
expression: "${payload.labels}"
|
|
63
|
+
required: false
|
|
64
|
+
- parameter_name: "properties"
|
|
65
|
+
expression: "${payload.properties}"
|
|
66
|
+
required: false
|
|
67
|
+
"graph.create_relationship":
|
|
68
|
+
- parameter_name: "from_node_id"
|
|
69
|
+
expression: "${payload.from_node_id}"
|
|
70
|
+
required: true
|
|
71
|
+
- parameter_name: "to_node_id"
|
|
72
|
+
expression: "${payload.to_node_id}"
|
|
73
|
+
required: true
|
|
74
|
+
- parameter_name: "relationship_type"
|
|
75
|
+
expression: "${payload.relationship_type}"
|
|
76
|
+
required: true
|
|
77
|
+
- parameter_name: "properties"
|
|
78
|
+
expression: "${payload.properties}"
|
|
79
|
+
required: false
|
|
80
|
+
"graph.delete_node":
|
|
81
|
+
- parameter_name: "node_id"
|
|
82
|
+
expression: "${payload.node_id}"
|
|
83
|
+
required: true
|
|
84
|
+
- parameter_name: "detach"
|
|
85
|
+
expression: "${payload.detach}"
|
|
86
|
+
required: false
|
|
87
|
+
"graph.delete_relationship":
|
|
88
|
+
- parameter_name: "relationship_id"
|
|
89
|
+
expression: "${payload.relationship_id}"
|
|
90
|
+
required: true
|
|
91
|
+
"graph.traverse":
|
|
92
|
+
- parameter_name: "start_node_id"
|
|
93
|
+
expression: "${payload.start_node_id}"
|
|
94
|
+
required: true
|
|
95
|
+
- parameter_name: "relationship_types"
|
|
96
|
+
expression: "${payload.relationship_types}"
|
|
97
|
+
required: false
|
|
98
|
+
- parameter_name: "direction"
|
|
99
|
+
expression: "${payload.direction}"
|
|
100
|
+
required: false
|
|
101
|
+
- parameter_name: "max_depth"
|
|
102
|
+
expression: "${payload.max_depth}"
|
|
103
|
+
required: false
|
|
104
|
+
- parameter_name: "filters"
|
|
105
|
+
expression: "${payload.filters}"
|
|
106
|
+
required: false
|
|
107
|
+
metadata:
|
|
108
|
+
handler_id: "graph-handler"
|
|
109
|
+
handler_type: "infra_handler"
|
|
110
|
+
handler_category: "effect"
|
|
111
|
+
transport_type: "graph"
|
|
112
|
+
security_features:
|
|
113
|
+
- "Parameterized Cypher queries"
|
|
114
|
+
- "Label validation for injection prevention"
|
|
115
|
+
- "Credential sanitization"
|
|
116
|
+
resilience_features:
|
|
117
|
+
- "Circuit breaker pattern"
|
|
118
|
+
- "Connection pool management"
|
|
119
|
+
- "Transaction support"
|
|
120
|
+
capabilities:
|
|
121
|
+
- "cypher"
|
|
122
|
+
- "parameterized_queries"
|
|
123
|
+
- "transactions"
|
|
124
|
+
- "node_crud"
|
|
125
|
+
- "relationship_crud"
|
|
126
|
+
- "traversal"
|
|
127
|
+
- "batch_operations"
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for HTTP Handler - REST API operations
|
|
4
|
+
name: "handler_http"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "HTTP REST handler for GET and POST operations using httpx async client"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "http"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerHttpRest"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_http"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "http.get"
|
|
30
|
+
- "http.post"
|
|
31
|
+
operation_bindings:
|
|
32
|
+
version:
|
|
33
|
+
major: 1
|
|
34
|
+
minor: 0
|
|
35
|
+
patch: 0
|
|
36
|
+
global_bindings:
|
|
37
|
+
- parameter_name: "correlation_id"
|
|
38
|
+
expression: "${envelope.correlation_id}"
|
|
39
|
+
required: true
|
|
40
|
+
bindings:
|
|
41
|
+
"http.get":
|
|
42
|
+
- parameter_name: "url"
|
|
43
|
+
expression: "${payload.url}"
|
|
44
|
+
required: true
|
|
45
|
+
- parameter_name: "headers"
|
|
46
|
+
expression: "${payload.headers}"
|
|
47
|
+
required: false
|
|
48
|
+
"http.post":
|
|
49
|
+
- parameter_name: "url"
|
|
50
|
+
expression: "${payload.url}"
|
|
51
|
+
required: true
|
|
52
|
+
- parameter_name: "headers"
|
|
53
|
+
expression: "${payload.headers}"
|
|
54
|
+
required: false
|
|
55
|
+
- parameter_name: "body"
|
|
56
|
+
expression: "${payload.body}"
|
|
57
|
+
required: false
|
|
58
|
+
metadata:
|
|
59
|
+
handler_id: "http-handler"
|
|
60
|
+
handler_type: "infra_handler"
|
|
61
|
+
handler_category: "effect"
|
|
62
|
+
transport_type: "http"
|
|
63
|
+
security_features:
|
|
64
|
+
- "Configurable request/response size limits"
|
|
65
|
+
- "Pre-read Content-Length validation"
|
|
66
|
+
- "Streaming body validation"
|
|
67
|
+
- "DoS protection"
|
|
68
|
+
resilience_features:
|
|
69
|
+
- "Configurable timeout"
|
|
70
|
+
- "Follow redirects"
|
|
71
|
+
notes:
|
|
72
|
+
- "PUT, DELETE, PATCH deferred to Beta"
|
|
73
|
+
- "Retry logic deferred to Beta"
|
|
74
|
+
- "Rate limiting deferred to Beta"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Intent Handler - Graph-based intent storage operations
|
|
4
|
+
name: "handler_intent"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "Intent handler wrapping HandlerGraph for intent-specific graph operations (DEMO)"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "intent"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerIntent"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_intent"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "intent.store"
|
|
30
|
+
- "intent.query_session"
|
|
31
|
+
- "intent.query_distribution"
|
|
32
|
+
operation_bindings:
|
|
33
|
+
version:
|
|
34
|
+
major: 1
|
|
35
|
+
minor: 0
|
|
36
|
+
patch: 0
|
|
37
|
+
global_bindings:
|
|
38
|
+
- parameter_name: "correlation_id"
|
|
39
|
+
expression: "${envelope.correlation_id}"
|
|
40
|
+
required: true
|
|
41
|
+
bindings:
|
|
42
|
+
"intent.store":
|
|
43
|
+
- parameter_name: "intent_type"
|
|
44
|
+
expression: "${payload.intent_type}"
|
|
45
|
+
required: true
|
|
46
|
+
- parameter_name: "session_id"
|
|
47
|
+
expression: "${payload.session_id}"
|
|
48
|
+
required: false
|
|
49
|
+
"intent.query_session":
|
|
50
|
+
- parameter_name: "session_id"
|
|
51
|
+
expression: "${payload.session_id}"
|
|
52
|
+
required: true
|
|
53
|
+
# No payload bindings required - aggregates all intents by type (read-only)
|
|
54
|
+
"intent.query_distribution": []
|
|
55
|
+
metadata:
|
|
56
|
+
handler_id: "intent-handler"
|
|
57
|
+
handler_type: "intent_handler"
|
|
58
|
+
handler_category: "effect"
|
|
59
|
+
transport_type: "graph"
|
|
60
|
+
notes:
|
|
61
|
+
- "TEMPORARY demo wiring - will be replaced by contract-driven routing"
|
|
62
|
+
- "intent.store is NOT idempotent (creates new node each call)"
|
|
63
|
+
- "intent.query_session is idempotent (read-only)"
|
|
64
|
+
- "intent.query_distribution is idempotent (read-only aggregation)"
|
|
65
|
+
dependencies:
|
|
66
|
+
- "Requires pre-initialized HandlerGraph instance"
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for MCP Handler - Model Context Protocol integration
|
|
4
|
+
name: "handler_mcp"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "MCP protocol handler for exposing ONEX nodes as AI agent tools"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "mcp"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerMCP"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_mcp"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "mcp.list_tools"
|
|
30
|
+
- "mcp.call_tool"
|
|
31
|
+
- "mcp.describe"
|
|
32
|
+
operation_bindings:
|
|
33
|
+
version:
|
|
34
|
+
major: 1
|
|
35
|
+
minor: 0
|
|
36
|
+
patch: 0
|
|
37
|
+
global_bindings:
|
|
38
|
+
- parameter_name: "correlation_id"
|
|
39
|
+
expression: "${envelope.correlation_id}"
|
|
40
|
+
required: true
|
|
41
|
+
bindings:
|
|
42
|
+
# No payload bindings required - returns all registered tools
|
|
43
|
+
"mcp.list_tools": []
|
|
44
|
+
"mcp.call_tool":
|
|
45
|
+
- parameter_name: "tool_name"
|
|
46
|
+
expression: "${payload.tool_name}"
|
|
47
|
+
required: true
|
|
48
|
+
- parameter_name: "arguments"
|
|
49
|
+
expression: "${payload.arguments}"
|
|
50
|
+
required: false
|
|
51
|
+
# No payload bindings required - returns MCP server capabilities
|
|
52
|
+
"mcp.describe": []
|
|
53
|
+
metadata:
|
|
54
|
+
handler_id: "mcp-handler"
|
|
55
|
+
handler_type: "infra_handler"
|
|
56
|
+
handler_category: "effect"
|
|
57
|
+
transport_type: "mcp"
|
|
58
|
+
security_features:
|
|
59
|
+
- "Tool execution timeout enforcement"
|
|
60
|
+
- "Request size limits"
|
|
61
|
+
- "Correlation ID propagation"
|
|
62
|
+
- "Circuit breaker protection"
|
|
63
|
+
resilience_features:
|
|
64
|
+
- "Circuit breaker pattern (threshold: 5, reset: 60s)"
|
|
65
|
+
- "Internal uvicorn server lifecycle management"
|
|
66
|
+
notes:
|
|
67
|
+
- "Authentication NOT yet implemented in MVP"
|
|
68
|
+
- "Streamable HTTP transport for production scalability"
|
|
69
|
+
- "Dynamic tool discovery from ONEX node registry"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
# Contract for Vault Handler - HashiCorp Vault secret management
|
|
4
|
+
name: "handler_vault"
|
|
5
|
+
node_type: "EFFECT_GENERIC"
|
|
6
|
+
description: "HashiCorp Vault handler for secret management operations using hvac client"
|
|
7
|
+
contract_version:
|
|
8
|
+
major: 1
|
|
9
|
+
minor: 0
|
|
10
|
+
patch: 0
|
|
11
|
+
node_version:
|
|
12
|
+
major: 0
|
|
13
|
+
minor: 1
|
|
14
|
+
patch: 0
|
|
15
|
+
input_model:
|
|
16
|
+
name: "ModelEventEnvelope"
|
|
17
|
+
module: "omnibase_core.models.events.model_event_envelope"
|
|
18
|
+
output_model:
|
|
19
|
+
name: "ModelHandlerOutput"
|
|
20
|
+
module: "omnibase_core.models.dispatch.model_handler_output"
|
|
21
|
+
handler_routing:
|
|
22
|
+
routing_strategy: "operation_match"
|
|
23
|
+
handlers:
|
|
24
|
+
- handler_type: "vault"
|
|
25
|
+
handler:
|
|
26
|
+
name: "HandlerVault"
|
|
27
|
+
module: "omnibase_infra.handlers.handler_vault"
|
|
28
|
+
supported_operations:
|
|
29
|
+
- "vault.read_secret"
|
|
30
|
+
- "vault.write_secret"
|
|
31
|
+
- "vault.delete_secret"
|
|
32
|
+
- "vault.list_secrets"
|
|
33
|
+
- "vault.renew_token"
|
|
34
|
+
operation_bindings:
|
|
35
|
+
version:
|
|
36
|
+
major: 1
|
|
37
|
+
minor: 0
|
|
38
|
+
patch: 0
|
|
39
|
+
global_bindings:
|
|
40
|
+
- parameter_name: "correlation_id"
|
|
41
|
+
expression: "${envelope.correlation_id}"
|
|
42
|
+
required: true
|
|
43
|
+
bindings:
|
|
44
|
+
"vault.read_secret":
|
|
45
|
+
- parameter_name: "path"
|
|
46
|
+
expression: "${payload.path}"
|
|
47
|
+
required: true
|
|
48
|
+
- parameter_name: "mount_point"
|
|
49
|
+
expression: "${payload.mount_point}"
|
|
50
|
+
required: false
|
|
51
|
+
"vault.write_secret":
|
|
52
|
+
- parameter_name: "path"
|
|
53
|
+
expression: "${payload.path}"
|
|
54
|
+
required: true
|
|
55
|
+
- parameter_name: "secret"
|
|
56
|
+
expression: "${payload.secret}"
|
|
57
|
+
required: true
|
|
58
|
+
- parameter_name: "mount_point"
|
|
59
|
+
expression: "${payload.mount_point}"
|
|
60
|
+
required: false
|
|
61
|
+
"vault.delete_secret":
|
|
62
|
+
- parameter_name: "path"
|
|
63
|
+
expression: "${payload.path}"
|
|
64
|
+
required: true
|
|
65
|
+
- parameter_name: "mount_point"
|
|
66
|
+
expression: "${payload.mount_point}"
|
|
67
|
+
required: false
|
|
68
|
+
"vault.list_secrets":
|
|
69
|
+
- parameter_name: "path"
|
|
70
|
+
expression: "${payload.path}"
|
|
71
|
+
required: true
|
|
72
|
+
- parameter_name: "mount_point"
|
|
73
|
+
expression: "${payload.mount_point}"
|
|
74
|
+
required: false
|
|
75
|
+
# No payload bindings required - renews the current auth token from connection config
|
|
76
|
+
"vault.renew_token": []
|
|
77
|
+
metadata:
|
|
78
|
+
handler_id: "vault-handler"
|
|
79
|
+
handler_type: "infra_handler"
|
|
80
|
+
handler_category: "effect"
|
|
81
|
+
transport_type: "vault"
|
|
82
|
+
security_features:
|
|
83
|
+
- "SecretStr protection for tokens"
|
|
84
|
+
- "Sanitized error messages"
|
|
85
|
+
- "SSL verification enabled by default"
|
|
86
|
+
- "Automatic token renewal management"
|
|
87
|
+
resilience_features:
|
|
88
|
+
- "Circuit breaker pattern"
|
|
89
|
+
- "Exponential backoff retry"
|
|
90
|
+
- "Thread pool management"
|
|
91
|
+
- "Token expiration tracking"
|