From 05c0f59e43496e9f59b88326c661fe2e8f7b606c Mon Sep 17 00:00:00 2001 From: philipph-askui Date: Tue, 5 May 2026 15:31:36 +0200 Subject: [PATCH] feat: add ComputerMousePressHoldReleaseTool --- src/askui/computer_agent.py | 2 + src/askui/tools/computer/__init__.py | 2 + .../computer/mouse_press_hold_release_tool.py | 44 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/askui/tools/computer/mouse_press_hold_release_tool.py diff --git a/src/askui/computer_agent.py b/src/askui/computer_agent.py index 016607bd..fe6008c8 100644 --- a/src/askui/computer_agent.py +++ b/src/askui/computer_agent.py @@ -25,6 +25,7 @@ ComputerListDisplaysTool, ComputerMouseClickTool, ComputerMouseHoldDownTool, + ComputerMousePressHoldReleaseTool, ComputerMouseReleaseTool, ComputerMouseScrollTool, ComputerMoveMouseTool, @@ -511,6 +512,7 @@ def get_default_tools() -> list[Tool]: ComputerKeyboardTapTool(), ComputerMouseClickTool(), ComputerMouseHoldDownTool(), + ComputerMousePressHoldReleaseTool(), ComputerMouseReleaseTool(), ComputerMouseScrollTool(), ComputerMoveMouseTool(), diff --git a/src/askui/tools/computer/__init__.py b/src/askui/tools/computer/__init__.py index 0410151e..278db94c 100644 --- a/src/askui/tools/computer/__init__.py +++ b/src/askui/tools/computer/__init__.py @@ -8,6 +8,7 @@ from .list_displays_tool import ComputerListDisplaysTool from .mouse_click_tool import ComputerMouseClickTool from .mouse_hold_down_tool import ComputerMouseHoldDownTool +from .mouse_press_hold_release_tool import ComputerMousePressHoldReleaseTool from .mouse_release_tool import ComputerMouseReleaseTool from .mouse_scroll_tool import ComputerMouseScrollTool from .move_mouse_tool import ComputerMoveMouseTool @@ -26,6 +27,7 @@ "ComputerKeyboardTapTool", "ComputerMouseClickTool", "ComputerMouseHoldDownTool", + "ComputerMousePressHoldReleaseTool", "ComputerMouseReleaseTool", "ComputerMouseScrollTool", "ComputerMoveMouseTool", diff --git a/src/askui/tools/computer/mouse_press_hold_release_tool.py b/src/askui/tools/computer/mouse_press_hold_release_tool.py new file mode 100644 index 00000000..49ccb02d --- /dev/null +++ b/src/askui/tools/computer/mouse_press_hold_release_tool.py @@ -0,0 +1,44 @@ +import time +from typing import get_args + +from askui.models.shared import ComputerBaseTool +from askui.tools.agent_os import AgentOs, MouseButton + + +class ComputerMousePressHoldReleaseTool(ComputerBaseTool): + """Computer Mouse Press Hold Release Tool""" + + def __init__(self, agent_os: AgentOs | None = None) -> None: + super().__init__( + name="mouse_press_hold_release", + description=( + "Press down the mouse button at the current position and hold" + " it down for the specified time, then release it." + ), + input_schema={ + "type": "object", + "properties": { + "mouse_button": { + "type": "string", + "description": "The mouse button to hold down.", + "enum": get_args(MouseButton), + }, + "hold_time": { + "type": "integer", + "description": ( + "The number of seconds the button is pressed." + " Must be an integer, e.g. 5 for 5 seconds." + ), + }, + }, + "required": ["mouse_button", "hold_time"], + }, + agent_os=agent_os, + ) + self.is_cacheable = True + + def __call__(self, mouse_button: MouseButton, hold_time: int) -> str: + self.agent_os.mouse_down(mouse_button) + time.sleep(hold_time) + self.agent_os.mouse_up(mouse_button) + return f"Mouse button {mouse_button} was pressed for {hold_time} seconds."