agent-device 0.21.21 → 0.21.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ c271cf2448728e2b10c51e132ea9393d1fdc4696578febcd361f6a6470b74b89 agent-device-android-ime-helper-0.21.22.apk
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "android-ime-helper",
3
- "version": "0.21.21",
4
- "assetName": "agent-device-android-ime-helper-0.21.21.apk",
5
- "sha256": "c9398faaf3bd6f4f7870e074d870d93c00892c849a8f523224a4b7705759edde",
3
+ "version": "0.21.22",
4
+ "assetName": "agent-device-android-ime-helper-0.21.22.apk",
5
+ "sha256": "c271cf2448728e2b10c51e132ea9393d1fdc4696578febcd361f6a6470b74b89",
6
6
  "packageName": "com.callstack.agentdevice.imehelper",
7
- "versionCode": 21021,
7
+ "versionCode": 21022,
8
8
  "serviceComponent": "com.callstack.agentdevice.imehelper/.TestInputMethodService",
9
9
  "broadcastProtocol": "android-ime-helper-v1"
10
10
  }
@@ -0,0 +1 @@
1
+ e39e73088e371a3cee63b403f12609eea53acd37c810b0a1241e9c5285ac2c07 agent-device-android-snapshot-helper-0.21.22.apk
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "android-snapshot-helper",
3
- "version": "0.21.21",
4
- "releaseTag": "v0.21.21",
5
- "assetName": "agent-device-android-snapshot-helper-0.21.21.apk",
3
+ "version": "0.21.22",
4
+ "releaseTag": "v0.21.22",
5
+ "assetName": "agent-device-android-snapshot-helper-0.21.22.apk",
6
6
  "apkUrl": null,
7
- "sha256": "afe24440c4392f50bd97c03024f256528699743d0a1bbad342ef163def2212b0",
8
- "checksumName": "agent-device-android-snapshot-helper-0.21.21.apk.sha256",
7
+ "sha256": "e39e73088e371a3cee63b403f12609eea53acd37c810b0a1241e9c5285ac2c07",
8
+ "checksumName": "agent-device-android-snapshot-helper-0.21.22.apk.sha256",
9
9
  "packageName": "com.callstack.agentdevice.snapshothelper",
10
- "versionCode": 21021,
10
+ "versionCode": 21022,
11
11
  "instrumentationRunner": "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation",
12
12
  "minSdk": 23,
13
13
  "targetSdk": 36,
