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())