v0.20.4
Highlights
-
Continue interactively after replay. Native
.adreplays support--keep-sessionand SDKkeepSession, allowing agents to suppress a terminalcloseand take over the active session. -
More trustworthy replay execution. Replay gained stronger save-script validation, launch-time capture retries, session-lifecycle handling, post-gesture stability checks, off-screen verification, and divergence evidence.
-
Verify cloud access without allocating a device.
connectvalidates BrowserStack, AWS Device Farm, and Limrun credentials and resources, reports readiness, and provides exact next steps without creating a provider session. -
More capable BrowserStack sessions. Configure orientation, location, timezone, language, locale, networking, and app resigning; cloud orientation now uses valid WebDriver transports.
-
Faster and more reliable device automation. Android permission prompts, targeted text reads, and snapshot recovery are more dependable. Concurrent device discovery, usbmux-first physical iOS transport, and memoized snapshot occlusion reduce latency and prevent CPU stalls.
Security: Project-local configuration can no longer control credentials, remote endpoints, provider settings, headers, or other operator-sensitive values. Thanks to [@glmgbj233](https://github.com/glmgbj233) for responsibly reporting the issue. Action possibly needed: move sensitive or operator-specific values out of project-local agent-device.json files and into user configuration, explicitly selected configuration, environment variables, CLI arguments, or saved remote profiles.
What's Changed
- fix: resolve qs Dependabot alert #55 by @thymikee in #1493
- refactor: pnpm workspace + @agent-device/kernel pilot (#1490 W0) by @thymikee in #1494
- test(ios): fix nightly fixture selector drift by @thymikee in #1492
- refactor: consolidate daemon errors by @thymikee in #1496
- refactor: restore pngjs codec by @thymikee in #1498
- test: stabilize parallel provider scenarios by @thymikee in #1497
- Simplify screenshot diff output by @thymikee in #1495
- test(android): add comprehensive emulator E2E coverage by @thymikee in #1482
- docs: require complete change migrations by @thymikee in #1500
- refactor: extract contracts workspace package by @thymikee in #1499
- fix(daemon): reject unsupported raw --save-script flags at request ingress by @thymikee in #1501
- docs: organize navigation and Node.js integrations by @thymikee in #1503
- test: characterize replay-test reporter contract and extend R10 by @thymikee in #1505
- fix(ios): deny viewport during capability admission on Apple targets by @thymikee in #1507
- refactor: isolate maestro engine package by @thymikee in #1506
- test: add Android full emulator coverage by @thymikee in #1484
- refactor: isolate Limrun construction dependencies by @thymikee in #1502
- refactor(daemon): consolidate session-script test factories and drop saveScriptDefaultedHealedPath by @thymikee in #1508
- fix(ci): drop pipefail from the nightly Android emulator script by @thymikee in #1512
- feat(ios): usbmux runner route override + #1403 transport experiment evidence by @thymikee in #1510
- refactor(replay-test): neutralize the values crossing the scheduler seam (#1478 P3, part 1) by @thymikee in #1509
- refactor: extract WebDriver provider package by @thymikee in #1504
- fix(test): give the iOS scroll search a capture-sized wait budget by @thymikee in #1514
- fix(android): re-capture past a transient helper content verdict by @thymikee in #1513
- test(replay-test): pin the retry-path reporter hint by @thymikee in #1516
- feat(ios): reach physical devices through usbmux first, tunnel as fallback by @thymikee in #1517
- fix(ios): map usbmux connect result codes to the right verdict by @thymikee in #1523
- fix(device): state when nothing is claimed and reap dead claims by @thymikee in #1519
- perf(devices): probe platform inventories concurrently by @thymikee in #1524
- refactor: move Limrun provider behind package facade by @thymikee in #1518
- fix: normalize physical iOS landscape taps by @thymikee in #1520
- test: stop two tests failing on timing and megapixels by @thymikee in #1526
- test: narrow Limrun public type contract by @thymikee in #1528
- fix(ios): name Developer Mode and pairing as the real launch blockers by @thymikee in #1527
- test: fix Android observability scenario to Android contracts by @thymikee in #1531
- refactor(replay-test): extract packages/replay-test (#1478 P3b) by @thymikee in #1525
- fix(ios): diagnose a runner that cannot install, instead of blaming the screen by @thymikee in #1529
- fix: treat Android permission prompts as pending alerts, not tap escapes by @thymikee in #1530
- fix(cli): drop the removed durationMs positional from swipe help by @thymikee in #1534
- refactor(daemon): session script publication behind one capability (#1478 P4a) by @thymikee in #1532
- test(daemon): pin resolveScriptTarget's retention table directly by @thymikee in #1539
- fix(test): repair Android replay fixtures against live device reality by @thymikee in #1538
- refactor(daemon): serialize replay transactions behind a locked coordinator (#1478 P4b) by @thymikee in #1535
- fix: clear the polynomial-redos class across main by @thymikee in #1546
- docs(agents): a green check is evidence only once you have seen it red by @thymikee in #1547
- fix: memoize snapshot occlusion coverage checks to stop a daemon CPU-spin by @thymikee in #1541
- refactor: extract the .ad script codec into packages/ad-script (#1478) by @thymikee in #1536
- fix: restore scheduled workflow health by @thymikee in #1543
- refactor(ios): drop the transport seam usbmux-first made dead by @thymikee in #1540
- feat(cloud-webdriver): BrowserStack device-feature capabilities, and fix cloud orientation by @leovarmak in #1544
- test(replay-test): cover failFast, retry exhaustion, plan-prep failure, JUnit escaping by @thymikee in #1550
- refactor: tidy three post-extraction seams by @thymikee in #1551
- fix(test): tolerate dead session in iOS e2e full-tier cleanup by @thymikee in #1548
- feat(mutation): add target-annotation-serde + snapshot-occlusion kernels by @thymikee in #1553
- fix: clear the last polynomial-redos instance in swift-cache by @thymikee in #1549
- test: pin selector-port behavior ahead of the P5 extraction (#1478) by @thymikee in #1552
- test: make pid-liveness fixtures deterministic under load by @thymikee in #1556
- feat: keep replay session active on request by @thymikee in #1554
- fix(daemon): reject unarmed close --save-script before teardown by @thymikee in #1558
- fix(ios): keyboard-dismiss content settle race (#1542) — partial, defect 2 needs a decision by @thymikee in #1559
- fix: read Android get text from target field by @thymikee in #1561
- fix(ios): double-check off-screen click refusals against a direct element read by @thymikee in #1566
- fix(daemon): distrust post-gesture stability that matches the pre-gesture baseline by @thymikee in #1563
- fix: restrict project config trust by @thymikee in #1565
- docs: add security policy by @thymikee in #1568
- feat: verify device cloud connections by @thymikee in #1564
New Contributors
- @leovarmak made their first contribution in #1544
Full Changelog: v0.20.3...v0.20.4