Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ dependencies = [
# omnibase-core = { git = "https://github.com/org/omnibase_core.git", rev = "SHA" }
# Remember to switch back to PyPI versions before merging to main.
#
"omnibase-core>=0.39.0",
"omnibase-core>=0.40.0,<0.41.0",
"omnibase-spi>=0.20.4",
"omnimarket>=0.1.0",
# ============================================================================
Expand Down Expand Up @@ -103,6 +103,7 @@ dependencies = [
"pydantic-settings>=2.2.1,<3.0.0", # Settings management
"jsonschema>=4.20.0,<5.0.0", # JSON schema validation
"watchdog>=4.0.0", # Filesystem event monitoring (HandlerContractFileWatcher, OMN-3940)
"a2a-sdk>=0.3.4,<0.4.0", # Real A2A client/server protocol support for remote-agent invocation
# Security: CVE-2026-32597 (HIGH) - PyJWT <2.12.0 accepts unknown `crit` header extensions.
# Transitive dependency (via mcp/httpx/authlib). Explicitly declared to enforce minimum version.
"pyjwt>=2.12.0",
Expand Down Expand Up @@ -160,15 +161,15 @@ dev = [

[tool.uv]
override-dependencies = [
"omnibase-core>=0.39.0",
"omnibase-core>=0.40.0,<0.41.0",
]

[tool.uv.sources]
onex-change-control = { git = "https://github.com/OmniNode-ai/onex_change_control.git", branch = "main" }
omnimarket = { git = "https://github.com/OmniNode-ai/omnimarket.git", branch = "main" }
# Pinned to core main post-OMN-9196 (resolver models + enum_handler_resolution_outcome).
# PyPI release v0.39.0 (2026-04-06) predates PR 846 — switch back after v0.40.0 ships.
omnibase-core = { git = "https://github.com/OmniNode-ai/omnibase_core.git", rev = "9d64d5a3944477093824a53ca931fd17a4b6a8e1" }
# Pinned to core main post-OMN-9637 (delegation models — ModelRemoteTaskState et al.).
# PyPI release v0.39.0 (2026-04-06) predates PR 912 — switch back after v0.40.0 ships.
omnibase-core = { git = "https://github.com/OmniNode-ai/omnibase_core.git", rev = "6a65f885303e29b4ddc36a66a0cb860537f47316" }
# Pinned to spi main post-OMN-9197 (ProtocolHandlerResolver + ProtocolHandlerOwnershipQuery).
# PyPI release v0.20.4 (2026-04-03) predates PR 186 — switch back after v0.20.5 ships.
omnibase-spi = { git = "https://github.com/OmniNode-ai/omnibase_spi.git", rev = "a9380008fb4a2f2a784d374389260d896455c3b2" }
Expand Down Expand Up @@ -508,6 +509,7 @@ node_registration_reducer = "omnibase_infra.nodes.node_registration_reducer"
node_registration_storage_effect = "omnibase_infra.nodes.node_registration_storage_effect"
node_registry_api_effect = "omnibase_infra.nodes.node_registry_api_effect"
node_registry_effect = "omnibase_infra.nodes.node_registry_effect"
node_remote_agent_invoke_effect = "omnibase_infra.nodes.node_remote_agent_invoke_effect"
node_reward_binder_effect = "omnibase_infra.nodes.node_reward_binder_effect"
node_routing_orchestrator = "omnibase_infra.nodes.node_routing_orchestrator"
node_routing_score_reducer = "omnibase_infra.nodes.node_routing_score_reducer"
Expand Down
3 changes: 3 additions & 0 deletions scripts/check_subscribe_wiring_health.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@
"onex.int.platform.runtime-tick.v1": "Published by runtime scheduler | owner: jonah | expiry: 2026-09-01",
# Onboarding — triggered by omniclaude /onboarding skill, not Kafka publisher
"onex.cmd.omnibase-infra.onboarding-start.v1": "Triggered by /onboarding skill via claude -p, not Kafka | owner: jonah | expiry: 2026-12-01",
# Remote-agent invoke — emitted by node_delegation_orchestrator (OMN-9620 epic);
# its contract addition is tracked separately and pending in another wave.
"onex.cmd.omnibase-infra.remote-agent-invoke.v1": "Publisher pending in delegation_orchestrator (OMN-9620 epic) | owner: jonah | expiry: 2026-09-01",
}
# fmt: on

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ class EnumOmnibaseInfraTopic(str, Enum):
CMD_LLM_EMBEDDING_REQUEST_V1 = "onex.cmd.omnibase-infra.llm-embedding-request.v1" # onex.cmd.omnibase-infra.llm-embedding-request.v1
CMD_LLM_INFERENCE_REQUEST_V1 = "onex.cmd.omnibase-infra.llm-inference-request.v1" # onex.cmd.omnibase-infra.llm-inference-request.v1
CMD_ONBOARDING_START_V1 = "onex.cmd.omnibase-infra.onboarding-start.v1" # onex.cmd.omnibase-infra.onboarding-start.v1
CMD_REMOTE_AGENT_INVOKE_V1 = "onex.cmd.omnibase-infra.remote-agent-invoke.v1" # onex.cmd.omnibase-infra.remote-agent-invoke.v1
CMD_VECTOR_STORE_REQUEST_V1 = "onex.cmd.omnibase-infra.vector-store-request.v1" # onex.cmd.omnibase-infra.vector-store-request.v1
EVT_AGENT_TASK_LIFECYCLE_V1 = "onex.evt.omnibase-infra.agent-task-lifecycle.v1" # onex.evt.omnibase-infra.agent-task-lifecycle.v1
EVT_BASELINES_COMPUTED_V1 = "onex.evt.omnibase-infra.baselines-computed.v1" # onex.evt.omnibase-infra.baselines-computed.v1
EVT_CHAIN_LEARN_COMPLETE_V1 = "onex.evt.omnibase-infra.chain-learn-complete.v1" # onex.evt.omnibase-infra.chain-learn-complete.v1
EVT_CHAIN_LEARN_FAILED_V1 = "onex.evt.omnibase-infra.chain-learn-failed.v1" # onex.evt.omnibase-infra.chain-learn-failed.v1
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
# SPDX-License-Identifier: MIT
"""Remote agent invocation effect node."""

from omnibase_infra.nodes.node_remote_agent_invoke_effect.node import (
NodeRemoteAgentInvokeEffect,
)

__all__ = ["NodeRemoteAgentInvokeEffect"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
# SPDX-License-Identifier: MIT
#
# ONEX Node Contract
# Node: NodeRemoteAgentInvokeEffect
#
# Submits routed remote-agent invocation commands to protocol-specific
# transports and emits remote task lifecycle events.
name: "node_remote_agent_invoke_effect"
contract_name: "node_remote_agent_invoke_effect"
node_name: "node_remote_agent_invoke_effect"
contract_version:
major: 0
minor: 1
patch: 0
node_version:
major: 0
minor: 1
patch: 0
node_type: "EFFECT_GENERIC"
description: >
Remote-agent invocation effect node for the A2A delegation bridge. Consumes invocation commands emitted by the delegation orchestrator, delegates task submission and watch operations to protocol-specific handlers, persists remote task state, and emits lifecycle events back to the orchestration pipeline.

input_model:
name: "ModelInvocationCommand"
module: "omnibase_infra.nodes.node_remote_agent_invoke_effect.models"
description: "Invocation command selected by delegation routing."
output_model:
name: "ModelAgentTaskLifecycleEvent"
module: "omnibase_infra.nodes.node_remote_agent_invoke_effect.models"
description: "Lifecycle event emitted while watching a remote agent task."
handler_routing:
routing_strategy: "operation_match"
handlers:
- operation: "agent.a2a_task"
handler:
name: "HandlerA2ATask"
module: "omnibase_infra.nodes.node_remote_agent_invoke_effect.handlers.handler_a2a_task"
handler_type: "HTTP"
description: "Submit remote A2A tasks and persist their initial lifecycle state."
execution_mode: "single"
max_timeout_seconds: 600
event_bus:
version:
major: 1
minor: 0
patch: 0
subscribe_topics:
- "onex.cmd.omnibase-infra.remote-agent-invoke.v1"
publish_topics:
- "onex.evt.omnibase-infra.agent-task-lifecycle.v1"
consumed_events:
- topic: "onex.cmd.omnibase-infra.remote-agent-invoke.v1"
event_type: "RemoteAgentInvokeCommand"
message_category: "COMMAND"
description: "Command requesting remote-agent task submission and lifecycle watch."
published_events:
- topic: "onex.evt.omnibase-infra.agent-task-lifecycle.v1"
event_type: "AgentTaskLifecycleEvent"
description: "Remote-agent lifecycle event emitted by protocol handlers."
health_check:
enabled: true
endpoint: "/health"
interval_seconds: 30
checks:
- name: "remote_agent_transport_handlers_loaded"
type: "handler"
critical: true
- name: "remote_task_state_persistence_available"
type: "database"
critical: true
capabilities:
- name: "remote_agent_invocation"
description: "Submit tasks to remote agents via protocol-specific handlers."
- name: "remote_task_lifecycle_watch"
description: "Watch remote task state and emit typed lifecycle events."
- name: "remote_task_restart_resumption"
description: "Reload unfinished remote task state on startup."
metadata:
description: "A2A delegation bridge effect node scaffold."
author: "OmniNode Team"
license: "MIT"
created: "2026-04-25"
tags:
- effect
- delegation
- a2a
- remote-agent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2025 OmniNode.ai Inc.
# SPDX-License-Identifier: MIT
"""Remote agent invocation handlers."""

from omnibase_infra.nodes.node_remote_agent_invoke_effect.handlers.handler_a2a_task import (
HandlerA2ATask,
)

__all__ = ["HandlerA2ATask"]
Loading
Loading