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,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"]
@@ -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"