agent-device 0.21.9 → 0.21.11

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.
Files changed (46) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.9.apk → agent-device-android-ime-helper-0.21.11.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.11.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.9.manifest.json → agent-device-android-ime-helper-0.21.11.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.9.apk → agent-device-android-snapshot-helper-0.21.11.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.11.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.9.manifest.json → agent-device-android-snapshot-helper-0.21.11.manifest.json} +6 -6
  7. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationProjection.swift +2 -0
  8. package/dist/src/agent-browser-provider.js +1 -1
  9. package/dist/src/agent-device-client.js +2 -2
  10. package/dist/src/app-launch.js +1 -1
  11. package/dist/src/app-lifecycle.js +1 -1
  12. package/dist/src/app-resolution.js +1 -1
  13. package/dist/src/application-lifecycle-interaction.js +1 -1
  14. package/dist/src/cli.js +2 -2
  15. package/dist/src/command-tools.js +1 -1
  16. package/dist/src/debug-symbols-facade.js +1 -1
  17. package/dist/src/device-claim-rule.js +2 -2
  18. package/dist/src/device-session.js +1 -1
  19. package/dist/src/interaction2.js +1 -1
  20. package/dist/src/interactor.js +1 -1
  21. package/dist/src/interactor2.js +1 -1
  22. package/dist/src/internal/bin.js +1 -1
  23. package/dist/src/lease-context.js +1 -1
  24. package/dist/src/lease-scope.js +1 -1
  25. package/dist/src/mechanics.js +1 -1
  26. package/dist/src/open-target-resolution.js +1 -1
  27. package/dist/src/perf-facade.js +1 -1
  28. package/dist/src/platform-runtime-open-target.js +1 -1
  29. package/dist/src/react-native.js +1 -1
  30. package/dist/src/record-runtime.js +1 -1
  31. package/dist/src/registry.js +23 -23
  32. package/dist/src/replay.js +1 -1
  33. package/dist/src/runner-client.js +1 -1
  34. package/dist/src/runtime4.js +1 -1
  35. package/dist/src/screenshot-result.js +1 -1
  36. package/dist/src/script.js +1 -1
  37. package/dist/src/sdk-batch-runner.js +2 -2
  38. package/dist/src/semantic-index.js +1 -1
  39. package/dist/src/session-store.js +1 -1
  40. package/dist/src/session2.js +1 -1
  41. package/dist/src/snapshot-diagnostics.js +1 -1
  42. package/dist/src/stop-sequence.js +1 -1
  43. package/package.json +1 -1
  44. package/server.json +2 -2
  45. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.9.apk.sha256 +0 -1
  46. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.9.apk.sha256 +0 -1
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t}from"./sdk-batch-runner.js";import{n}from"./app-inventory.js";import"./device.js";import{t as r}from"./request-cancellation.js";import{n as i,t as a}from"./ios-client.js";import{i as o}from"./snapshot.js";import s from"node:path";import c from"node:fs";import l from"node:os";import{setTimeout as u}from"node:timers/promises";function d(e){return e?.trim()||void 0}async function f(e,t){let n=await i({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t},a={exec:async(e,t)=>await v(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return a.reverse=await t.android.createPortReverse(a.exec),Object.assign(r,{adbProvider:a})}function p(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function m(e,t,n,i,a,o){a?.throwIfAborted();let s=d(i?.packageNameHint);i?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await v(t,e,n),s,a);let c=await r(o,e.assets.getOrUpload({path:n,name:w(s,n)},{signal:a}),a);await r(o,t.client.sendAsset(c.signedDownloadUrl),a),a?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function h(e,t){await e.adbProvider.reverse?.ensure({local:C(t.devicePort),remote:C(t.hostPort),ownerId:t.name})}async function g(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await _(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function _(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function v(e,t,n){let{invocation:r,result:i}=await y(e,t,n);return await b(r,i,n?.allowFailure,e.dependencies)}async function y(e,t,n){let r=await x(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function b(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function x(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??S(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function S(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function C(t){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${t}`);return`tcp:${t}`}function w(e,t){let n=s.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function T(e,t){let n=await a({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t}}async function E(e,t,n,i,a,o){a?.throwIfAborted();let s=await A(n,t.dependencies);try{a?.throwIfAborted();let n=await r(o,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:a}),a),c=(await D(t,n.signedDownloadUrl,{md5:n.md5,relaunch:i?.relaunch,appIdentifierHint:i?.appIdentifierHint},a,o)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function D(t,n,i,a,o){a?.throwIfAborted();let s=await r(o,t.client.listApps(),a).catch(e=>{if(a?.aborted)throw e}),c=d((await r(o,t.client.installApp(n,{md5:i?.md5,launchMode:i?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),a)).bundleId),l=d(i?.appIdentifierHint),f=[];for(let e of M){e>0&&await u(e,void 0,{signal:a}),f=await r(o,t.client.listApps(),a);let n=F({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:f});if(n)return{appId:n}}throw new e(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:f.filter(L).map(e=>e.bundleId).sort()})}function O(e){return new k(e)}var k=class{session;constructor(e){this.session=e}async open(e,n){if(n?.url){await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e)),await this.session.client.openUrl(n.url);return}if(t(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(o(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:P},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=N){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>u(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),await u(t);return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);c.mkdirSync(s.dirname(e),{recursive:!0}),await c.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async home(){throw z(`home`,`Limrun iOS direct sessions do not expose home yet.`)}async setOrientation(e){if(e===`portrait-upside-down`)throw z(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async performGesture(){throw z(`gesture`,`Limrun iOS direct sessions do not expose portable gesture execution yet.`)}async appSwitcher(){throw z(`app-switcher`,`Limrun iOS direct sessions do not expose app switcher yet.`)}async tvRemote(){throw z(`tv-remote`,`Limrun iOS direct sessions do not expose tv remote control.`)}async readAlert(){throw z(`alert`,R)}async awaitAlert(){throw z(`alert`,R)}async acceptAlert(){throw z(`alert`,R)}async dismissAlert(){throw z(`alert`,R)}async readClipboard(){throw z(`clipboard`,`Limrun iOS direct sessions do not expose clipboard read yet.`)}async writeClipboard(){throw z(`clipboard`,`Limrun iOS direct sessions do not expose clipboard write yet.`)}async setSetting(){throw z(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function A(e,t){if(!(await c.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:s.basename(e),appName:j(e),cleanup:async()=>{}};let n=await c.promises.mkdtemp(s.join(l.tmpdir(),`agent-device-limrun-ios-app-`)),r=s.join(n,`${s.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:s.dirname(e),entryName:s.basename(e),archivePath:r})}catch(e){throw await c.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:s.basename(r),appName:await t.ios.readBundleAppName(e)??j(e),cleanup:async()=>{await c.promises.rm(n,{recursive:!0,force:!0})}}}function j(e){return s.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const M=[0,250],N=800,P=80;function F(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??I(e.beforeInstallApps,e.afterInstallApps)}function I(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>L(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function L(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}const R=`Limrun iOS direct sessions do not expose alert inspection yet.`;function z(t,n){throw new e(`UNSUPPORTED_OPERATION`,n,{command:t})}function B(e){return e.platform===`android`?V(e):H(e)}function V(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:p(e),adb:e.adbProvider,listApps:async r=>await e.dependencies.android.listApps(t,n(r)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function H(e){return{platform:`ios`,device:e.device,interactor:O(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>n(t)===`all`||L(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await D(e,t,n),runSimctl:t=>e.client.simctl(t)}}function U(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{g as a,f as c,E as i,m as l,O as n,h as o,T as r,p as s,B as t};
1
+ import{D as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{n}from"./app-inventory.js";import"./device.js";import{t as r}from"./request-cancellation.js";import{n as i,t as a}from"./ios-client.js";import{i as o}from"./snapshot.js";import s from"node:path";import c from"node:fs";import l from"node:os";import{setTimeout as u}from"node:timers/promises";function d(e){return e?.trim()||void 0}async function f(e,t){let n=await i({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t},a={exec:async(e,t)=>await v(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return a.reverse=await t.android.createPortReverse(a.exec),Object.assign(r,{adbProvider:a})}function p(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function m(e,t,n,i,a,o){a?.throwIfAborted();let s=d(i?.packageNameHint);i?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await v(t,e,n),s,a);let c=await r(o,e.assets.getOrUpload({path:n,name:w(s,n)},{signal:a}),a);await r(o,t.client.sendAsset(c.signedDownloadUrl),a),a?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function h(e,t){await e.adbProvider.reverse?.ensure({local:C(t.devicePort),remote:C(t.hostPort),ownerId:t.name})}async function g(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await _(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function _(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function v(e,t,n){let{invocation:r,result:i}=await y(e,t,n);return await b(r,i,n?.allowFailure,e.dependencies)}async function y(e,t,n){let r=await x(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function b(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function x(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??S(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function S(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function C(t){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${t}`);return`tcp:${t}`}function w(e,t){let n=s.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function T(e,t){let n=await a({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t}}async function E(e,t,n,i,a,o){a?.throwIfAborted();let s=await A(n,t.dependencies);try{a?.throwIfAborted();let n=await r(o,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:a}),a),c=(await D(t,n.signedDownloadUrl,{md5:n.md5,relaunch:i?.relaunch,appIdentifierHint:i?.appIdentifierHint},a,o)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function D(t,n,i,a,o){a?.throwIfAborted();let s=await r(o,t.client.listApps(),a).catch(e=>{if(a?.aborted)throw e}),c=d((await r(o,t.client.installApp(n,{md5:i?.md5,launchMode:i?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),a)).bundleId),l=d(i?.appIdentifierHint),f=[];for(let e of M){e>0&&await u(e,void 0,{signal:a}),f=await r(o,t.client.listApps(),a);let n=F({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:f});if(n)return{appId:n}}throw new e(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:f.filter(L).map(e=>e.bundleId).sort()})}function O(e){return new k(e)}var k=class{session;constructor(e){this.session=e}async open(e,n){if(n?.url){await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e)),await this.session.client.openUrl(n.url);return}if(t(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(o(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:P},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=N){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>u(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),await u(t);return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);c.mkdirSync(s.dirname(e),{recursive:!0}),await c.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async home(){throw z(`home`,`Limrun iOS direct sessions do not expose home yet.`)}async setOrientation(e){if(e===`portrait-upside-down`)throw z(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async performGesture(){throw z(`gesture`,`Limrun iOS direct sessions do not expose portable gesture execution yet.`)}async appSwitcher(){throw z(`app-switcher`,`Limrun iOS direct sessions do not expose app switcher yet.`)}async tvRemote(){throw z(`tv-remote`,`Limrun iOS direct sessions do not expose tv remote control.`)}async readAlert(){throw z(`alert`,R)}async awaitAlert(){throw z(`alert`,R)}async acceptAlert(){throw z(`alert`,R)}async dismissAlert(){throw z(`alert`,R)}async readClipboard(){throw z(`clipboard`,`Limrun iOS direct sessions do not expose clipboard read yet.`)}async writeClipboard(){throw z(`clipboard`,`Limrun iOS direct sessions do not expose clipboard write yet.`)}async setSetting(){throw z(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function A(e,t){if(!(await c.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:s.basename(e),appName:j(e),cleanup:async()=>{}};let n=await c.promises.mkdtemp(s.join(l.tmpdir(),`agent-device-limrun-ios-app-`)),r=s.join(n,`${s.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:s.dirname(e),entryName:s.basename(e),archivePath:r})}catch(e){throw await c.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:s.basename(r),appName:await t.ios.readBundleAppName(e)??j(e),cleanup:async()=>{await c.promises.rm(n,{recursive:!0,force:!0})}}}function j(e){return s.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const M=[0,250],N=800,P=80;function F(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??I(e.beforeInstallApps,e.afterInstallApps)}function I(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>L(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function L(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}const R=`Limrun iOS direct sessions do not expose alert inspection yet.`;function z(t,n){throw new e(`UNSUPPORTED_OPERATION`,n,{command:t})}function B(e){return e.platform===`android`?V(e):H(e)}function V(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:p(e),adb:e.adbProvider,listApps:async r=>await e.dependencies.android.listApps(t,n(r)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function H(e){return{platform:`ios`,device:e.device,interactor:O(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>n(t)===`all`||L(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...U(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await D(e,t,n),runSimctl:t=>e.client.simctl(t)}}function U(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{g as a,f as c,E as i,m as l,O as n,h as o,T as r,p as s,B as t};
@@ -1 +1 @@
1
- import{D as e,L as t,O as n,T as r,d as i,o as a,u as o,z as s}from"./sdk-contracts.js";import{f as c}from"./sdk-batch-runner.js";import{b as l,f as u}from"./sdk-device.js";import{C as d,h as f,m as p,p as ee}from"./sdk-batch.js";import{c as te,o as ne}from"./scroll-gesture.js";import{C as m,E as re,S as ie,v as ae,x as h}from"./script.js";import{A as oe,M as g,N as _,d as se,n as ce,r as v,t as le,u as ue}from"./session-snapshot.js";import{N as de,d as y}from"./parameterized-recorded-fill.js";import{m as fe,s as b}from"./runtime.js";import{n as x}from"./catalog.js";import{r as pe}from"./success-text.js";import{i as S,n as me,r as he}from"./click-button.js";import{r as ge,t as _e}from"./interaction-positionals.js";import{r as C}from"./diagnostics.js";import{t as ve}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import"./gesture-plan.js";import{r as ye}from"./request-cancel.js";import"./request.js";import{i as be}from"./request-runtime-binding.js";import{n as w,t as T}from"./touch-reference-frame.js";import{c as xe,s as Se}from"./quality-warnings.js";import{i as Ce,r as E}from"./internal/daemon.js";import{r as we}from"./capture-disclosure.js";import{a as Te,c as Ee,i as D,l as De,n as O,o as k,r as A,s as Oe,t as ke}from"./interaction-ref-policy.js";import{t as j}from"./gesture-runtime.js";import{d as Ae,g as M,i as je,r as Me,u as Ne}from"./selector-runtime.js";import{n as Pe}from"./type-text-runtime.js";function Fe(t){let n=t.flags?.recordAs;if(n!==void 0){if(de(n),t.flags?.noRecord)throw new e(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!t.isSessionRecording&&!t.replayPlanStep)throw new e(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}async function N(e,t){if(!oe(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){C({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function P(e,t){return!u(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:a(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Ie=new Set(f()),Le=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function F(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Le.has(e)))}function Re(e){return Be({fields:ze(e.command),input:e.input??{},data:F(e.data),controlledFields:Ie})}function ze(e){let t=d(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Be(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Ve(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a,observation:o}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`&&!t.lease?.leaseProvider&&!be(t.device)){if(!o)throw Error(`Android observation was not injected into the request`);let e=await o.readScreenSize(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=T(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let u=await a(t,n,r,i,{interactiveOnly:!0}),d=T(u);return d&&s.setTouchReferenceFrame(d),d}async function He(e){try{return await Ve(e)}catch(t){C({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function I(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=We(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ue({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...pe(o)})}function Ue(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function We(e,t,n){let r=L(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Ge(t,n),a=Ke(e);if(a)return Je(a,e??{},i);if(i)return qe(e,i)}function L(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ge(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ke(e){let t=L(e,`ref`);return t===void 0?L(e,`selector`):`@${t}`}function qe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Je(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function R(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function z(e,t){let n=R(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=M(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:a(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ye(e){let t=R(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...tt(e[2])};let n=et(e),r=z(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function B(e){return{ok:!1,response:a(`INVALID_ARGS`,`fill requires text after ${e} (use "" to clear the field)`)}}function Xe(e){let t=Ze(e);if(!t)return{ok:!1,response:a(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)};switch(t.kind){case`ref`:{let n=M(e[0]??``);return n.ok?t.text===void 0?B(`ref`):{ok:!0,target:{kind:`ref`,ref:n.ref},refGeneration:n.generation,text:t.text}:{ok:!1,response:n.response}}case`point`:return t.text===void 0?B(`coordinates`):{ok:!0,target:{kind:`point`,x:t.target.x,y:t.target.y},text:t.text};case`selector`:return t.text===void 0||t.text.length>0&&!t.text.trim()?B(`selector`):{ok:!0,target:{kind:`selector`,selector:t.target.selector},text:t.text}}}function Ze(e){try{return _e(e)}catch{return null}}function Qe(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ge(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function $e(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function et(e){let t=e.at(-1);return e.length>1&&nt(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function tt(e){return e===void 0?{}:{durationMs:Number(e)}}function nt(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}const rt={source:`direct-ios`,kind:`not-observed`};function V(e,t){if(!it(e))return t;let{resolution:n,...r}=t;return r}function it(e){return`dispatchPath`in e&&e.dispatchPath===`maestro-non-hittable-fallback`}function H(e){return U({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function U(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...V(t,{resolution:t.kind===`runner-payload`?rt:t.resolution}),...r??{}};return{result:I({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:I({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...V(t,Qe(i)),...st(i.settle,e.settleRefsGeneration),...r??{}},o=I({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...ot(i)}}),s=I({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=ct(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...at(i)}}function at(e){let t=W(e)?.node??(`node`in e?e.node:void 0),n=`preAction`in e?e.preAction?.nodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function ot(e){let t=W(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function W(e){return`recordingTarget`in e?e.recordingTarget:void 0}function st(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function ct(e,t){return t?e?`${e} ${t}`:t:e}async function lt(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await He({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession,observation:t.androidObservation}):w(n.snapshot?.nodes??[]);return U({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:le(n,r.settle)})}function G(e){return e.command?Re({command:e.command,input:e.flags,data:e.data}):F(e.data)}function ut(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function K(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function q(e){return[String(e.x),String(e.y)]}function dt(t){let{error:n,snapshotGeneration:r,publishPartialRefs:i}=t;if(n.code!==`AMBIGUOUS_MATCH`)return n;let a=s(n.details);return a.length===0||r===void 0?n:(i(a),new e(n.code,n.message,{...n.details,refsGeneration:r},n.cause))}async function ft(t,n,r){let i=await Ne(t,r);if(i){if(i.permissionDialog)return`press ${n} opened an Android permission dialog (${i.foregroundPackage}) over ${i.expectedPackage}. ${i.hint}`;throw new e(`COMMAND_FAILED`,`press ${n} left ${t.appBundleId} and foregrounded ${i.foregroundPackage}. The tap likely escaped the app.`,i)}}function pt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}async function J(e){if(!mt(e))return;let t=gt(e.session.snapshot);if(!t)return;let n=await _t(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!vt(t.snapshot,n,e.command)))return xt(t.snapshot,n,e.command)}function mt(e){return ht(e.command)&&n(e.error).code===`XCTEST_RECORDED_FAILURE`&&Ee(e.session,{skipPendingPostGestureStabilization:!1})}function ht(e){return e===`click`||e===`press`}function gt(e){if(!Y(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){C({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=St(e.presentationKey);if(n){if(n.raw){C({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function _t(e,t,n){try{let r=xe(t);return await e.captureSnapshotForSession(e.session,Dt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:ye(e.requestId)})}catch(t){C({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function vt(e,t,n){let r=yt(e,t);return r===void 0?bt(e,t,n):r?!0:(C({level:`debug`,phase:`ios_tap_failure_corroboration_identity_mismatch`,data:{command:n}}),!1)}function yt(e,t){if(e.comparisonKey!==void 0||t.comparisonKey!==void 0)return e.comparisonKey!==void 0&&e.comparisonKey===t.comparisonKey}function bt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(C({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(C({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function xt(e,t,n){if(!Y(t))return;let r=b(e.nodes),i=b(t.nodes);if(r.digest!==i.digest)return C({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function Y(e){return!!(e&&e.nodes.length>0&&!Se(e.snapshotQuality))}function St(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return Ct(t)}function Ct(e){let t=wt(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!Tt(t.depth)||!Et(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function wt(e){return typeof e==`object`&&e?e:void 0}function Tt(e){return e==null||typeof e==`number`}function Et(e){return e==null||typeof e==`string`}function Dt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function Ot(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function kt(e,t,n,r,i){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let a=await E({session:e,command:t,phase:`before-command`,observation:i});if(n.refContext&&a.status===`recovered`){let t=O({ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning,frame:_({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration})});if(t)return{aborted:!0,response:t}}let o=await r();return await E({session:e,command:t,phase:`after-command`,observation:i}),{aborted:!1,readiness:a,runtimeResult:o}}async function X(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return o();let i=Te({...e,touchExecutor:t.touchExecutor}),a=Date.now();try{let n,o=await kt(r,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(i);return n=await t.afterRun?.(e),e},e.androidObservation);if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...n?[n]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return k({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Nt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(i){let o=dt({error:n(i),snapshotGeneration:r.snapshotGeneration,publishPartialRefs:e=>ce(r,e)});if(pt(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Z(o):await At({error:o,handlerParams:e,session:r,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||Z(o)}}async function At(e){if(!e.target)return;let t=fe(e.error);if(!t&&y(e.session))return;let n=await J({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=jt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:w(e.session.snapshot?.nodes??[]),extra:e.extra});return k({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function jt(e){return e.resolvedTarget?U({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):H({targetKind:e.target.kind,point:Mt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...Ot(e.target),...e.extra??{}}})}function Mt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function Z(e){return{ok:!1,error:t(e)}}function Nt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?q(t.point):void 0}async function Q(e,t,n,r){let i=await se({device:t.device,command:n,requiresCapture:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?{ok:!0,touchExecutor:ue(i.runtime,e.contextFromFlags(e.req.flags,t.appBundleId,t.trace?.outPath))}:i}async function Pt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=P(i,`fill`);if(e)return e}if(!i)return o();let a=Xe(t.positionals??[]);if(!a.ok)return a.response;let s=await Q(e,i,`fill`,a.target.kind!==`point`);if(!s.ok)return s.response;let{touchExecutor:c}=s;Fe({flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0,isSessionRecording:y(i)});let l=D(`fill`,t.flags);if(l)return l;let u=await Ft(e,i,a.target,a.refGeneration);if(u.response)return u.response;let{staleRefsWarning:d}=u,f=t.internal?.replayTargetGuard;return await X(e,{touchExecutor:c,refContext:a.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:a.target.ref,mintedGeneration:a.refGeneration,staleRefsWarning:d}:void 0,run:async e=>await e.interactions.fill(a.target,a.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:A(t.flags),expectedResolvedTarget:f,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>It({session:i,result:e,text:a.text,flags:t.flags,staleRefsWarning:d})})}async function Ft(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?v({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:O({ref:n.ref,mintedGeneration:r,staleRefsWarning:i,frame:_({session:t,ref:n.ref,mintedGeneration:r})});return o?{response:o,staleRefsWarning:i}:(await N(e,t),{staleRefsWarning:i})}function It(e){let{session:t,result:n}=e,r=K(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:w(t.snapshot?.nodes??[]);return U({source:{kind:`runtime`,result:n,publicData:G({command:`fill`,flags:e.flags,data:n.backendResult}),...r.used?{dispatchPath:`maestro-non-hittable-fallback`}:{}},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:le(t,n.settle)})}async function Lt(e,n,r,i){let a=e,o={selector:r.raw},s=Date.now();g(n);try{let e=await i(r)??{},t=Date.now(),c=zt(e),l=G({command:ut(a.req.command,`press`),flags:a.req.flags,data:e}),u=K(r.allowNonHittableCoordinateFallback===!0,e),{result:d,responseData:f}=U({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:l,point:c,dispatchPath:u.used?`maestro-non-hittable-fallback`:`maestro-direct-selector`},referenceFrame:Bt(e),extra:{...o,...u.extra}});return k({session:n,sessionStore:a.sessionStore,command:a.req.command,positionals:a.req.positionals??[],retryPositionals:q(c),flags:a.req.flags,result:d,responseData:f,actionStartedAt:s,actionFinishedAt:t})}catch(e){return await Rt({error:e,handlerParams:a,session:n,extra:o,positionals:[],actionStartedAt:s})||(Oe(e,{delegateSemanticFailures:r.allowNonHittableCoordinateFallback!==!0})?(C({level:`debug`,phase:`ios_direct_selector_tap_fallback`,data:{selector:r.raw,error:e instanceof Error?e.message:String(e)}}),null):{ok:!1,error:t(e)})}}async function Rt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await J({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=H({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return k({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function zt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Bt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Vt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return!e.tapElementSelectorAvailable||i?.maestro?.allowNonHittableCoordinateFallback!==!0||n!==`click`||r.kind!==`selector`||y(t)||Wt(i)||p(n)&&i?.verify===!0||ee(n)&&i?.settle===!0?null:Ht(t,r.selector,i)}function Ht(e,t,n){let r=De({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Ut=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function Wt(e){return Ut.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Gt=new Set([`press`,`click`]);async function Kt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,a=r.get(i);if(!a)return{response:o()};let s=t===`click`?`click`:t,c=qt(a,t,s,n.flags);if(c)return{response:c};let l=n.positionals??[],u=t===`longpress`?Ye(l):z(l,s);if(!u.ok)return{response:u.response};let d=Yt(a,n,u),f=Zt(e,a,t,u,d);if(f.response)return{response:f.response};let p=S(n.flags);return{admitted:{session:a,commandLabel:s,clickButton:p,resultButtonTag:me(p),target:u.target,durationMs:t===`longpress`?u.durationMs:void 0,staleRefsWarning:d,refContext:Xt(n,u,d)}}}function qt(e,t,n,r){return P(e,n)||D(t,r)||Jt(e,t,n,r)}function Jt(e,t,n,r){let i=S(r);if(!Gt.has(t)||i===`primary`)return;let o=he({commandLabel:n,platform:l(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(o)return a(o.code,o.message,o.details)}function Yt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return v({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function Xt(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}function Zt(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:O({ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i,frame:_({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration})});return s?{response:s}:{}}async function $(e,t){let n=await Kt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=await Q(e,r.session,t,r.target.kind!==`point`);if(!i.ok)return i.response;let{touchExecutor:a}=i,o=r.target.kind===`ref`?await N(e,r.session):void 0,s={...r,androidFreshnessBaseline:o},c=e.req.internal?.replayTargetGuard?null:Vt({session:s.session,commandLabel:s.commandLabel,target:s.target,flags:e.req.flags,tapElementSelectorAvailable:a.tapElementSelector!==void 0});if(c&&a.tapElementSelector){let t=await Lt(e,s.session,c,a.tapElementSelector);if(t)return t}return await X(e,{...Qt(e,t,s),touchExecutor:a})}function Qt(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await $t({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async t=>{if(!a.lease?.leaseProvider)return await ft(a,$e(o,t),e.androidObservation)},buildPayloads:async n=>{let i=tn(n);return await lt({params:e,session:a,result:n,staleRefsWarning:c,publicData:G({command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function $t(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:A(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,en(e,c));case`press`:return await t.interactions.press(r,en(e,c))}}function en(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,preresolvedTarget:e.preresolvedTarget}}function tn(e){return`durationMs`in e?e.durationMs:void 0}function nn(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function rn(e){return`refused`in e}async function an(e){return await dn(e,`gesture`,async t=>on(e,t))}async function on(e,t){let n=re(e.req.input),r=pn(n,t);r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile);let i=await j({device:t.device,input:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?cn(n,r,await sn(un(e,i.gestures),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags):{refused:i.response}}async function sn(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function cn(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:hn(e,i),flags:Sn(e,r),responseData:nn(n,{executionProfile:fn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function ln(e){return await dn(e,`swipe`,async t=>{let n=gn(e.req.input),r=await j({device:t.device,input:m(n).gesture,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!r.ok)return{refused:r.response};let i=n.count??1,a=n.pauseMs??0,o=n.pattern??`one-way`,s=await bn(un(e,r.gestures),e,n,i,a,o);return{positionals:yn(n),flags:e.req.flags,responseData:nn(s,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:s.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:i,pauseMs:a,pattern:o})}})}function un(e,t){return Te({...e,gestures:t,pairedGestureViewport:e.req.internal?.gestureViewport})}async function dn(e,n,r){let i=e.sessionStore.get(e.sessionName);if(!i)return o();let a=Date.now();try{let t=be(i.device),o=t?{status:`clear`}:await E({session:i,command:n,phase:`before-command`,observation:e.androidObservation}),s=await r(i);if(rn(s))return s.refused;t||await E({session:i,command:n,phase:`after-command`,observation:e.androidObservation});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),k({session:i,sessionStore:e.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(e){return{ok:!1,error:t(e)}}}function fn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function pn(e,t){let n=ie(e);return n.intent===`drag`?{...n,source:mn(n.source,t),destination:mn(n.destination,t)}:n}function mn(t,n){if(!t.startsWith(`@`))return t;let a=r(t);if(!a)throw new e(`INVALID_ARGS`,`Invalid ref "${t}" — malformed generation suffix.`,{hint:i});return ke({ref:a.base,mintedGeneration:a.generation,frame:_({session:n,ref:a.base,mintedGeneration:a.generation})}),a.base}function hn(e,t){return e.kind!==`drag`||!t?h(e):h({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function gn(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`swipe requires structured object input`);ae(t);let n=t,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new e(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:vn(n.from,`swipe from`),to:vn(n.to,`swipe to`),count:c(n,`count`,{min:1,max:200}),pauseMs:c(n,`pauseMs`,{min:0,max:ne}),pattern:r};return _n(i),i}function _n(t){let n=t.count??1,r=t.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new e(`INVALID_ARGS`,`Swipe series must fit within ${te}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function vn(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be a point`);let r=t;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new e(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new e(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function yn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function bn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=m(xn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await ve(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function xn(e,t,n){return t!==`ping-pong`||n%2!=1?e:{...e,from:e.to,to:e.from}}function Sn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Cn(e){let t={},n=await wn({...e,refSnapshotFlagGuardResponse:Ae,activationProof:t});return n&&we(n,t.state)}async function wn(e){switch(e.req.command){case`press`:return await $(e,`press`);case`click`:return await $(e,`click`);case`longpress`:return await $(e,`longpress`);case`hover`:return await $(e,`hover`);case`fill`:return await Pt(e);default:return await Tn(e)}}async function Tn(e){switch(e.req.command){case x.gesture:return await an(e);case x.swipe:return await ln(e);case x.type:return await En(e);case`get`:return await Me(e);case`is`:return await je(e);default:return null}}async function En(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);if(!r)return o();let i=await Pe({device:r.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!i.ok)return i.response;let a=await Dn(r,e.androidObservation);return a.response?a.response:await On(e,r,i.typeText,a.warning)}async function Dn(e,t){if(e.device.platform===`android`&&e.screenRecording){let n=await Ce({session:e,observation:t});if(n.status===`failed`)return{response:a(`COMMAND_FAILED`,`Android system dialog blocked the recording session`)};if(n.status===`unknown`)return{warning:n.warning}}return{}}async function On(e,n,r,i){let{req:a,sessionStore:o}=e,s=Date.now();try{let t=await E({session:n,command:a.command,phase:`before-command`,observation:e.androidObservation});g(n);let c=await r(a.positionals??[],e.contextFromFlags(a.flags,n.appBundleId,n.trace?.outPath));await E({session:n,command:a.command,phase:`after-command`,observation:e.androidObservation});let l=Date.now(),u={...c};return kn(u,i,t),k({session:n,sessionStore:o,command:a.command,positionals:a.positionals??[],flags:a.flags,result:u,responseData:u,actionStartedAt:s,actionFinishedAt:l})}catch(e){return{ok:!1,error:t(e)}}}function kn(e,t,n){let r=[typeof e.warning==`string`?e.warning:void 0,t];n.status===`recovered`&&r.push(n.warning);let i=r.filter(e=>typeof e==`string`&&e.length>0).join(` `);i.length>0&&(e.warning=i)}export{Cn as handleInteractionCommands};
1
+ import{D as e,L as t,O as n,T as r,d as i,o as a,u as o,z as s}from"./sdk-contracts.js";import{p as c}from"./sdk-batch-runner.js";import{b as l,f as u}from"./sdk-device.js";import{C as d,h as f,m as p,p as ee}from"./sdk-batch.js";import{c as te,o as ne}from"./scroll-gesture.js";import{C as m,E as re,S as ie,v as ae,x as h}from"./script.js";import{A as oe,M as g,N as _,d as se,n as ce,r as v,t as le,u as ue}from"./session-snapshot.js";import{N as de,d as y}from"./parameterized-recorded-fill.js";import{m as fe,s as b}from"./runtime.js";import{n as x}from"./catalog.js";import{r as pe}from"./success-text.js";import{i as S,n as me,r as he}from"./click-button.js";import{r as ge,t as _e}from"./interaction-positionals.js";import{r as C}from"./diagnostics.js";import{t as ve}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import"./gesture-plan.js";import{r as ye}from"./request-cancel.js";import"./request.js";import{i as be}from"./request-runtime-binding.js";import{n as w,t as T}from"./touch-reference-frame.js";import{c as xe,s as Se}from"./quality-warnings.js";import{i as Ce,r as E}from"./internal/daemon.js";import{r as we}from"./capture-disclosure.js";import{a as Te,c as Ee,i as D,l as De,n as O,o as k,r as A,s as Oe,t as ke}from"./interaction-ref-policy.js";import{t as j}from"./gesture-runtime.js";import{d as Ae,g as M,i as je,r as Me,u as Ne}from"./selector-runtime.js";import{n as Pe}from"./type-text-runtime.js";function Fe(t){let n=t.flags?.recordAs;if(n!==void 0){if(de(n),t.flags?.noRecord)throw new e(`INVALID_ARGS`,`fill --record-as cannot be combined with --no-record because no script step would be published.`);if(!t.isSessionRecording&&!t.replayPlanStep)throw new e(`INVALID_ARGS`,`fill --record-as requires an armed script recording. Start a fresh session with open --save-script, then retry the fill.`)}}async function N(e,t){if(!oe(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){C({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function P(e,t){return!u(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:a(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}const Ie=new Set(f()),Le=new Set([`currentUptimeMs`,`gestureEndUptimeMs`,`gestureStartUptimeMs`,`sequenceResults`]);function F(e){if(e)return Object.fromEntries(Object.entries(e).filter(([e])=>!Le.has(e)))}function Re(e){return Be({fields:ze(e.command),input:e.input??{},data:F(e.data),controlledFields:Ie})}function ze(e){let t=d(e);if(!t)throw Error(`Missing response data transform descriptor for ${e}`);return t.fields}function Be(e){let t=Object.fromEntries(Object.entries(e.data??{}).filter(([t])=>!e.controlledFields.has(t)));for(let[n,r]of Object.entries(e.fields)){let i=e.input[n]===void 0?r.defaultValue:e.input[n];if(i===void 0||r.omitDefault===!0&&i===r.defaultValue){delete t[n];continue}t[n]=i}return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Ve(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a,observation:o}=e,s=t.screenRecording?.handle;if(!s)return;let c=s.inspect().touchReferenceFrame;if(c)return c;if(t.device.platform===`android`&&!t.lease?.leaseProvider&&!be(t.device)){if(!o)throw Error(`Android observation was not injected into the request`);let e=await o.readScreenSize(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return s.setTouchReferenceFrame(n),n}let l=T(t.snapshot);if(l)return s.setTouchReferenceFrame(l),l;let u=await a(t,n,r,i,{interactiveOnly:!0}),d=T(u);return d&&s.setTouchReferenceFrame(d),d}async function He(e){try{return await Ve(e)}catch(t){C({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:e.session.device.platform,error:t instanceof Error?t.message:String(t)}});return}}function I(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=We(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return Ue({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...pe(o)})}function Ue(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function We(e,t,n){let r=L(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=Ge(t,n),a=Ke(e);if(a)return Je(a,e??{},i);if(i)return qe(e,i)}function L(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function Ge(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function Ke(e){let t=L(e,`ref`);return t===void 0?L(e,`selector`):`@${t}`}function qe(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:e?.gesture===`hover`?`Hovered${t}`:`Tapped${t}`}function Je(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:t.gesture===`hover`?`Hovered ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function R(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function z(e,t){let n=R(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=M(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:a(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ye(e){let t=R(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...tt(e[2])};let n=et(e),r=z(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function B(e){return{ok:!1,response:a(`INVALID_ARGS`,`fill requires text after ${e} (use "" to clear the field)`)}}function Xe(e){let t=Ze(e);if(!t)return{ok:!1,response:a(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)};switch(t.kind){case`ref`:{let n=M(e[0]??``);return n.ok?t.text===void 0?B(`ref`):{ok:!0,target:{kind:`ref`,ref:n.ref},refGeneration:n.generation,text:t.text}:{ok:!1,response:n.response}}case`point`:return t.text===void 0?B(`coordinates`):{ok:!0,target:{kind:`point`,x:t.target.x,y:t.target.y},text:t.text};case`selector`:return t.text===void 0||t.text.length>0&&!t.text.trim()?B(`selector`):{ok:!0,target:{kind:`selector`,selector:t.target.selector},text:t.text}}}function Ze(e){try{return _e(e)}catch{return null}}function Qe(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:ge(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function $e(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function et(e){let t=e.at(-1);return e.length>1&&nt(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function tt(e){return e===void 0?{}:{durationMs:Number(e)}}function nt(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}const rt={source:`direct-ios`,kind:`not-observed`};function V(e,t){if(!it(e))return t;let{resolution:n,...r}=t;return r}function it(e){return`dispatchPath`in e&&e.dispatchPath===`maestro-non-hittable-fallback`}function H(e){return U({source:{kind:`corroborated-tap`,targetKind:e.targetKind,data:{warning:e.warning},publicData:{warning:e.warning},point:e.point,resolution:e.resolution},referenceFrame:e.referenceFrame,extra:e.extra})}function U(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`||t.kind===`corroborated-tap`){let e={targetKind:t.targetKind,...V(t,{resolution:t.kind===`runner-payload`?rt:t.resolution}),...r??{}};return{result:I({data:t.data,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e}),responseData:I({data:t.publicData,fallbackX:t.point?.x,fallbackY:t.point?.y,referenceFrame:n,extra:e})}}let{result:i}=t,a={targetKind:i.kind,...V(t,Qe(i)),...st(i.settle,e.settleRefsGeneration),...r??{}},o=I({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:{...a,...ot(i)}}),s=I({data:t.publicData,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:a}),c=ct(`warning`in i?i.warning:void 0,e.staleRefsWarning);return c&&(o.warning=c,s.warning=c),{result:o,responseData:s,...at(i)}}function at(e){let t=W(e)?.node??(`node`in e?e.node:void 0),n=`preAction`in e?e.preAction?.nodes:void 0;return t&&n?{recordedTarget:{node:t,preActionNodes:n}}:{}}function ot(e){let t=W(e);return t?{selectorChain:t.selectorChain,refLabel:t.refLabel}:{}}function W(e){return`recordingTarget`in e?e.recordingTarget:void 0}function st(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function ct(e,t){return t?e?`${e} ${t}`:t:e}async function lt(e){let{params:t,session:n,result:r,publicData:i,extra:a}=e,o=r.kind===`point`?await He({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession,observation:t.androidObservation}):w(n.snapshot?.nodes??[]);return U({source:{kind:`runtime`,result:r,publicData:i},referenceFrame:o,extra:a,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:le(n,r.settle)})}function G(e){return e.command?Re({command:e.command,input:e.flags,data:e.data}):F(e.data)}function ut(e,t){return e===`click`||e===`press`||e===`fill`?e:t}function K(e,t){if(!e)return{used:!1,extra:{}};let n=t?.maestroNonHittableCoordinateFallbackUsed===!0;return{used:n,extra:{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}}function q(e){return[String(e.x),String(e.y)]}function dt(t){let{error:n,snapshotGeneration:r,publishPartialRefs:i}=t;if(n.code!==`AMBIGUOUS_MATCH`)return n;let a=s(n.details);return a.length===0||r===void 0?n:(i(a),new e(n.code,n.message,{...n.details,refsGeneration:r},n.cause))}async function ft(t,n,r){let i=await Ne(t,r);if(i){if(i.permissionDialog)return`press ${n} opened an Android permission dialog (${i.foregroundPackage}) over ${i.expectedPackage}. ${i.hint}`;throw new e(`COMMAND_FAILED`,`press ${n} left ${t.appBundleId} and foregrounded ${i.foregroundPackage}. The tap likely escaped the app.`,i)}}function pt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}async function J(e){if(!mt(e))return;let t=gt(e.session.snapshot);if(!t)return;let n=await _t(e,t.snapshot.snapshotQuality,t.presentation);if(!(!n||!vt(t.snapshot,n,e.command)))return xt(t.snapshot,n,e.command)}function mt(e){return ht(e.command)&&n(e.error).code===`XCTEST_RECORDED_FAILURE`&&Ee(e.session,{skipPendingPostGestureStabilization:!1})}function ht(e){return e===`click`||e===`press`}function gt(e){if(!Y(e))return;let t=Date.now()-e.createdAt;if(t<0||t>15e3){C({level:`debug`,phase:`ios_tap_failure_corroboration_stale_baseline`,data:{ageMs:t}});return}let n=St(e.presentationKey);if(n){if(n.raw){C({level:`debug`,phase:`ios_tap_failure_corroboration_raw_baseline`,data:{presentationKey:e.presentationKey}});return}return{snapshot:e,presentation:n}}}async function _t(e,t,n){try{let r=xe(t);return await e.captureSnapshotForSession(e.session,Dt(e.flags,n),e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly??!0,...r?{preferredBackend:r}:{},signal:ye(e.requestId)})}catch(t){C({level:`debug`,phase:`ios_tap_failure_corroboration_capture_failed`,data:{command:e.command,error:t instanceof Error?t.message:String(t)}});return}}function vt(e,t,n){let r=yt(e,t);return r===void 0?bt(e,t,n):r?!0:(C({level:`debug`,phase:`ios_tap_failure_corroboration_identity_mismatch`,data:{command:n}}),!1)}function yt(e,t){if(e.comparisonKey!==void 0||t.comparisonKey!==void 0)return e.comparisonKey!==void 0&&e.comparisonKey===t.comparisonKey}function bt(e,t,n){let r=e.snapshotQuality?.backend,i=t.snapshotQuality?.backend;return!r||r!==i?(C({level:`debug`,phase:`ios_tap_failure_corroboration_backend_mismatch`,data:{command:n,baselineBackend:r,afterBackend:i}}),!1):e.presentationKey===t.presentationKey||(C({level:`debug`,phase:`ios_tap_failure_corroboration_scope_mismatch`,data:{command:n,baselinePresentationKey:e.presentationKey,afterPresentationKey:t.presentationKey}}),!1)}function xt(e,t,n){if(!Y(t))return;let r=b(e.nodes),i=b(t.nodes);if(r.digest!==i.digest)return C({level:`warn`,phase:`ios_tap_failure_corroborated`,data:{command:n,beforeNodeCount:r.nodeCount,afterNodeCount:i.nodeCount}}),{warning:`XCTest reported the tap as failed, but a same-scope post-action accessibility capture changed; treating the tap as landed. Observe the current screen before issuing another tap.`}}function Y(e){return!!(e&&e.nodes.length>0&&!Se(e.snapshotQuality))}function St(e){if(!e)return;let t;try{t=JSON.parse(e)}catch{return}return Ct(t)}function Ct(e){let t=wt(e);if(!(!t||typeof t.interactiveOnly!=`boolean`||typeof t.raw!=`boolean`)&&!(!Tt(t.depth)||!Et(t.scope)))return{interactiveOnly:t.interactiveOnly,...typeof t.depth==`number`?{depth:t.depth}:{},...typeof t.scope==`string`?{scope:t.scope}:{},raw:t.raw}}function wt(e){return typeof e==`object`&&e?e:void 0}function Tt(e){return e==null||typeof e==`number`}function Et(e){return e==null||typeof e==`string`}function Dt(e,t){if(!(!e&&!t))return{...e??{},out:void 0,...t?{snapshotDepth:t.depth,snapshotScope:t.scope,snapshotRaw:t.raw}:{}}}function Ot(e){return e.kind===`selector`?{selector:e.selector}:e.kind===`ref`?{ref:e.ref.startsWith(`@`)?e.ref.slice(1):e.ref}:{}}async function kt(e,t,n,r,i){if(e.lease?.leaseProvider)return{aborted:!1,readiness:{status:`clear`},runtimeResult:await r()};let a=await E({session:e,command:t,phase:`before-command`,observation:i});if(n.refContext&&a.status===`recovered`){let t=O({ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration,staleRefsWarning:n.refContext.staleRefsWarning,frame:_({session:e,ref:n.refContext.ref,mintedGeneration:n.refContext.mintedGeneration})});if(t)return{aborted:!0,response:t}}let o=await r();return await E({session:e,command:t,phase:`after-command`,observation:i}),{aborted:!1,readiness:a,runtimeResult:o}}async function X(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return o();let i=Te({...e,touchExecutor:t.touchExecutor}),a=Date.now();try{let n,o=await kt(r,e.req.command,{refContext:t.refContext},async()=>{let e=await t.run(i);return n=await t.afterRun?.(e),e},e.androidObservation);if(o.aborted)return o.response;let{readiness:s,runtimeResult:c}=o,l=Date.now(),{result:u,responseData:d,recordedTarget:f}=await t.buildPayloads(c),p=[...s.status===`recovered`?[s.warning]:[],...n?[n]:[]];if(p.length>0){let e=[...typeof d.warning==`string`?[d.warning]:[],...p].join(` `);u.warning=e,d.warning=e}return k({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Nt(e.req.command,c),flags:e.req.flags,result:u,responseData:d,recordedTarget:f,actionStartedAt:a,actionFinishedAt:l,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(i){let o=dt({error:n(i),snapshotGeneration:r.snapshotGeneration,publishPartialRefs:e=>ce(r,e)});if(pt(o))throw o;return o.code===`AMBIGUOUS_MATCH`?Z(o):await At({error:o,handlerParams:e,session:r,target:t.iosTapCorroboration?.target,extra:t.iosTapCorroboration?.extra,actionStartedAt:a,androidFreshnessBaseline:t.androidFreshnessBaseline})||Z(o)}}async function At(e){if(!e.target)return;let t=fe(e.error);if(!t&&y(e.session))return;let n=await J({error:e.error,command:e.handlerParams.req.command,requestId:e.handlerParams.req.meta?.requestId,flags:e.handlerParams.req.flags,session:e.session,sessionStore:e.handlerParams.sessionStore,contextFromFlags:e.handlerParams.contextFromFlags,captureSnapshotForSession:e.handlerParams.captureSnapshotForSession});if(!n)return;let r=jt({target:e.target,resolvedTarget:t,warning:n.warning,referenceFrame:w(e.session.snapshot?.nodes??[]),extra:e.extra});return k({session:e.session,sessionStore:e.handlerParams.sessionStore,command:e.handlerParams.req.command,positionals:e.handlerParams.req.positionals??[],flags:e.handlerParams.req.flags,result:r.result,responseData:r.responseData,recordedTarget:r.recordedTarget,scheduleInteractionOutcomeRetry:!1,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),androidFreshnessBaseline:e.androidFreshnessBaseline})}function jt(e){return e.resolvedTarget?U({source:{kind:`runtime`,result:{...e.resolvedTarget,warning:e.warning}},referenceFrame:e.referenceFrame,extra:e.extra}):H({targetKind:e.target.kind,point:Mt(e.target),warning:e.warning,referenceFrame:e.referenceFrame,extra:{...Ot(e.target),...e.extra??{}}})}function Mt(e){return e.kind===`point`?{x:e.x,y:e.y}:void 0}function Z(e){return{ok:!1,error:t(e)}}function Nt(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?q(t.point):void 0}async function Q(e,t,n,r){let i=await se({device:t.device,command:n,requiresCapture:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?{ok:!0,touchExecutor:ue(i.runtime,e.contextFromFlags(e.req.flags,t.appBundleId,t.trace?.outPath))}:i}async function Pt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=P(i,`fill`);if(e)return e}if(!i)return o();let a=Xe(t.positionals??[]);if(!a.ok)return a.response;let s=await Q(e,i,`fill`,a.target.kind!==`point`);if(!s.ok)return s.response;let{touchExecutor:c}=s;Fe({flags:t.flags,replayPlanStep:t.internal?.replayPlanStep===!0,isSessionRecording:y(i)});let l=D(`fill`,t.flags);if(l)return l;let u=await Ft(e,i,a.target,a.refGeneration);if(u.response)return u.response;let{staleRefsWarning:d}=u,f=t.internal?.replayTargetGuard;return await X(e,{touchExecutor:c,refContext:a.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0?{ref:a.target.ref,mintedGeneration:a.refGeneration,staleRefsWarning:d}:void 0,run:async e=>await e.interactions.fill(a.target,a.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,allowNonHittableCoordinateFallback:t.flags?.maestro?.allowNonHittableCoordinateFallback,verify:t.flags?.verify,settle:A(t.flags),expectedResolvedTarget:f,preresolvedTarget:t.internal?.findResolvedTarget}),buildPayloads:e=>It({session:i,result:e,text:a.text,flags:t.flags,staleRefsWarning:d})})}async function Ft(e,t,n,r){if(n.kind!==`ref`)return{};let i=e.req.internal?.findResolvedTarget===void 0?v({session:t,ref:n.ref,mintedGeneration:r}):void 0,a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);if(a)return{response:a,staleRefsWarning:i};let o=e.req.internal?.findResolvedTarget?null:O({ref:n.ref,mintedGeneration:r,staleRefsWarning:i,frame:_({session:t,ref:n.ref,mintedGeneration:r})});return o?{response:o,staleRefsWarning:i}:(await N(e,t),{staleRefsWarning:i})}function It(e){let{session:t,result:n}=e,r=K(e.flags?.maestro?.allowNonHittableCoordinateFallback===!0,n.backendResult),i=n.kind===`point`?void 0:w(t.snapshot?.nodes??[]);return U({source:{kind:`runtime`,result:n,publicData:G({command:`fill`,flags:e.flags,data:n.backendResult}),...r.used?{dispatchPath:`maestro-non-hittable-fallback`}:{}},referenceFrame:i,extra:{text:e.text,...r.extra},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:le(t,n.settle)})}async function Lt(e,n,r,i){let a=e,o={selector:r.raw},s=Date.now();g(n);try{let e=await i(r)??{},t=Date.now(),c=zt(e),l=G({command:ut(a.req.command,`press`),flags:a.req.flags,data:e}),u=K(r.allowNonHittableCoordinateFallback===!0,e),{result:d,responseData:f}=U({source:{kind:`runner-payload`,targetKind:`selector`,data:e,publicData:l,point:c,dispatchPath:u.used?`maestro-non-hittable-fallback`:`maestro-direct-selector`},referenceFrame:Bt(e),extra:{...o,...u.extra}});return k({session:n,sessionStore:a.sessionStore,command:a.req.command,positionals:a.req.positionals??[],retryPositionals:q(c),flags:a.req.flags,result:d,responseData:f,actionStartedAt:s,actionFinishedAt:t})}catch(e){return await Rt({error:e,handlerParams:a,session:n,extra:o,positionals:[],actionStartedAt:s})||(Oe(e,{delegateSemanticFailures:r.allowNonHittableCoordinateFallback!==!0})?(C({level:`debug`,phase:`ios_direct_selector_tap_fallback`,data:{selector:r.raw,error:e instanceof Error?e.message:String(e)}}),null):{ok:!1,error:t(e)})}}async function Rt(e){let{error:t,handlerParams:n,session:r,extra:i,positionals:a,actionStartedAt:o}=e,s=await J({error:t,command:n.req.command,requestId:n.req.meta?.requestId,flags:n.req.flags,session:r,sessionStore:n.sessionStore,contextFromFlags:n.contextFromFlags,captureSnapshotForSession:n.captureSnapshotForSession});if(!s)return;let{result:c,responseData:l}=H({targetKind:`selector`,warning:s.warning,resolution:{source:`direct-ios`,kind:`not-observed`},extra:i});return k({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??a,flags:n.req.flags,result:c,responseData:l,scheduleInteractionOutcomeRetry:!1,actionStartedAt:o,actionFinishedAt:Date.now()})}function zt(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Bt(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}function Vt(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return!e.tapElementSelectorAvailable||i?.maestro?.allowNonHittableCoordinateFallback!==!0||n!==`click`||r.kind!==`selector`||y(t)||Wt(i)||p(n)&&i?.verify===!0||ee(n)&&i?.settle===!0?null:Ht(t,r.selector,i)}function Ht(e,t,n){let r=De({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{},...n?.maestro?.expectedTapPoint?{expectedPoint:n.maestro.expectedTapPoint}:{}}:null}const Ut=[`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`];function Wt(e){return Ut.some(t=>e?.[t]!==void 0)?!0:e?.clickButton!==void 0&&e.clickButton!==`primary`}const Gt=new Set([`press`,`click`]);async function Kt(e,t){let{req:n,sessionStore:r,sessionName:i}=e,a=r.get(i);if(!a)return{response:o()};let s=t===`click`?`click`:t,c=qt(a,t,s,n.flags);if(c)return{response:c};let l=n.positionals??[],u=t===`longpress`?Ye(l):z(l,s);if(!u.ok)return{response:u.response};let d=Yt(a,n,u),f=Zt(e,a,t,u,d);if(f.response)return{response:f.response};let p=S(n.flags);return{admitted:{session:a,commandLabel:s,clickButton:p,resultButtonTag:me(p),target:u.target,durationMs:t===`longpress`?u.durationMs:void 0,staleRefsWarning:d,refContext:Xt(n,u,d)}}}function qt(e,t,n,r){return P(e,n)||D(t,r)||Jt(e,t,n,r)}function Jt(e,t,n,r){let i=S(r);if(!Gt.has(t)||i===`primary`)return;let o=he({commandLabel:n,platform:l(e.device),button:i,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(o)return a(o.code,o.message,o.details)}function Yt(e,t,n){if(n.target.kind===`ref`&&t.internal?.findResolvedTarget===void 0)return v({session:e,ref:n.target.ref,mintedGeneration:n.refGeneration})}function Xt(e,t,n){if(t.target.kind===`ref`&&e.internal?.findResolvedTarget===void 0)return{ref:t.target.ref,mintedGeneration:t.refGeneration,staleRefsWarning:n}}function Zt(e,t,n,r,i){let{req:a}=e;if(r.target.kind!==`ref`)return{};let o=e.refSnapshotFlagGuardResponse(n===`click`?`press`:n,a.flags);if(o)return{response:o};let s=a.internal?.findResolvedTarget?null:O({ref:r.target.ref,mintedGeneration:r.refGeneration,staleRefsWarning:i,frame:_({session:t,ref:r.target.ref,mintedGeneration:r.refGeneration})});return s?{response:s}:{}}async function $(e,t){let n=await Kt(e,t);if(`response`in n)return n.response;let{admitted:r}=n,i=await Q(e,r.session,t,r.target.kind!==`point`);if(!i.ok)return i.response;let{touchExecutor:a}=i,o=r.target.kind===`ref`?await N(e,r.session):void 0,s={...r,androidFreshnessBaseline:o},c=e.req.internal?.replayTargetGuard?null:Vt({session:s.session,commandLabel:s.commandLabel,target:s.target,flags:e.req.flags,tapElementSelectorAvailable:a.tapElementSelector!==void 0});if(c&&a.tapElementSelector){let t=await Lt(e,s.session,c,a.tapElementSelector);if(t)return t}return await X(e,{...Qt(e,t,s),touchExecutor:a})}function Qt(e,t,n){let{req:r,sessionName:i}=e,{session:a,target:o,durationMs:s,staleRefsWarning:c,resultButtonTag:l}=n,u=t===`longpress`?{...s===void 0?{}:{durationMs:s},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l;return{androidFreshnessBaseline:n.androidFreshnessBaseline,refContext:n.refContext,iosTapCorroboration:{target:o,extra:u},run:async e=>await $t({runtime:e,command:t,target:o,sessionName:i,requestId:r.meta?.requestId,clickButton:n.clickButton,flags:r.flags,durationMs:s,expectedResolvedTarget:r.internal?.replayTargetGuard,preresolvedTarget:r.internal?.findResolvedTarget}),afterRun:async t=>{if(!a.lease?.leaseProvider)return await ft(a,$e(o,t),e.androidObservation)},buildPayloads:async n=>{let i=tn(n);return await lt({params:e,session:a,result:n,staleRefsWarning:c,publicData:G({command:t===`longpress`||t===`hover`?void 0:t,flags:r.flags,data:n.backendResult}),extra:t===`longpress`?{...i===void 0?{}:{durationMs:i},gesture:`longpress`}:t===`hover`?{gesture:`hover`}:l})}}}async function $t(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o,expectedResolvedTarget:s}=e,c={session:i,requestId:a,settle:A(o),expectedResolvedTarget:s};switch(n){case`longpress`:return await t.interactions.longPress(r,{...c,durationMs:e.durationMs});case`hover`:return await t.interactions.hover(r,c);case`click`:return await t.interactions.click(r,en(e,c));case`press`:return await t.interactions.press(r,en(e,c))}}function en(e,t){let{flags:n}=e;return{...t,button:e.clickButton,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap,verify:n?.verify,preresolvedTarget:e.preresolvedTarget}}function tn(e){return`durationMs`in e?e.durationMs:void 0}function nn(e,t={}){let n=typeof t.executionProfile==`string`?t.executionProfile:void 0;return{kind:e.kind,durationMs:e.durationMs,pointerCount:e.pointerCount,from:e.from,to:e.to,...e.kind===`drag`?{targets:e.targets}:{},...e.backendResult??{},...t,...n?{timing:{executionProfile:n,gestureDurationMs:e.durationMs}}:{},message:e.message}}function rn(e){return`refused`in e}async function an(e){return await dn(e,`gesture`,async t=>on(e,t))}async function on(e,t){let n=re(e.req.input),r=pn(n,t);r.intent===`pan`&&e.req.internal?.gestureExecutionProfile&&(r.executionProfile=e.req.internal.gestureExecutionProfile);let i=await j({device:t.device,input:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?cn(n,r,await sn(un(e,i.gestures),{session:e.sessionName,requestId:e.req.meta?.requestId},r,e.req.internal),e.req.flags):{refused:i.response}}async function sn(e,t,n,r){if(n.intent!==`drag`)return await e.interactions.gesture({...t,gesture:n});let i=r?.replayTargetGuards??(r?.replayTargetGuard?{source:r.replayTargetGuard}:void 0);return await e.interactions.gesture({...t,gesture:n,...i?{expectedResolvedTargets:i}:{}})}function cn(e,t,n,r){let i=n.kind===`drag`?n.recording:void 0,a=i?.sourceTarget,o=i?.destinationTarget;return{positionals:hn(e,i),flags:Sn(e,r),responseData:nn(n,{executionProfile:fn(t)}),...e.kind===`pinch`?{recordingResultExtra:{scale:e.scale}}:a?{recordingResultExtra:{selectorChain:a.selectorChain}}:{},...a&&o?{recordedTargets:{source:{node:a.node,preActionNodes:a.preActionNodes},destination:{node:o.node,preActionNodes:o.preActionNodes}}}:{}}}async function ln(e){return await dn(e,`swipe`,async t=>{let n=gn(e.req.input),r=await j({device:t.device,input:m(n).gesture,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!r.ok)return{refused:r.response};let i=n.count??1,a=n.pauseMs??0,o=n.pattern??`one-way`,s=await bn(un(e,r.gestures),e,n,i,a,o);return{positionals:yn(n),flags:e.req.flags,responseData:nn(s,{from:n.from,to:n.to,x1:n.from.x,y1:n.from.y,x2:n.to.x,y2:n.to.y,effectiveDurationMs:s.durationMs,timingMode:`direct`,executionProfile:`endpoint-hold`,count:i,pauseMs:a,pattern:o})}})}function un(e,t){return Te({...e,gestures:t,pairedGestureViewport:e.req.internal?.gestureViewport})}async function dn(e,n,r){let i=e.sessionStore.get(e.sessionName);if(!i)return o();let a=Date.now();try{let t=be(i.device),o=t?{status:`clear`}:await E({session:i,command:n,phase:`before-command`,observation:e.androidObservation}),s=await r(i);if(rn(s))return s.refused;t||await E({session:i,command:n,phase:`after-command`,observation:e.androidObservation});let c={...s.responseData};return o.status===`recovered`&&(c.warning=`${typeof c.warning==`string`?`${c.warning} `:``}${o.warning}`),k({session:i,sessionStore:e.sessionStore,command:n,actionCommand:n,positionals:s.positionals,flags:s.flags,result:{...c,...s.recordingResultExtra??{}},responseData:c,recordedTargets:s.recordedTargets,actionStartedAt:a,actionFinishedAt:Date.now()})}catch(e){return{ok:!1,error:t(e)}}}function fn(e){if(e.intent===`fling`)return`endpoint-hold`;if(e.intent===`pan`)return e.executionProfile??`timed-pan`;if(e.intent===`drag`)return`timed-pan`}function pn(e,t){let n=ie(e);return n.intent===`drag`?{...n,source:mn(n.source,t),destination:mn(n.destination,t)}:n}function mn(t,n){if(!t.startsWith(`@`))return t;let a=r(t);if(!a)throw new e(`INVALID_ARGS`,`Invalid ref "${t}" — malformed generation suffix.`,{hint:i});return ke({ref:a.base,mintedGeneration:a.generation,frame:_({session:n,ref:a.base,mintedGeneration:a.generation})}),a.base}function hn(e,t){return e.kind!==`drag`||!t?h(e):h({...e,source:t.sourceSelector??e.source,destination:t.destinationSelector??e.destination})}function gn(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`swipe requires structured object input`);ae(t);let n=t,r=n.pattern;if(r!==void 0&&r!==`one-way`&&r!==`ping-pong`)throw new e(`INVALID_ARGS`,`swipe pattern must be one-way or ping-pong`);let i={from:vn(n.from,`swipe from`),to:vn(n.to,`swipe to`),count:c(n,`count`,{min:1,max:200}),pauseMs:c(n,`pauseMs`,{min:0,max:ne}),pattern:r};return _n(i),i}function _n(t){let n=t.count??1,r=t.pauseMs??0,i=n*100+Math.max(0,n-1)*r;if(!(i<=6e4))throw new e(`INVALID_ARGS`,`Swipe series must fit within ${te}ms.`,{count:n,pauseMs:r,gestureDurationMs:100,scheduledDurationMs:i,hint:`Reduce --count or --pause-ms.`})}function vn(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be a point`);let r=t;if(typeof r.x!=`number`||!Number.isFinite(r.x))throw new e(`INVALID_ARGS`,`${n} x must be finite`);if(typeof r.y!=`number`||!Number.isFinite(r.y))throw new e(`INVALID_ARGS`,`${n} y must be finite`);return{x:r.x,y:r.y}}function yn(e){return[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y)]}async function bn(e,t,n,r,i,a){let o;for(let s=0;s<r;s+=1){let c=m(xn(n,a,s));o=await e.interactions.gesture({session:t.sessionName,requestId:t.req.meta?.requestId,gesture:c.gesture}),i>0&&s+1<r&&await ve(i)}if(!o)throw Error(`Swipe orchestration did not execute a gesture.`);return o}function xn(e,t,n){return t!==`ping-pong`||n%2!=1?e:{...e,from:e.to,to:e.from}}function Sn(e,t){return e.kind!==`pan`||e.pointerCount===void 0?t:{...t,pointerCount:e.pointerCount}}async function Cn(e){let t={},n=await wn({...e,refSnapshotFlagGuardResponse:Ae,activationProof:t});return n&&we(n,t.state)}async function wn(e){switch(e.req.command){case`press`:return await $(e,`press`);case`click`:return await $(e,`click`);case`longpress`:return await $(e,`longpress`);case`hover`:return await $(e,`hover`);case`fill`:return await Pt(e);default:return await Tn(e)}}async function Tn(e){switch(e.req.command){case x.gesture:return await an(e);case x.swipe:return await ln(e);case x.type:return await En(e);case`get`:return await Me(e);case`is`:return await je(e);default:return null}}async function En(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);if(!r)return o();let i=await Pe({device:r.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!i.ok)return i.response;let a=await Dn(r,e.androidObservation);return a.response?a.response:await On(e,r,i.typeText,a.warning)}async function Dn(e,t){if(e.device.platform===`android`&&e.screenRecording){let n=await Ce({session:e,observation:t});if(n.status===`failed`)return{response:a(`COMMAND_FAILED`,`Android system dialog blocked the recording session`)};if(n.status===`unknown`)return{warning:n.warning}}return{}}async function On(e,n,r,i){let{req:a,sessionStore:o}=e,s=Date.now();try{let t=await E({session:n,command:a.command,phase:`before-command`,observation:e.androidObservation});g(n);let c=await r(a.positionals??[],e.contextFromFlags(a.flags,n.appBundleId,n.trace?.outPath));await E({session:n,command:a.command,phase:`after-command`,observation:e.androidObservation});let l=Date.now(),u={...c};return kn(u,i,t),k({session:n,sessionStore:o,command:a.command,positionals:a.positionals??[],flags:a.flags,result:u,responseData:u,actionStartedAt:s,actionFinishedAt:l})}catch(e){return{ok:!1,error:t(e)}}}function kn(e,t,n){let r=[typeof e.warning==`string`?e.warning:void 0,t];n.status===`recovered`&&r.push(n.warning);let i=r.filter(e=>typeof e==`string`&&e.length>0).join(` `);i.length>0&&(e.warning=i)}export{Cn as handleInteractionCommands};
@@ -1,4 +1,4 @@
1
- import{D as e,v as t}from"./sdk-contracts.js";import{E 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{i 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{i as nt,o as rt,s 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
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{i 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{i as nt,o as rt,s 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
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===`
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t}from"./sdk-batch-runner.js";import{a as n}from"./exec.js";import{o as r}from"./tv-remote.js";import"./command.js";import{t as i}from"./tool-provider3.js";function a(t){let n=async n=>{throw new e(`UNSUPPORTED_OPERATION`,`${n} is not supported on ${t}`)};return{open:()=>n(`open`),openDevice:()=>n(`openDevice`),close:()=>n(`close`),tap:()=>n(`tap`),doubleTap:()=>n(`doubleTap`),longPress:()=>n(`longPress`),focus:()=>n(`focus`),type:()=>n(`type`),fill:()=>n(`fill`),scroll:()=>n(`scroll`),screenshot:()=>n(`screenshot`),snapshot:()=>n(`snapshot`),back:()=>n(`back`),home:()=>n(`home`),setOrientation:()=>n(`setOrientation`),appSwitcher:()=>n(`appSwitcher`),tvRemote:()=>n(`tvRemote`),readClipboard:()=>n(`readClipboard`),writeClipboard:()=>n(`writeClipboard`),setSetting:()=>n(`setSetting`),readAlert:()=>n(`readAlert`),awaitAlert:()=>n(`awaitAlert`),acceptAlert:()=>n(`acceptAlert`),dismissAlert:()=>n(`dismissAlert`)}}const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){n(await i().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){n(await i().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){n(await i().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,a){let o=r(t);n(await i().pressRemote(e.id,o,a,{allowFailure:!0,timeoutMs:1e4+(a??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...a(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
1
+ import{D as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{a as n}from"./exec.js";import{o as r}from"./tv-remote.js";import"./command.js";import{t as i}from"./tool-provider3.js";function a(t){let n=async n=>{throw new e(`UNSUPPORTED_OPERATION`,`${n} is not supported on ${t}`)};return{open:()=>n(`open`),openDevice:()=>n(`openDevice`),close:()=>n(`close`),tap:()=>n(`tap`),doubleTap:()=>n(`doubleTap`),longPress:()=>n(`longPress`),focus:()=>n(`focus`),type:()=>n(`type`),fill:()=>n(`fill`),scroll:()=>n(`scroll`),screenshot:()=>n(`screenshot`),snapshot:()=>n(`snapshot`),back:()=>n(`back`),home:()=>n(`home`),setOrientation:()=>n(`setOrientation`),appSwitcher:()=>n(`appSwitcher`),tvRemote:()=>n(`tvRemote`),readClipboard:()=>n(`readClipboard`),writeClipboard:()=>n(`writeClipboard`),setSetting:()=>n(`setSetting`),readAlert:()=>n(`readAlert`),awaitAlert:()=>n(`awaitAlert`),acceptAlert:()=>n(`acceptAlert`),dismissAlert:()=>n(`dismissAlert`)}}const o={allowFailure:!0,timeoutMs:3e4};async function s(e,t){n(await i().launchApp(e.id,t,o),`Failed to launch Vega app ${t}`,{appName:t,deviceId:e.id})}async function c(e){n(await i().checkConnected(e.id,o),`Vega device is not connected`,{deviceId:e.id})}async function l(e,t){n(await i().terminateApp(e.id,t,o),`Failed to terminate Vega app ${t}`,{appName:t,deviceId:e.id})}async function u(e,t,a){let o=r(t);n(await i().pressRemote(e.id,o,a,{allowFailure:!0,timeoutMs:1e4+(a??0)}),`Failed to press Vega TV remote ${t}`,{button:t,deviceId:e.id})}const d=[{matches:(e,n)=>t(e)||!!n?.url,message:`Vega open does not support URLs or deep links.`,hint:`Use open <component-id> with an installed Vega app component ID.`},{matches:(e,t)=>!!t?.activity,message:`Vega open does not support Android activity selection.`,hint:`Remove --activity and use the Vega component ID as the open target.`},{matches:(e,t)=>!!t?.launchConsole,message:`Vega open does not support launch-console output.`,hint:`Remove --launch-console and open the Vega component ID directly.`},{matches:(e,t)=>!!t?.terminateRunningApp,message:`Vega open does not support terminating the running app before launch.`,hint:`Close the Vega component explicitly before opening it again.`},{matches:(e,t)=>!!t?.launchArgs?.length,message:`Vega open does not support launch arguments.`,hint:`Remove --launch-arg values and open the Vega component ID directly.`}];function f(e,t){return{...a(`Vega OS`),open:async(t,n)=>{p(t,n),await s(e,t)},openDevice:()=>c(e),close:t=>l(e,t),back:()=>u(e,`back`),home:()=>u(e,`home`),tvRemote:(t,n)=>u(e,t,n)}}function p(t,n){let r=d.find(({matches:e})=>e(t,n));if(r)throw new e(`UNSUPPORTED_OPERATION`,r.message,{hint:r.hint})}export{f as createVegaInteractor};
@@ -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.9`,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.11`,stdout:e=>{process.stdout.write(e)},stderr:e=>{process.stderr.write(e)}}).catch(()=>process.exit(1));export{};
@@ -1 +1 @@
1
- import{O as e}from"./sdk-batch-runner.js";import{a as t}from"./lease-scope.js";function n(e){return t(e)}function r(t,r){let i=n(t),a=i.leaseId??r?.leaseId,o=i.tenantId??r?.tenantId,s=i.runId??r?.runId;if(!(!o||!s||!a))return e({tenantId:o,runId:s,leaseId:a,leaseBackend:i.leaseBackend??r?.backend,leaseProvider:i.leaseProvider??r?.leaseProvider,deviceKey:i.deviceKey??r?.deviceKey,clientId:i.clientId??r?.clientId,expiresAt:r?.expiresAt})}function i(t,r){let i=n(t),a=r?.lease??r?.deviceLease??void 0;return e({tenantId:i.tenantId??a?.tenantId,runId:i.runId??a?.runId,leaseId:i.leaseId??a?.leaseId,leaseTtlMs:i.leaseTtlMs,leaseBackend:i.leaseBackend??a?.leaseBackend,leaseProvider:i.leaseProvider??a?.leaseProvider,deviceKey:i.deviceKey??a?.deviceKey,clientId:i.clientId??a?.clientId})}function a(t){let n=t.meta,r=e({leaseId:o(n?.leaseId),clientId:o(n?.clientId),tenantId:o(n?.tenantId),runId:o(n?.runId),leaseProvider:o(n?.leaseProvider),deviceKey:o(n?.deviceKey)});return Object.keys(r).length>0?r:void 0}function o(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{a as i,n,i as r,r as t};
1
+ import{k as e}from"./sdk-batch-runner.js";import{a as t}from"./lease-scope.js";function n(e){return t(e)}function r(t,r){let i=n(t),a=i.leaseId??r?.leaseId,o=i.tenantId??r?.tenantId,s=i.runId??r?.runId;if(!(!o||!s||!a))return e({tenantId:o,runId:s,leaseId:a,leaseBackend:i.leaseBackend??r?.backend,leaseProvider:i.leaseProvider??r?.leaseProvider,deviceKey:i.deviceKey??r?.deviceKey,clientId:i.clientId??r?.clientId,expiresAt:r?.expiresAt})}function i(t,r){let i=n(t),a=r?.lease??r?.deviceLease??void 0;return e({tenantId:i.tenantId??a?.tenantId,runId:i.runId??a?.runId,leaseId:i.leaseId??a?.leaseId,leaseTtlMs:i.leaseTtlMs,leaseBackend:i.leaseBackend??a?.leaseBackend,leaseProvider:i.leaseProvider??a?.leaseProvider,deviceKey:i.deviceKey??a?.deviceKey,clientId:i.clientId??a?.clientId})}function a(t){let n=t.meta,r=e({leaseId:o(n?.leaseId),clientId:o(n?.clientId),tenantId:o(n?.tenantId),runId:o(n?.runId),leaseProvider:o(n?.leaseProvider),deviceKey:o(n?.deviceKey)});return Object.keys(r).length>0?r:void 0}function o(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}export{a as i,n,i as r,r as t};
@@ -1 +1 @@
1
- import{O as e}from"./sdk-batch-runner.js";const t=3e5,n=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function r(t){return e({tenantId:t.meta?.tenantId??_(t.flags,`tenant`),runId:t.meta?.runId??_(t.flags,`runId`),leaseId:t.meta?.leaseId??_(t.flags,`leaseId`),leaseTtlMs:t.meta?.leaseTtlMs,leaseBackend:t.meta?.leaseBackend,leaseProvider:t.meta?.leaseProvider??_(t.flags,`leaseProvider`)??_(t.flags,`provider`),deviceKey:t.meta?.deviceKey??_(t.flags,`deviceKey`),clientId:t.meta?.clientId??_(t.flags,`clientId`)})}function i(t){return e({tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId,leaseTtlMs:t.leaseTtlMs??t.ttlMs,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider??t.provider,deviceKey:t.deviceKey,clientId:t.clientId})}function a(t){return e({tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId,leaseTtlMs:t.leaseTtlMs,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId})}function o(t){return e({tenant:t.tenantId,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId})}function s(t){return e({tenantId:t.tenantId??``,runId:t.runId??``,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,ttlMs:t.leaseTtlMs})}function c(e){return g(e)}function l(e){let{ttlMs:t,...n}=g(e);return n}function u(t,n,r){let i=e({...r.includeTokenParam?{token:r.token}:{},session:r.session,tenantId:t.tenantId,runId:t.runId,leaseProvider:t.leaseProvider,clientId:t.clientId,deviceKey:t.deviceKey});switch(n){case`lease_allocate`:return{...i,...e({ttlMs:t.leaseTtlMs,backend:t.leaseBackend})};case`lease_heartbeat`:return{...i,...e({leaseId:t.leaseId,ttlMs:t.leaseTtlMs})};case`lease_release`:return{...i,...e({leaseId:t.leaseId})}}}const d=[`platform`,`device`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function f(e){let t={};for(let n of d){let r=e?.[n];(typeof r==`string`||typeof r==`boolean`)&&(t[n]=r)}return t}function p(t){let n=e({leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId});return Object.keys(n).length>0?n:void 0}function m(e){return e.leaseProvider===`proxy`}function h(e){return m(e)?n.filter(t=>!e[t]):[]}function g(t){return e({leaseId:t.leaseId??``,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,ttlMs:t.leaseTtlMs})}function _(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}export{r as a,p as c,l as d,a as f,i,c as l,h as n,s as o,f as p,m as r,o as s,t,u};
1
+ import{k as e}from"./sdk-batch-runner.js";const t=3e5,n=[`leaseId`,`tenantId`,`runId`,`clientId`,`deviceKey`];function r(t){return e({tenantId:t.meta?.tenantId??_(t.flags,`tenant`),runId:t.meta?.runId??_(t.flags,`runId`),leaseId:t.meta?.leaseId??_(t.flags,`leaseId`),leaseTtlMs:t.meta?.leaseTtlMs,leaseBackend:t.meta?.leaseBackend,leaseProvider:t.meta?.leaseProvider??_(t.flags,`leaseProvider`)??_(t.flags,`provider`),deviceKey:t.meta?.deviceKey??_(t.flags,`deviceKey`),clientId:t.meta?.clientId??_(t.flags,`clientId`)})}function i(t){return e({tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId,leaseTtlMs:t.leaseTtlMs??t.ttlMs,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider??t.provider,deviceKey:t.deviceKey,clientId:t.clientId})}function a(t){return e({tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId,leaseTtlMs:t.leaseTtlMs,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId})}function o(t){return e({tenant:t.tenantId,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId})}function s(t){return e({tenantId:t.tenantId??``,runId:t.runId??``,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,ttlMs:t.leaseTtlMs})}function c(e){return g(e)}function l(e){let{ttlMs:t,...n}=g(e);return n}function u(t,n,r){let i=e({...r.includeTokenParam?{token:r.token}:{},session:r.session,tenantId:t.tenantId,runId:t.runId,leaseProvider:t.leaseProvider,clientId:t.clientId,deviceKey:t.deviceKey});switch(n){case`lease_allocate`:return{...i,...e({ttlMs:t.leaseTtlMs,backend:t.leaseBackend})};case`lease_heartbeat`:return{...i,...e({leaseId:t.leaseId,ttlMs:t.leaseTtlMs})};case`lease_release`:return{...i,...e({leaseId:t.leaseId})}}}const d=[`platform`,`device`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function f(e){let t={};for(let n of d){let r=e?.[n];(typeof r==`string`||typeof r==`boolean`)&&(t[n]=r)}return t}function p(t){let n=e({leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId});return Object.keys(n).length>0?n:void 0}function m(e){return e.leaseProvider===`proxy`}function h(e){return m(e)?n.filter(t=>!e[t]):[]}function g(t){return e({leaseId:t.leaseId??``,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,ttlMs:t.leaseTtlMs})}function _(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}export{r as a,p as c,l as d,a as f,i,c as l,h as n,s as o,f as p,m as r,o as s,t,u};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t,L as n,O as r,U as i,g as a,m as o}from"./sdk-contracts.js";import"./capture.js";import{D as s}from"./sdk-batch-runner.js";import{a as c,d as l,i as u,l as d,o as f,r as p,t as ee,u as te}from"./android-input-ownership.js";import{Gr as ne,Hr as re,Ur as ie,Vr as ae}from"./sdk-batch.js";import{i as oe,n as se,r as ce}from"./snapshot-scope.js";import{_ as le,d as ue,p as de}from"./scroll-gesture.js";import{r as fe}from"./success-text.js";import{n as pe}from"./alert-contract.js";import{_ as me,d as he,n as ge,v as _e,x as ve,y as ye}from"./location-coordinates.js";import{r as be}from"./mobile-snapshot-semantics.js";import"./device.js";import{n as xe}from"./device-rotation.js";import{c as m,r as h}from"./diagnostics.js";import{a as Se,c as Ce,h as we,n as Te,s as Ee}from"./exec.js";import{t as g}from"./timeouts.js";import{i as De}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{a as _,n as Oe,o as v}from"./device-shell.js";import"./retry.js";import{n as ke,r as Ae}from"./version.js";import{n as je,r as Me}from"./install-source2.js";import{_ as Ne,a as y,c as Pe,d as b,f as Fe,g as x,h as S,i as Ie,l as Le,n as Re,o as C,p as ze,r as Be,s as Ve,t as He,u as Ue,v as We}from"./adb-executor.js";import{c as Ge,h as Ke,i as qe,o as Je,r as Ye,u as Xe}from"./adb-transport.js";import{i as Ze,n as w,o as Qe,s as $e}from"./adb-failure.js";import{a as et,i as tt,n as nt,o as T}from"./adb.js";import{i as rt,n as it,r as at}from"./gesture-plan.js";import{n as ot,r as st,s as ct}from"./android-system-chrome.js";import{a as lt,c as ut,i as dt,l as ft,n as pt,o as mt,r as ht,s as gt,u as _t}from"./app-lifecycle.js";import{a as vt,i as yt,n as bt,o as xt,r as St,t as Ct}from"./app-deployment-resolution.js";import{a as wt,i as Tt,n as Et,o as Dt,t as Ot}from"./app-parsers.js";import{i as kt,n as At,r as jt,t as Mt}from"./window-state.js";import{n as Nt}from"./toolchain-probe.js";import{t as Pt}from"./keyed-lock.js";import{t as Ft}from"./bounds.js";import{t as It}from"./entities.js";import{n as Lt}from"./startup-recovery-fence.js";import{n as Rt}from"./numeric.js";import E from"node:path";import zt from"node:net";import{TextDecoder as Bt}from"node:util";const Vt=new Map;async function Ht(e){let t=Vt.get(e.deviceKey);if(t!==void 0)return t;let n;try{let t=await e.adb([`features`],{allowFailure:!0,timeoutMs:2e3,...e.signal?{signal:e.signal}:{}});if(t.exitCode!==0)return!1;n=t.stdout}catch{return!1}let r=Wt(n).includes(`shell_v2`);return Vt.set(e.deviceKey,r),r}function Ut(){Vt.clear()}function Wt(e){return e.split(`
1
+ import{r as e}from"./rolldown-runtime.js";import{D as t,L as n,O as r,U as i,g as a,m as o}from"./sdk-contracts.js";import"./capture.js";import{O as s}from"./sdk-batch-runner.js";import{a as c,d as l,i as u,l as d,o as f,r as p,t as ee,u as te}from"./android-input-ownership.js";import{Gr as ne,Hr as re,Ur as ie,Vr as ae}from"./sdk-batch.js";import{i as oe,n as se,r as ce}from"./snapshot-scope.js";import{_ as le,d as ue,p as de}from"./scroll-gesture.js";import{r as fe}from"./success-text.js";import{n as pe}from"./alert-contract.js";import{_ as me,d as he,n as ge,v as _e,x as ve,y as ye}from"./location-coordinates.js";import{r as be}from"./mobile-snapshot-semantics.js";import"./device.js";import{n as xe}from"./device-rotation.js";import{c as m,r as h}from"./diagnostics.js";import{a as Se,c as Ce,h as we,n as Te,s as Ee}from"./exec.js";import{t as g}from"./timeouts.js";import{i as De}from"./tv-remote.js";import"./diagnostics2.js";import"./command.js";import{a as _,n as Oe,o as v}from"./device-shell.js";import"./retry.js";import{n as ke,r as Ae}from"./version.js";import{n as je,r as Me}from"./install-source2.js";import{_ as Ne,a as y,c as Pe,d as b,f as Fe,g as x,h as S,i as Ie,l as Le,n as Re,o as C,p as ze,r as Be,s as Ve,t as He,u as Ue,v as We}from"./adb-executor.js";import{c as Ge,h as Ke,i as qe,o as Je,r as Ye,u as Xe}from"./adb-transport.js";import{i as Ze,n as w,o as Qe,s as $e}from"./adb-failure.js";import{a as et,i as tt,n as nt,o as T}from"./adb.js";import{i as rt,n as it,r as at}from"./gesture-plan.js";import{n as ot,r as st,s as ct}from"./android-system-chrome.js";import{a as lt,c as ut,i as dt,l as ft,n as pt,o as mt,r as ht,s as gt,u as _t}from"./app-lifecycle.js";import{a as vt,i as yt,n as bt,o as xt,r as St,t as Ct}from"./app-deployment-resolution.js";import{a as wt,i as Tt,n as Et,o as Dt,t as Ot}from"./app-parsers.js";import{i as kt,n as At,r as jt,t as Mt}from"./window-state.js";import{n as Nt}from"./toolchain-probe.js";import{t as Pt}from"./keyed-lock.js";import{t as Ft}from"./bounds.js";import{t as It}from"./entities.js";import{n as Lt}from"./startup-recovery-fence.js";import{n as Rt}from"./numeric.js";import E from"node:path";import zt from"node:net";import{TextDecoder as Bt}from"node:util";const Vt=new Map;async function Ht(e){let t=Vt.get(e.deviceKey);if(t!==void 0)return t;let n;try{let t=await e.adb([`features`],{allowFailure:!0,timeoutMs:2e3,...e.signal?{signal:e.signal}:{}});if(t.exitCode!==0)return!1;n=t.stdout}catch{return!1}let r=Wt(n).includes(`shell_v2`);return Vt.set(e.deviceKey,r),r}function Ut(){Vt.clear()}function Wt(e){return e.split(`
2
2
  `).map(e=>e.trim()).filter(Boolean)}const Gt=new Set([`com.android.permissioncontroller`,`com.google.android.permissioncontroller`,`com.google.android.packageinstaller`,`com.android.packageinstaller`]);function Kt(e){return Gt.has(e)}const qt=new Set([`android`,`com.android.systemui`]),Jt=/^android:id\/(?:alertTitle|message|button[123]|parentPanel|buttonPanel|contentPanel)$/i,Yt=/^android:id\/button[123]$/i,Xt=/(?:^|:)id\/permission_/i,Zt=/\b(?:is(?:n't| not) responding|keeps stopping|has stopped|close app|app info)\b/i,Qt=/^(?:ok|allow|allow all|while using the app|only this time|yes|continue|save|confirm|turn on|open settings)$/i,$t=/^(?:cancel|deny|don.t allow|don’t allow|not now|no|dismiss|close|close app|later|skip)$/i;function en(e){if(e!==null){if(Yt.test(e))return`button`;if(Jt.test(e))return`content`}}function tn(e){let t=an(e.filter(nn)),n=t.nodes;if(n.length===0)return null;let r=un(n),i=n.filter(e=>D(e)&&!bn(e)),a=pn(i),o=mn(i,a);if(!a&&!o&&r.length===0)return null;let s=xn(n);return{alert:{...a?{title:a}:{},...o?{message:o}:{},buttons:r.map(e=>e.label),platform:`android`,source:t.source,...s?{packageName:s}:{}},buttons:r}}function nn(e){return!d(e)}function rn(e,t){let n=t===`accept`?`accept`:`dismiss`;return e.find(e=>e.role===n)||(t===`dismiss`?e.find(e=>e.role===`neutral`)??null:e.length===1?e[0]??null:null)}function an(e){let t=e.filter(e=>vn(e));if(t.length)return{nodes:t,source:`permission`};let n=ln(e);return n.length?{nodes:n,source:`system-dialog`}:{nodes:on(e),source:`native-dialog`}}function on(e){let t=e.filter(e=>sn(e.type??``)),n=e.filter(e=>Jt.test(e.identifier??``)),r=t.length?[...t,...n]:cn(n);if(r.length===0)return[];let i=hn(e,r);return i===void 0?r:_n(e,i)}function sn(e){let t=Math.max(e.lastIndexOf(`.`),e.lastIndexOf(`$`));return e.slice(t+1).toLowerCase().endsWith(`dialog`)}function cn(e){let t=e.some(e=>Yt.test(e.identifier??``)),n=e.some(e=>!Yt.test(e.identifier??``));return t&&n?e:[]}function ln(e){let t=e.filter(e=>yn(e));if(t.length===0)return[];let n=hn(e,t);return n===void 0?t:_n(e,n).filter(e=>e.bundleId&&qt.has(e.bundleId))}function un(e){let t=new Set,n=[];for(let r of e){let e=D(r);if(!e||!r.rect||!bn(r))continue;let i=e.trim().toLowerCase();if(!i||t.has(i))continue;t.add(i);let o=a(r.rect);n.push({label:e,x:o.x,y:o.y,role:dn(r,e)})}return n}function dn(e,t){return fn(e.identifier??``)||(Qt.test(t.trim())?`accept`:$t.test(t.trim())?`dismiss`:`neutral`)}function fn(e){return/(?:^|:)id\/button1$/i.test(e)?`accept`:/(?:^|:)id\/button2$/i.test(e)?`dismiss`:/(?:^|:)id\/button3$/i.test(e)?`neutral`:/(?:^|:)id\/permission_allow/i.test(e)?`accept`:/(?:^|:)id\/permission_deny/i.test(e)?`dismiss`:null}function pn(e){return D(e.find(e=>/(?:^|:)id\/(?:alertTitle|permission_message)$/i.test(e.identifier??``)))||D(e[0])}function mn(e,t){let n=e.map(e=>D(e)).filter(e=>e&&e!==t);return n.length?[...new Set(n)].join(`
3
3
  `):void 0}function hn(e,t){let n=t[0];if(!n)return;let r=gn(e,n.index);for(let n of t.slice(1)){let t=new Set(gn(e,n.index));for(let e=r.length-1;e>=0;--e)t.has(r[e])||r.splice(e,1)}return r.at(-1)}function gn(e,t){let n=new Map(e.map(e=>[e.index,e])),r=[],i=n.get(t);for(;i;)r.push(i.index),i=i.parentIndex===void 0?void 0:n.get(i.parentIndex);return r.reverse()}function _n(e,t){let n=new Map;for(let t of e){if(t.parentIndex===void 0)continue;let e=n.get(t.parentIndex)??[];e.push(t),n.set(t.parentIndex,e)}let r=new Set([t]),i=[t];for(let e of i)for(let t of n.get(e)??[])r.has(t.index)||(r.add(t.index),i.push(t.index));return e.filter(e=>r.has(e.index))}function vn(e){let t=e.bundleId??``;return Gt.has(t)||Xt.test(e.identifier??``)}function yn(e){let t=e.bundleId??``;return qt.has(t)&&Zt.test(D(e))}function bn(e){let t=e.type??``,n=e.identifier??``;return!!(e.hittable||/\bbutton\b/i.test(t)||Yt.test(n)||/(?:^|:)id\/permission_(?:allow|deny)/i.test(n))}function D(e){return e?[e.label,e.value].filter(e=>typeof e==`string`&&e.trim().length>0)[0]?.trim()??``:``}function xn(e){return e.find(e=>e.bundleId)?.bundleId}function Sn(e,n,r){if(typeof e!=`number`||!Number.isInteger(e))throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return e}function O(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function Cn(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function wn(e,n){let r=Cn(e,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new t(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}function Tn(e){let t={status:[],results:[],currentStatus:null,currentResult:null};for(let n of e.split(/\r?\n/))En(n,t);return Dn(t),{status:t.status,results:t.results}}function En(e,t){if(e.startsWith(`INSTRUMENTATION_STATUS: `)){t.currentStatus??={},An(e.slice(24),t.currentStatus);return}if(e.startsWith(`INSTRUMENTATION_STATUS_CODE: `)){On(t);return}if(e.startsWith(`INSTRUMENTATION_RESULT: `)){t.currentResult??={},An(e.slice(24),t.currentResult);return}e.startsWith(`INSTRUMENTATION_CODE: `)&&kn(t)}function Dn(e){On(e),kn(e)}function On(e){e.currentStatus&&=(e.status.push(e.currentStatus),null)}function kn(e){e.currentResult&&=(e.results.push(e.currentResult),null)}function An(e,t){let n=e.indexOf(`=`);n<0||(t[e.slice(0,n)]=e.slice(n+1))}function k(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function A(e){if(e===`true`)return!0;if(e===`false`)return!1}function jn(e){if(!Number.isFinite(e.x)||!Number.isFinite(e.y)||!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0)throw new t(`COMMAND_FAILED`,`Android helper returned an invalid gesture viewport`);return e}const Mn=1e4;async function Nn(e,t){try{return await He(e,t)}catch(e){throw Qe(e)}}async function Pn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,apkPath:a,sha256:o,cache:s,deviceKey:c,installTimeoutMs:l,helperLabel:u}=e,d=`${c}\0${r}\0${i}\0${o}`;if(s.has(d))return{packageName:r,versionCode:i,installedSha256:o,installed:!1,reason:`current`};await Vn(a,o,u);let f=await Fn({adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:o});if(f.reason===`current`)return s.add(d),{packageName:r,versionCode:i,...f,installed:!1};let p=await Nn(a,{provider:n,replace:!0,allowFailure:!0,timeoutMs:l});if(p.exitCode!==0)throw w(`Failed to install ${u}`,p,{packageName:r,versionCode:i,reason:f.reason});return s.add(d),{packageName:r,versionCode:i,...f,installed:!0}}async function Fn(e){let{adb:t,adbProvider:n,packageName:r,versionCode:i,sha256:a,signal:o}=e,s=await Rn(t,r,o);if(s===void 0)return{reason:`missing`};if(s<i)return{installedVersionCode:s,reason:`outdated`};if(s>i)return{installedVersionCode:s,reason:`current`};try{let e=await zn(t,n,r,o);return{installedVersionCode:s,installedSha256:e,reason:e===a?`current`:`mismatched`}}catch{return o?.throwIfAborted(),{installedVersionCode:s,reason:`unverifiable`}}}async function In(e){let r=x().files,i=Ae(),a=E.join(ke(),`android`,e.helperDirName,`dist`),o=E.join(a,e.manifestFileName(i));try{let t=e.parseManifest(JSON.parse(await r.readText(o))),n=E.join(a,t.assetName);return await r.access(n),{apkPath:n,manifest:t}}catch(r){throw new t(`UNSUPPORTED_OPERATION`,e.unavailableMessage,{manifestPath:o,error:n(r).message},r)}}function Ln(e){return async t=>await Pn({adb:t.adb,adbProvider:t.adbProvider,packageName:t.artifact.manifest.packageName,versionCode:t.artifact.manifest.versionCode,apkPath:t.artifact.apkPath,sha256:t.artifact.manifest.sha256,cache:e.cache,deviceKey:t.deviceKey,installTimeoutMs:e.installTimeoutMs,helperLabel:e.helperLabel})}async function Rn(e,t,n){let r=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:5e3,signal:n});if(r.exitCode!==0)return;let i=RegExp(`package:${Un(t)}(?:\\s|$).*versionCode:(\\d+)`).exec(`${r.stdout}\n${r.stderr}`);return i?Number(i[1]):void 0}async function zn(e,n,r,i){let a=await b(e,[`pm`,`path`,r],{allowFailure:!0,timeoutMs:Mn,signal:i}),o=Bn(`${a.stdout}\n${a.stderr}`);if(a.exitCode!==0||!o)throw new t(`COMMAND_FAILED`,`Could not resolve installed Android helper APK`);let s=x().files,c=await s.makeTempDirectory(`agent-device-helper-`),l=E.join(c,`base.apk`);try{let e=await Re(o,l,{provider:n,allowFailure:!0,timeoutMs:Mn,signal:i});if(e.exitCode!==0)throw w(`Could not read installed Android helper APK`,e,{packageName:r,remotePath:o});return await Hn(l)}finally{await s.remove(c,{recursive:!0,force:!0})}}function Bn(e){return e.split(/\r?\n/).map(e=>e.startsWith(`package:`)?e.slice(8).trim():``).find(e=>e.endsWith(`/base.apk`))}async function Vn(e,n,r){let i=await Hn(e);if(i!==n)throw new t(`COMMAND_FAILED`,`${r} APK checksum mismatch`,{apkPath:e,expectedSha256:n,actualSha256:i})}async function Hn(e){let t=x().files;return t.sha256(await t.readBytes(e))}function Un(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Wn=`android-snapshot-helper-v1`,Gn=`uiautomator-xml`,Kn=5e3,qn=3e4;function Jn(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest must be an object.`);let n=e;return{name:Xn(n.name,`name`,`android-snapshot-helper`),version:j(n.version,`version`),releaseTag:Qn(n.releaseTag),assetName:Qn(n.assetName),apkUrl:$n(n.apkUrl,`apkUrl`),sha256:Zn(n.sha256),checksumName:Qn(n.checksumName),packageName:j(n.packageName,`packageName`),versionCode:Yn(n.versionCode,`versionCode`),instrumentationRunner:j(n.instrumentationRunner,`instrumentationRunner`),minSdk:Yn(n.minSdk,`minSdk`),targetSdk:n.targetSdk===void 0?void 0:Yn(n.targetSdk,`targetSdk`),outputFormat:Xn(n.outputFormat,`outputFormat`,Gn),statusProtocol:Xn(n.statusProtocol,`statusProtocol`,Wn)}}function Yn(e,t){return Sn(e,t,`snapshot helper`)}function Xn(e,t,n){return O(e,t,n,`snapshot helper`)}function Zn(e){let n=j(e,`sha256`).trim().toLowerCase();if(n.length!==64||!er(n))throw new t(`INVALID_ARGS`,`Android snapshot helper manifest sha256 must be a 64-character hex string.`);return n}function j(e,n){if(typeof e!=`string`||e.trim().length===0)throw new t(`INVALID_ARGS`,`Android snapshot helper manifest ${n} is required.`);return e}function Qn(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function $n(e,t){return e===null?null:j(e,t)}function er(e){for(let t of e){let e=t.charCodeAt(0);if(!(e>=48&&e<=57)&&!(e>=97&&e<=102))return!1}return!0}const M=new Map;function tr(e){let t=`${e.deviceKey}\0${e.packageName}\0${e.versionCode}\0`;for(let e of M.keys())e.startsWith(t)&&ar(e)}function nr(){M.clear()}function rr(e,t,n,r){return e?`${e}\0${t}\0${n}\0${r}`:void 0}function ir(e,t){if(!e)return;let[n,r]=e.split(`\0`),i=`${n}\0${r}\0`;for(let t of M.keys())t!==e&&t.startsWith(i)&&M.delete(t);M.set(e,t)}function ar(e){e&&M.delete(e)}async function or(e){let{adb:t,artifact:n}=e,r=e.installPolicy??`missing-or-outdated`,i=n.manifest.packageName,a=n.manifest.versionCode,o=n.manifest.sha256;if(r===`never`)return{packageName:i,versionCode:a,installed:!1,reason:`skipped`};let s=rr(e.deviceKey,i,a,o),c=s?M.get(s):void 0;if(s&&r!==`always`&&c!==void 0)return{packageName:i,versionCode:a,installedVersionCode:c,installedSha256:o,installed:!1,reason:`current`};await Vn(n.apkPath,o,`Android snapshot helper`);let l=r===`always`?{installedVersionCode:await lr(t,i,e.timeoutMs,e.signal),reason:`forced`}:await Fn({adb:t,adbProvider:cr(e.adbProvider,t),packageName:i,versionCode:a,sha256:o,signal:e.signal}),{installedVersionCode:u}=l,d=`installedSha256`in l?l.installedSha256:void 0,f=l.reason;if(f===`current`){if(u===void 0)throw Error(`Expected installed versionCode for current Android snapshot helper`);return ir(s,u),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!1,reason:f}}let p;try{p=await ur(t,e.adbProvider??t,n.apkPath,{packageName:i,timeoutMs:e.timeoutMs,signal:e.signal})}catch(e){throw ar(s),sr(e,{packageName:i,versionCode:a})}if(p.exitCode!==0)throw ar(s),sr(w(`Failed to install Android snapshot helper`,p,{packageName:i,versionCode:a}));return ir(s,a),{packageName:i,versionCode:a,installedVersionCode:u,installedSha256:d,installed:!0,reason:f}}function sr(e,t){let n=r(e,`COMMAND_FAILED`);return n.details={...t,...n.details,androidSnapshotHelperInstallFailure:!0},n}function cr(e,t){return e?typeof e==`function`?{exec:e}:e:{exec:t}}async function lr(e,t,n,r){let i=await b(e,[`cmd`,`package`,`list`,`packages`,`--show-versioncode`,t],{allowFailure:!0,timeoutMs:n,signal:r});if(i.exitCode===0)return dr(`${i.stdout}\n${i.stderr}`,t)}async function ur(e,t,n,r){let i=async()=>await Nn(n,{allowFailure:!0,provider:t,replace:!0,timeoutMs:r.timeoutMs,signal:r.signal}),a=await i();if(a.exitCode===0||!fr(a))return a;let o=await e([`uninstall`,r.packageName],{allowFailure:!0,timeoutMs:r.timeoutMs,signal:r.signal}),s=await i();return s.exitCode===0?s:{...s,stderr:[s.stderr,o.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${o.stderr}`:``].filter(Boolean).join(`
4
4
  `)}}function dr(e,t){let n=`package:${t}`;for(let t of e.split(/\r?\n/)){if(!t.startsWith(n)||t.length>n.length&&!/\s/.test(t[n.length]??``))continue;let e=/(?:^|\s)versionCode:(\d+)(?:\s|$)/.exec(t);if(e)return Number(e[1])}}function fr(e){return`${e.stdout}\n${e.stderr}`.includes(`INSTALL_FAILED_UPDATE_INCOMPATIBLE`)}function pr(e){return e.errorType===`java.util.concurrent.TimeoutException`?`accessibility-timeout`:void 0}function mr(e){return e===137?`accessibility-timeout`:void 0}function hr(e){return e?{androidCaptureFailureReason:e}:{}}function gr(){return new Promise((e,t)=>{let n=zt.createServer();n.unref(),n.on(`error`,t),n.listen(0,`127.0.0.1`,()=>{let r=n.address();if(!r||typeof r==`string`){n.close(()=>t(Error(`Failed to allocate a local TCP port`)));return}let i=r.port;n.close(()=>e(i))})})}function _r(e,n,r,i){return new Promise((a,o)=>{let s=zt.connect({host:`127.0.0.1`,port:e}),c=[],l=setTimeout(()=>{u(),s.destroy(),o(new t(`COMMAND_FAILED`,`Android snapshot helper session request timed out`,{command:n,timeoutMs:r,port:e}))},r),u=()=>{clearTimeout(l),i?.removeEventListener(`abort`,d)},d=()=>{u(),s.destroy(),o(i?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(i?.addEventListener(`abort`,d,{once:!0}),i?.aborted){d();return}s.on(`connect`,()=>s.write(`${n}\n`)),s.on(`data`,e=>c.push(Buffer.from(e))),s.on(`error`,e=>{u(),o(e)}),s.on(`close`,()=>{u(),a(Buffer.concat(c).toString(`utf8`))})})}async function vr(e){let t=`snapshot-${Date.now()}-${Math.random().toString(16).slice(2)}`;return wr(await _r(e.port,`snapshot ${t}`,yr(e),e.signal),t)}function yr(e){return Math.min(e.commandTimeoutMs,Math.max(e.timeoutMs+3e3,3e3))}function br(e,n,r){return new Promise((i,a)=>{let o=``,s=setTimeout(()=>{r?.removeEventListener(`abort`,l),a(new t(`COMMAND_FAILED`,`Android snapshot helper session did not become ready`,{output:o,timeoutMs:n,reason:`android_snapshot_helper_session_ready_timeout`}))},n),c=e=>{o+=e.toString(),o.includes(`agentDeviceProtocol=android-snapshot-helper-v1`)&&o.includes(`sessionReady=true`)&&(clearTimeout(s),r?.removeEventListener(`abort`,l),i())},l=()=>{clearTimeout(s),a(r?.reason??new DOMException(`The operation was aborted`,`AbortError`))};if(r?.addEventListener(`abort`,l,{once:!0}),r?.aborted){l();return}e.stdout?.on(`data`,c),e.stderr?.on(`data`,c),e.once(`exit`,(e,n)=>{clearTimeout(s),r?.removeEventListener(`abort`,l),a(new t(`COMMAND_FAILED`,`Android snapshot helper session exited before ready`,{output:o,exitCode:e,signal:n,reason:`android_snapshot_helper_session_exited_before_ready`}))}),e.on(`error`,e=>{clearTimeout(s),r?.removeEventListener(`abort`,l),a(e)})})}function xr(e){let t=e.indexOf(`
@@ -1 +1 @@
1
- import{r as e}from"./sdk-batch-runner.js";import{r as t}from"./app-deployment-resolution.js";import{n}from"./window-state.js";async function r(n,r){if(!(n.platform!==`android`||!r||e(r)))try{let e=await t(n,r);return e.type===`package`?e.value:void 0}catch{return}}async function i(t,r,i){if(i||t.platform!==`android`||!r||!e(r))return i;try{return(await n(t)).package?.trim()||i}catch{return i}}export{i as inferAndroidPackageAfterOpen,r as resolveAndroidPackageForOpen};
1
+ import{i as e}from"./sdk-batch-runner.js";import{r as t}from"./app-deployment-resolution.js";import{n}from"./window-state.js";async function r(n,r){if(!(n.platform!==`android`||!r||e(r)))try{let e=await t(n,r);return e.type===`package`?e.value:void 0}catch{return}}async function i(t,r,i){if(i||t.platform!==`android`||!r||!e(r))return i;try{return(await n(t)).package?.trim()||i}catch{return i}}export{i as inferAndroidPackageAfterOpen,r as resolveAndroidPackageForOpen};
@@ -1,2 +1,2 @@
1
- import{D as e}from"./sdk-contracts.js";import{D as t}from"./sdk-batch-runner.js";import{b as n,d as r,f as i,l as a}from"./sdk-device.js";import{sr as o}from"./sdk-batch.js";import{a as s,l as c,n as l}from"./exec.js";import"./command.js";import{t as u}from"./parser.js";import{n as d,t as f}from"./numeric.js";import{C as p,D as ee,g as m,i as te,m as h,o as g,u as _,w as ne,y as v}from"./host-file.js";import{a as y,o as b}from"./tool-provider.js";import{o as re,t as ie}from"./devicectl.js";import{t as x}from"./simctl.js";import{t as ae}from"./physical-device-control.js";import{t as oe}from"./plist.js";import S from"node:path";import{fileURLToPath as C}from"node:url";function w(e,t){for(let n of e){if(t(n))return n;let e=w(n.children,t);if(e)return e}}function T(e,t){let n=[];for(let r of e)t(r)&&n.push(r),n.push(...T(r.children,t));return n}function se(e,t){return e.children.find(e=>e.name===t)?.text??null}function E(e,t){let n=w(e,e=>e.name===`schema`&&e.attributes.name===t);return n?n.children.filter(e=>e.name===`col`).map(e=>se(e,`mnemonic`)??``):[]}function D(e){if(!e||e.children.some(e=>e.name===`sentinel`)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function O(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:D(e):null}function ce(e){return new Map(T(e,e=>!!e.attributes.id).flatMap(e=>{let t=e.attributes.id;return t?[[t,e]]:[]}))}function k(e,t){if(e)return e.attributes.ref?t.get(e.attributes.ref):e}const A=`xctrace-animation-hitches`;function le(e){let t=ue(e.frameLifetimesXml),n=de(e.displayInfoXml),r=fe(e.hitchesXml).filter(t=>he(t,e.processIds,e.processNames)),i=r.length,a=Math.max(0,Math.round(Date.parse(e.windowEndedAt)-Date.parse(e.windowStartedAt))),s=ge(r,Date.parse(e.windowStartedAt));return{droppedFramePercent:t>0?d(i/t*100):0,droppedFrameCount:i,totalFrameCount:t,sampleWindowMs:a,windowStartedAt:e.windowStartedAt,windowEndedAt:e.windowEndedAt,measuredAt:e.measuredAt,method:A,matchedProcesses:o(r.map(e=>e.processName).filter(e=>typeof e==`string`&&e.length>0)),frameDeadlineMs:n===void 0?void 0:f(1e3/n),refreshRateHz:n,worstWindows:s.length>0?s:void 0}}function ue(e){return ve(e,`hitches-frame-lifetimes`).length}function de(e){if(!e)return;let{rows:t,schema:n}=j(e,`device-display-info`),r=n.indexOf(`max-refresh-rate`);if(r<0)return;let i=new Map;for(let e of t){M(e.children,i);let t=O(e.children[r],i);if(t!==null&&t>0)return t}}function fe(e){let t=u(e),n=pe(t);if(!n)return[];let r=new Map;return T(t,e=>e.name===`row`).map(e=>me(e,n,r)).filter(e=>!!e)}function pe(e){let t=E(e,`hitches`),n={start:t.indexOf(`start`),duration:t.indexOf(`duration`),process:t.indexOf(`process`),isSystem:t.indexOf(`is-system`)};return Object.values(n).every(e=>e>=0)?n:null}function me(e,t,n){if(M(e.children,n),ye(e.children[t.isSystem],n)===!0)return null;let r=O(e.children[t.start],n),i=O(e.children[t.duration],n);if(r===null||i===null)return null;let a=be(e.children[t.process],n);return{startNs:r,durationNs:i,pid:a?.pid,processName:a?.name}}function he(e,t,n){return e.pid!==void 0&&t.includes(e.pid)?!0:e.processName?n.includes(e.processName):!1}function ge(e,t){if(e.length===0)return[];let n=[...e].sort((e,t)=>e.startNs-t.startNs),r=[],i=[];for(let e of n){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}r.push(i),i=[e]}return i.length>0&&r.push(i),r.map(e=>_e(e,t)).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function _e(e,t){let n=Math.min(...e.map(e=>e.startNs)),r=Math.max(...e.map(e=>e.startNs+e.durationNs)),i=Math.max(0,Math.round(n/1e6)),a=Math.max(i,Math.round(r/1e6));return{startOffsetMs:i,endOffsetMs:a,startAt:new Date(t+i).toISOString(),endAt:new Date(t+a).toISOString(),missedDeadlineFrameCount:e.length,worstFrameMs:f(Math.max(...e.map(e=>e.durationNs))/1e6)}}function ve(e,t){return j(e,t).rows}function j(e,t){let n=u(e),r=E(n,t);return{rows:r.length===0?[]:T(n,e=>e.name===`row`),schema:r}}function M(e,t){for(let n of e)M(n.children,t),n.attributes.id&&t.set(n.attributes.id,{numberValue:D(n),process:N(n)})}function ye(e,t){let n=O(e,t);return n===null?null:n!==0}function be(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.process??null:N(e):null}function N(e){if(!e||e.children.some(e=>e.name===`sentinel`))return null;let t=D(w(e.children,e=>e.name===`pid`)),n=(e.attributes.fmt??``).replace(/\s+\(\d+\)$/,``).trim();return t===null&&n.length===0?null:{pid:t??void 0,name:n.length>0?n:void 0}}const P=`ps-process-snapshot`,F=`xctrace-activity-monitor`,I=`leaks-output-graph`,L=15e3,R=12e4;async function xe(t,n){if(r(t)&&t.kind===`device`)return await Fe(t,n);let i=await G(t,n),a=await q(t,i);if(a.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf.`});let o=new Date().toISOString();return X({residentMemoryKb:a.reduce((e,t)=>e+t.rssKb,0),measuredAt:o,matchedProcesses:[i.executableName],memoryMethod:P})}async function Se(t,n,r){let i=B(t);if(!i.memgraph)return{available:!1,kind:`memgraph`,reason:i.reason,hint:i.hint,support:i};let a=await Ve(t,n,i);if(a.available===!1)return a;let{process:o}=a;await g(S.dirname(r));let s=await Te(r),c;try{c=await Ce(t,r,o.pid)}catch(e){throw await z(r,s),we(t,n,o,r,e)}if(c.exitCode!==0)throw await z(r,s),new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,l(c,{kind:`memgraph`,appBundleId:n,pid:o.pid,processName:S.basename(J(o.command)),path:r,hint:Y(t,c.stdout,c.stderr)}));let u=await _(r).catch(()=>null);if(!u?.isFile()||u.size<=0)throw await z(r,s),new e(`COMMAND_FAILED`,`Apple memgraph artifact is missing or empty`,{kind:`memgraph`,appBundleId:n,pid:o.pid,path:r,hint:`Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output.`});return{available:!0,kind:`memgraph`,path:r,sizeBytes:u.size,measuredAt:new Date().toISOString(),method:I,appBundleId:n,pid:o.pid,processName:S.basename(J(o.command)),support:i}}async function Ce(e,t,n){return i(e)?await y(`leaks`,[`--outputGraph=${t}`,String(n)],{allowFailure:!0,timeoutMs:R}):await b(x(e,[`spawn`,e.id,`leaks`,`--outputGraph=${t}`,String(n)]),{allowFailure:!0,timeoutMs:R})}function we(t,n,r,i,a){if(a instanceof e){let o=a.details??{};return new e(a.code,`Failed to capture Apple memgraph for ${n}`,{...o,kind:`memgraph`,appBundleId:n,pid:r.pid,processName:S.basename(J(r.command)),path:i,hint:Y(t,typeof o.stdout==`string`?o.stdout:``,typeof o.stderr==`string`&&o.stderr.length>0?o.stderr:a.message)},a)}return new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,{kind:`memgraph`,appBundleId:n,pid:r.pid,processName:S.basename(J(r.command)),path:i,hint:`Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output.`},a)}async function Te(e){return await _(e).then(e=>e.isFile()).catch(()=>!1)}async function z(e,t){t||await p(e).catch(()=>{})}async function Ee(t,i){if(!r(t)||t.kind!==`device`)throw new e(`COMMAND_FAILED`,`Apple frame-health sampling is currently available only on connected iOS devices.`,{metric:`fps`,platform:n(t),deviceKind:t.kind});let a=await K(t,i),s=await ke(t,i,a);return le({hitchesXml:s.hitchesXml,frameLifetimesXml:s.frameLifetimesXml,displayInfoXml:s.displayInfoXml,processIds:a.map(e=>e.pid),processNames:o(a.map(e=>S.basename(C(e.executable)))),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,measuredAt:s.windowEndedAt})}function De(e){return r(e)&&e.kind===`device`?{method:A,description:`Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.`,unit:`percent`,primaryField:`droppedFramePercent`,window:`short 2s xctrace Animation Hitches record of the active app process`,resetsAfterRead:!1}:{method:A,description:`Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.`,unit:`percent`,primaryField:`droppedFramePercent`}}function Oe(e){if(r(e)&&e.kind===`device`)return{method:F,description:`Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.`,unit:`kB`};let t=i(e)?`host ps for the running macOS app executable resolved from the bundle ID.`:`xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.`;return{method:P,description:`Resident memory snapshot from ${t}`,unit:`kB`}}function B(e){return r(e)&&e.kind===`device`?{platform:n(e),deviceKind:e.kind,memgraph:!1,method:I,reason:`Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.`,hint:`Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture.`}:r(e)&&e.kind===`simulator`?{platform:n(e),deviceKind:e.kind,memgraph:!0,method:I,reason:`iOS simulator processes are host-visible through simctl spawn leaks.`,hint:`Keep the simulator app running in the foreground while the memgraph is captured.`}:i(e)?{platform:n(e),deviceKind:e.kind,memgraph:!0,method:I,reason:`macOS app processes are host-visible to leaks --outputGraph.`,hint:`Grant Terminal/agent process permissions if macOS denies process inspection.`}:{platform:n(e),deviceKind:e.kind,memgraph:!1,method:I,reason:`Apple memgraph capture is available only for iOS simulator and macOS app sessions.`,hint:`Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture.`}}async function ke(e,t,n){let r=await h(`agent-device-ios-frame-perf-`),i=S.join(r,`animation-hitches.trace`),a=S.join(r,`hitches.xml`),o=S.join(r,`frame-lifetimes.xml`),s=S.join(r,`display-info.xml`);try{let r=await V({device:e,appBundleId:t,tracePath:i,template:`Animation Hitches`,duration:`2s`,targetPids:n.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await W(e,t,i,`hitches`,a),await W(e,t,i,`hitches-frame-lifetimes`,o);let c=await Me(e,t,i,`device-display-info`,s);return{windowStartedAt:r.startedAt,windowEndedAt:r.endedAt,hitchesXml:await v(a),frameLifetimesXml:await v(o),displayInfoXml:c?await v(s):void 0}}finally{await p(r).catch(()=>{})}}async function V(t){let{device:n,appBundleId:r,tracePath:i,template:a,duration:o}=t,s=t.allProcesses?[`--all-processes`]:(t.targetPids??[]).flatMap(e=>[`--attach`,String(e)]),c=[`xctrace`,`record`,`--template`,a,`--device`,n.id,...s,`--time-limit`,o,`--output`,i,`--quiet`,`--no-prompt`],u=await Ae(c,t.tracePath);if(u.result.exitCode===0)return t.validateTraceOutput&&await je(t,u.result.stdout,u.result.stderr),{startedAt:u.startedAt,endedAt:u.endedAt,capturedAtMs:u.capturedAtMs};throw new e(`COMMAND_FAILED`,t.failureMessage,l(u.result,{cmd:`xcrun`,args:c,appBundleId:r,deviceId:n.id,hint:Q(u.result.stdout,u.result.stderr)}))}async function Ae(e,t){let n;for(let r=1;r<=3;r+=1){await U(t,r,1500);let i=new Date().toISOString(),a=await b(e,{allowFailure:!0,timeoutMs:6e4});if(n={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},a.exitCode===0||!H(a))return n}return n}function H(e){let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`_lockkperf`)||t.includes(`could not lock kperf`)||t.includes(`likely another session just started`)}async function U(e,t,n){t<=1||(await p(e).catch(()=>{}),await new Promise(e=>setTimeout(e,n)))}async function je(t,n,r){let i=await _(t.tracePath).catch(()=>null);if(!(i?.isDirectory()===!0?(await m(t.tracePath).catch(()=>[])).length>0:(i?.size??0)>0))throw new e(`COMMAND_FAILED`,`${t.failureMessage}: xctrace produced no trace data`,{tracePath:t.tracePath,appBundleId:t.appBundleId,deviceId:t.device.id,stdout:n,stderr:r,hint:`Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.`})}async function W(e,t,n,r,i){let a=[`xctrace`,`export`,`--input`,n,`--xpath`,`/trace-toc/run/data/table[@schema="${r}"]`,`--output`,i];s(await b(a,{allowFailure:!0,timeoutMs:15e3}),`Failed to export iOS device ${r} data`,n=>({cmd:`xcrun`,args:a,appBundleId:t,deviceId:e.id,hint:Q(n.stdout,n.stderr)}))}async function Me(e,t,n,r,i){try{return await W(e,t,n,r,i),!0}catch{return!1}}function Ne(e){let n=[];for(let r of t(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[t,i,a,o]=e.slice(1);if(t===void 0||i===void 0||a===void 0||o===void 0)continue;let s=Number(t),c=Number(i),l=Number(a),u=o.trim();!Number.isFinite(s)||!Number.isFinite(c)||!Number.isFinite(l)||n.push({pid:s,cpuPercent:c,rssKb:l,command:u})}return n}async function Pe(t){let n=u(t),r=E(n,`activity-monitor-process-live`);if(r.length===0)throw new e(`COMMAND_FAILED`,`Failed to parse xctrace activity-monitor-process-live schema`);let i=r.indexOf(`pid`),a=r.indexOf(`process`),o=r.indexOf(`memory-real`);if(i<0||a<0||o<0)throw new e(`COMMAND_FAILED`,`xctrace activity-monitor-process-live export is missing expected columns`);let s=T(n,e=>e.name===`row`),c=[],l=new Map;for(let e of s){let t=e.children;if(t.length===0)continue;for(let e of t){let t=w(e.children,e=>e.name===`pid`&&typeof e.attributes.id==`string`);if(t?.attributes.id){let e=Number(t.text);l.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&l.set(e.attributes.id,{numberValue:D(e),processName:Z(e)})}let n=O(t[i],l),r=We(t[a],l);n===null||!Number.isFinite(n)||!r||c.push({pid:n,processName:r,residentMemoryBytes:O(t[o],l)})}return c}async function G(t,n){let r=i(t)?await Re(n):await ze(t,n),a=i(t)?S.join(r,`Contents`,`Info.plist`):S.join(r,`Info.plist`),o=await oe(a,`CFBundleExecutable`);if(!o)throw new e(`COMMAND_FAILED`,`Failed to resolve executable for ${n}`,{appBundleId:n,appPath:r});return{executableName:o,executablePath:i(t)?S.join(r,`Contents`,`MacOS`,o):S.join(r,o)}}async function Fe(t,n){let r=await K(t,n),i=await Ie(t,n),a=Le(await Pe(i.xml),r,n,t);if(a.residentMemoryBytes===null)throw new e(`COMMAND_FAILED`,`Incomplete Activity Monitor sample for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});return X({residentMemoryKb:a.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:a.matchedProcesses,memoryMethod:F})}async function K(t,n){let{appBundleUrl:r,processes:i}=await ae(t).resolveAppProcesses(t,n),a=C(r);if(i.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,deviceId:t.id,appBundlePath:a,hint:`Run open <app> for this session again to ensure the iOS app is active, then retry perf.`});return i}async function Ie(e,t){let n=await h(`agent-device-ios-perf-`),r=S.join(n,`sample.trace`),i=S.join(n,`activity-monitor-process-live.xml`);try{let n=await V({device:e,appBundleId:t,tracePath:r,template:`Activity Monitor`,duration:`1s`,allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await W(e,t,r,`activity-monitor-process-live`,i),{capturedAtMs:n.capturedAtMs,xml:await v(i)}}finally{await p(n).catch(()=>{})}}function Le(t,n,r,i){let a=new Set(n.map(e=>e.pid)),s=new Set(n.map(e=>S.basename(C(e.executable)))),c=t.filter(e=>a.has(e.pid)||s.has(e.processName));if(c.length===0)throw new e(`COMMAND_FAILED`,`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:i.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});let l=new Map;for(let e of c){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,residentMemoryBytes:Ge(t.residentMemoryBytes,e.residentMemoryBytes)})}let u=[...l.values()],d=u.map(e=>e.residentMemoryBytes).filter(e=>e!==null);return{residentMemoryBytes:d.length>0?d.reduce((e,t)=>e+t,0):null,matchedProcesses:o(u.map(e=>e.processName))}}async function Re(t){let n=`kMDItemCFBundleIdentifier == "${t.replaceAll(`"`,String.raw`\"`)}"`,r=s(await y(`mdfind`,[n],{allowFailure:!0,timeoutMs:L}),`Failed to resolve macOS app bundle for ${t}`,{appBundleId:t}).stdout.split(`
1
+ import{D as e}from"./sdk-contracts.js";import{O as t}from"./sdk-batch-runner.js";import{b as n,d as r,f as i,l as a}from"./sdk-device.js";import{sr as o}from"./sdk-batch.js";import{a as s,l as c,n as l}from"./exec.js";import"./command.js";import{t as u}from"./parser.js";import{n as d,t as f}from"./numeric.js";import{C as p,D as ee,g as m,i as te,m as h,o as g,u as _,w as ne,y as v}from"./host-file.js";import{a as y,o as b}from"./tool-provider.js";import{o as re,t as ie}from"./devicectl.js";import{t as x}from"./simctl.js";import{t as ae}from"./physical-device-control.js";import{t as oe}from"./plist.js";import S from"node:path";import{fileURLToPath as C}from"node:url";function w(e,t){for(let n of e){if(t(n))return n;let e=w(n.children,t);if(e)return e}}function T(e,t){let n=[];for(let r of e)t(r)&&n.push(r),n.push(...T(r.children,t));return n}function se(e,t){return e.children.find(e=>e.name===t)?.text??null}function E(e,t){let n=w(e,e=>e.name===`schema`&&e.attributes.name===t);return n?n.children.filter(e=>e.name===`col`).map(e=>se(e,`mnemonic`)??``):[]}function D(e){if(!e||e.children.some(e=>e.name===`sentinel`)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function O(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:D(e):null}function ce(e){return new Map(T(e,e=>!!e.attributes.id).flatMap(e=>{let t=e.attributes.id;return t?[[t,e]]:[]}))}function k(e,t){if(e)return e.attributes.ref?t.get(e.attributes.ref):e}const A=`xctrace-animation-hitches`;function le(e){let t=ue(e.frameLifetimesXml),n=de(e.displayInfoXml),r=fe(e.hitchesXml).filter(t=>he(t,e.processIds,e.processNames)),i=r.length,a=Math.max(0,Math.round(Date.parse(e.windowEndedAt)-Date.parse(e.windowStartedAt))),s=ge(r,Date.parse(e.windowStartedAt));return{droppedFramePercent:t>0?d(i/t*100):0,droppedFrameCount:i,totalFrameCount:t,sampleWindowMs:a,windowStartedAt:e.windowStartedAt,windowEndedAt:e.windowEndedAt,measuredAt:e.measuredAt,method:A,matchedProcesses:o(r.map(e=>e.processName).filter(e=>typeof e==`string`&&e.length>0)),frameDeadlineMs:n===void 0?void 0:f(1e3/n),refreshRateHz:n,worstWindows:s.length>0?s:void 0}}function ue(e){return ve(e,`hitches-frame-lifetimes`).length}function de(e){if(!e)return;let{rows:t,schema:n}=j(e,`device-display-info`),r=n.indexOf(`max-refresh-rate`);if(r<0)return;let i=new Map;for(let e of t){M(e.children,i);let t=O(e.children[r],i);if(t!==null&&t>0)return t}}function fe(e){let t=u(e),n=pe(t);if(!n)return[];let r=new Map;return T(t,e=>e.name===`row`).map(e=>me(e,n,r)).filter(e=>!!e)}function pe(e){let t=E(e,`hitches`),n={start:t.indexOf(`start`),duration:t.indexOf(`duration`),process:t.indexOf(`process`),isSystem:t.indexOf(`is-system`)};return Object.values(n).every(e=>e>=0)?n:null}function me(e,t,n){if(M(e.children,n),ye(e.children[t.isSystem],n)===!0)return null;let r=O(e.children[t.start],n),i=O(e.children[t.duration],n);if(r===null||i===null)return null;let a=be(e.children[t.process],n);return{startNs:r,durationNs:i,pid:a?.pid,processName:a?.name}}function he(e,t,n){return e.pid!==void 0&&t.includes(e.pid)?!0:e.processName?n.includes(e.processName):!1}function ge(e,t){if(e.length===0)return[];let n=[...e].sort((e,t)=>e.startNs-t.startNs),r=[],i=[];for(let e of n){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}r.push(i),i=[e]}return i.length>0&&r.push(i),r.map(e=>_e(e,t)).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}function _e(e,t){let n=Math.min(...e.map(e=>e.startNs)),r=Math.max(...e.map(e=>e.startNs+e.durationNs)),i=Math.max(0,Math.round(n/1e6)),a=Math.max(i,Math.round(r/1e6));return{startOffsetMs:i,endOffsetMs:a,startAt:new Date(t+i).toISOString(),endAt:new Date(t+a).toISOString(),missedDeadlineFrameCount:e.length,worstFrameMs:f(Math.max(...e.map(e=>e.durationNs))/1e6)}}function ve(e,t){return j(e,t).rows}function j(e,t){let n=u(e),r=E(n,t);return{rows:r.length===0?[]:T(n,e=>e.name===`row`),schema:r}}function M(e,t){for(let n of e)M(n.children,t),n.attributes.id&&t.set(n.attributes.id,{numberValue:D(n),process:N(n)})}function ye(e,t){let n=O(e,t);return n===null?null:n!==0}function be(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.process??null:N(e):null}function N(e){if(!e||e.children.some(e=>e.name===`sentinel`))return null;let t=D(w(e.children,e=>e.name===`pid`)),n=(e.attributes.fmt??``).replace(/\s+\(\d+\)$/,``).trim();return t===null&&n.length===0?null:{pid:t??void 0,name:n.length>0?n:void 0}}const P=`ps-process-snapshot`,F=`xctrace-activity-monitor`,I=`leaks-output-graph`,L=15e3,R=12e4;async function xe(t,n){if(r(t)&&t.kind===`device`)return await Fe(t,n);let i=await G(t,n),a=await q(t,i);if(a.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf.`});let o=new Date().toISOString();return X({residentMemoryKb:a.reduce((e,t)=>e+t.rssKb,0),measuredAt:o,matchedProcesses:[i.executableName],memoryMethod:P})}async function Se(t,n,r){let i=B(t);if(!i.memgraph)return{available:!1,kind:`memgraph`,reason:i.reason,hint:i.hint,support:i};let a=await Ve(t,n,i);if(a.available===!1)return a;let{process:o}=a;await g(S.dirname(r));let s=await Te(r),c;try{c=await Ce(t,r,o.pid)}catch(e){throw await z(r,s),we(t,n,o,r,e)}if(c.exitCode!==0)throw await z(r,s),new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,l(c,{kind:`memgraph`,appBundleId:n,pid:o.pid,processName:S.basename(J(o.command)),path:r,hint:Y(t,c.stdout,c.stderr)}));let u=await _(r).catch(()=>null);if(!u?.isFile()||u.size<=0)throw await z(r,s),new e(`COMMAND_FAILED`,`Apple memgraph artifact is missing or empty`,{kind:`memgraph`,appBundleId:n,pid:o.pid,path:r,hint:`Retry with a writable --out path. If the file is still empty, run with --debug and inspect leaks output.`});return{available:!0,kind:`memgraph`,path:r,sizeBytes:u.size,measuredAt:new Date().toISOString(),method:I,appBundleId:n,pid:o.pid,processName:S.basename(J(o.command)),support:i}}async function Ce(e,t,n){return i(e)?await y(`leaks`,[`--outputGraph=${t}`,String(n)],{allowFailure:!0,timeoutMs:R}):await b(x(e,[`spawn`,e.id,`leaks`,`--outputGraph=${t}`,String(n)]),{allowFailure:!0,timeoutMs:R})}function we(t,n,r,i,a){if(a instanceof e){let o=a.details??{};return new e(a.code,`Failed to capture Apple memgraph for ${n}`,{...o,kind:`memgraph`,appBundleId:n,pid:r.pid,processName:S.basename(J(r.command)),path:i,hint:Y(t,typeof o.stdout==`string`?o.stdout:``,typeof o.stderr==`string`&&o.stderr.length>0?o.stderr:a.message)},a)}return new e(`COMMAND_FAILED`,`Failed to capture Apple memgraph for ${n}`,{kind:`memgraph`,appBundleId:n,pid:r.pid,processName:S.basename(J(r.command)),path:i,hint:`Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output.`},a)}async function Te(e){return await _(e).then(e=>e.isFile()).catch(()=>!1)}async function z(e,t){t||await p(e).catch(()=>{})}async function Ee(t,i){if(!r(t)||t.kind!==`device`)throw new e(`COMMAND_FAILED`,`Apple frame-health sampling is currently available only on connected iOS devices.`,{metric:`fps`,platform:n(t),deviceKind:t.kind});let a=await K(t,i),s=await ke(t,i,a);return le({hitchesXml:s.hitchesXml,frameLifetimesXml:s.frameLifetimesXml,displayInfoXml:s.displayInfoXml,processIds:a.map(e=>e.pid),processNames:o(a.map(e=>S.basename(C(e.executable)))),windowStartedAt:s.windowStartedAt,windowEndedAt:s.windowEndedAt,measuredAt:s.windowEndedAt})}function De(e){return r(e)&&e.kind===`device`?{method:A,description:`Rendered-frame hitch health from xctrace Animation Hitches on connected iOS devices. Dropped frames are counted from native hitch rows for the attached app process, with total frames from the same trace frame-lifetime table.`,unit:`percent`,primaryField:`droppedFramePercent`,window:`short 2s xctrace Animation Hitches record of the active app process`,resetsAfterRead:!1}:{method:A,description:`Unavailable on iOS simulators and macOS because local Apple tooling does not expose reliable app frame hitches for these targets.`,unit:`percent`,primaryField:`droppedFramePercent`}}function Oe(e){if(r(e)&&e.kind===`device`)return{method:F,description:`Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.`,unit:`kB`};let t=i(e)?`host ps for the running macOS app executable resolved from the bundle ID.`:`xcrun simctl spawn ps, with host ps fallback, for the running iOS simulator app executable resolved from the bundle ID.`;return{method:P,description:`Resident memory snapshot from ${t}`,unit:`kB`}}function B(e){return r(e)&&e.kind===`device`?{platform:n(e),deviceKind:e.kind,memgraph:!1,method:I,reason:`Physical iOS device memgraph capture is not exposed through reliable local agent-device tooling.`,hint:`Use perf memory sample for a compact resident-memory reading, or reproduce on an iOS simulator/macOS target for memgraph capture.`}:r(e)&&e.kind===`simulator`?{platform:n(e),deviceKind:e.kind,memgraph:!0,method:I,reason:`iOS simulator processes are host-visible through simctl spawn leaks.`,hint:`Keep the simulator app running in the foreground while the memgraph is captured.`}:i(e)?{platform:n(e),deviceKind:e.kind,memgraph:!0,method:I,reason:`macOS app processes are host-visible to leaks --outputGraph.`,hint:`Grant Terminal/agent process permissions if macOS denies process inspection.`}:{platform:n(e),deviceKind:e.kind,memgraph:!1,method:I,reason:`Apple memgraph capture is available only for iOS simulator and macOS app sessions.`,hint:`Use perf memory sample on supported app sessions, or rerun against iOS simulator/macOS for memgraph capture.`}}async function ke(e,t,n){let r=await h(`agent-device-ios-frame-perf-`),i=S.join(r,`animation-hitches.trace`),a=S.join(r,`hitches.xml`),o=S.join(r,`frame-lifetimes.xml`),s=S.join(r,`display-info.xml`);try{let r=await V({device:e,appBundleId:t,tracePath:i,template:`Animation Hitches`,duration:`2s`,targetPids:n.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await W(e,t,i,`hitches`,a),await W(e,t,i,`hitches-frame-lifetimes`,o);let c=await Me(e,t,i,`device-display-info`,s);return{windowStartedAt:r.startedAt,windowEndedAt:r.endedAt,hitchesXml:await v(a),frameLifetimesXml:await v(o),displayInfoXml:c?await v(s):void 0}}finally{await p(r).catch(()=>{})}}async function V(t){let{device:n,appBundleId:r,tracePath:i,template:a,duration:o}=t,s=t.allProcesses?[`--all-processes`]:(t.targetPids??[]).flatMap(e=>[`--attach`,String(e)]),c=[`xctrace`,`record`,`--template`,a,`--device`,n.id,...s,`--time-limit`,o,`--output`,i,`--quiet`,`--no-prompt`],u=await Ae(c,t.tracePath);if(u.result.exitCode===0)return t.validateTraceOutput&&await je(t,u.result.stdout,u.result.stderr),{startedAt:u.startedAt,endedAt:u.endedAt,capturedAtMs:u.capturedAtMs};throw new e(`COMMAND_FAILED`,t.failureMessage,l(u.result,{cmd:`xcrun`,args:c,appBundleId:r,deviceId:n.id,hint:Q(u.result.stdout,u.result.stderr)}))}async function Ae(e,t){let n;for(let r=1;r<=3;r+=1){await U(t,r,1500);let i=new Date().toISOString(),a=await b(e,{allowFailure:!0,timeoutMs:6e4});if(n={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},a.exitCode===0||!H(a))return n}return n}function H(e){let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`_lockkperf`)||t.includes(`could not lock kperf`)||t.includes(`likely another session just started`)}async function U(e,t,n){t<=1||(await p(e).catch(()=>{}),await new Promise(e=>setTimeout(e,n)))}async function je(t,n,r){let i=await _(t.tracePath).catch(()=>null);if(!(i?.isDirectory()===!0?(await m(t.tracePath).catch(()=>[])).length>0:(i?.size??0)>0))throw new e(`COMMAND_FAILED`,`${t.failureMessage}: xctrace produced no trace data`,{tracePath:t.tracePath,appBundleId:t.appBundleId,deviceId:t.device.id,stdout:n,stderr:r,hint:`Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.`})}async function W(e,t,n,r,i){let a=[`xctrace`,`export`,`--input`,n,`--xpath`,`/trace-toc/run/data/table[@schema="${r}"]`,`--output`,i];s(await b(a,{allowFailure:!0,timeoutMs:15e3}),`Failed to export iOS device ${r} data`,n=>({cmd:`xcrun`,args:a,appBundleId:t,deviceId:e.id,hint:Q(n.stdout,n.stderr)}))}async function Me(e,t,n,r,i){try{return await W(e,t,n,r,i),!0}catch{return!1}}function Ne(e){let n=[];for(let r of t(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[t,i,a,o]=e.slice(1);if(t===void 0||i===void 0||a===void 0||o===void 0)continue;let s=Number(t),c=Number(i),l=Number(a),u=o.trim();!Number.isFinite(s)||!Number.isFinite(c)||!Number.isFinite(l)||n.push({pid:s,cpuPercent:c,rssKb:l,command:u})}return n}async function Pe(t){let n=u(t),r=E(n,`activity-monitor-process-live`);if(r.length===0)throw new e(`COMMAND_FAILED`,`Failed to parse xctrace activity-monitor-process-live schema`);let i=r.indexOf(`pid`),a=r.indexOf(`process`),o=r.indexOf(`memory-real`);if(i<0||a<0||o<0)throw new e(`COMMAND_FAILED`,`xctrace activity-monitor-process-live export is missing expected columns`);let s=T(n,e=>e.name===`row`),c=[],l=new Map;for(let e of s){let t=e.children;if(t.length===0)continue;for(let e of t){let t=w(e.children,e=>e.name===`pid`&&typeof e.attributes.id==`string`);if(t?.attributes.id){let e=Number(t.text);l.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&l.set(e.attributes.id,{numberValue:D(e),processName:Z(e)})}let n=O(t[i],l),r=We(t[a],l);n===null||!Number.isFinite(n)||!r||c.push({pid:n,processName:r,residentMemoryBytes:O(t[o],l)})}return c}async function G(t,n){let r=i(t)?await Re(n):await ze(t,n),a=i(t)?S.join(r,`Contents`,`Info.plist`):S.join(r,`Info.plist`),o=await oe(a,`CFBundleExecutable`);if(!o)throw new e(`COMMAND_FAILED`,`Failed to resolve executable for ${n}`,{appBundleId:n,appPath:r});return{executableName:o,executablePath:i(t)?S.join(r,`Contents`,`MacOS`,o):S.join(r,o)}}async function Fe(t,n){let r=await K(t,n),i=await Ie(t,n),a=Le(await Pe(i.xml),r,n,t);if(a.residentMemoryBytes===null)throw new e(`COMMAND_FAILED`,`Incomplete Activity Monitor sample for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});return X({residentMemoryKb:a.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:a.matchedProcesses,memoryMethod:F})}async function K(t,n){let{appBundleUrl:r,processes:i}=await ae(t).resolveAppProcesses(t,n),a=C(r);if(i.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,deviceId:t.id,appBundlePath:a,hint:`Run open <app> for this session again to ensure the iOS app is active, then retry perf.`});return i}async function Ie(e,t){let n=await h(`agent-device-ios-perf-`),r=S.join(n,`sample.trace`),i=S.join(n,`activity-monitor-process-live.xml`);try{let n=await V({device:e,appBundleId:t,tracePath:r,template:`Activity Monitor`,duration:`1s`,allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await W(e,t,r,`activity-monitor-process-live`,i),{capturedAtMs:n.capturedAtMs,xml:await v(i)}}finally{await p(n).catch(()=>{})}}function Le(t,n,r,i){let a=new Set(n.map(e=>e.pid)),s=new Set(n.map(e=>S.basename(C(e.executable)))),c=t.filter(e=>a.has(e.pid)||s.has(e.processName));if(c.length===0)throw new e(`COMMAND_FAILED`,`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:i.id,hint:`Keep the app running in the foreground while perf samples the device, then retry.`});let l=new Map;for(let e of c){let t=l.get(e.pid);if(!t){l.set(e.pid,e);continue}l.set(e.pid,{pid:e.pid,processName:e.processName||t.processName,residentMemoryBytes:Ge(t.residentMemoryBytes,e.residentMemoryBytes)})}let u=[...l.values()],d=u.map(e=>e.residentMemoryBytes).filter(e=>e!==null);return{residentMemoryBytes:d.length>0?d.reduce((e,t)=>e+t,0):null,matchedProcesses:o(u.map(e=>e.processName))}}async function Re(t){let n=`kMDItemCFBundleIdentifier == "${t.replaceAll(`"`,String.raw`\"`)}"`,r=s(await y(`mdfind`,[n],{allowFailure:!0,timeoutMs:L}),`Failed to resolve macOS app bundle for ${t}`,{appBundleId:t}).stdout.split(`
2
2
  `).map(e=>e.trim()).find(e=>e.endsWith(`.app`));if(!r)throw new e(`APP_NOT_INSTALLED`,`No macOS app found for ${t}`,{appBundleId:t});return r}async function ze(t,n){let r=x(t,[`get_app_container`,t.id,n,`app`]),i=s(await b(r,{allowFailure:!0,timeoutMs:L}),`Failed to resolve iOS simulator app container for ${n}`,{appBundleId:n,hint:`Ensure the iOS simulator app is installed and booted, then retry perf.`}).stdout.trim();if(i.length===0)throw new e(`APP_NOT_INSTALLED`,`No iOS simulator app container found for ${n}`,{appBundleId:n});return i}async function q(e,t){let n=i(e)?[`-axo`,`pid=,%cpu=,rss=,command=`]:x(e,[`spawn`,e.id,`ps`,`-axo`,`pid=,%cpu=,rss=,command=`]),r=i(e)?await y(`ps`,n,{timeoutMs:L}):await Ue(n),{matchesAppleExecutableProcess:a}=await import(`./perf-process-identity.js`);return Ne(r.stdout).filter(e=>a(e.command,t))}function J(e){let[t=``]=e.trim().split(/\s+/,1);return t}async function Be(t,n,r){let i=(await q(t,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(i)return i;throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{kind:`memgraph`,appBundleId:n,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot.`})}async function Ve(e,t,n){try{return{available:!0,process:await Be(e,t,await G(e,t))}}catch(t){if(He(e,t))return{available:!1,kind:`memgraph`,reason:`iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.`,hint:`Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.`,support:{...n,memgraph:!1}};throw t}}function He(t,n){if(!r(t)||t.kind!==`simulator`||!(n instanceof e))return!1;let i=n.details??{},a=Array.isArray(i.args)?i.args.join(` `):``,o=typeof i.stderr==`string`?i.stderr:``,s=`${n.message}\n${o}`.toLowerCase();return a.includes(`simctl spawn`)&&a.includes(` ps `)&&s.includes(`no such file`)}function Y(e,t,n){let r=`${t}\n${n}`.toLowerCase();return r.includes(`timed out`)||r.includes(`timeout`)?`Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.`:r.includes(`not found`)||r.includes(`no such file`)?`Install Xcode command line tools and ensure leaks is available, then retry.`:r.includes(`permission`)||r.includes(`denied`)||r.includes(`not authorized`)?i(e)?`Grant the agent terminal process permission to inspect this macOS app, then retry.`:`Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.`:`Keep the app process running and retry perf memory snapshot with --debug if the failure persists.`}async function Ue(e){let t=await b(e,{allowFailure:!0,timeoutMs:L});return t.exitCode===0?t:await y(`ps`,[`-axo`,`pid=,%cpu=,rss=,command=`],{timeoutMs:L})}function X(e){return{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}function Z(e){let t=e?.attributes.fmt?.trim()??``;return t?t.replace(/\s+\(\d+\)$/,``).trim():null}function We(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.processName??null:Z(e):null}function Q(e,t){let n=re(e,t);if(n)return n;let r=`${e}\n${t}`.toLowerCase();return r.includes(`no device matched`)||r.includes(`failed to find device`)?ie:r.includes(`timed out`)?`Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf.`:`Ensure the iOS device is unlocked, trusted, visible to xctrace, and the target app stays active while perf samples it.`}function Ge(e,t){return e===null?t:t===null?e:Math.max(e,t)}function Ke(e,t=10){let n=u(e),r=ce(n),i=new Map,a=0,o=0;for(let e of T(n,e=>e.name===`row`)){let t=qe(e,r),n=Je(e,r);if(t===void 0||!n)continue;let s=n.attributes.name?.trim()||`<unknown>`,c=Ye(n,r),l=`${c??``}\u0000${s}`,u=i.get(l);i.set(l,{symbol:s,binary:c,weightNs:(u?.weightNs??0)+t}),a+=1,o+=t}let s=Math.max(0,Math.floor(t)),c=[...i.values()].sort((e,t)=>t.weightNs-e.weightNs||e.symbol.localeCompare(t.symbol)).slice(0,s).map(({symbol:e,binary:t,weightNs:n})=>({symbol:e,binary:t,selfSampleMs:$(n),selfSamplePercent:o>0?d(n/o*100):0}));return{sampleCount:a,totalSampleWeightMs:$(o),topFunctions:c}}function qe(e,t){let n=k(e.children.find(e=>e.name===`weight`),t);if(!n?.text)return;let r=Number(n.text);return Number.isFinite(r)&&r>0?r:void 0}function Je(e,t){return k(k(e.children.find(e=>e.name===`backtrace`),t)?.children.find(e=>e.name===`frame`),t)}function Ye(e,t){return k(e.children.find(e=>e.name===`binary`),t)?.attributes.name?.trim()||void 0}function $(e){return Math.round(e/1e6*1e3)/1e3}const Xe=15e3;async function Ze(e){let t=await nt(e.device,e.appBundleId);await g(S.dirname(e.outPath));let r=rt({device:e.device,template:e.template,targetPids:t.pids,outPath:e.outPath}),i=new Date().toISOString(),a=await it(r,e.outPath,{device:e.device,appBundleId:e.appBundleId,failureMessage:`Failed to start Apple xctrace ${e.mode} capture for ${e.appBundleId}`});return{kind:`xctrace`,mode:e.mode,template:e.template,outPath:e.outPath,appBundleId:e.appBundleId,deviceId:e.device.id,platform:n(e.device),targetPids:t.pids,targetProcesses:t.processNames,startedAt:i,child:a.child,wait:a.wait}}async function Qe(e,t=e.outPath){t!==e.outPath&&await g(S.dirname(t));let n=s(await ot(e,{failOnForcedKill:!0}),`Failed to stop Apple xctrace ${e.mode} capture`,t=>({tracePath:e.outPath,captureCleanedUp:!0,hint:Q(t.stdout,t.stderr)}));return t!==e.outPath&&await ne(e.outPath,t).catch(async()=>{await te(e.outPath,t),await p(e.outPath)}),await ct(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:n.stdout,stderr:n.stderr}),{kind:`xctrace`,mode:e.mode,template:e.template,outPath:t,appBundleId:e.appBundleId,deviceId:e.deviceId,platform:e.platform,targetPids:e.targetPids,targetProcesses:e.targetProcesses,startedAt:e.startedAt,endedAt:new Date().toISOString()}}async function $e(e){return await ot(e,{failOnForcedKill:!1})}async function et(t){let n=await h(`agent-device-xctrace-report-`),r=S.join(n,`trace-toc.xml`),i=S.join(n,`time-profile.xml`);try{let n=[`xctrace`,`export`,`--input`,t.tracePath,`--toc`,`--output`,r];s(await b(n,{allowFailure:!0,timeoutMs:Xe}),`Failed to export Apple xctrace report metadata`,e=>({cmd:`xcrun`,args:n,tracePath:t.tracePath,hint:Q(e.stdout,e.stderr)}));let a=await v(r),o=await tt(t.tracePath,i),c=lt({...t,tocXml:a,timeProfileXml:o});if(c.summary.sampleCount===0)throw new e(`COMMAND_FAILED`,`Apple xctrace CPU report contained no samples`,{tracePath:t.tracePath,tableSchemas:c.summary.tableSchemas,hint:`Keep the app active while recording, then retry. Open the raw trace in Instruments if it still contains no Time Profiler samples.`});return await g(S.dirname(t.outPath)),await ee(t.outPath,`${JSON.stringify(c,null,2)}\n`),c}finally{await p(n).catch(()=>{})}}async function tt(e,t){let n=[`xctrace`,`export`,`--input`,e,`--xpath`,`/trace-toc/run/data/table[@schema="time-profile"]`,`--output`,t];return s(await b(n,{allowFailure:!0,timeoutMs:Xe}),`Failed to export Apple xctrace Time Profiler samples`,t=>({cmd:`xcrun`,args:n,tracePath:e,hint:Q(t.stdout,t.stderr)})),await v(t)}async function nt(t,n){if(!a(t.platform))throw new e(`UNSUPPORTED_OPERATION`,`Apple xctrace perf is not supported on Android.`,{platform:t.platform,hint:`Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace.`});if(r(t)&&t.kind===`device`){let e=await K(t,n);return{pids:e.map(e=>e.pid),processNames:o(e.map(e=>S.basename(C(e.executable))))}}let i=await G(t,n),s=await q(t,i);if(s.length===0)throw new e(`COMMAND_FAILED`,`No running process found for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Run open <app> for this session again to ensure the Apple app is active, then retry perf.`});return{pids:s.map(e=>e.pid),processNames:[i.executableName]}}function rt(e){return[`xctrace`,`record`,`--template`,e.template,...r(e.device)?[`--device`,e.device.id]:[],...e.targetPids.flatMap(e=>[`--attach`,String(e)]),`--output`,e.outPath,`--quiet`,`--no-prompt`]}async function it(t,n,r){let i;for(let e=1;e<=3;e+=1){await U(n,e,1500);let r=c(`xcrun`,t,{allowFailure:!0}),a=await at(r.wait);if(!a)return r;if(i=a,!H(a))break}let a=i??{stdout:``,stderr:``,exitCode:1};throw new e(`COMMAND_FAILED`,r.failureMessage,l(a,{cmd:`xcrun`,args:t,appBundleId:r.appBundleId,deviceId:r.device.id,hint:Q(a.stdout,a.stderr)}))}async function at(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function ot(t,n){t.child.kill(`SIGINT`);let r=await st(t.wait,45e3);if(r)return r;t.child.kill(`SIGKILL`);let i=await st(t.wait,5e3);if(i&&!n.failOnForcedKill)return i;throw i?new e(`COMMAND_FAILED`,`Timed out waiting for Apple xctrace capture to stop`,{exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,tracePath:t.outPath,captureCleanedUp:!0,forcedKill:!0,hint:`xctrace did not finish after SIGINT, so it was force-killed. Retry the perf command after confirming no other xctrace session is active.`}):new e(`COMMAND_FAILED`,`Timed out waiting for Apple xctrace capture to stop after SIGKILL`,{tracePath:t.outPath,captureCleanedUp:!1,forcedKill:!0,hint:`xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying.`})}async function st(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function ct(t,n){let r=await _(t).catch(()=>null);if(!(r?.isDirectory()===!0?(await m(t).catch(()=>[])).length>0:(r?.size??0)>0))throw new e(`COMMAND_FAILED`,`xctrace produced no trace data`,{tracePath:t,appBundleId:n.appBundleId,deviceId:n.deviceId,stdout:n.stdout,stderr:n.stderr,hint:`Keep the Apple device unlocked and connected, keep the app active, then retry perf.`})}function lt(e){let t=u(e.tocXml),n=T(t,e=>e.name===`run`),r=o(T(t,e=>e.name===`table`).map(e=>e.attributes.schema).filter(e=>typeof e==`string`&&e.length>0)).sort(),i=Ke(e.timeProfileXml);return{kind:`xctrace`,mode:`cpu-profile`,template:e.template,tracePath:e.tracePath,reportPath:e.outPath,appBundleId:e.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:n.length,tableSchemas:r,...i}}}export{De as buildAppleFrameSamplingMetadata,Oe as buildAppleMemorySamplingMetadata,B as buildAppleMemorySnapshotSupport,Se as captureAppleMemorySnapshot,$e as cleanupAppleXctracePerfCapture,H as isRetryableIosDeviceTraceRecordFailure,q as readAppleProcessSamples,G as resolveAppleExecutable,Q as resolveIosDevicePerfHint,K as resolveIosDevicePerfTarget,Ee as sampleAppleFramePerf,xe as sampleAppleMemoryPerf,Ze as startAppleXctracePerfCapture,Qe as stopAppleXctracePerfCapture,et as writeAppleXctracePerfReport};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{a as n,i as r,r as i}from"./sdk-batch-runner.js";import{f as a,l as o}from"./sdk-device.js";import{n as s}from"./session.js";import{t as c}from"./platform-runtime-android-mechanics.js";var l=e({resolveRequestedOpenSurface:()=>d,resolveSessionAppBundleIdForTarget:()=>S,validateOpenRelaunchTarget:()=>g});const u=new Set([`app`,`desktop`,`frontmost-app`]);function d(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return t.platform===`linux`?f(n,r,i):a(t)?p(n,r,i):m(n)}function f(e,n,r){if(!e)return r??`app`;let i=s(e);if(!u.has(i))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${e}")`);return h(i,n),i}function p(e,t,n){if(!e)return n??`app`;let r=s(e);return r!==`app`&&r!==`menubar`&&h(r,t),r}function m(e){if(e)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}function h(e,n){if(e!==`app`&&e!==`menubar`&&n)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`)}async function g(e){let{target:t,platform:n,surface:r}=e;if(t&&i(t))return`open --relaunch does not support URL targets.`;if(r!==void 0&&r!==`app`)return`open --relaunch is supported only for app surfaces.`;if(n===`android`&&t){let{classifyAndroidAppTarget:e,formatAndroidInstalledPackageRequiredMessage:n}=await c();if(e(t)===`binary`)return n(t)}}async function _(e,t,s){if(!(!o(e.platform)||!t))return i(t)?a(e)?void 0:e.kind===`device`?n(s,t):r(t)?void 0:s??await v(e,t):await y(e,t)}async function v(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}async function y(e,t){try{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}function b(e,t){return e.platform===`android`&&!!(t&&i(t))}function x(e){let t=e?.trim();if(!(!t||i(t)||!t.includes(`.`)))return t}async function S(e,t,n){return e.platform===`harmonyos`?x(t)??n:await _(e,t,n)??await C(e,t)??(b(e,t)?n:void 0)}async function C(e,t){if(!(e.platform!==`android`||!t))try{let{resolveAndroidPackageForOpen:n}=await c();return await n(e,t)}catch{return}}export{g as i,d as n,S as r,l as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{a as n,i as r,o as i,r as a}from"./sdk-batch-runner.js";import{f as o,l as s}from"./sdk-device.js";import{n as c}from"./session.js";import{t as l}from"./platform-runtime-android-mechanics.js";var u=e({resolveRequestedOpenSurface:()=>f,resolveSessionAppBundleIdForTarget:()=>C,validateOpenRelaunchTarget:()=>_});const d=new Set([`app`,`desktop`,`frontmost-app`]);function f(e){let{device:t,surfaceFlag:n,openTarget:r,existingSurface:i}=e;return t.platform===`linux`?p(n,r,i):o(t)?m(n,r,i):h(n)}function p(e,n,r){if(!e)return r??`app`;let i=c(e);if(!d.has(i))throw new t(`INVALID_ARGS`,`Linux supports --surface app, desktop, and frontmost-app (got "${e}")`);return g(i,n),i}function m(e,t,n){if(!e)return n??`app`;let r=c(e);return r!==`app`&&r!==`menubar`&&g(r,t),r}function h(e){if(e)throw new t(`INVALID_ARGS`,`surface is only supported on macOS and Linux`);return`app`}function g(e,n){if(e!==`app`&&e!==`menubar`&&n)throw new t(`INVALID_ARGS`,`open --surface ${e} does not accept an app target`)}async function _(e){let{target:t,platform:n,surface:i}=e;if(t&&r(t))return`open --relaunch does not support URL targets.`;if(i!==void 0&&i!==`app`)return`open --relaunch is supported only for app surfaces.`;if(n===`android`&&t){let{classifyAndroidAppTarget:e,formatAndroidInstalledPackageRequiredMessage:n}=await l();if(e(t)===`binary`)return n(t)}}async function v(e,t,c){if(!(!s(e.platform)||!t))return r(t)?o(e)?void 0:e.kind===`device`?i(c,t):n(t)?a:c??await y(e,t):await b(e,t)}async function y(e,t){try{let{resolveIosSimulatorDeepLinkBundleId:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}async function b(e,t){try{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}catch{return}}function x(e,t){return e.platform===`android`&&!!(t&&r(t))}function S(e){let t=e?.trim();if(!(!t||r(t)||!t.includes(`.`)))return t}async function C(e,t,n){return e.platform===`harmonyos`?S(t)??n:await v(e,t,n)??await w(e,t)??(x(e,t)?n:void 0)}async function w(e,t){if(!(e.platform!==`android`||!t))try{let{resolveAndroidPackageForOpen:n}=await l();return await n(e,t)}catch{return}}export{_ as i,f as n,C as r,u as t};
@@ -1 +1 @@
1
- import{L as e,o as t,u as n}from"./sdk-contracts.js";import{O as r}from"./sdk-batch-runner.js";import{M as i,d as a,u as o}from"./session-snapshot.js";import{M as s}from"./runtime.js";import{n as c}from"./catalog.js";import{r as l}from"./success-text.js";import{n as u}from"./touch-reference-frame.js";import{s as d}from"./quality-warnings.js";import{o as f}from"./interaction-ref-policy.js";import{captureSnapshotForSession as p}from"./interaction.js";async function m(r){let{req:i,sessionName:o,sessionStore:l}=r;if(i.command!==c.reactNative)return null;let u=h(i.positionals??[]);if(!u.ok)return u.response;let f=l.get(o);if(!f)return n();let m=await a({device:f.device,command:`press`,requiresCapture:!1,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:e=>t(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(!m.ok)return m.response;try{let e=await p(f,i.flags,l,r.contextFromFlags,{interactiveOnly:!0});if(d(e.snapshotQuality))return _(e.snapshotQuality);let t=s(e.nodes),n=t.primaryAction;return n?await v(r,f,e,n,m.runtime):g(t.detected)}catch(t){return{ok:!1,error:e(t)}}}function h(e){return e.length===1&&e[0]===`dismiss-overlay`?{ok:!0}:{ok:!1,response:t(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}}function g(e){return e?t(`COMMAND_FAILED`,`React Native overlay detected, but no safe dismiss target was found`,{hint:`Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`}):{ok:!0,data:{action:`dismiss-overlay`,detected:!1,dismissed:!1,...l(`No React Native overlay detected`)}}}function _(e){return t(`COMMAND_FAILED`,`React Native overlay state could not be determined because the accessibility tree is unreadable`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth; if an overlay is visible, report it or navigate with coordinates, then retry snapshot or dismiss-overlay on a readable screen.`})}async function v(e,n,a,s,c){let{req:d,sessionStore:p}=e,m=e.contextFromFlags(d.flags,n.appBundleId,n.trace?.outPath),h=o(c,m).tapPoint;if(!h)return t(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`);let g=Date.now();i(n);let _=await h(s.point),v=Date.now(),x=await y(e,n),S=r({...u(a.nodes),..._,action:`dismiss-overlay`,overlayAction:s.action,x:s.point.x,y:s.point.y,ref:s.ref,label:s.label,warning:s.warning,dismissed:!0,verified:x.verified,verificationRequired:!x.verified,verificationWarning:x.verificationWarning,nextCommand:x.nextCommand,...l(b(x))});return f({session:n,sessionStore:p,command:d.command,positionals:d.positionals??[],flags:d.flags,result:S,responseData:S,actionStartedAt:g,actionFinishedAt:v})}async function y(e,t){let{req:n,sessionStore:r}=e,i=await p(t,n.flags,r,e.contextFromFlags,{interactiveOnly:!0});return d(i.snapshotQuality)?{verified:!1,verificationWarning:`React Native overlay dismissal could not be verified because the post-dismiss accessibility tree is unreadable. Use screenshot as visual truth.`,nextCommand:`agent-device screenshot`}:s(i.nodes).detected?{verified:!1,verificationWarning:`React Native overlay is still detected after dismissal. Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`,nextCommand:`agent-device screenshot --overlay-refs`}:{verified:!0}}function b(e){return e.verified?`React Native overlay dismiss action sent and verified gone`:`React Native overlay dismiss action sent, but verification still detects an overlay`}export{m as handleReactNativeCommands};
1
+ import{L as e,o as t,u as n}from"./sdk-contracts.js";import{k as r}from"./sdk-batch-runner.js";import{M as i,d as a,u as o}from"./session-snapshot.js";import{M as s}from"./runtime.js";import{n as c}from"./catalog.js";import{r as l}from"./success-text.js";import{n as u}from"./touch-reference-frame.js";import{s as d}from"./quality-warnings.js";import{o as f}from"./interaction-ref-policy.js";import{captureSnapshotForSession as p}from"./interaction.js";async function m(r){let{req:i,sessionName:o,sessionStore:l}=r;if(i.command!==c.reactNative)return null;let u=h(i.positionals??[]);if(!u.ok)return u.response;let f=l.get(o);if(!f)return n();let m=await a({device:f.device,command:`press`,requiresCapture:!1,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:e=>t(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(!m.ok)return m.response;try{let e=await p(f,i.flags,l,r.contextFromFlags,{interactiveOnly:!0});if(d(e.snapshotQuality))return _(e.snapshotQuality);let t=s(e.nodes),n=t.primaryAction;return n?await v(r,f,e,n,m.runtime):g(t.detected)}catch(t){return{ok:!1,error:e(t)}}}function h(e){return e.length===1&&e[0]===`dismiss-overlay`?{ok:!0}:{ok:!1,response:t(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}}function g(e){return e?t(`COMMAND_FAILED`,`React Native overlay detected, but no safe dismiss target was found`,{hint:`Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`}):{ok:!0,data:{action:`dismiss-overlay`,detected:!1,dismissed:!1,...l(`No React Native overlay detected`)}}}function _(e){return t(`COMMAND_FAILED`,`React Native overlay state could not be determined because the accessibility tree is unreadable`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth; if an overlay is visible, report it or navigate with coordinates, then retry snapshot or dismiss-overlay on a readable screen.`})}async function v(e,n,a,s,c){let{req:d,sessionStore:p}=e,m=e.contextFromFlags(d.flags,n.appBundleId,n.trace?.outPath),h=o(c,m).tapPoint;if(!h)return t(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`);let g=Date.now();i(n);let _=await h(s.point),v=Date.now(),x=await y(e,n),S=r({...u(a.nodes),..._,action:`dismiss-overlay`,overlayAction:s.action,x:s.point.x,y:s.point.y,ref:s.ref,label:s.label,warning:s.warning,dismissed:!0,verified:x.verified,verificationRequired:!x.verified,verificationWarning:x.verificationWarning,nextCommand:x.nextCommand,...l(b(x))});return f({session:n,sessionStore:p,command:d.command,positionals:d.positionals??[],flags:d.flags,result:S,responseData:S,actionStartedAt:g,actionFinishedAt:v})}async function y(e,t){let{req:n,sessionStore:r}=e,i=await p(t,n.flags,r,e.contextFromFlags,{interactiveOnly:!0});return d(i.snapshotQuality)?{verified:!1,verificationWarning:`React Native overlay dismissal could not be verified because the post-dismiss accessibility tree is unreadable. Use screenshot as visual truth.`,nextCommand:`agent-device screenshot`}:s(i.nodes).detected?{verified:!1,verificationWarning:`React Native overlay is still detected after dismissal. Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`,nextCommand:`agent-device screenshot --overlay-refs`}:{verified:!0}}function b(e){return e.verified?`React Native overlay dismiss action sent and verified gone`:`React Native overlay dismiss action sent, but verification still detects an overlay`}export{m as handleReactNativeCommands};