Files
2026-07-01 17:56:31 +08:00

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,
),
]