123 lines
4.9 KiB
Python
123 lines
4.9 KiB
Python
"""Runtime-managed native subagent tools.
|
|
|
|
These tools are intercepted by Native Runtime V2 rather than executed by the
|
|
global registry. Their schemas must still be exposed to the model.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from opc.layer4_tools.registry import ToolDefinition
|
|
|
|
|
|
async def _runtime_noop(**_kwargs: Any) -> dict[str, Any]:
|
|
return {"error": "runtime managed tool must be intercepted by Native Runtime V2", "success": False}
|
|
|
|
|
|
def create_agent_runtime_tools() -> list[ToolDefinition]:
|
|
shared_profile_desc = "Specialist profile to use: general | explore | plan | implement | verify."
|
|
return [
|
|
ToolDefinition(
|
|
name="agent_spawn",
|
|
description=(
|
|
"Spawn a native subagent. Use explore/plan for read-only investigation, "
|
|
"implement for isolated coding, and verify for adversarial validation. "
|
|
"Supports OpenOPC native subagent fields such as description, name, model, "
|
|
"background, mode, and worktree isolation."
|
|
),
|
|
parameters={
|
|
"type": "object",
|
|
"properties": {
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Short description of the subagent task",
|
|
},
|
|
"profile": {"type": "string", "description": shared_profile_desc},
|
|
"prompt": {"type": "string", "description": "Task for the subagent"},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Optional stable nickname for addressing the subagent later",
|
|
},
|
|
"model": {
|
|
"type": "string",
|
|
"description": "Optional model override for this subagent",
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"description": "Permission mode hint: default | plan | accept_edits | bypass_permissions | dont_ask",
|
|
"default": "default",
|
|
},
|
|
"background": {"type": "boolean", "description": "Run in background", "default": False},
|
|
"resident": {
|
|
"type": "boolean",
|
|
"description": "Keep a background worker resident so it can resume with follow-up input after going idle.",
|
|
"default": False,
|
|
},
|
|
"isolation": {
|
|
"type": "string",
|
|
"description": "Isolation mode: shared | worktree",
|
|
"default": "",
|
|
},
|
|
},
|
|
"required": ["profile", "prompt"],
|
|
},
|
|
func=_runtime_noop,
|
|
category="orchestration",
|
|
concurrency_safe=False,
|
|
read_only=False,
|
|
runtime_managed=True,
|
|
),
|
|
ToolDefinition(
|
|
name="agent_wait",
|
|
description="Wait for a previously spawned subagent to complete and return its latest result.",
|
|
parameters={
|
|
"type": "object",
|
|
"properties": {
|
|
"agent_id": {"type": "string", "description": "Subagent id returned by agent_spawn"},
|
|
"timeout_seconds": {
|
|
"type": "integer",
|
|
"description": "Maximum time to wait before returning still-running status",
|
|
"default": 300,
|
|
},
|
|
},
|
|
"required": ["agent_id"],
|
|
},
|
|
func=_runtime_noop,
|
|
category="orchestration",
|
|
concurrency_safe=False,
|
|
read_only=True,
|
|
runtime_managed=True,
|
|
),
|
|
ToolDefinition(
|
|
name="agent_send",
|
|
description="Send a follow-up message to a running native subagent.",
|
|
parameters={
|
|
"type": "object",
|
|
"properties": {
|
|
"agent_id": {"type": "string", "description": "Subagent id returned by agent_spawn"},
|
|
"message": {"type": "string", "description": "Follow-up instruction for the subagent"},
|
|
},
|
|
"required": ["agent_id", "message"],
|
|
},
|
|
func=_runtime_noop,
|
|
category="orchestration",
|
|
concurrency_safe=False,
|
|
read_only=False,
|
|
runtime_managed=True,
|
|
),
|
|
ToolDefinition(
|
|
name="agent_list",
|
|
description="List currently known native subagents and their status.",
|
|
parameters={
|
|
"type": "object",
|
|
"properties": {},
|
|
},
|
|
func=_runtime_noop,
|
|
category="orchestration",
|
|
concurrency_safe=True,
|
|
read_only=True,
|
|
runtime_managed=True,
|
|
),
|
|
]
|