Skip to content

v0.20.4

Choose a tag to compare

@thymikee thymikee released this 03 Aug 15:03
· 700 commits to main since this release

Highlights

  • Continue interactively after replay. Native .ad replays support --keep-session and SDK keepSession, allowing agents to suppress a terminal close and 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. connect validates 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

Full Changelog: v0.20.3...v0.20.4