* `from === undefined` → drag from current cursor (training's * left_click_drag with start_coordinate omitted). Inner `finally`: the * button is ALWAYS released even if the move throws — otherwise the * user's left button is stuck-pressed until they physically click. * 50ms sleep
(
from: { x: number; y: number } | undefined,
to: { x: number; y: number },
)
| 577 | * needs a HID-tap round-trip to show up there. |
| 578 | */ |
| 579 | async drag( |
| 580 | from: { x: number; y: number } | undefined, |
| 581 | to: { x: number; y: number }, |
| 582 | ): Promise<void> { |
| 583 | const input = requireComputerUseInput() |
| 584 | if (from !== undefined) { |
| 585 | await moveAndSettle(input, from.x, from.y) |
| 586 | } |
| 587 | await input.mouseButton('left', 'press') |
| 588 | await sleep(MOVE_SETTLE_MS) |
| 589 | try { |
| 590 | await animatedMove(input, to.x, to.y, getMouseAnimationEnabled()) |
| 591 | } finally { |
| 592 | await input.mouseButton('left', 'release') |
| 593 | } |
| 594 | }, |
| 595 | |
| 596 | /** |
| 597 | * Move first, then scroll each axis. Vertical-first — it's the common |
nothing calls this directly
no test coverage detected