@@ -1,6 +1,6 @@
1
1
  import{$ as e,P as t,T as n,tt as r,w as i}from"./sdk-contracts.js";import{i as a}from"./capture.js";import{O as o}from"./sdk-batch-runner.js";import{c as s,r as c}from"./diagnostics.js";import"./diagnostics2.js";import{O as l,f as ee,k as u,m as d,p as te,y as f}from"./sdk-device.js";import{Ur as ne,ti as re}from"./sdk-batch.js";import{d as ie,i as ae,l as oe}from"./scroll-gesture.js";import{n as p}from"./session.js";import{S as se,T as ce,b as le,m as ue,n as de,r as fe,v as pe,x as me}from"./settings.js";import{c as he,n as ge,t as _e}from"./scroll-command.js";import"./device.js";import{t as ve}from"./device-rotation.js";import{o as m}from"./exec.js";import{a as ye}from"./tv-remote.js";import"./command.js";import{i as be,n as xe}from"./retry.js";import{a as h}from"./gesture-plan.js";import{n as Se}from"./scoped-provider.js";import{n as Ce,r as we}from"./ios-snapshot-planning.js";import{n as Te,r as Ee}from"./ios-system-surface.js";import{a as De,l as Oe,n as ke,s as Ae}from"./quality-warnings.js";import{r as g}from"./ios-snapshot-acquisition.js";import{t as je}from"./png-size.js";import{n as Me}from"./screenshot-density.js";import{i as _,n as Ne,r as v}from"./ios-snapshot-engine.js";import{C as Pe,g as Fe,o as Ie,r as y}from"./host-file.js";import{c as b,f as Le,h as Re,m as ze,p as Be}from"./config.js";import{o as x}from"./tool-provider.js";import{n as S,r as C,t as w}from"./physical-device-control.js";import{i as Ve,n as T,r as E,s as He}from"./runner.js";import{u as Ue}from"./host.js";import{t as We}from"./runner-cache-metadata.js";import{a as D,n as O}from"./simctl.js";import{c as k}from"./runner-client.js";import"./runner-error-classification.js";import{n as Ge,r as Ke,t as A}from"./app-launch.js";import{r as j,t as M}from"./simulator.js";import{c as qe,d as Je,l as Ye,o as Xe,s as Ze,t as Qe,u as $e}from"./helper.js";import{a as et,d as tt,f as nt,p as rt}from"./app-resolution.js";import{i as it,t as at}from"./display-inventory.js";import{t as ot}from"./simctl-settings.js";import{n as st}from"./interactor-types.js";import{r as ct,t as lt}from"./app-backend.js";import{i as ut,r as dt,t as ft}from"./alert.js";import{t as pt}from"./surface-snapshot.js";import{t as mt}from"./ios-target-activation.js";import N from"node:path";async function ht(e){return d(e)?await tt():(j(e,`clipboard`),await M(e),m(await D(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
2
2
  `,`
3
3
  `).replace(/\n$/,``))}async function gt(e,t,n){if(d(e)){await rt(t);return}if(j(e,`clipboard`),f(e)){let r=n?.signal;await M(e,{signal:r}),m(await D(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t,signal:r}),`Failed to write tvOS simulator clipboard`);return}await k(e,{command:`pasteboardWrite`,text:t},n)}function P(e,n){if(!ee(e))throw new t(`UNSUPPORTED_OPERATION`,n.message,{deviceId:e.id,appleOs:l(e),deviceKind:e.kind,reason:n.reason,hint:n.hint})}async function _t(e,t){P(e,fe);let n=me(t);return await D(e,[`ui`,e.id,`content_size`,n]),ce(n,n)}async function vt(e){P(e,fe),await M(e);let n=m(await D(e,[`ui`,e.id,`content_size`],{allowFailure:!0}),`Failed to read iOS content size category`),r=n.stdout.trim(),i=se(r);if(i===void 0)throw new t(`COMMAND_FAILED`,`iOS simulator reported an unknown text size: ${r||`(empty)`}`,{deviceId:e.id,stdout:n.stdout,stderr:n.stderr,hint:"Boot the simulator, or run `xcrun simctl ui <device> content_size` to see what it reports."});return ce(i,r)}const yt=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],bt={0:`hide`,1:`wifi`,6:`3g`,7:`4g`,8:`lte`,9:`lte-a`,10:`lte+`,11:`5g`,12:`5g+`,13:`5g-uwb`,14:`5g-uc`},xt={1:`searching`,2:`failed`,3:`active`},St={0:`notSupported`,1:`searching`,2:`failed`,3:`active`},F=new Set;async function Ct(e){let t=null,n=!1;if(Et(e))n=!0;else try{t=await Dt(e),n=!0}catch(t){Nt(e,`snapshot_failed`,t)}try{(!n||t)&&await Ot(e),await kt(e,yt)}catch(t){Nt(e,`prepare_failed`,t)}return async()=>{await wt(e,n?t:null)}}async function wt(e,t){if(await Ot(e),!t){Tt(e);return}await kt(e,jt(t)),I(e)}function I(e){F.delete(L(e))}function Tt(e){F.add(L(e))}function Et(e){return F.has(L(e))}function L(e){return`${e.platform}:${e.kind}:${e.id}`}async function Dt(e){return At(m(await D(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function Ot(e){await D(e,[`status_bar`,e.id,`clear`])}async function kt(e,t){t.length!==0&&await D(e,[`status_bar`,e.id,`override`,...t])}function At(e){let n={},r=e.split(`
4
- `).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let e of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(e);if(r){let e=Number(r[1]),i=bt[e];if(!i)throw new t(`COMMAND_FAILED`,`Unsupported simulator data network type: ${e}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(e);if(i){let e=xt[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(e);if(a){let e=Number(a[1]),r=St[e];if(!r)throw new t(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${e}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(e);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function jt(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||Mt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Mt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function Nt(e,t,n){c({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...C(n)}})}async function Pt(n,r,i,a,o){if(d(n)){let e=r.toLowerCase();if(e===`appearance`){await nt(i);return}if(e===`permission`){let e=pe(i);if(e===`deny`)throw new t(`INVALID_ARGS`,ue(`permission`));let n=zt(o?.permissionTarget);return await Ze(e,n)}throw new t(`INVALID_ARGS`,ue(r))}j(n,`settings`),await M(n);let s=r.toLowerCase();switch(s){case`clear-app-state`:{if(i.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,e());let r=await Rt(n,a);return{bundleId:r.bundleId,containerPath:r.containerPath,cleared:!0}}case`reset-keychain`:if(i.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await D(n,[`keychain`,n.id,`reset`]),{scope:`simulator`,cleared:!0,message:`Reset the whole iOS simulator keychain. This clears keychain-backed credentials for every installed app, not just the app under test.`};case`wifi`:{let e=le(i)?`active`:`failed`;await D(n,[`status_bar`,n.id,`override`,`--wifiMode`,e]),I(n);return}case`airplane`:le(i)?(await D(n,[`status_bar`,n.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),I(n)):(await D(n,[`status_bar`,n.id,`clear`]),Tt(n));return;case`faceid`:case`touchid`:{P(n,de);let e=s,t=Bt[e];await Ht(n,Vt(i,e),{settingName:e,notificationModality:t.notificationModality});return}case`text-size`:return await _t(n,i);case`appearance`:case`permission`:case`location`:return await ot({runSimctl:e=>D(n,e),udid:n.id,setting:s,state:i,appBundleId:a,options:o});default:throw new t(`INVALID_ARGS`,`Unsupported setting: ${r}`)}}const Ft={"text-size":vt};async function It(e,t){return await Ft[t](e)}const Lt=[`Documents`,`Library/Caches`,`Library/Preferences`,`SystemData`,`tmp`];async function Rt(e,n){if(!te(e)||e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await et(e,n);await M(e),await A(e,r);let i=m(await D(e,[`get_app_container`,e.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!i)throw new t(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let a=await Fe(i);return await Promise.all(a.filter(e=>e!==`.com.apple.mobile_container_manager.metadata.plist`).map(e=>Pe(N.join(i,e)))),await Promise.all(Lt.map(e=>Ie(N.join(i,e)))),{bundleId:r,containerPath:i}}function zt(e){let n=e?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new t(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}const Bt={faceid:{notificationModality:`pearl`},touchid:{notificationModality:`fingerTouch`}};function Vt(e,n){let r=e.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new t(`INVALID_ARGS`,`Invalid ${n} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}async function Ht(e,n,i){let a=O(e,Gt(e.id,n,i.notificationModality)),o=await x(a,{allowFailure:!0}),s=[];if(o.exitCode!==0)s.push({args:a,stderr:o.stderr,stdout:o.stdout,exitCode:o.exitCode});else{let t=Ut(n);if(t!==void 0){let n=await Wt(e);if(n.state===t)return;s.push({args:n.args,stderr:n.stderr,stdout:n.stdout,exitCode:n.exitCode})}else return}throw new t(`COMMAND_FAILED`,`Failed to simulate ${i.settingName}.`,{deviceId:e.id,action:n,setting:i.settingName,attempts:r(s)})}const R=`com.apple.BiometricKit.enrollmentChanged`;function Ut(e){if(e===`enroll`)return`1`;if(e===`unenroll`)return`0`}async function Wt(e){let t=O(e,[`spawn`,e.id,`notifyutil`,`-g`,R]),n=await x(t,{allowFailure:!0}),r=n.stdout.split(`
4
+ `).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let e of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(e);if(r){let e=Number(r[1]),i=bt[e];if(!i)throw new t(`COMMAND_FAILED`,`Unsupported simulator data network type: ${e}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(e);if(i){let e=xt[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(e);if(a){let e=Number(a[1]),r=St[e];if(!r)throw new t(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${e}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(e);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function jt(e){let t=[];return e.dataNetwork&&t.push(`--dataNetwork`,e.dataNetwork),e.wifiMode&&t.push(`--wifiMode`,e.wifiMode),e.wifiBars!==void 0&&(e.dataNetwork===`wifi`||e.wifiMode)&&t.push(`--wifiBars`,e.wifiBars),e.cellularMode&&t.push(`--cellularMode`,e.cellularMode),e.cellularBars!==void 0&&(e.cellularMode||Mt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Mt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function Nt(e,t,n){c({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...C(n)}})}async function Pt(n,r,i,a,o){if(d(n)){let e=r.toLowerCase();if(e===`appearance`){await nt(i);return}if(e===`permission`){let e=pe(i);if(e===`deny`)throw new t(`INVALID_ARGS`,ue(`permission`));let n=zt(o?.permissionTarget);return await Ze(e,n)}throw new t(`INVALID_ARGS`,ue(r))}j(n,`settings`),await M(n);let s=r.toLowerCase();switch(s){case`clear-app-state`:{if(i.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,e());let r=await Rt(n,a);return{bundleId:r.bundleId,containerPath:r.containerPath,cleared:!0}}case`reset-keychain`:if(i.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await D(n,[`keychain`,n.id,`reset`]),{scope:`simulator`,cleared:!0,message:`Reset the whole iOS simulator keychain. This clears keychain-backed credentials for every installed app, not just the app under test.`};case`wifi`:{let e=le(i)?`active`:`failed`;await D(n,[`status_bar`,n.id,`override`,`--wifiMode`,e]),I(n);return}case`airplane`:le(i)?(await D(n,[`status_bar`,n.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),I(n)):(await D(n,[`status_bar`,n.id,`clear`]),Tt(n));return;case`faceid`:case`touchid`:{P(n,de);let e=s,t=Bt[e];await Ht(n,Vt(i,e),{settingName:e,notificationModality:t.notificationModality});return}case`text-size`:return await _t(n,i);case`appearance`:case`permission`:case`location`:return await ot({runSimctl:e=>D(n,e),udid:n.id,deviceId:n.id,setting:s,state:i,appBundleId:a,options:o});default:throw new t(`INVALID_ARGS`,`Unsupported setting: ${r}`)}}const Ft={"text-size":vt};async function It(e,t){return await Ft[t](e)}const Lt=[`Documents`,`Library/Caches`,`Library/Preferences`,`SystemData`,`tmp`];async function Rt(e,n){if(!te(e)||e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await et(e,n);await M(e),await A(e,r);let i=m(await D(e,[`get_app_container`,e.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!i)throw new t(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let a=await Fe(i);return await Promise.all(a.filter(e=>e!==`.com.apple.mobile_container_manager.metadata.plist`).map(e=>Pe(N.join(i,e)))),await Promise.all(Lt.map(e=>Ie(N.join(i,e)))),{bundleId:r,containerPath:i}}function zt(e){let n=e?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new t(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}const Bt={faceid:{notificationModality:`pearl`},touchid:{notificationModality:`fingerTouch`}};function Vt(e,n){let r=e.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new t(`INVALID_ARGS`,`Invalid ${n} state: ${e}. Use match|nonmatch|enroll|unenroll.`)}async function Ht(e,n,i){let a=O(e,Gt(e.id,n,i.notificationModality)),o=await x(a,{allowFailure:!0}),s=[];if(o.exitCode!==0)s.push({args:a,stderr:o.stderr,stdout:o.stdout,exitCode:o.exitCode});else{let t=Ut(n);if(t!==void 0){let n=await Wt(e);if(n.state===t)return;s.push({args:n.args,stderr:n.stderr,stdout:n.stdout,exitCode:n.exitCode})}else return}throw new t(`COMMAND_FAILED`,`Failed to simulate ${i.settingName}.`,{deviceId:e.id,action:n,setting:i.settingName,attempts:r(s)})}const R=`com.apple.BiometricKit.enrollmentChanged`;function Ut(e){if(e===`enroll`)return`1`;if(e===`unenroll`)return`0`}async function Wt(e){let t=O(e,[`spawn`,e.id,`notifyutil`,`-g`,R]),n=await x(t,{allowFailure:!0}),r=n.stdout.split(`
5
5
  `).map(e=>e.trim().split(/\s+/)).find(e=>e[0]===R)?.[1];return{args:t,stderr:n.stderr,stdout:n.stdout,exitCode:n.exitCode,state:n.exitCode===0?r:void 0}}function Gt(e,t,n){let r=[`spawn`,e,`notifyutil`];switch(t){case`match`:return[...r,`-p`,`com.apple.BiometricKit_Sim.${n}.match`];case`nonmatch`:return[...r,`-p`,`com.apple.BiometricKit_Sim.${n}.nomatch`];case`enroll`:return[...r,`-s`,R,`1`,`-p`,R];case`unenroll`:return[...r,`-s`,R,`0`,`-p`,R]}}function Kt(e){let t=e.screenshotMetadata;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t,r=z(n.displayID),i=z(n.pixelWidth),a=z(n.pixelHeight),o=qt(n.pixelsPerPoint);if(r!==void 0&&i!==void 0&&a!==void 0&&o!==void 0)return Object.freeze({displayID:r,pixelWidth:i,pixelHeight:a,pixelsPerPoint:o})}function z(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function qt(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}const Jt={ensureBooted:M,prepareStatusBarForScreenshot:Ct,resolveCaptureTarget:it,captureWithRetry:Qt,normalizeDensity:cn,captureWithRunner:V,shouldFallbackToRunner:on},Yt=new Map,B=new Map;async function Xt(e,t,n={}){return d(e)?(await V(e,t,n.appBundleId,n.fullscreen,n.runnerOptions),{}):e.kind===`simulator`?await Zt(e,t,n):(await w(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:k}),{})}async function Zt(e,n,r={}){if(e.kind!==`simulator`)throw new t(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...Jt,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(e);let{display:a,displayRotation:o}=await i.resolveCaptureTarget(e),s=o?{displayRotation:o}:{},c=async()=>{await i.captureWithRetry(e,n,a),await i.normalizeDensity(e,n,r.pixelDensity,a?.pointScale)},l=async()=>{};if(r.normalizeStatusBar===!0)try{l=await i.prepareStatusBarForScreenshot(e)}catch(t){rn(e,`prepare_failed`,t)}try{try{return await c(),s}catch(t){let n=t;if(r.skipIosSimulatorBootCheck&&sn(t)){await i.ensureBooted(e);try{return await c(),s}catch(e){n=e}}if(!i.shouldFallbackToRunner(n))throw n;nn(e,`simctl_screenshot`,n)}let t=await i.captureWithRunner(e,n,r.appBundleId,r.fullscreen,r.runnerOptions);return await i.normalizeDensity(e,n,r.pixelDensity,t?.pixelsPerPoint),s}finally{await l().catch(t=>rn(e,`restore_failed`,t))}}async function Qt(e,t,n){let r=xe.fromTimeoutMs(Re),i=[`io`,e.id,`screenshot`,...at(n),t];await be(async({deadline:t})=>{await D(e,i,{timeoutMs:Math.max(1e3,t?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Le,maxDelayMs:Be,jitter:.2,shouldRetry:e=>on(e)},{deadline:r,phase:`ios_simulator_screenshot`})}async function V(e,n,r,i,a){if(e.kind===`device`&&!d(e)){await w(e).captureScreenshot(e,n,{appBundleId:r,fullscreen:i,runnerOptions:a,preferRunner:!0,runRunnerCommand:k});return}let o=await k(e,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},a),s=o.message;if(!s)throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);let c=Kt(o);if(d(e))return await y(s,n),c;if(e.kind===`simulator`)return await $t(e,s,n),c;throw new t(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function $t(e,n,r){let i=xe.fromTimeoutMs(b),a=`Unable to locate runner container for simulator screenshot`,o=B.get(e.id);if(o){let t=await en(o,n,r);if(t.copied)return;a=t.error,B.delete(e.id)}for(let t of We){let o=await D(e,[`get_app_container`,e.id,t,`data`],{allowFailure:!0,timeoutMs:tn(i,b,`runner screenshot container lookup`)});if(o.exitCode!==0){let e=o.stderr.trim();e&&(a=e);continue}let s=o.stdout.trim();if(!s){a=`simctl get_app_container returned empty output`;continue}let c=await en(s,n,r);if(c.copied){B.set(e.id,s);return}a=c.error}throw new t(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function en(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of an(e,t))try{return await y(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function tn(e,n,r){let i=e.remainingMs();if(i>0)return i;throw new t(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function nn(e,t,n){let r=C(n);c({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function rn(e,t,n){c({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...C(n)}})}function an(e,t){let n=N.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=N.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(N.join(n,s)),N.isAbsolute(r)&&o(N.normalize(r)),c.startsWith(`tmp/`))o(N.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(N.join(n,t))}}let l=N.basename(r);return l&&o(N.join(n,`tmp`,l)),i}function on(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=S(e);return n.includes(`timeout waiting for screen surfaces`)||n.includes(`nsposixerrordomain`)&&n.includes(`code=60`)&&n.includes(`screenshot`)||n.includes(`timed out`)&&n.includes(`screenshot`)}function sn(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=S(e);return n.includes(`not booted`)||n.includes(`current state: shutdown`)||n.includes(`current state is shutdown`)||n.includes(`current state=shutdown`)||n.includes(`state: shutdown`)||n.includes(`state=shutdown`)}async function cn(e,t,n,r){let i=r??await ln(e),a=Me(await je(t),i,n);a&&await De(t,a.width,a.height)}async function ln(e){let n=Yt.get(e.id);if(n!==void 0)return n;let r=await D(e,[`getenv`,e.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:ze}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new t(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return Yt.set(e.id,i),i}function un(e){return!(e instanceof t)||e.details?.runnerErrorCode!==`SCROLL_KEYBOARD_OCCLUDES_SURFACE`?e:new t(e.code,e.message,{...e.details,...ae})}function dn(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:_e},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function H(e,t,n,r={includeDuration:!0}){let i=U(e.referenceWidth),a=U(e.referenceHeight);if(i===void 0||a===void 0)return W(e,{amount:n?.amount});let o=ie({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return W(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function fn(e,t={}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t.includeDuration!==!1&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{},...t.includeReleaseBehavior!==!1&&e?.releaseBehavior!==void 0?{scrollReleaseBehavior:e.releaseBehavior}:{}}}function U(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function W(e,t){let{x1:n,y1:r,x2:i,y2:a}=mn(e),o=U(e.referenceWidth),s=U(e.referenceHeight),c=pn(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0),l=U(e.keyboardMinY);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...e.keyboardAvoided===!0?{keyboardAvoided:!0}:{},...l===void 0?{}:{keyboardMinY:l},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function pn(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function mn(e){let t=U(e.x),n=U(e.y),r=U(e.x2),i=U(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function hn(e,t,n,r,i,a){return H(await e(t,{command:`desktopScroll`,direction:i,...fn(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function G(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function gn(e){return e===`system`?`backSystem`:`backInApp`}function _n(e,t){let n={signal:t.signal,verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await k(e,q(e,t,r,i),n),pressPoint:async(r,i)=>await vn(e,t,n,r,i),tapElementSelector:async r=>await k(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...u(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await k(e,T([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return E(a),a},appState:async()=>Cn(await k(e,{command:`appState`,appBundleId:t.appBundleId},n)),longPress:async(r,i,a)=>await k(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await k(e,q(e,t,r,i),n),type:async(r,i)=>Sn(await k(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
6
6
  `?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await k(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,...s?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},appBundleId:t.appBundleId},n),scroll:async(r,i)=>await On(k,e,t,n,r,i),performGesture:async r=>await En(e,t,n,r),gestureViewport:async()=>Tn(await k(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function vn(e,t,n,r,i){let a=d(e)?p(i.surface,`xctest`):void 0;return a?await yn(t,r,i,a):i.button===`primary`?i.count===1?await xn(e,t,n,r,i):await Ve(e,r,i,t.appBundleId,async t=>await k(e,t,n)):await bn(e,t,n,r,i.button)}async function yn(e,n,r,i){if(r.button!==`primary`)throw new t(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${i} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.n),o=await a(n.x,n.y,{bundleId:e.appBundleId,surface:i,holdMs:r.holdMs,clicks:r.count,doubleClick:r.doubleTap,intervalMs:r.intervalMs,signal:e.signal});return o.holdMs===void 0?{}:{holdMs:o.holdMs}}async function bn(e,t,n,r,i){return await k(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function xn(e,t,n,r,i){if(i.doubleTap){let i=await k(e,T([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return E(i),i}return i.holdMs>0?await k(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await k(e,q(e,t,r.x,r.y),n)}function Sn(e){let t=e.textEntryRoute;return wn(t)?{textEntryRoute:t}:{}}function Cn(e){let t=e.applicationState;return i(t)?{applicationState:t}:{}}function wn(e){return typeof e==`string`&&st.includes(e)}function Tn(e){let n=K(e.x),r=K(e.y),i=K(e.x2),a=K(e.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new t(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function K(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function En(e,t,n,r){if(r.topology===`two`&&ct(e,r.intent),r.topology===`single`&&d(e)){let{start:i,end:a}=h(r);return await k(e,{command:`drag`,x:i.x,y:i.y,x2:a.x,y2:a.y,durationMs:r.durationMs,appBundleId:t.appBundleId},n)}if(r.topology===`single`&&f(e)){let{start:i,end:a}=h(r);return await k(e,{command:`swipe`,direction:Dn(i,a),appBundleId:t.appBundleId},n)}return await k(e,{command:`gesture`,gesturePlan:r,appBundleId:t.appBundleId},n)}function Dn(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.abs(n)>=Math.abs(r)?n>=0?`right`:`left`:r>=0?`down`:`up`}function q(e,t,n,r){return{command:`tap`,x:n,y:r,...u(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}async function On(e,t,n,r,i,a){if(he(a?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ge}`}),f(t))return W(await e(t,G(i,n.appBundleId,a?.durationMs),r),{amount:a?.amount,durationMs:a?.durationMs});if(oe(a??{}),d(t))return await hn(e,t,n,r,i,a);let o=dn(a),s;try{s=await e(t,{command:`scroll`,direction:i,...fn(o),appBundleId:n.appBundleId},r)}catch(e){throw un(e)}return H(s,i,o)}const kn=p(`app`,`native`),An=`The native macOS app backend acts through accessibility actions only. Unset AGENT_DEVICE_MACOS_APP_BACKEND to drive this app with XCTest.`,jn=new Set(Qe);function Mn(e,t){let n=()=>{if(t.appBundleId)return t.appBundleId;throw J(`an action on a session that names no app`)},r=async(e,r={})=>Nn(await Y(qe(e.x,e.y,{surface:kn,bundleId:n(),clicks:r.count,intervalMs:r.intervalMs,signal:t.signal})));return{open:e.open,openDevice:e.openDevice,close:e.close,screenshot:e.screenshot,snapshot:e.snapshot,readTextAtPoint:e.readTextAtPoint,readClipboard:e.readClipboard,writeClipboard:e.writeClipboard,setSetting:e.setSetting,readAlert:e.readAlert,awaitAlert:e.awaitAlert,acceptAlert:e.acceptAlert,dismissAlert:e.dismissAlert,tap:async(e,t)=>await r({x:e,y:t}),pressPoint:async(t,n)=>{if(n.surface!==void 0&&n.surface!==`app`)return await e.pressPoint(t,n);if(n.button!==`primary`)throw J(`${n.button} click`);if(n.doubleTap)throw J(`double-click`);if(n.holdMs>0)throw J(`press and hold`);return await r(t,n)},longPress:async()=>{throw J(`press and hold`)},focus:async(e,t)=>await r({x:e,y:t}),type:async(e,r)=>{await Y(Je(e,{bundleId:n(),delayMs:r,signal:t.signal}))},fill:async(e,r,i)=>Nn(await Y(Xe(e,r,i,{bundleId:n(),signal:t.signal}))),scroll:async(e,r)=>{oe(r??{});let i=await Y($e(e,{bundleId:n(),amount:r?.amount,pixels:r?.pixels,signal:t.signal}));return{...H(i,e,r,{includeDuration:!1}),mechanism:i.mechanism}},back:async()=>{throw J(`back`)},setOrientation:async()=>{throw J(`orientation`)}}}function Nn(e){return{mechanism:e.mechanism,...e.windowTitle===void 0?{}:{windowTitle:e.windowTitle}}}function J(e){return new t(`UNSUPPORTED_OPERATION`,`${e} is not supported by the native macOS app backend.`,{reason:`unsupported-device-backend`,hint:An})}async function Y(e){try{return await e}catch(e){if(!(e instanceof t))throw e;let n=e.details?.reason;throw typeof n!=`string`||!jn.has(n)?e:new t(`UNSUPPORTED_OPERATION`,e.message,{...e.details,reason:`unsupported-device-backend`,helperReason:n,hint:An},e)}}const Pn={0:`unknown`,1:`notRunning`,2:`runningBackgroundSuspended`,3:`runningBackground`};function Fn(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return;let r={...e},i=r.reason;if(!n(i))return;let a=r.priorState;if(typeof a!=`number`||!Number.isInteger(a))return;let o=Pn[a];o===void 0&&t?.({reason:i,rawPriorState:a});let s=r.otherActiveApplicationPid;return{reason:i,priorState:o??`unknown`,...typeof s==`number`&&Number.isInteger(s)&&s>0?{otherActiveApplicationPid:s}:{}}}function In(e){let t=Ln(e.systemSurface),n=o(e.keyboard),r=Fn(e.targetActivation,e=>Ue({level:`debug`,phase:`ios_runner_target_activation_prior_state_unmapped`,data:e}));return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:Oe(e.snapshotQuality),qualityPayload:Vn(e.qualityPayload,t),runnerFatal:e.runnerFatal===!0,...n?{keyboard:n}:{},...t?{systemSurface:t}:{},...r?{targetActivation:r}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function Ln(e){if(!X(e)||typeof e.bundleId!=`string`)return;let t=Ee(e.bundleId);return t&&{bundleId:t.bundleId,kind:t.kind}}function Rn(e,t,n){let r=n.nodes??[],i=Hn(r,n.qualityPayload?.nodes);if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return{nodes:r};let a=we({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),o={stage:`presented`,presentation:{producer:`apple-runner`,intent:`full`,payload:{nodes:r,truncated:n.truncated??!1,...n.quality?.effectiveDepth===void 0?{}:{effectiveDepth:n.quality.effectiveDepth}},...n.qualityPayload?{qualityPayload:n.qualityPayload}:{}},validation:{presentationKey:Ce(a),viewport:i,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{let e=Ne(o,a),t=re(e.validatedViewport);return{nodes:e.nodes,...t?{viewport:t}:{}}}catch(e){zn(e,n)}}function zn(e,n){let r=n.quality;if(e instanceof v&&Ae(r))throw new t(`COMMAND_FAILED`,e.message,{..._(e),...n.systemSurface?{systemSurface:n.systemSurface}:{},snapshotQuality:{state:r.state,backend:r.backend,...r.reason?{reason:r.reason}:{},...r.reasonCode?{reasonCode:r.reasonCode}:{}},hint:Bn(n.systemSurface,r)},e);Z(e,n.systemSurface)}function Bn(e,t){return[e?`${e.bundleId} hosts the surface presented over the app, and this capture targeted that surface.`:void 0,...ke(t,[])].filter(e=>e!==void 0).join(` `)}function Vn(e,t){if(e!==void 0)return(!X(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new v(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`),t),e.scope!==void 0&&e.scope!==null&&Z(new v(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`}),t),{nodes:e.nodes,truncated:e.truncated,scope:null}}function Hn(e,t){return g(Un(t),{fallbackToLargestRoot:!0})??g(Un(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function Un(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(e,n){throw e instanceof v?new t(`COMMAND_FAILED`,e.message,{..._(e),...n?{systemSurface:n}:{}},e):e}function Wn(e,n,r){if(e.appleOs===`watchos`)throw new t(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:i,runnerOpts:a}=_n(e,n),o=d(e)?lt():`xctest`,s=t=>d(e)?p(t,o):void 0,c={open:(t,n)=>Ge(e,t,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:a}),openDevice:()=>Ke(e),close:t=>A(e,t,a),screenshot:(t,n)=>tr(e,t,n,a,s(n?.surface)),snapshot:async t=>await Gn(e,t,a,s(t?.surface)),readTextAtPoint:async(t,n)=>{let r=s(n?.surface);return r?await nr(t,r,n?.appBundleId,n?.signal):await rr(e,t,n,a)},findText:async(t,n)=>({found:(await k(e,{command:`findText`,text:t,appBundleId:n?.appBundleId},n?.signal?{...a,signal:n.signal}:a))?.found===!0}),back:async t=>{if(f(e)){await k(e,G(`menu`,n.appBundleId),a);return}await k(e,{command:gn(t),appBundleId:n.appBundleId},a)},home:async()=>{if(f(e)){await k(e,G(`home`,n.appBundleId),a);return}await k(e,{command:`home`,appBundleId:n.appBundleId},a)},setOrientation:async r=>{let i=$n(await k(e,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},a));if(i!==r)throw new t(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await k(e,{command:`appSwitcher`,appBundleId:n.appBundleId},a)},actionButton:async()=>{await k(e,{command:`actionButton`,appBundleId:n.appBundleId},a)},tvRemote:async(t,r)=>{await k(e,G(ye(t),n.appBundleId,r),a)},keyboardDismiss:async()=>{let t=await k(e,{command:`keyboardDismiss`,appBundleId:n.appBundleId},a);return{kind:`mechanism`,wasVisible:Q(t,`wasVisible`),dismissed:Q(t,`dismissed`),visible:Q(t,`visible`),mechanism:Qn(t,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let t=await k(e,{command:`keyboardReturn`,appBundleId:n.appBundleId},a);return{kind:`visibility-echo`,visible:Q(t,`visible`),wasVisible:Q(t,`wasVisible`)}},readClipboard:()=>ht(e),writeClipboard:t=>gt(e,t,a),setSetting:(t,n,r,i)=>Pt(e,t,n,r,i),readSetting:t=>It(e,t),readAlert:t=>ut(e,a,t),awaitAlert:t=>dt(e,a,t),acceptAlert:t=>ft(e,a,`accept`,t),dismissAlert:t=>ft(e,a,`dismiss`,t),...i},l=o===`native`?Mn(c,n):c;return r?er(e,n,l,r):l}async function Gn(e,t,n,r){return r?await pt({...t,surface:r},t?.signal):await Kn(e,t,n)}async function Kn(e,t,n){let r=In(await s(`snapshot_capture`,async()=>await k(e,{command:`snapshot`,appBundleId:t?.appBundleId,interactiveOnly:t?.interactiveOnly,preferredBackend:t?.preferredBackend,customActions:t?.customActions,depth:t?.depth,scope:t?.scope,raw:t?.raw},Zn(n,t?.signal)),{backend:`xctest`}));qn(e,t,r);let i=Jn(r),a=Yn(e,t,r);return{nodes:a.nodes,truncated:r.truncated??!1,backend:`xctest`,producer:`apple-runner`,...a.viewport?{viewport:a.viewport}:{},...r.quality?{quality:r.quality}:{},...r.systemSurface?{systemSurface:r.systemSurface}:{},...r.keyboard?{keyboard:r.keyboard}:{},...r.targetActivation?{targetActivation:r.targetActivation}:{},...i.length>0?{warnings:i}:{}}}function qn(e,n,r){if(!((r.nodes?.length??0)>0)&&!Xn(n,r.quality)&&e.kind===`simulator`)throw new t(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`)}function Jn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(Te(e.systemSurface.bundleId)),e.targetActivation&&t.push(mt(e.targetActivation)),t}function Yn(e,t,n){return d(e)?{nodes:n.nodes??[]}:Rn(e.id,t,n)}function Xn(e,t){return ne(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Zn(e,t){return t?{...e,signal:e.signal?AbortSignal.any([e.signal,t]):t}:e}function Q(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Qn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function $n(e){let n=e.orientation;if(typeof n==`string`&&ve.includes(n))return n;throw new t(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function er(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),setSetting:async()=>$(`setSetting`),readSetting:async()=>$(`readSetting`)};return Se(i,n=>He(r,{deviceId:e.id,requestId:t.requestId},n))}function $(e){throw new t(`UNSUPPORTED_OPERATION`,`${e} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${e} implementation.`)}async function tr(e,n,r={},i,o){if(o){if(r.fullscreen)throw new t(`INVALID_ARGS`,`screenshot --fullscreen is not accepted on the macOS ${o} surface: its capture frame is fixed`,{reason:a.macOsHelperSurfaceFixedFrame,surface:o});return await Ye(n,{surface:o,...o===`app`?{bundleId:r.appBundleId}:{},signal:i.signal}),{}}return r.captureBackend===`runner`?(await V(e,n,r.appBundleId,r.fullscreen,i),{}):await Xt(e,n,{appBundleId:r.appBundleId,pixelDensity:r.pixelDensity,fullscreen:r.fullscreen,runnerOptions:i,normalizeStatusBar:r.normalizeStatusBar,skipIosSimulatorBootCheck:r.skipIosSimulatorBootCheck})}async function nr(e,t,n,r){let{runMacOsReadTextAction:i}=await import(`./helper.js`).then(e=>e.n);return(await i(e.x,e.y,{bundleId:n,surface:t,signal:r})).text}async function rr(e,t,n,r){let i=await k(e,{command:`readText`,x:t.x,y:t.y,appBundleId:n?.appBundleId},n?.signal?{...r,signal:n.signal}:r);return typeof i.text==`string`?i.text:typeof i.message==`string`?i.message:void 0}export{Wn as createAppleInteractor};
@@ -1 +1 @@
1
- async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.21`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
1
+ async function e(e,n,r){try{await t(e,n,r)}catch(e){r.stderr(`${e instanceof Error?e.message:String(e)}\n`),await(await n.processExit()).exitAfterFlush(1)}}async function t(e,t,l){if(e.length===0)return await n(t,l);if(o(e))return await r(t,l);let u=c(e);if(u!==void 0)return await i(u,e,t,l);if(s(e))return await(await t.mcp()).runAgentDeviceMcpServer();await a(e,t)}async function n(e,t){t.stdout(`${(await e.help()).buildUsageText()}\n`),await(await e.processExit()).exitAfterFlush(1)}async function r(e,t){t.stdout(`${t.bundledVersion??(await e.version()).readVersion()}\n`)}async function i(e,t,n,r){let i=await n.help(),o=e===null?`${i.buildUsageText()}\n`:i.resolveHelpTargetUsageText(e);if(o===null)return await a(t,n);r.stdout(o)}async function a(e,t){await(await t.cli()).runCliProcess(e)}function o(e){return e.length===1&&(e[0]===`--version`||e[0]===`-V`)}function s(e){return e[0]===`mcp`&&!e.some(l)}function c(e){let[t,n]=e;if(e.length===1)return t===`help`||l(t)?null:void 0;if(e.length===2)return t===`help`?n:l(n)?t:void 0}function l(e){return e===`--help`||e===`-h`}e(process.argv.slice(2),{help:()=>import(`../cli-help.js`).then(e=>e.n),cli:()=>import(`../process-entry.js`),mcp:()=>import(`../server.js`),version:()=>import(`../version.js`).then(e=>e.t),processExit:()=>import(`../process-exit.js`)},{bundledVersion:`0.21.22`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
@@ -1 +1 @@
1
- import{$ as e,P as t}from"./sdk-contracts.js";async function n(e,n,a,o,s){let c=n.toLowerCase();switch(c){case`appearance`:case`permission`:case`location`:return await e.dependencies.ios.applySimctlSetting({runSimctl:t=>r(e,t),udid:`booted`,setting:c,state:a,appBundleId:o===void 0?void 0:await e.dependencies.ios.resolveAppAlias(o),options:s});case`clear-app-state`:return await i(e,a,o);default:throw new t(`UNSUPPORTED_OPERATION`,`Limrun iOS direct sessions support appearance, permission, location, and clear-app-state settings, not ${n}.`,{command:`settings`})}}async function r(e,n){let r=await e.client.simctl(n).wait();if(r.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS simctl exited with code ${r.code}`,{args:n,exitCode:r.code,stdout:r.stdout,stderr:r.stderr});return r}async function i(n,r,i){if(r.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!i)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,e());let a=await n.dependencies.ios.resolveAppAlias(i);try{await n.client.softReset(a,{strategy:`data`}),await n.client.terminateApp(a)}catch(e){throw e instanceof t?e:new t(`COMMAND_FAILED`,`Limrun iOS could not clear app state.`,{setting:`clear-app-state`,bundleId:a},e)}return{bundleId:a,cleared:!0}}export{n as setLimrunIosSetting};
1
+ import{$ as e,P as t}from"./sdk-contracts.js";async function n(e,n,a,o,s){let c=n.toLowerCase();switch(c){case`appearance`:case`permission`:case`location`:return await e.dependencies.ios.applySimctlSetting({runSimctl:t=>r(e,t),udid:`booted`,deviceId:e.device.id,setting:c,state:a,appBundleId:o===void 0?void 0:await e.dependencies.ios.resolveAppAlias(o),options:s});case`clear-app-state`:return await i(e,a,o);default:throw new t(`UNSUPPORTED_OPERATION`,`Limrun iOS direct sessions support appearance, permission, location, and clear-app-state settings, not ${n}.`,{command:`settings`})}}async function r(e,n){let r=await e.client.simctl(n).wait();if(r.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS simctl exited with code ${r.code}`,{args:n,exitCode:r.code,stdout:r.stdout,stderr:r.stderr});return r}async function i(n,r,i){if(r.toLowerCase()!==`clear`)throw new t(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!i)throw new t(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`,e());let a=await n.dependencies.ios.resolveAppAlias(i);try{await n.client.softReset(a,{strategy:`data`}),await n.client.terminateApp(a)}catch(e){throw e instanceof t?e:new t(`COMMAND_FAILED`,`Limrun iOS could not clear app state.`,{setting:`clear-app-state`,bundleId:a},e)}return{bundleId:a,cleared:!0}}export{n as setLimrunIosSetting};
@@ -1 +1 @@
1
- import{$ as e,P as t}from"./sdk-contracts.js";import{_ as n,b as r,v as i,y as a}from"./settings.js";import{n as o}from"./location-coordinates.js";async function s(e){switch(e.setting){case`appearance`:return await c(e);case`permission`:return await l(e);case`location`:return await u(e)}}async function c({runSimctl:e,udid:r,state:i}){let a=n(i),o;if(a===`toggle`){let n=await e([`ui`,r,`appearance`]),i=m(n.stdout,n.stderr);if(!i)throw new t(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:n.stdout,stderr:n.stderr});o=i===`dark`?`light`:`dark`}else o=a;await e([`ui`,r,`appearance`,o])}async function l(e){let{runSimctl:t,udid:n,state:r,options:a}=e,o=d(e),s=i(r),c=s===`deny`?`revoke`:s,l=p(a?.permissionTarget,a?.permissionMode);try{await t([`privacy`,n,c,l,o])}catch(e){throw h(e)?g(c,l,o,n,e):e}}async function u(e){let{runSimctl:t,udid:n,state:i,options:a}=e;if(i.toLowerCase()===`set`){let{latitude:e,longitude:r}=o(a);return await t([`location`,n,`set`,`${e},${r}`]),{latitude:e,longitude:r}}await t([`privacy`,n,r(i)?`grant`:`revoke`,`location`,d(e)])}function d({setting:n,appBundleId:r}){if(r)return r;throw new t(`INVALID_ARGS`,`${n} setting requires an active app in session`,e())}const f={all:`all`,camera:`camera`,microphone:`microphone`,contacts:`contacts`,"contacts-limited":`contacts-limited`,notifications:`notifications`,calendar:`calendar`,location:`location`,"location-always":`location-always`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`};function p(e,n){let r=a(e);if(r===`photos`){let e=n?.trim().toLowerCase();if(!e||e===`full`)return`photos`;if(e===`limited`)return`photos-add`;throw new t(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}if(n?.trim())throw new t(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);return f[r]}function m(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}function h(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=String(e.details?.stderr??``).toLowerCase();return/failed to (set|grant|revoke|reset) access/.test(n)&&n.includes(`operation not permitted`)}function g(e,n,r,i,a){return e===`reset`?new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support resetting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:`Use reinstall to force a fresh prompt, or reset simulator content and settings.`},a):new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:"Privacy support varies by Xcode runtime: run `xcrun simctl privacy help` for its documented services, or use the `all` target, which applies the action to every service this runtime can change."},a)}export{s as t};
1
+ import{$ as e,P as t}from"./sdk-contracts.js";import{_ as n,b as r,v as i,y as a}from"./settings.js";import{n as o}from"./location-coordinates.js";async function s(e){switch(e.setting){case`appearance`:return await c(e);case`permission`:return await l(e);case`location`:return await u(e)}}async function c({runSimctl:e,udid:r,state:i}){let a=n(i),o;if(a===`toggle`){let n=await e([`ui`,r,`appearance`]),i=m(n.stdout,n.stderr);if(!i)throw new t(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:n.stdout,stderr:n.stderr});o=i===`dark`?`light`:`dark`}else o=a;await e([`ui`,r,`appearance`,o])}async function l(e){let{runSimctl:t,udid:n,deviceId:r,state:a,options:o}=e,s=d(e),c=i(a),l=c===`deny`?`revoke`:c,u=p(o?.permissionTarget,o?.permissionMode);try{await t([`privacy`,n,l,u,s])}catch(e){throw h(e)?g(l,u,s,r,e):e}}async function u(e){let{runSimctl:t,udid:n,state:i,options:a}=e;if(i.toLowerCase()===`set`){let{latitude:e,longitude:r}=o(a);return await t([`location`,n,`set`,`${e},${r}`]),{latitude:e,longitude:r}}await t([`privacy`,n,r(i)?`grant`:`revoke`,`location`,d(e)])}function d({setting:n,appBundleId:r}){if(r)return r;throw new t(`INVALID_ARGS`,`${n} setting requires an active app in session`,e())}const f={all:`all`,camera:`camera`,microphone:`microphone`,contacts:`contacts`,"contacts-limited":`contacts-limited`,notifications:`notifications`,calendar:`calendar`,location:`location`,"location-always":`location-always`,"media-library":`media-library`,motion:`motion`,reminders:`reminders`,siri:`siri`};function p(e,n){let r=a(e);if(r===`photos`){let e=n?.trim().toLowerCase();if(!e||e===`full`)return`photos`;if(e===`limited`)return`photos-add`;throw new t(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}if(n?.trim())throw new t(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);return f[r]}function m(e,t){let n=/\b(light|dark|unsupported|unknown)\b/i.exec(`${e}\n${t}`);if(!n)return null;let r=n[1]?.toLowerCase();return r===`dark`?`dark`:r===`light`?`light`:null}function h(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=String(e.details?.stderr??``).toLowerCase();return/failed to (set|grant|revoke|reset) access/.test(n)&&n.includes(`operation not permitted`)}function g(e,n,r,i,a){return e===`reset`?new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support resetting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:`Use reinstall to force a fresh prompt, or reset simulator content and settings.`},a):new t(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting ${n} permission via simctl privacy on this runtime.`,{deviceId:i,appBundleId:r,hint:"Privacy support varies by Xcode runtime: run `xcrun simctl privacy help` for its documented services, or use the `all` target, which applies the action to every service this runtime can change."},a)}export{s as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-device",
3
- "version": "0.21.21",
3
+ "version": "0.21.22",
4
4
  "description": "Mobile app automation and verification for AI coding agents. CLI, MCP server, and typed Node.js API for iOS, Android, HarmonyOS, TV, web, macOS, and Linux.",
5
5
  "mcpName": "io.github.callstack/agent-device",
6
6
  "license": "MIT",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/callstack/agent-device",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.21.21",
10
+ "version": "0.21.22",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "agent-device",
15
- "version": "0.21.21",
15
+ "version": "0.21.22",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -1 +0,0 @@
1
- c9398faaf3bd6f4f7870e074d870d93c00892c849a8f523224a4b7705759edde agent-device-android-ime-helper-0.21.21.apk
@@ -1 +0,0 @@
1
- afe24440c4392f50bd97c03024f256528699743d0a1bbad342ef163def2212b0 agent-device-android-snapshot-helper-0.21.21.apk