File size: 2,340 Bytes
5dc5419 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | """SleepTool - Simple delay tool for Stack 2.9"""
import asyncio
import time
from datetime import datetime
from .base import BaseTool, ToolResult
from .registry import tool_registry
class SleepTool(BaseTool):
"""Pause execution for a specified duration."""
name = "sleep"
description = "Pause execution for a specified number of seconds"
input_schema = {
"type": "object",
"properties": {
"seconds": {"type": "number", "description": "Number of seconds to sleep"}
},
"required": ["seconds"]
}
async def execute(self, seconds: float) -> ToolResult:
"""Sleep."""
if seconds <= 0:
return ToolResult(success=False, error="Seconds must be positive")
if seconds > 3600:
return ToolResult(success=False, error="Maximum sleep is 3600 seconds (1 hour)")
start = time.time()
await asyncio.sleep(seconds)
elapsed = time.time() - start
return ToolResult(success=True, data={
"requested_seconds": seconds,
"actual_elapsed": elapsed,
"completed_at": datetime.now().isoformat()
})
class WaitForTool(BaseTool):
"""Wait for a condition to become true."""
name = "wait_for"
description = "Wait for a condition with timeout"
input_schema = {
"type": "object",
"properties": {
"seconds": {"type": "number", "description": "Maximum seconds to wait"},
"poll_interval": {"type": "number", "default": 1.0, "description": "Seconds between checks"}
},
"required": ["seconds"]
}
async def execute(self, seconds: float, poll_interval: float = 1.0) -> ToolResult:
"""Wait with polling."""
if seconds <= 0 or poll_interval <= 0:
return ToolResult(success=False, error="All values must be positive")
start = time.time()
elapsed = 0
while elapsed < seconds:
await asyncio.sleep(min(poll_interval, seconds - elapsed))
elapsed = time.time() - start
return ToolResult(success=True, data={
"waited_seconds": seconds,
"actual_elapsed": elapsed,
"timed_out": True
})
# Register tools
tool_registry.register(SleepTool())
tool_registry.register(WaitForTool())
|