Skip to content

shuttle v0.1.17

Choose a tag to compare

@github-actions github-actions released this 23 Oct 03:44
· 13 commits to main since this release
  • Embedded mode. An app that ships shuttle inside its own bundle and starts shuttle serve itself sets SHUTTLE_EMBEDDED=1 for serve and mcp, so the macOS permissions belong to that app (install.md). serve then starts the bundled cua-driver with CUA_DRIVER_EMBEDDED=1, which raises no permission prompts of its own. mcp only connects: when no daemon answers it fails at once with no shuttle daemon answers at <endpoint>, and never starts one. Before, mcp from a copy of shuttle inside another app's bundle found that app as its own bundle and ran open -a <that app> --args serve.
  • Stale driver socket. Before each start of the bundled cua-driver, the first one and every restart, the daemon removes a socket file at the driver's endpoint that refuses a connect, as one a killed driver leaves; a socket that answers or any other error leaves the file alone. A cua-driver in embedded mode refuses to start over an existing socket file. Windows pipes are unchanged.
  • A click, scroll or drag that names a window takes pixels of that window's shot. With window, x, y (and to_x, to_y for a drag) are pixels of the image screenshot {window} (desk shot with window) returns, in the foreground and in the background, on any display and at any scale, so the point an agent picks in that image is the point it clicks. A cropped shot returns origin, its top left in the whole window image, and its pixel (px, py) is (origin[0] + px, origin[1] + py). A title that matches two listed windows alike, both equal to it or both containing it, is refused for such points, since a shot by that title may show the other window, and a window shot waits for a click, scroll or drag in flight, so the driver maps the click by the read it was made for. Before, they were desk coordinates, the main display's pixels, which an agent had to work out from a window origin that desk windows does not give, and which on a Retina main display are not the pixels of a window on a 1x display. Without window they stay desk coordinates; at keeps desk coordinates with window too. A script that passes window with desk coordinates now clicks elsewhere: drop window or convert the point.
  • macOS: a click after a window shot lands where it is aimed. screenshot {window} reads the window at full size, and cua-driver maps the next pixel click on that window by that read, while shuttle still scaled the click by the smaller image of its own earlier read. On a window wider than 1280 image pixels (on a Retina display, wider than 640 points) a background click, or a foreground click in the window, after a shot of it landed short, at about 0.6 of its distance from the window's top left on a 2113-point TextEdit window. Shuttle now keeps the scale of the shot's read for the next click.
  • at without a window reads the window at the point. desk at with neither window nor pid hit-tests the topmost app window the driver lists at the point, and the allowlist judges that window's app; with no app window there it fails with no app window at the point. Before, it hit-tested in the front window, so with an allowlist a point on another window failed with the front app's name (Warp is not in the app allowlist for a point on a window of an allowed app on a second display).