agent-device 0.21.11 → 0.21.12
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.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.11.apk → agent-device-android-ime-helper-0.21.12.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.12.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.11.manifest.json → agent-device-android-ime-helper-0.21.12.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.11.apk → agent-device-android-snapshot-helper-0.21.12.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.12.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.11.manifest.json → agent-device-android-snapshot-helper-0.21.12.manifest.json} +6 -6
- package/apple/fold-helper/Fold.m +97 -0
- package/apple/macos-helper/Package.swift +1 -8
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +0 -2
- package/dist/src/back-mode.js +1 -1
- package/dist/src/cli-help.js +4 -2
- package/dist/src/client-types.d.ts +2 -4
- package/dist/src/device-input-state.d.ts +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/interactor.js +3 -3
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/macos-facade.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/registry.js +35 -35
- package/dist/src/runtime4.js +4 -4
- package/dist/src/script.js +1 -1
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-selectors.d.ts +12 -1
- package/dist/src/simulator-facade.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.11.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.11.apk.sha256 +0 -1
- package/apple/macos-helper/Sources/AgentDeviceMacOSDeviceHub/DeviceHubPose.swift +0 -47
- package/apple/macos-helper/Sources/AgentDeviceMacOSDeviceHub/DeviceHubWindowInventory.swift +0 -65
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubPose.swift +0 -225
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubSidebar.swift +0 -57
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubWindowDiscovery.swift +0 -108
- package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubPoseTests.swift +0 -30
- package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubWindowInventoryTests.swift +0 -65
package/dist/src/interactor.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{D as e,v as t}from"./sdk-contracts.js";import{D as n}from"./sdk-batch-runner.js";import{_ as r,d as i,f as a,u as o,w as s}from"./sdk-device.js";import{r as c}from"./snapshot-scope.js";import{d as l,i as ee,l as te}from"./scroll-gesture.js";import{a as ne,n as u}from"./alert-contract.js";import{_ as d,b as re,m as f,n as ie,r as p,v as ae,x as oe,y as se}from"./location-coordinates.js";import{n as ce,s as le,t as ue}from"./scroll-command.js";import"./device.js";import{t as de}from"./device-rotation.js";import{c as fe,r as m}from"./diagnostics.js";import{a as h}from"./exec.js";import{t as pe}from"./timeouts.js";import{a as me}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{i as he,n as ge}from"./retry.js";import{a as _e}from"./gesture-plan.js";import{n as ve}from"./scoped-provider.js";import{n as ye,r as be}from"./ios-snapshot-planning.js";import{a as xe,l as Se,n as Ce,s as we}from"./quality-warnings.js";import{a as g,o as Te,t as Ee}from"./runner-presentation.js";import{n as De,r as Oe}from"./ios-system-surface.js";import{r as _}from"./ios-snapshot-acquisition.js";import{t as ke}from"./png-size.js";import{n as Ae}from"./screenshot-density.js";import{n as je}from"./interactor-types.js";import{C as Me,g as Ne,r as v}from"./host-file.js";import{c as Pe,d as Fe,f as Ie,m as Le,p as Re}from"./config.js";import{o as ze}from"./tool-provider.js";import{n as y}from"./simctl.js";import{n as b,r as Be}from"./apps-simctl.js";import{n as Ve,r as x,t as He}from"./physical-device-control.js";import{n as Ue,r as S,s as We}from"./runner.js";import{l as Ge}from"./host.js";import{t as Ke}from"./runner-cache-metadata.js";import"./runner-contract.js";import{h as C,m as qe}from"./runner-client.js";import{n as Je,r as Ye,t as w}from"./app-launch.js";import{
|
|
1
|
+
import{D as e,v as t}from"./sdk-contracts.js";import{D as n}from"./sdk-batch-runner.js";import{_ as r,d as i,f as a,u as o,w as s}from"./sdk-device.js";import{r as c}from"./snapshot-scope.js";import{d as l,i as ee,l as te}from"./scroll-gesture.js";import{a as ne,n as u}from"./alert-contract.js";import{_ as d,b as re,m as f,n as ie,r as p,v as ae,x as oe,y as se}from"./location-coordinates.js";import{n as ce,s as le,t as ue}from"./scroll-command.js";import"./device.js";import{t as de}from"./device-rotation.js";import{c as fe,r as m}from"./diagnostics.js";import{a as h}from"./exec.js";import{t as pe}from"./timeouts.js";import{a as me}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{i as he,n as ge}from"./retry.js";import{a as _e}from"./gesture-plan.js";import{n as ve}from"./scoped-provider.js";import{n as ye,r as be}from"./ios-snapshot-planning.js";import{a as xe,l as Se,n as Ce,s as we}from"./quality-warnings.js";import{a as g,o as Te,t as Ee}from"./runner-presentation.js";import{n as De,r as Oe}from"./ios-system-surface.js";import{r as _}from"./ios-snapshot-acquisition.js";import{t as ke}from"./png-size.js";import{n as Ae}from"./screenshot-density.js";import{n as je}from"./interactor-types.js";import{C as Me,g as Ne,r as v}from"./host-file.js";import{c as Pe,d as Fe,f as Ie,m as Le,p as Re}from"./config.js";import{o as ze}from"./tool-provider.js";import{n as y}from"./simctl.js";import{n as b,r as Be}from"./apps-simctl.js";import{n as Ve,r as x,t as He}from"./physical-device-control.js";import{n as Ue,r as S,s as We}from"./runner.js";import{l as Ge}from"./host.js";import{t as Ke}from"./runner-cache-metadata.js";import"./runner-contract.js";import{h as C,m as qe}from"./runner-client.js";import{n as Je,r as Ye,t as w}from"./app-launch.js";import{r as T,t as E}from"./simulator.js";import{a as Xe,d as Ze,f as Qe,g as $e,h as D,m as et,p as tt}from"./app-resolution.js";import{a as nt,i as rt,o as it}from"./helper.js";import{i as at,t as ot}from"./display-inventory.js";import{n as st}from"./multitouch-support.js";import{t as ct}from"./surface-snapshot.js";import{t as lt}from"./ios-target-activation.js";import O from"node:path";async function ut(e){return a(e)?await Ze():(T(e,`clipboard`),await E(e),h(await b(e,[`pbpaste`,e.id],{allowFailure:!0}),`Failed to read iOS simulator clipboard`).stdout.replaceAll(`\r
|
|
2
2
|
`,`
|
|
3
3
|
`).replace(/\n$/,``))}async function dt(e,t){if(a(e)){await tt(t);return}T(e,`clipboard`),await E(e),h(await b(e,[`pbcopy`,e.id],{allowFailure:!0,stdin:t}),`Failed to write iOS simulator clipboard`)}function ft(t){if(!o(t))throw new e(`UNSUPPORTED_OPERATION`,p.message,{deviceId:t.id,appleOs:s(t),deviceKind:t.kind,reason:p.reason,hint:p.hint})}async function pt(e,t){ft(e);let n=se(t);return await b(e,[`ui`,e.id,`content_size`,n]),oe(n,n)}async function mt(t){ft(t),await E(t);let n=h(await b(t,[`ui`,t.id,`content_size`],{allowFailure:!0}),`Failed to read iOS content size category`),r=n.stdout.trim(),i=re(r);if(i===void 0)throw new e(`COMMAND_FAILED`,`iOS simulator reported an unknown text size: ${r||`(empty)`}`,{deviceId:t.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 oe(i,r)}const ht=[`--time`,`9:41`,`--dataNetwork`,`wifi`,`--wifiMode`,`active`,`--wifiBars`,`3`,`--batteryState`,`charged`,`--batteryLevel`,`100`],gt={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`},_t={1:`searching`,2:`failed`,3:`active`},vt={0:`notSupported`,1:`searching`,2:`failed`,3:`active`};function k(e,t,n){return y(e,t,n)}const A=new Set;async function yt(e){let t=null,n=!1;if(xt(e))n=!0;else try{t=await St(e),n=!0}catch(t){I(e,`snapshot_failed`,t)}try{(!n||t)&&await P(e),await F(e,ht)}catch(t){I(e,`prepare_failed`,t)}return async()=>{await bt(e,n?t:null)}}async function bt(e,t){if(await P(e),!t){M(e);return}await F(e,wt(t)),j(e)}function j(e){A.delete(N(e))}function M(e){A.add(N(e))}function xt(e){return A.has(N(e))}function N(e){return`${e.platform}:${e.kind}:${e.id}`}async function St(e){return Ct(h(await k(e,[`status_bar`,e.id,`list`],{allowFailure:!0}),`Failed to read simulator status bar overrides`).stdout)}async function P(e){await k(e,[`status_bar`,e.id,`clear`])}async function F(e,t){t.length!==0&&await k(e,[`status_bar`,e.id,`override`,...t])}function Ct(t){let n={},r=t.split(`
|
|
4
|
-
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i=gt[t];if(!i)throw new e(`COMMAND_FAILED`,`Unsupported simulator data network type: ${t}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(t);if(i){let e=_t[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(t);if(a){let t=Number(a[1]),r=vt[t];if(!r)throw new e(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${t}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(t);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function wt(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||Tt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Tt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function I(e,t,n){m({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}async function Et(t,n,r,i,o){if(a(t)){let t=n.toLowerCase();if(t===`appearance`){await Qe(r);return}if(t===`permission`){let t=d(r);if(t===`deny`)throw new e(`INVALID_ARGS`,f(`permission`));let n=At(o?.permissionTarget);return await rt(t,n)}throw new e(`INVALID_ARGS`,f(n))}T(t,`settings`),await E(t);let s=n.toLowerCase();switch(s){case`clear-app-state`:{if(r.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await kt(t,i);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`reset-keychain`:if(r.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await b(t,[`keychain`,t.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=D(r)?`active`:`failed`;await b(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),j(t);return}case`airplane`:D(r)?(await b(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),j(t)):(await b(t,[`status_bar`,t.id,`clear`]),M(t));return;case`location`:{if(r.toLowerCase()===`set`){let{latitude:e,longitude:n}=ie(o);return await b(t,[`location`,t.id,`set`,`${e},${n}`]),{latitude:e,longitude:n}}let n=D(r);if(!i)throw new e(`INVALID_ARGS`,`location setting requires an active app in session`);let a=n?`grant`:`revoke`;await b(t,[`privacy`,t.id,a,`location`,i]);return}case`faceid`:case`touchid`:{let e=s,n=Nt[e];await Vt(t,Bt(r,e),{settingName:e,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let e=await jt(t,r);await b(t,[`ui`,t.id,`appearance`,e]);return}case`text-size`:return await pt(t,r);case`permission`:if(!i)throw new e(`INVALID_ARGS`,`permission setting requires an active app in session`);await Ft(t,Pt(d(r)),zt(o?.permissionTarget,o?.permissionMode),i);return;default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}const Dt={"text-size":mt};async function Ot(e,t){return await Dt[t](e)}async function kt(t,n){if(!i(t)||t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await Xe(t,n);await E(t),await w(t,r);let a=h(await b(t,[`get_app_container`,t.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!a)throw new e(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let o=await Ne(a);return await Promise.all(o.map(e=>Me(O.join(a,e)))),{bundleId:r,containerPath:a}}function At(t){let n=t?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new e(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function jt(t,n){let r=et(n);if(r!==`toggle`)return r;let i=h(await b(t,[`ui`,t.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=Mt(i.stdout,i.stderr);if(!a)throw new e(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function Mt(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}const Nt={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function Pt(e){return e===`deny`?`revoke`:e}async function Ft(e,t,n,r){try{await b(e,[`privacy`,e.id,t,n,r])}catch(i){throw It(i)?Lt(e,t,n,r,i):i}}function It(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=String(t.details?.stderr??``).toLowerCase();return/failed to (set|grant|revoke|reset) access/.test(n)&&n.includes(`operation not permitted`)}function Lt(t,n,r,i,a){return n===`reset`?new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support resetting ${r} permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Use reinstall to force a fresh prompt, or reset simulator content and settings.`},a):new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting ${r} permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,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)}const Rt={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 zt(t,n){let r=ae(t);if(r===`photos`){let t=n?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}if(n?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);return Rt[r]}function Bt(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function Vt(t,n,r){let i=Ht(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=Be(t,e),r=await ze(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=$e(a);throw a.length>0&&a.every(e=>Ut(e.stdout,e.stderr))?new e(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o}):new e(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o})}function Ht(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function Ut(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}function Wt(e){let t=e.screenshotMetadata;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t,r=L(n.displayID),i=L(n.pixelWidth),a=L(n.pixelHeight),o=Gt(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 L(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function Gt(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function R(e,t,n){return y(e,t,n)}const Kt={ensureBooted:E,prepareStatusBarForScreenshot:yt,resolveCaptureDisplay:at,captureWithRetry:Yt,normalizeDensity:nn,captureWithRunner:V,shouldFallbackToRunner:en},z=new Map,B=new Map;async function qt(e,t,n={}){if(a(e)){await V(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Jt(e,t,n);return}await He(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:C})}async function Jt(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...Kt,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=await i.resolveCaptureDisplay(t),o=async()=>{await i.captureWithRetry(t,n,a),await i.normalizeDensity(t,n,r.pixelDensity,a?.pointScale)},s=async()=>{};if(r.normalizeStatusBar===!0)try{s=await i.prepareStatusBarForScreenshot(t)}catch(e){U(t,`prepare_failed`,e)}try{try{await o();return}catch(e){let n=e;if(r.skipIosSimulatorBootCheck&&tn(e)){await i.ensureBooted(t);try{await o();return}catch(e){n=e}}if(!i.shouldFallbackToRunner(n))throw n;Qt(t,`simctl_screenshot`,n)}let e=await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions);await i.normalizeDensity(t,n,r.pixelDensity,e?.pixelsPerPoint)}finally{await s().catch(e=>U(t,`restore_failed`,e))}}async function Yt(e,t,n){let r=ge.fromTimeoutMs(Le),i=[`io`,e.id,`screenshot`,...ot(n),t];await he(async({deadline:t})=>{await R(e,i,{timeoutMs:Math.max(1e3,t?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Fe,maxDelayMs:Ie,jitter:.2,shouldRetry:e=>en(e)},{deadline:r,phase:`ios_simulator_screenshot`})}async function V(t,n,r,i,o){if(t.kind===`device`&&!a(t)){await He(t).captureScreenshot(t,n,{appBundleId:r,fullscreen:i,runnerOptions:o,preferRunner:!0,runRunnerCommand:C});return}let s=await C(t,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},o),c=s.message;if(!c)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);let l=Wt(s);if(a(t))return await v(c,n),l;if(t.kind===`simulator`)return await Xt(t,c,n),l;throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Xt(t,n,r){let i=ge.fromTimeoutMs(Pe),a=`Unable to locate runner container for simulator screenshot`,o=B.get(t.id);if(o){let e=await H(o,n,r);if(e.copied)return;a=e.error,B.delete(t.id)}for(let e of Ke){let o=await R(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:Zt(i,Pe,`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 H(s,n,r);if(c.copied){B.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function H(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of $t(e,t))try{return await v(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Zt(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function Qt(e,t,n){let r=x(n);m({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function U(e,t,n){m({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}function $t(e,t){let n=O.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=O.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(O.join(n,s)),O.isAbsolute(r)&&o(O.normalize(r)),c.startsWith(`tmp/`))o(O.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(O.join(n,t))}}let l=O.basename(r);return l&&o(O.join(n,`tmp`,l)),i}function en(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ve(t);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 tn(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ve(t);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 nn(e,t,n,r){let i=r??await rn(e),a=Ae(await ke(t),i,n);a&&await xe(t,a.width,a.height)}async function rn(t){let n=z.get(t.id);if(n!==void 0)return n;let r=await R(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:Re}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return z.set(t.id,i),i}function an(t){return!(t instanceof e)||t.details?.runnerErrorCode!==`SCROLL_KEYBOARD_OCCLUDES_SURFACE`?t:new e(t.code,t.message,{...t.details,...ee})}function on(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:ue},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function sn(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),a=W(e.referenceHeight);if(i===void 0||a===void 0)return G(e,{amount:n?.amount});let o=l({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return G(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function cn(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 W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=un(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=ln(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=W(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 ln(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 un(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(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 dn(e,t,n,r,i,a){return sn(await e(t,{command:`desktopScroll`,direction:i,...cn(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function fn(e){return e===`system`?`backSystem`:`backInApp`}function pn(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 C(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await mn(e,t,n,r,i),tapElementSelector:async r=>await C(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...Cn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await C(e,Ue([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return S(a),a},longPress:async(r,i,a)=>await C(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await C(e,J(e,t,r,i),n),type:async(r,i)=>vn(await C(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
5
|
-
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await C(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 wn(C,e,t,n,r,i),performGesture:async r=>await xn(e,t,n,r),gestureViewport:async()=>bn(await C(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function mn(e,t,n,r,i){return a(e)&&i.surface&&i.surface!==`app`?await hn(t,r,i):i.button===`primary`?i.count===1?await _n(e,t,n,r,i):await qe(e,r,i,t.appBundleId,async t=>await C(e,t,n)):await gn(e,t,n,r,i.button)}async function hn(t,n,r){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await import(`./helper.js`).then(e=>e.t),a=await i(n.x,n.y,{bundleId:t.appBundleId,surface:r.surface,holdMs:r.holdMs,clicks:r.count,doubleClick:r.doubleTap,intervalMs:r.intervalMs,signal:t.signal});return a.holdMs===void 0?{}:{holdMs:a.holdMs}}async function gn(e,t,n,r,i){return await C(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function _n(e,t,n,r,i){if(i.doubleTap){let i=await C(e,Ue([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return S(i),i}return i.holdMs>0?await C(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await C(e,J(e,t,r.x,r.y),n)}function vn(e){let t=e.textEntryRoute;return yn(t)?{textEntryRoute:t}:{}}function yn(e){return typeof e==`string`&&je.includes(e)}function bn(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function xn(e,t,n,i){if(i.topology===`two`&&st(e,i.intent),i.topology===`single`&&a(e)){let{start:r,end:a}=_e(i);return await C(e,{command:`drag`,x:r.x,y:r.y,x2:a.x,y2:a.y,durationMs:i.durationMs,appBundleId:t.appBundleId},n)}if(i.topology===`single`&&r(e)){let{start:r,end:a}=_e(i);return await C(e,{command:`swipe`,direction:Sn(r,a),appBundleId:t.appBundleId},n)}return await C(e,{command:`gesture`,gesturePlan:i,appBundleId:t.appBundleId},n)}function Sn(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 J(e,t,n,r){return{command:`tap`,x:n,y:r,...Cn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function Cn(e){return i(e)&&!r(e)}async function wn(e,t,n,i,o,s){if(le(s?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ce}`}),r(t))return G(await e(t,K(o,n.appBundleId,s?.durationMs),i),{amount:s?.amount,durationMs:s?.durationMs});if(te(s??{}),a(t))return await dn(e,t,n,i,o,s);let c=on(s),l;try{l=await e(t,{command:`scroll`,direction:o,...cn(c),appBundleId:n.appBundleId},i)}catch(e){throw an(e)}return sn(l,o,c)}function Y(e,t,n){if(a(e)){let e=n?.surface===`frontmost-app`?{surface:n.surface}:{bundleId:n?.appBundleId,surface:n?.surface};return async t=>await nt(t,e)}return async(r,i)=>await C(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function Tn(e,t,n){return await Y(e,t,n)(`get`,ne)}async function En(t,n,r){let i=Y(t,n,r),a=r?.timeoutMs??1e4,o=Date.now(),s=!0;for(;Date.now()-o<a;){try{let e=s?a:On(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await pe(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function Dn(e,t,n,r){let a=Y(e,t,r),o=i(e)?ne:u,s=Date.now(),c,l=!0;for(;Date.now()-s<u;){try{let e=l?o:On(s,u);return l=!1,await a(n,e)}catch(e){if(c=e,!X(e))break}await pe(300)}throw kn(c)}function On(e,t){return Math.max(1,t-(Date.now()-e))}function kn(t){return!(t instanceof e)||!X(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function X(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}const An={0:`unknown`,1:`notRunning`,2:`runningBackgroundSuspended`,3:`runningBackground`};function jn(e,n){if(typeof e!=`object`||!e||Array.isArray(e))return;let r={...e},i=r.reason;if(!t(i))return;let a=r.priorState;if(typeof a!=`number`||!Number.isInteger(a))return;let o=An[a];o===void 0&&n?.({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 Mn(e){let t=Nn(e.systemSurface),r=n(e.keyboard),i=jn(e.targetActivation,e=>Ge({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:Se(e.snapshotQuality),qualityPayload:Ln(e.qualityPayload,t),runnerFatal:e.runnerFatal===!0,...r?{keyboard:r}:{},...t?{systemSurface:t}:{},...i?{targetActivation:i}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function Nn(e){if(!Bn(e)||typeof e.bundleId!=`string`)return;let t=Oe(e.bundleId);return t&&{bundleId:t.bundleId,kind:t.kind}}function Pn(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=be({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=Rn(r,n.qualityPayload?.nodes),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:ye(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return Ee(o,i).nodes}catch(e){Fn(e,n)}}function Fn(t,n){let r=n.quality;if(t instanceof g&&we(r))throw new e(`COMMAND_FAILED`,t.message,{...Te(t),...n.systemSurface?{systemSurface:n.systemSurface}:{},snapshotQuality:{state:r.state,backend:r.backend,...r.reason?{reason:r.reason}:{},...r.reasonCode?{reasonCode:r.reasonCode}:{}},hint:In(n.systemSurface,r)},t);Z(t,n.systemSurface)}function In(e,t){return[e?`${e.bundleId} hosts the surface presented over the app, and this capture targeted that surface.`:void 0,...Ce(t,[])].filter(e=>e!==void 0).join(` `)}function Ln(e,t){if(e!==void 0)return(!Bn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new g(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`),t),e.scope!==void 0&&e.scope!==null&&Z(new g(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`}),t),{nodes:e.nodes,truncated:e.truncated,scope:null}}function Rn(e,t){return _(zn(t),{fallbackToLargestRoot:!0})??_(zn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function zn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function Bn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t,n){throw t instanceof g?new e(`COMMAND_FAILED`,t.message,{...Te(t),...n?{systemSurface:n}:{}},t):t}function Vn(t,n,i){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=pn(t,n),s={open:(e,n)=>Je(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>Ye(t),close:e=>w(t,e,o),screenshot:(e,n)=>Qn(t,e,n,o),snapshot:async e=>await Hn(t,e,o),readTextAtPoint:async(e,n)=>er(t,n?.surface)?await tr(e,n):await nr(t,e,n,o),findText:async(e,n)=>({found:(await C(t,{command:`findText`,text:e,appBundleId:n?.appBundleId},n?.signal?{...o,signal:n.signal}:o))?.found===!0}),back:async e=>{if(r(t)){await C(t,K(`menu`,n.appBundleId),o);return}await C(t,{command:fn(e),appBundleId:n.appBundleId},o)},home:async()=>{if(r(t)){await C(t,K(`home`,n.appBundleId),o);return}await C(t,{command:`home`,appBundleId:n.appBundleId},o)},setOrientation:async r=>{let i=Xn(await C(t,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},o));if(i!==r)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await C(t,{command:`appSwitcher`,appBundleId:n.appBundleId},o)},actionButton:async()=>{await C(t,{command:`actionButton`,appBundleId:n.appBundleId},o)},tvRemote:async(e,r)=>{await C(t,K(me(e),n.appBundleId,r),o)},keyboardDismiss:async()=>{let e=await C(t,{command:`keyboardDismiss`,appBundleId:n.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:Yn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await C(t,{command:`keyboardReturn`,appBundleId:n.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>ut(t),writeClipboard:e=>dt(t,e),setSetting:(e,n,r,i)=>Et(t,e,n,r,i),readSetting:e=>Ot(t,e),readAlert:e=>Tn(t,o,e),awaitAlert:e=>En(t,o,e),acceptAlert:e=>Dn(t,o,`accept`,e),dismissAlert:e=>Dn(t,o,`dismiss`,e),...a};return i?Zn(t,n,s,i):s}async function Hn(e,t,n){return a(e)&&t?.surface&&t.surface!==`app`?await ct(t,t.signal):await Un(e,t,n)}async function Un(e,t,n){let r=Mn(await fe(`snapshot_capture`,async()=>await C(e,{command:`snapshot`,appBundleId:t?.appBundleId,interactiveOnly:t?.interactiveOnly,preferredBackend:t?.preferredBackend,customActions:t?.customActions,depth:t?.depth,scope:t?.scope,raw:t?.raw},Jn(n,t?.signal)),{backend:`xctest`}));Wn(e,t,r);let i=Gn(r);return{nodes:Kn(e,t,r),truncated:r.truncated??!1,backend:`xctest`,producer:`apple-runner`,...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 Wn(t,n,r){if(!((r.nodes?.length??0)>0)&&!qn(n,r.quality)&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`)}function Gn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(De(e.systemSurface.bundleId)),e.targetActivation&&t.push(lt(e.targetActivation)),t}function Kn(e,t,n){return a(e)?n.nodes??[]:Pn(e.id,t,n)}function qn(e,t){return c(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Jn(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 Yn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Xn(t){let n=t.orientation;if(typeof n==`string`&&de.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Zn(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`),readSetting:async()=>$(`readSetting`)};return ve(i,n=>We(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function Qn(e,t,n={},r){if($n(e,n.surface)){await it(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await V(e,t,n.appBundleId,n.fullscreen,r);return}await qt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function $n(e,t){return a(e)&&t!==void 0&&t!==`app`}function er(e,t){return a(e)&&t!==void 0&&t!==`app`}async function tr(e,t){let{runMacOsReadTextAction:n}=await import(`./helper.js`).then(e=>e.t);return(await n(e.x,e.y,{bundleId:t?.appBundleId,surface:t?.surface})).text}async function nr(e,t,n,r){let i=await C(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{Vn as createAppleInteractor};
|
|
4
|
+
`).map(e=>e.trim()).filter(e=>e.length>0&&e!==`Current Status Bar Overrides:`&&!/^=+$/.test(e));for(let t of r){let r=/^DataNetworkType:\s+(\d+)$/.exec(t);if(r){let t=Number(r[1]),i=gt[t];if(!i)throw new e(`COMMAND_FAILED`,`Unsupported simulator data network type: ${t}`);n.dataNetwork=i;continue}let i=/^WiFi Mode:\s+(\d+),\s+WiFi Bars:\s+(\d+)$/.exec(t);if(i){let e=_t[Number(i[1])];e&&(n.wifiMode=e),n.wifiBars=i[2];continue}let a=/^Cell Mode:\s+(\d+),\s+Cell Bars:\s+(\d+)$/.exec(t);if(a){let t=Number(a[1]),r=vt[t];if(!r)throw new e(`COMMAND_FAILED`,`Unsupported simulator cellular mode: ${t}`);n.cellularMode=r,n.cellularBars=a[2];continue}let o=/^Operator Name:\s*(.*)$/.exec(t);if(o){n.operatorName=o[1]??``;continue}}return Object.keys(n).length===0?null:n}function wt(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||Tt(e.dataNetwork)||e.operatorName!==void 0)&&t.push(`--cellularBars`,e.cellularBars),e.operatorName!==void 0&&t.push(`--operatorName`,e.operatorName),t}function Tt(e){return!!(e&&e!==`hide`&&e!==`wifi`)}function I(e,t,n){m({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}async function Et(t,n,r,i,o){if(a(t)){let t=n.toLowerCase();if(t===`appearance`){await Qe(r);return}if(t===`permission`){let t=d(r);if(t===`deny`)throw new e(`INVALID_ARGS`,f(`permission`));let n=At(o?.permissionTarget);return await nt(t,n)}throw new e(`INVALID_ARGS`,f(n))}T(t,`settings`),await E(t);let s=n.toLowerCase();switch(s){case`clear-app-state`:{if(r.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);let n=await kt(t,i);return{bundleId:n.bundleId,containerPath:n.containerPath,cleared:!0}}case`reset-keychain`:if(r.toLowerCase()!==`clear`)throw new e(`INVALID_ARGS`,`settings reset-keychain only supports clear.`);return await b(t,[`keychain`,t.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=D(r)?`active`:`failed`;await b(t,[`status_bar`,t.id,`override`,`--wifiMode`,e]),j(t);return}case`airplane`:D(r)?(await b(t,[`status_bar`,t.id,`override`,`--dataNetwork`,`hide`,`--wifiMode`,`failed`,`--wifiBars`,`0`,`--cellularMode`,`failed`,`--cellularBars`,`0`,`--operatorName`,``]),j(t)):(await b(t,[`status_bar`,t.id,`clear`]),M(t));return;case`location`:{if(r.toLowerCase()===`set`){let{latitude:e,longitude:n}=ie(o);return await b(t,[`location`,t.id,`set`,`${e},${n}`]),{latitude:e,longitude:n}}let n=D(r);if(!i)throw new e(`INVALID_ARGS`,`location setting requires an active app in session`);let a=n?`grant`:`revoke`;await b(t,[`privacy`,t.id,a,`location`,i]);return}case`faceid`:case`touchid`:{let e=s,n=Nt[e];await Vt(t,Bt(r,e),{settingName:e,label:n.label,modalityAliases:n.modalityAliases});return}case`appearance`:{let e=await jt(t,r);await b(t,[`ui`,t.id,`appearance`,e]);return}case`text-size`:return await pt(t,r);case`permission`:if(!i)throw new e(`INVALID_ARGS`,`permission setting requires an active app in session`);await Ft(t,Pt(d(r)),zt(o?.permissionTarget,o?.permissionMode),i);return;default:throw new e(`INVALID_ARGS`,`Unsupported setting: ${n}`)}}const Dt={"text-size":mt};async function Ot(e,t){return await Dt[t](e)}async function kt(t,n){if(!i(t)||t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Clearing app state is currently supported only on iOS simulators.`);let r=await Xe(t,n);await E(t),await w(t,r);let a=h(await b(t,[`get_app_container`,t.id,r,`data`],{allowFailure:!0}),`simctl get_app_container failed for ${r}`).stdout.trim();if(!a)throw new e(`COMMAND_FAILED`,`simctl get_app_container returned an empty data container path for ${r}`);let o=await Ne(a);return await Promise.all(o.map(e=>Me(O.join(a,e)))),{bundleId:r,containerPath:a}}function At(t){let n=t?.trim().toLowerCase();if(n===`accessibility`||n===`screen-recording`||n===`input-monitoring`)return n;throw new e(`INVALID_ARGS`,`Unsupported macOS permission target. Use accessibility|screen-recording|input-monitoring.`)}async function jt(t,n){let r=et(n);if(r!==`toggle`)return r;let i=h(await b(t,[`ui`,t.id,`appearance`],{allowFailure:!0}),`Failed to read current iOS appearance`),a=Mt(i.stdout,i.stderr);if(!a)throw new e(`COMMAND_FAILED`,`Unable to determine current iOS appearance for toggle`,{stdout:i.stdout,stderr:i.stderr});return a===`dark`?`light`:`dark`}function Mt(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}const Nt={faceid:{label:`Face ID`,modalityAliases:[`face`]},touchid:{label:`Touch ID`,modalityAliases:[`finger`,`touch`]}};function Pt(e){return e===`deny`?`revoke`:e}async function Ft(e,t,n,r){try{await b(e,[`privacy`,e.id,t,n,r])}catch(i){throw It(i)?Lt(e,t,n,r,i):i}}function It(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=String(t.details?.stderr??``).toLowerCase();return/failed to (set|grant|revoke|reset) access/.test(n)&&n.includes(`operation not permitted`)}function Lt(t,n,r,i,a){return n===`reset`?new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support resetting ${r} permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,hint:`Use reinstall to force a fresh prompt, or reset simulator content and settings.`},a):new e(`UNSUPPORTED_OPERATION`,`iOS simulator does not support setting ${r} permission via simctl privacy on this runtime.`,{deviceId:t.id,appBundleId:i,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)}const Rt={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 zt(t,n){let r=ae(t);if(r===`photos`){let t=n?.trim().toLowerCase();if(!t||t===`full`)return`photos`;if(t===`limited`)return`photos-add`;throw new e(`INVALID_ARGS`,`Invalid photos mode: ${n}. Use full|limited.`)}if(n?.trim())throw new e(`INVALID_ARGS`,`Permission mode is only supported for photos. Received: ${n}.`);return Rt[r]}function Bt(t,n){let r=t.trim().toLowerCase();if(r===`match`)return`match`;if(r===`nonmatch`)return`nonmatch`;if(r===`enroll`)return`enroll`;if(r===`unenroll`)return`unenroll`;throw new e(`INVALID_ARGS`,`Invalid ${n} state: ${t}. Use match|nonmatch|enroll|unenroll.`)}async function Vt(t,n,r){let i=Ht(t.id,n,r.modalityAliases),a=[];for(let e of i){let n=Be(t,e),r=await ze(n,{allowFailure:!0});if(r.exitCode===0)return;a.push({args:n,stderr:r.stderr,stdout:r.stdout,exitCode:r.exitCode})}let o=$e(a);throw a.length>0&&a.every(e=>Ut(e.stdout,e.stderr))?new e(`UNSUPPORTED_OPERATION`,`${r.label} simulation is not supported on this simulator runtime.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o}):new e(`COMMAND_FAILED`,`Failed to simulate ${r.settingName}.`,{deviceId:t.id,action:n,setting:r.settingName,attempts:o})}function Ht(e,t,n){let r=n.length>0?n:[`face`];switch(t){case`match`:return r.flatMap(t=>[[`biometric`,e,`match`,t],[`biometric`,`match`,e,t]]);case`nonmatch`:return r.flatMap(t=>[[`biometric`,e,`nonmatch`,t],[`biometric`,e,`nomatch`,t],[`biometric`,`nonmatch`,e,t],[`biometric`,`nomatch`,e,t]]);case`enroll`:return[[`biometric`,e,`enroll`,`yes`],[`biometric`,e,`enroll`,`1`],[`biometric`,`enroll`,e,`yes`],[`biometric`,`enroll`,e,`1`]];case`unenroll`:return[[`biometric`,e,`enroll`,`no`],[`biometric`,e,`enroll`,`0`],[`biometric`,`enroll`,e,`no`],[`biometric`,`enroll`,e,`0`]]}}function Ut(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`unrecognized subcommand`)||n.includes(`unknown subcommand`)||n.includes(`not supported`)||n.includes(`unavailable`)||n.includes(`biometric`)&&n.includes(`invalid`)}function Wt(e){let t=e.screenshotMetadata;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t,r=L(n.displayID),i=L(n.pixelWidth),a=L(n.pixelHeight),o=Gt(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 L(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}function Gt(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function R(e,t,n){return y(e,t,n)}const Kt={ensureBooted:E,prepareStatusBarForScreenshot:yt,resolveCaptureDisplay:at,captureWithRetry:Yt,normalizeDensity:nn,captureWithRunner:V,shouldFallbackToRunner:en},z=new Map,B=new Map;async function qt(e,t,n={}){if(a(e)){await V(e,t,n.appBundleId,n.fullscreen,n.runnerOptions);return}if(e.kind===`simulator`){await Jt(e,t,n);return}await He(e).captureScreenshot(e,t,{appBundleId:n.appBundleId,fullscreen:n.fullscreen,runnerOptions:n.runnerOptions,runRunnerCommand:C})}async function Jt(t,n,r={}){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`Simulator screenshot fallback flow supports only iOS simulators`);let i={...Kt,...r.deps??{}};r.skipIosSimulatorBootCheck||await i.ensureBooted(t);let a=await i.resolveCaptureDisplay(t),o=async()=>{await i.captureWithRetry(t,n,a),await i.normalizeDensity(t,n,r.pixelDensity,a?.pointScale)},s=async()=>{};if(r.normalizeStatusBar===!0)try{s=await i.prepareStatusBarForScreenshot(t)}catch(e){U(t,`prepare_failed`,e)}try{try{await o();return}catch(e){let n=e;if(r.skipIosSimulatorBootCheck&&tn(e)){await i.ensureBooted(t);try{await o();return}catch(e){n=e}}if(!i.shouldFallbackToRunner(n))throw n;Qt(t,`simctl_screenshot`,n)}let e=await i.captureWithRunner(t,n,r.appBundleId,r.fullscreen,r.runnerOptions);await i.normalizeDensity(t,n,r.pixelDensity,e?.pixelsPerPoint)}finally{await s().catch(e=>U(t,`restore_failed`,e))}}async function Yt(e,t,n){let r=ge.fromTimeoutMs(Le),i=[`io`,e.id,`screenshot`,...ot(n),t];await he(async({deadline:t})=>{await R(e,i,{timeoutMs:Math.max(1e3,t?.remainingMs()??2e4)})},{maxAttempts:5,baseDelayMs:Fe,maxDelayMs:Ie,jitter:.2,shouldRetry:e=>en(e)},{deadline:r,phase:`ios_simulator_screenshot`})}async function V(t,n,r,i,o){if(t.kind===`device`&&!a(t)){await He(t).captureScreenshot(t,n,{appBundleId:r,fullscreen:i,runnerOptions:o,preferRunner:!0,runRunnerCommand:C});return}let s=await C(t,{command:`screenshot`,appBundleId:r,fullscreen:i,inlineScreenshot:!1},o),c=s.message;if(!c)throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: runner returned no file path`);let l=Wt(s);if(a(t))return await v(c,n),l;if(t.kind===`simulator`)return await Xt(t,c,n),l;throw new e(`COMMAND_FAILED`,`Unsupported Apple screenshot target`)}async function Xt(t,n,r){let i=ge.fromTimeoutMs(Pe),a=`Unable to locate runner container for simulator screenshot`,o=B.get(t.id);if(o){let e=await H(o,n,r);if(e.copied)return;a=e.error,B.delete(t.id)}for(let e of Ke){let o=await R(t,[`get_app_container`,t.id,e,`data`],{allowFailure:!0,timeoutMs:Zt(i,Pe,`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 H(s,n,r);if(c.copied){B.set(t.id,s);return}a=c.error}throw new e(`COMMAND_FAILED`,`Failed to capture iOS screenshot: ${a}`)}async function H(e,t,n){let r=`Runner screenshot was not found in the simulator container`;for(let i of $t(e,t))try{return await v(i,n),{copied:!0}}catch(e){r=e instanceof Error?e.message:String(e)}return{copied:!1,error:r}}function Zt(t,n,r){let i=t.remainingMs();if(i>0)return i;throw new e(`COMMAND_FAILED`,`iOS ${r} timed out after ${n}ms`,{timeoutMs:n,step:r})}function Qt(e,t,n){let r=x(n);m({level:`warn`,phase:`ios_screenshot_fallback`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,from:t,to:`runner`,...r}})}function U(e,t,n){m({level:`warn`,phase:`ios_screenshot_status_bar_${t}`,data:{platform:e.platform,deviceKind:e.kind,deviceId:e.id,...x(n)}})}function $t(e,t){let n=O.resolve(e),r=t.trim();if(!r)return[];let i=[],a=new Set,o=e=>{let t=O.normalize(e);a.has(t)||(a.add(t),i.push(t))},s=r.replace(/^\/+/,``),c=s.replaceAll(`\\`,`/`);if(s&&o(O.join(n,s)),O.isAbsolute(r)&&o(O.normalize(r)),c.startsWith(`tmp/`))o(O.join(n,c));else{let e=c.lastIndexOf(`/tmp/`);if(e>=0){let t=c.slice(e+1);o(O.join(n,t))}}let l=O.basename(r);return l&&o(O.join(n,`tmp`,l)),i}function en(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ve(t);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 tn(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=Ve(t);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 nn(e,t,n,r){let i=r??await rn(e),a=Ae(await ke(t),i,n);a&&await xe(t,a.width,a.height)}async function rn(t){let n=z.get(t.id);if(n!==void 0)return n;let r=await R(t,[`getenv`,t.id,`SIMULATOR_MAINSCREEN_SCALE`],{timeoutMs:Re}),i=Number(r.stdout.trim());if(!Number.isFinite(i)||i<=0)throw new e(`COMMAND_FAILED`,`Failed to read iOS simulator screenshot scale from SIMULATOR_MAINSCREEN_SCALE`);return z.set(t.id,i),i}function an(t){return!(t instanceof e)||t.details?.runnerErrorCode!==`SCROLL_KEYBOARD_OCCLUDES_SURFACE`?t:new e(t.code,t.message,{...t.details,...ee})}function on(e){let t=e?.amount!==void 0||e?.pixels!==void 0;return{...e,...t?{}:{amount:ue},durationMs:e?.durationMs??400,releaseBehavior:e?.releaseBehavior??`controlled`}}function sn(e,t,n,r={includeDuration:!0}){let i=W(e.referenceWidth),a=W(e.referenceHeight);if(i===void 0||a===void 0)return G(e,{amount:n?.amount});let o=l({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return G(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function cn(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 W(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function G(e,t){let{x1:n,y1:r,x2:i,y2:a}=un(e),o=W(e.referenceWidth),s=W(e.referenceHeight),c=ln(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=W(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 ln(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 un(e){let t=W(e.x),n=W(e.y),r=W(e.x2),i=W(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 dn(e,t,n,r,i,a){return sn(await e(t,{command:`desktopScroll`,direction:i,...cn(a,{includeDuration:!0,includeReleaseBehavior:!1}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function K(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function fn(e){return e===`system`?`backSystem`:`backInApp`}function pn(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 C(e,J(e,t,r,i),n),pressPoint:async(r,i)=>await mn(e,t,n,r,i),tapElementSelector:async r=>await C(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,...r.expectedPoint?{x:r.expectedPoint.x,y:r.expectedPoint.y}:{},...Cn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await C(e,Ue([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return S(a),a},longPress:async(r,i,a)=>await C(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await C(e,J(e,t,r,i),n),type:async(r,i)=>vn(await C(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
5
|
+
`?void 0:`append`,appBundleId:t.appBundleId},n)),fill:async(r,i,a,o,s)=>await C(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 wn(C,e,t,n,r,i),performGesture:async r=>await xn(e,t,n,r),gestureViewport:async()=>bn(await C(e,{command:`gestureViewport`,appBundleId:t.appBundleId},n))}}}async function mn(e,t,n,r,i){return a(e)&&i.surface&&i.surface!==`app`?await hn(t,r,i):i.button===`primary`?i.count===1?await _n(e,t,n,r,i):await qe(e,r,i,t.appBundleId,async t=>await C(e,t,n)):await gn(e,t,n,r,i.button)}async function hn(t,n,r){if(r.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${r.button} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await import(`./helper.js`).then(e=>e.t),a=await i(n.x,n.y,{bundleId:t.appBundleId,surface:r.surface,holdMs:r.holdMs,clicks:r.count,doubleClick:r.doubleTap,intervalMs:r.intervalMs,signal:t.signal});return a.holdMs===void 0?{}:{holdMs:a.holdMs}}async function gn(e,t,n,r,i){return await C(e,{command:`mouseClick`,x:r.x,y:r.y,button:i,appBundleId:t.appBundleId},n)}async function _n(e,t,n,r,i){if(i.doubleTap){let i=await C(e,Ue([{kind:`doubleTap`,x:r.x,y:r.y}],t.appBundleId),n);return S(i),i}return i.holdMs>0?await C(e,{command:`longPress`,x:r.x,y:r.y,durationMs:i.holdMs,appBundleId:t.appBundleId},n):await C(e,J(e,t,r.x,r.y),n)}function vn(e){let t=e.textEntryRoute;return yn(t)?{textEntryRoute:t}:{}}function yn(e){return typeof e==`string`&&je.includes(e)}function bn(t){let n=q(t.x),r=q(t.y),i=q(t.x2),a=q(t.y2);if(n===void 0||r===void 0||i===void 0||a===void 0||i<=0||a<=0)throw new e(`COMMAND_FAILED`,`Apple runner returned an invalid gesture viewport`);return{x:n,y:r,width:i,height:a}}function q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}async function xn(e,t,n,i){if(i.topology===`two`&&st(e,i.intent),i.topology===`single`&&a(e)){let{start:r,end:a}=_e(i);return await C(e,{command:`drag`,x:r.x,y:r.y,x2:a.x,y2:a.y,durationMs:i.durationMs,appBundleId:t.appBundleId},n)}if(i.topology===`single`&&r(e)){let{start:r,end:a}=_e(i);return await C(e,{command:`swipe`,direction:Sn(r,a),appBundleId:t.appBundleId},n)}return await C(e,{command:`gesture`,gesturePlan:i,appBundleId:t.appBundleId},n)}function Sn(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 J(e,t,n,r){return{command:`tap`,x:n,y:r,...Cn(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function Cn(e){return i(e)&&!r(e)}async function wn(e,t,n,i,o,s){if(le(s?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${ce}`}),r(t))return G(await e(t,K(o,n.appBundleId,s?.durationMs),i),{amount:s?.amount,durationMs:s?.durationMs});if(te(s??{}),a(t))return await dn(e,t,n,i,o,s);let c=on(s),l;try{l=await e(t,{command:`scroll`,direction:o,...cn(c),appBundleId:n.appBundleId},i)}catch(e){throw an(e)}return sn(l,o,c)}function Y(e,t,n){if(a(e)){let e=n?.surface===`frontmost-app`?{surface:n.surface}:{bundleId:n?.appBundleId,surface:n?.surface};return async t=>await rt(t,e)}return async(r,i)=>await C(e,{command:`alert`,action:r,appBundleId:n?.appBundleId,timeoutMs:i},t)}async function Tn(e,t,n){return await Y(e,t,n)(`get`,ne)}async function En(t,n,r){let i=Y(t,n,r),a=r?.timeoutMs??1e4,o=Date.now(),s=!0;for(;Date.now()-o<a;){try{let e=s?a:On(o,a);return s=!1,await i(`get`,e)}catch(e){if(!X(e))throw e}await pe(300)}throw new e(`COMMAND_FAILED`,`alert wait timed out`)}async function Dn(e,t,n,r){let a=Y(e,t,r),o=i(e)?ne:u,s=Date.now(),c,l=!0;for(;Date.now()-s<u;){try{let e=l?o:On(s,u);return l=!1,await a(n,e)}catch(e){if(c=e,!X(e))break}await pe(300)}throw kn(c)}function On(e,t){return Math.max(1,t-(Date.now()-e))}function kn(t){return!(t instanceof e)||!X(t)?t:new e(t.code,t.message,{...t.details??{},hint:`If the permission sheet is visible in snapshot or screenshot but alert reports no alert, take a scoped snapshot around the visible button label and use press @ref.`})}function X(t){if(!(t instanceof e))return!1;let n=t.details??{};return n.runnerErrorCode===`ALERT_NOT_FOUND`||n.reason===`alert-not-found`}const An={0:`unknown`,1:`notRunning`,2:`runningBackgroundSuspended`,3:`runningBackground`};function jn(e,n){if(typeof e!=`object`||!e||Array.isArray(e))return;let r={...e},i=r.reason;if(!t(i))return;let a=r.priorState;if(typeof a!=`number`||!Number.isInteger(a))return;let o=An[a];o===void 0&&n?.({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 Mn(e){let t=Nn(e.systemSurface),r=n(e.keyboard),i=jn(e.targetActivation,e=>Ge({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:Se(e.snapshotQuality),qualityPayload:Ln(e.qualityPayload,t),runnerFatal:e.runnerFatal===!0,...r?{keyboard:r}:{},...t?{systemSurface:t}:{},...i?{targetActivation:i}:{},message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}function Nn(e){if(!Bn(e)||typeof e.bundleId!=`string`)return;let t=Oe(e.bundleId);return t&&{bundleId:t.bundleId,kind:t.kind}}function Pn(e,t,n){let r=n.nodes??[];if(n.runnerFatal===!0||r.length===0&&n.qualityPayload===void 0)return r;let i=be({raw:t?.raw,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,customActions:t?.customActions}),a=Rn(r,n.qualityPayload?.nodes),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:ye(i),viewport:a,hittability:{kind:`available`},lineage:{targetId:e},residue:[]}};try{return Ee(o,i).nodes}catch(e){Fn(e,n)}}function Fn(t,n){let r=n.quality;if(t instanceof g&&we(r))throw new e(`COMMAND_FAILED`,t.message,{...Te(t),...n.systemSurface?{systemSurface:n.systemSurface}:{},snapshotQuality:{state:r.state,backend:r.backend,...r.reason?{reason:r.reason}:{},...r.reasonCode?{reasonCode:r.reasonCode}:{}},hint:In(n.systemSurface,r)},t);Z(t,n.systemSurface)}function In(e,t){return[e?`${e.bundleId} hosts the surface presented over the app, and this capture targeted that surface.`:void 0,...Ce(t,[])].filter(e=>e!==void 0).join(` `)}function Ln(e,t){if(e!==void 0)return(!Bn(e)||!Array.isArray(e.nodes)||typeof e.truncated!=`boolean`)&&Z(new g(`invalid-quality-payload`,`iOS runner returned an invalid quality payload`),t),e.scope!==void 0&&e.scope!==null&&Z(new g(`invalid-quality-payload`,`iOS runner quality payload must be unscoped`,{field:`scope`}),t),{nodes:e.nodes,truncated:e.truncated,scope:null}}function Rn(e,t){return _(zn(t),{fallbackToLargestRoot:!0})??_(zn(e),{fallbackToLargestRoot:!0})??{kind:`missing`,reason:`not-provided`}}function zn(e){return e?.filter(e=>e.parentIndex===void 0)??[]}function Bn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Z(t,n){throw t instanceof g?new e(`COMMAND_FAILED`,t.message,{...Te(t),...n?{systemSurface:n}:{}},t):t}function Vn(t,n,i){if(t.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:a,runnerOpts:o}=pn(t,n),s={open:(e,n)=>Je(t,e,{appBundleId:n?.appBundleId,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,terminateRunningApp:n?.terminateRunningApp,url:n?.url,runnerOptions:o}),openDevice:()=>Ye(t),close:e=>w(t,e,o),screenshot:(e,n)=>Qn(t,e,n,o),snapshot:async e=>await Hn(t,e,o),readTextAtPoint:async(e,n)=>er(t,n?.surface)?await tr(e,n):await nr(t,e,n,o),findText:async(e,n)=>({found:(await C(t,{command:`findText`,text:e,appBundleId:n?.appBundleId},n?.signal?{...o,signal:n.signal}:o))?.found===!0}),back:async e=>{if(r(t)){await C(t,K(`menu`,n.appBundleId),o);return}await C(t,{command:fn(e),appBundleId:n.appBundleId},o)},home:async()=>{if(r(t)){await C(t,K(`home`,n.appBundleId),o);return}await C(t,{command:`home`,appBundleId:n.appBundleId},o)},setOrientation:async r=>{let i=Xn(await C(t,{command:`rotate`,orientation:r,appBundleId:n.appBundleId},o));if(i!==r)throw new e(`COMMAND_FAILED`,`iOS runner observed ${i} after requesting ${r}`,{requestedOrientation:r,observedOrientation:i});return{orientation:i}},appSwitcher:async()=>{await C(t,{command:`appSwitcher`,appBundleId:n.appBundleId},o)},actionButton:async()=>{await C(t,{command:`actionButton`,appBundleId:n.appBundleId},o)},tvRemote:async(e,r)=>{await C(t,K(me(e),n.appBundleId,r),o)},keyboardDismiss:async()=>{let e=await C(t,{command:`keyboardDismiss`,appBundleId:n.appBundleId},o);return{kind:`mechanism`,wasVisible:Q(e,`wasVisible`),dismissed:Q(e,`dismissed`),visible:Q(e,`visible`),mechanism:Yn(e,`keyboardDismissMechanism`)}},keyboardEnter:async()=>{let e=await C(t,{command:`keyboardReturn`,appBundleId:n.appBundleId},o);return{kind:`visibility-echo`,visible:Q(e,`visible`),wasVisible:Q(e,`wasVisible`)}},readClipboard:()=>ut(t),writeClipboard:e=>dt(t,e),setSetting:(e,n,r,i)=>Et(t,e,n,r,i),readSetting:e=>Ot(t,e),readAlert:e=>Tn(t,o,e),awaitAlert:e=>En(t,o,e),acceptAlert:e=>Dn(t,o,`accept`,e),dismissAlert:e=>Dn(t,o,`dismiss`,e),...a};return i?Zn(t,n,s,i):s}async function Hn(e,t,n){return a(e)&&t?.surface&&t.surface!==`app`?await ct(t,t.signal):await Un(e,t,n)}async function Un(e,t,n){let r=Mn(await fe(`snapshot_capture`,async()=>await C(e,{command:`snapshot`,appBundleId:t?.appBundleId,interactiveOnly:t?.interactiveOnly,preferredBackend:t?.preferredBackend,customActions:t?.customActions,depth:t?.depth,scope:t?.scope,raw:t?.raw},Jn(n,t?.signal)),{backend:`xctest`}));Wn(e,t,r);let i=Gn(r);return{nodes:Kn(e,t,r),truncated:r.truncated??!1,backend:`xctest`,producer:`apple-runner`,...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 Wn(t,n,r){if(!((r.nodes?.length??0)>0)&&!qn(n,r.quality)&&t.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`)}function Gn(e){let t=[];return!e.quality&&e.message&&t.push(e.message),e.systemSurface&&t.push(De(e.systemSurface.bundleId)),e.targetActivation&&t.push(lt(e.targetActivation)),t}function Kn(e,t,n){return a(e)?n.nodes??[]:Pn(e.id,t,n)}function qn(e,t){return c(e?.scope)!==null&&t!==void 0&&t.state!==`sparse`}function Jn(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 Yn(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Xn(t){let n=t.orientation;if(typeof n==`string`&&de.includes(n))return n;throw new e(`COMMAND_FAILED`,`iOS runner returned an invalid orientation result`,{orientation:n})}function Zn(e,t,n,r){let i={...n,open:async()=>$(`open`),openDevice:async()=>$(`openDevice`),close:async()=>$(`close`),screenshot:async()=>$(`screenshot`),readClipboard:async()=>$(`readClipboard`),writeClipboard:async()=>$(`writeClipboard`),setSetting:async()=>$(`setSetting`),readSetting:async()=>$(`readSetting`)};return ve(i,n=>We(r,{deviceId:e.id,requestId:t.requestId},n))}function $(t){throw new e(`UNSUPPORTED_OPERATION`,`${t} uses local Apple tooling (simctl/devicectl), which an injected runner transport cannot reach; the provider session must supply its own ${t} implementation.`)}async function Qn(e,t,n={},r){if($n(e,n.surface)){await it(t,{surface:n.surface,fullscreen:n.fullscreen});return}if(n.captureBackend===`runner`){await V(e,t,n.appBundleId,n.fullscreen,r);return}await qt(e,t,{appBundleId:n.appBundleId,pixelDensity:n.pixelDensity,fullscreen:n.fullscreen,runnerOptions:r,normalizeStatusBar:n.normalizeStatusBar,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck})}function $n(e,t){return a(e)&&t!==void 0&&t!==`app`}function er(e,t){return a(e)&&t!==void 0&&t!==`app`}async function tr(e,t){let{runMacOsReadTextAction:n}=await import(`./helper.js`).then(e=>e.t);return(await n(e.x,e.y,{bundleId:t?.appBundleId,surface:t?.surface})).text}async function nr(e,t,n,r){let i=await C(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{Vn as createAppleInteractor};
|
package/dist/src/internal/bin.js
CHANGED
|
@@ -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.
|
|
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.12`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
|