66 Commits

Author SHA1 Message Date
Michał Pierzchała a5fffc6e49 feat: add Maestro YAML replay compatibility (#581)
* feat: add Maestro replay compatibility

* fix: harden Maestro replay compatibility

* fix: address Maestro replay review feedback

* fix: finalize Maestro replay compatibility

* refactor: tighten Maestro replay compatibility boundary

* refactor: reduce Maestro replay quality debt

* refactor: satisfy Maestro replay fallow audit

* fix: stabilize Android provider snapshot tests
2026-05-27 21:45:51 +02:00
Michał Pierzchała ea21793154 feat: support ios transform gesture (#586) 2026-05-26 09:58:33 +02:00
Michał Pierzchała 47b981c8ad feat: add gesture command coverage (#576)
* feat: add gesture command coverage

* fix: align iOS fling provider fixture

* feat: group gesture commands

* fix: clarify android gesture support

* feat: add android multitouch gestures

* fix: address gesture review feedback

* refactor: simplify gesture plumbing

* fix: keep gesture subcommands internal

* fix: update iOS provider pan transcript
2026-05-22 18:01:58 +02:00
Michał Pierzchała dfd5c71282 perf: speed up hot iOS taps (#572)
* perf: skip fresh iOS tap preflight

* perf: use app root for iOS coordinate taps

* perf: simplify iOS coordinate tap payloads

* fix: tighten hot iOS tap safety window

* chore: trace skipped iOS tap preflights
2026-05-21 12:42:08 +02:00
Michał Pierzchała b0e19c9d1e perf: improve recording and interaction flows (#563)
* perf: improve recording and interaction flows

* feat: add React Native overlay dismiss command

* test: cover RedBox overlay dismissal

* fix: simplify React Native overlay snapshot hint

* fix: address daemon and scroll review feedback

* fix: unblock ci after recording polish

* chore: refresh fallow health baseline

* test: stabilize android provider suites

* test: cover rn overlay provider command
2026-05-20 20:32:08 +02:00
Michał Pierzchała f71371ebb8 fix: handle platform alerts (#562)
* fix: handle Android platform alerts

* fix: handle iOS alerts in runner

* chore: type alert metadata

* refactor: colocate Android alert handling
2026-05-20 14:51:17 +02:00
Michał Pierzchała 840bef56ca fix: tighten env var surface (#560) 2026-05-19 17:11:31 +02:00
Michał Pierzchała 094c290703 perf: speed up iOS replay runner (#557)
* perf: speed up iOS replay runner

* fix: harden ios replay fast paths

* fix: address ci validation failures

* refactor: trim unused ios replay surface
2026-05-19 11:36:48 +02:00
Alex d67e988671 fix: ios press idle timeout (#543)
* fix: ios press idle timeout

* fix: preserve ios mutating command recovery

---------

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-05-15 13:27:05 +02:00
Hwidong Bae 2e04edd869 fix: prevent runner XCTest attachment bloat (#520)
Long-running AgentDeviceRunnerUITests sessions can inherit Xcode 26 screenRecording/deleteOnSuccess defaults and leave hidden testmanagerd attachments behind when sessions terminate outside a clean XCTest success path.

Pin an explicit AgentDeviceRunnerUITests.xctestplan with screenshots and keepNever attachment lifetimes, then normalize the generated per-session .xctestrun copy before test-without-building. The .xctestrun normalization protects stale cached artifacts and Xcode versions that ignore some test-plan attachment lifetime keys during build-for-testing.

This only affects XCTest's automatic attachments; user-requested agent-device recordings still use the existing record command paths.

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-05-14 14:24:33 +02:00
Si Huynh d2a3742c7c fix: enable tvOS compilation for XCUITest runner (#492)
* fix: enable tvOS compilation for XCUITest runner

XCUICoordinate type and XCUIElement.tap() are unavailable on tvOS.
Gate coordinate-based interactions and touch APIs behind #if !os(tvOS)
and provide tvOS alternatives using XCUIRemote (Siri Remote) actions:

- tap/doubleTap → XCUIRemote.shared.press(.select)
- longPress → XCUIRemote.shared.press(.select, forDuration:)
- drag → directional remote press based on primary axis
- back gesture → XCUIRemote menu button
- app switcher → double home press
- pinch/rotate → return unsupported (no-op / false)
- keyboard dismiss → remote menu button
- alert accept/dismiss → remote select button

Verified: builds successfully for both tvOS Simulator and iOS Simulator.

* fix: harden tvOS runner interactions

* refactor: prune tvOS remote helpers

* test: keep fallow focused on tvOS changes

---------

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-05-12 10:32:21 +02:00
Michał Pierzchała bbb1d363c2 fix: handle iOS keyboard Done dismiss controls (#469) 2026-04-28 21:20:09 -04:00
Michał Pierzchała 364844e01d feat: add recording quality flag (#409)
* feat: add recording quality flag

* test: cover quality edge cases

* fix: scale transform translation in resize

* fix: narrow recording quality flag
2026-04-15 13:18:57 +02:00
Michał Pierzchała 7df452b3b5 feat: add rotate command for iOS and Android (#344)
* feat: add device rotation command

* fix: simplify rotate command handling
2026-04-01 20:34:56 +02:00
Michał Pierzchała 8df45b69a8 fix: make snapshot refs visible-first (#337)
* fix: make snapshot refs visible-first

* fix: handle zero-height visible rects

* refactor: simplify scrollintoview success handling

* feat: hint hidden scroll content in snapshots

* refactor: simplify snapshot output helpers

* feat: add hidden scroll-area hints to snapshots

* refactor: keep scroll containers in interactive snapshots

* perf: reuse Android snapshot tree for scroll hints

* refactor: trim hidden scroll hint scope

* refactor: unify mobile visible-first snapshot semantics

* fix: suppress noisy system scroll-container labels

* refactor: unify scroll indicator heuristics

* refactor: trim android hinting overhead

* fix: avoid viewport-sized ancestor promotion for ref taps

* refactor: dedupe viewport helpers and clarify hint naming
2026-04-01 19:00:02 +02:00
Michał Pierzchała f7f7ce531f chore: add icon for iOS UITest runner (#328)
* chore: add icon for iOS UITest runner

* chore: tighten uitest runner icon assets

* chore: prefer jpg for uitest runner icon
2026-03-31 21:03:57 +02:00
Michał Pierzchała 0fed800eee fix: avoid focusing iOS simulator window (#319) 2026-03-28 19:39:14 +01:00
Michał Pierzchała 876f091c00 feat: close macOS parity gaps (#311)
* feat: close macos parity gaps

* fix: support targeted macOS menubar app snapshots

* chore: clarify menubar fallback heuristics

* chore: address review nits

* fix: complete macOS parity flow
2026-03-28 19:06:52 +01:00
Michał Pierzchała d9d94f0f5a [codex] close iOS runner responses gracefully (#306)
* fix: close iOS runner responses gracefully

* fix: close runner connection after send
2026-03-27 17:48:20 +01:00
Michał Pierzchała ac50381270 docs: clarify iOS runner protocol contract (#300) 2026-03-27 15:27:56 +01:00
Michał Pierzchała b6592db978 Fix iOS runner fill for tapped secure text fields (#298)
* fix: target iOS runner fill typing to tapped inputs

* fix: clarify targeted fill error handling
2026-03-27 14:57:56 +01:00
Michał Pierzchała 1669c7a101 feat: support pixel-based scroll gestures (#293)
* feat: add pixel-based scroll gestures

* fix: address remaining scroll review comments

* chore: make scroll direction switch exhaustive

* docs: keep readme informational

* docs: revert readme changes

* refactor: reuse shared apple scroll planning

* refactor: reduce apple scroll runner churn
2026-03-27 12:06:57 +01:00
Michał Pierzchała 11b47a25a7 Fix keyboard dismiss semantics across iOS and Android (#291)
* fix: correct keyboard dismiss semantics

* fix: address PR review feedback

* fix: preserve iOS keyboard dismiss contract

* fix: restore session handler platform import

* docs: update skill guidance for keyboard commands
2026-03-27 11:49:30 +01:00
Michał Pierzchała c9ca550f1e feat: add --delay-ms support to type and fill (#292)
* feat: add delayed typing support

* fix: keep literal delay tokens in replay

* chore: tighten delay-ms follow-up polish
2026-03-27 10:43:52 +01:00
Michał Pierzchała 605f736f2f fix: expose collapsed iOS tab items in snapshots (#287)
* fix: expose collapsed iOS tab items in snapshots

* fix: address snapshot fallback review feedback

* fix: tighten snapshot fallback scope and truncation
2026-03-27 10:25:32 +01:00
Michał Pierzchała dc8f318f76 Split back navigation into explicit in-app and system semantics (#288)
* feat: split back navigation semantics

* fix: address back review feedback

* fix: make in-app back the default
2026-03-27 10:18:00 +01:00
Michał Pierzchała a39bb6d0fc fix: improve large text surface discovery and reads (#261)
* fix: improve large text surface discovery and reads

* chore: trim duplicated skill guidance

* fix: tighten large text read follow-ups

* fix: scope snapshot metadata and log read fallbacks
2026-03-25 17:13:31 +01:00
Michał Pierzchała 0cca41f673 feat: add gesture telemetry recording overlays (#245)
* feat: add gesture telemetry recording overlays

* fix: stabilize recording validation and telemetry artifacts

* fix: tighten recording telemetry helpers

* fix: clean up android recording stop fallback

* refactor: split ios recording handlers

* fix: tighten runner-backed touch telemetry

* refactor: simplify touch recording recovery

* feat: add gesture telemetry recording overlays

* refactor: split touch interaction recording flow

* fix: rebase gesture telemetry onto main

* test: fix recording overlay CI expectations
2026-03-24 13:38:41 +01:00
Michał Pierzchała 4b8fc2f4f6 fix: improve macOS runner snapshot and context menus (#252)
* fix: improve macos runner snapshot and context menus

* fix: address macos runner review feedback

* refactor: simplify xctestrun product resolution

* refactor: future-proof macos runner and click flows

* refactor: remove secondary click alias

* fix: tighten macos runner review follow-ups

* update readme

* fix: discover macos apps from standard bundles

* fix: stabilize macos app listing test on linux
2026-03-23 16:01:52 +01:00
Michał Pierzchała 9e1991daf6 feat: add apple-family macOS desktop support (#246)
* feat: add apple-family macos desktop support

* feat: extend macos desktop command support

* fix: stabilize CI for macos runner build

* fix: harden macos app resolution

* fix: tighten apple-family session routing

* fix: align macos log capabilities

* fix: support macos wait text

* fix: make iOS session refresh test host-agnostic
2026-03-23 10:22:55 +01:00
Muhammad Mugni Hadi b79bd86017 fix: remove trailing commas in Swift for Xcode <16.3 compatibility (#186)
* fix: remove trailing commas in Swift for Xcode <16.3 compatibility

Remove trailing commas from function/initializer argument lists in the
iOS XCUITest runner Swift source files. SE-0439 trailing commas in
comma-separated lists require Swift 6.1+ (Xcode 16.3+), but the runner
is compiled locally by users who may have older Xcode versions.

Users with Xcode 16.2 (Swift 6.0.3) encounter build failures:
  error: unexpected ',' separator

This causes the runner to never start, surfacing as:
  Error (COMMAND_FAILED): Runner did not accept connection (simctl spawn)

Files fixed (12 trailing commas removed):
- RunnerTests+Snapshot.swift (5)
- RunnerTests+Transport.swift (2)
- RunnerTests+CommandExecution.swift (1)
- RunnerTests+ScreenRecorder.swift (2)
- RunnerTests.swift (2)

Verified: pnpm build:xcuitest passes (TEST BUILD SUCCEEDED).

* ci: guard iOS runner trailing-comma syntax

---------

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-03-06 15:40:18 +01:00
Michał Pierzchała 9b443c526f refactor: split RunnerTests into focused files (#149)
* refactor: split RunnerTests into focused files

* chore: remove dead interaction label helper
2026-02-28 13:38:59 +01:00
Michał Pierzchała 97f59254bb fix: make snapshot --raw use target app tree on physical iOS (#148)
* fix: use snapshots for raw iOS tree traversal

Fixes #147

* refactor: unify snapshot hittable computation across modes

* refactor: account for cousin occlusion in hittable

* refactor: tighten snapshot occlusion heuristic
2026-02-28 12:55:41 +01:00
Michał Pierzchała 14de55c9b7 fix: support configurable iOS runner bundle IDs (#146) 2026-02-26 16:40:24 +01:00
Nick Dima 43aae1d30a fix(ios): correctly implement runner fallback for physical device screenshots (#132)
* fix(ios): use XCTest runner for screenshots on physical devices

`xcrun devicectl device screenshot` was removed in Xcode 26.x, causing
`agent-device screenshot` to fail on physical iOS devices with exit code 64.

This fix routes physical device screenshots through the AgentDeviceRunner
XCTest runner (already used for snapshot/interaction commands) instead:

- Add `screenshot` command to the Swift runner's `CommandType` enum
- Implement the handler using `XCUIScreen.main.screenshot()`, writing a
  timestamped PNG to the app's temp directory (returned as `tmp/<file>`)
- If `appBundleId` is provided, activate the target app before capturing
  so the screenshot shows the app under test rather than the runner itself
- In `screenshotIos()`, pass `appBundleId` to the runner command then pull
  the file back to the host via `xcrun devicectl device copy from` (same
  mechanism used by the recording feature)
- Thread `appBundleId` through `Interactor.screenshot()` → `dispatch.ts`
  → `screenshotIos()` so the active session's app is always captured
- Extract `IOS_RUNNER_CONTAINER_BUNDLE_IDS` to `runner-client.ts` so it
  can be shared between `apps.ts` and `record-trace.ts`

Fixes: screenshots failing with "Failed to capture iOS screenshot" on
devices using Xcode 26.x / devicectl 506.6+

* fix: clean up iOS screenshot fallback follow-ups

---------

Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-02-25 16:11:01 +01:00
Michał Pierzchała 8123117e6d fix: fallback iOS/tvOS screenshot to runner when devicectl screenshot is unavailable (#130) 2026-02-25 15:34:14 +01:00
Michał Pierzchała ef20dea6bc feat: add AndroidTV and tvOS target support (#125)
* feat: add AndroidTV and tvOS target support

* feat: enable tvOS runner interactions

* refactor: unify apple target handling and tvOS capability gates

* refactor: remove hardcoded tvOS app-switcher sleep

* fix: align tvOS capabilities and docs for simulator-only helpers

* feat: improve AppleTV and AndroidTV physical device detection

* refactor: simplify tv target detection helpers
2026-02-25 14:55:54 +01:00
Michał Pierzchała 00ba0be101 fix: speed up and simplify scrollintoview @ref (#87) 2026-02-20 19:43:05 +01:00
Michał Pierzchała 2fd2bf50fe chore: remove dead ios runner command paths (#88) 2026-02-20 19:38:16 +01:00
Michał Pierzchała 8eea063374 feat: add iOS device record support via runner (#83)
* feat: add iOS device record support via runner

* refactor: simplify record command pathways

* fix: harden iOS record runner failure handling

* chore: emit diagnostic on iOS record stop runner failure

* fix: clear ios device runner cache in build:xcuitest

* chore: drop unused clean-derived env from build script

* fix: stage iOS device recordings via runner temp file

* fix: prefer requested iOS record path with permission fallback

* fix: disable iOS record fallback for explicit output paths

* refactor: remove iOS record fallback staging path flow

* fix: resolve record output paths from request cwd

* chore: log resolved record output path in diagnostics

* fix: avoid app activation when starting iOS recording

* refactor: streamline iOS recording setup paths

* fix: copy iOS device recordings back to host path

* fix: copy iOS recordings from runner test container

* feat: add configurable iOS recording fps

* fix: disable xcode test diagnostics for runner sessions

* fix: use wall-clock timestamps for iOS recording

* feat: default iOS recording to uncapped fps

* fix: recover stale ios runner recording state

* fix: preserve app focus when starting iOS recording

* docs: clarify iOS device recording capture model

* fix: tighten iOS device record start ownership checks

* refactor: collocate iOS record context checks

* refactor: derive uncapped recorder timescale from interval
2026-02-20 18:41:07 +01:00
Michał Pierzchała 345b7eee7d fix: harden ios runner resilience and cancellation (#85) 2026-02-20 17:18:37 +01:00
Michał Pierzchała fc10613ecd fix: harden iOS runner command execution (#72)
* fix: harden iOS runner command execution

* fix: tighten iOS runner error semantics

* fix: harden runner interactions after snapshot
2026-02-18 16:13:18 +01:00
Michał Pierzchała 99cc68463c fix: align press/click behavior and honor fast press cadence on iOS (#70)
* fix: align press and click semantics and reduce iOS tap latency

* perf: batch repeated iOS taps in runner

* perf: add opt-in tap batching for repeated iOS presses

* perf: batch repeated iOS swipes in runner

* fix: preserve interaction series semantics in record/replay

* test: cover click/press interaction handler paths

* refactor: dedupe replay and interaction series helpers

* fix: unify press/click double-tap behavior

* refactor: add interactor doubleTap and alias docs

* refactor: normalize click alias to press path
2026-02-18 16:02:45 +01:00
Michał Pierzchała 106a5f661d chore(breaking): remove AX snapshot backend and trim npm artifacts (#62)
* chore: remove AX snapshot backend and trim npm artifacts

* docs: remove AX backend references from commands page

* chore: update website
2026-02-17 12:00:21 +01:00
Michał Pierzchała ac078905c6 refactor: stabilize iOS app/session and daemon startup flows (#64)
* refactor: stabilize iOS app/session and daemon startup flows

* fix: wait for android app launch completion

* fix: address review findings for iOS appstate and daemon flows

* fixups
2026-02-16 18:19:17 +01:00
Michał Pierzchała 06a8778157 Enable iOS device core parity and align docs/skills (#55)
* Add iOS device runner support and document platform matrix

* ios: make signing identity override-only

* ios: address PR55 review follow-ups

* docs: remove v1 phrasing from support messages

* ios appstate: prefer xctest before ax fallback

* docs: clarify ios runner derived path override behavior

* ios: harden runner polling and appstate fallback

* ios: remove automatic AX fallback paths

* docs: clarify no automatic AX fallback

* ios: replace ad-hoc runner poll sleep with retry policy

* Harden iOS runner timeouts and cleanup safety

* args: align scrollintoview schema with capabilities

* test: skip iOS integration flows on CI by default
2026-02-15 21:12:10 +01:00
Michał Pierzchała 64d27c18d0 Add consolidated gesture controls for press and swipe (#54)
* Add gesture series controls for press and swipe

* Normalize iOS swipe timing to safe duration

* Harden daemon startup for integration runs
2026-02-14 13:55:58 +01:00
Michał Pierzchała 613974ab71 Handle iOS system blocker alerts in snapshots (#38) 2026-02-11 19:05:19 +01:00
Michał Pierzchała 6a064f229d fix: update IPHONEOS_DEPLOYMENT_TARGET to 15.6 (#42) 2026-02-11 10:07:58 +01:00
Michał Pierzchała 4aed3fba72 fix: support TouchableOpacity as [other] on iOS when has content (#31)
* fix: support TouchableOpacity as [other] on iOS when has content

* update snapshot ios
2026-02-09 19:07:04 +01:00