mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
e70fac7b44
The capability matrix admitted `viewport` on every Apple simulator and device while no Apple interactor implements `setViewport`, so the command was routed to the device and only rejected inside dispatch with the backend-shaped "viewport is not supported by this backend". Nothing can serve it there: Apple screen geometry is fixed by the selected device type and neither simctl nor XCTest exposes a resize primitive, so viewport is a web-surface contract (its CLI summary and docs already say so). Deny it in the descriptor's capability facet, matching the adjacent Android denial, and give the Apple family an unsupported hint that names the surface that does support it. Admission now fails before the request reaches the device: "viewport is not supported on this device" with supportedOn: web. The iOS simulator coverage manifest's known-gap row becomes a capability-denial row owned by the static coverage test, which retires the whole known-gap level and the `full:known-gaps` live scenario that existed only to pin this failure. Closes #1407
6.0 KiB
6.0 KiB
Changelog
Unreleased
viewportis now rejected during capability admission on Apple targets instead of reaching the device and failing inside dispatch. No Apple backend can resize a screen — simulator and device geometry is fixed by the selected device type — soviewporton iOS/iPadOS/tvOS/macOS now fails withUNSUPPORTED_OPERATION,viewport is not supported on this device, and a hint pointing at--platform weband at picking a different simulator.capabilitiesno longer advertisesviewporton Apple targets. Web viewport resizing (agent-device viewport 1280 900 --platform web) is unchanged, and Android was already denied.--save-scriptis now accepted only by the commands that declare it —open,close, andreplay. A hand-built daemon request (or abatchstep) that setsaveScripton any other command, such asrecordortrace, used to arm script publication and could write a.adartifact; it is now rejected withINVALID_ARGSbefore the request reaches admission, the device, or any handler. CLI, Node, and MCP usage of--save-scripton its documented commands is unchanged.diff screenshotno longer runs the retired best-effort OCR and non-text analyzers. Their optionalocrandnonTextDeltasfields remain in the result type for source compatibility but are no longer emitted; use the baseline/current images and diff artifact with vision for qualitative interpretation.- Breaking: removed the deprecated
--session-lockedand--session-lock-conflictsflags. Use--session-lock reject|stripinstead; passing either old flag now fails withUnknown flag: ... Use --session-lock reject|strip instead. - Breaking: removed the
replay export --formatflag.replay exportalways writes Maestro YAML. - Breaking: removed the unused
LeaseAllocatePayload,LeaseHeartbeatPayload, andLeaseReleasePayloadtype exports fromagent-device/contracts. Lease request metadata is fully described byDaemonRequestMeta. - Maestro compat:
assertVisibleandassertNotVisiblenow acceptchildOffor ancestor scoping, matchingtapOn(#1294). - Breaking: removed deprecated gesture duration and rotate velocity inputs (#1218).
swipe x1 y1 x2 y2no longer accepts a trailingdurationMspositional; usegesture pan x1 y1 (x2-x1) (y2-y1) durationMsfor deliberate timed drags.- Maestro
swipeoperations with a duration continue to normalize togesture panwith theendpoint-holdexecution profile, preserving the Maestro-compatible fast-swipe-then-hold behavior on iOS. gesture fling direction x yno longer accepts a trailingdurationMspositional; usegesture panfor timed movement.gesture swipe presetno longer accepts a trailingdurationMspositional; usegesture panfor timed movement.gesture rotate degrees [x] [y]no longer accepts a trailingvelocitypositional; rotation pacing is derived fromdegrees.- MCP/Node schemas no longer advertise
velocityordurationMsonswipe/fling/gesture swipe;durationMsremains ongesture panandgesture transform. - A
.adscript that still carries a removed positional now fails when the script is parsed, before the replay executes any device action, naming the line and its rewrite (for exampleswipe accepts 4 arguments: x1 y1 x2 y2 (line 6). The trailing durationMs positional was removed: use "gesture pan 197 650 0 -350 300" ...). Previously the script ran up to that step and then failed as a replay divergence. - Published the gesture migration guide covering CLI, Node.js, MCP, and saved
.adrecordings, plus the deprecation policy the next such removal follows (#1216). replay exportnow writes an explicitduration: 100forswipe— the canonical fling duration — instead of omitting it and letting Maestro apply its own 400ms default. Maestro flows replayed byagent-deviceare unaffected; a timed Maestroswipestill normalizes togesture panwith theendpoint-holdprofile.
- Breaking: the deprecated
rotateCLI command alias has been removed. Useorientationinstead; invokingrotatenow fails withrotate was renamed to orientation; for the two-finger gesture use: gesture rotate. - Breaking (ADR 0014, session ref-frame lifetime): a mutation through an
@refnow expires the session's ref frame, so a later ref mutation without a fresh observation fails closed with a typeddetails.reason(ref_frame_expired,ref_generation_mismatch,plain_ref_requires_complete_frame, orref_not_issued) instead of acting on a possibly-navigated screen. A ref-oriented sequence that performs several mutations must re-snapshotbetween them, consume an honestly issued--settleref in pinned@eN~s<gen>form, or use selectors. Enforcement applies on every platform, not just iOS. Legacy hand-written.adscripts that reuse several bare refs from one snapshot must capture between mutations or use selectors. - Ref reads resolve against the authorized ref frame's source tree, so an internal read-only capture (including Android freshness) can no longer retarget an admitted
@refby positional coincidence. Read-only ref consumers keep the structured staleness warning while the frame retains the ref's evidence.
0.15.0
- Breaking:
appsdiscovery and public app-list helpers now default to user-installed apps. Use--allorfilter: 'all'to include system/OEM apps. - Breaking: removed the
agent-device/android-appspublic subpath. Use the Android app helpers fromagent-device/android-adb. - Breaking: removed the
agent-device/daemonpublic subpath. Useagent-device/contractsfor daemon request/response types. - Breaking: removed public local ADB bypass/selection helpers such as
spawnAndroidAdbBySerialandresolveAndroidAdbProvider; usecreateLocalAndroidAdbProvider(device)or pass providers directly to the helpers fromagent-device/android-adb. - Added Android ADB provider helpers for exec, stream, clipboard, keyboard, app lifecycle, logcat, and port reverse workflows.