agent-device 0.18.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.0.apk → agent-device-android-multitouch-helper-0.18.1.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.1.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.0.manifest.json → agent-device-android-multitouch-helper-0.18.1.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.0.apk → agent-device-android-snapshot-helper-0.18.1.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.1.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.0.manifest.json → agent-device-android-snapshot-helper-0.18.1.manifest.json} +6 -6
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +156 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +10 -16
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +3 -1
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +2 -4
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +9 -36
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +2 -0
- package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +0 -1
- package/dist/src/1986.js +1 -0
- package/dist/src/2748.js +1 -1
- package/dist/src/2948.js +21 -21
- package/dist/src/314.js +1 -1
- package/dist/src/3340.js +8 -7
- package/dist/src/432.js +4 -4
- package/dist/src/4418.js +1 -1
- package/dist/src/4428.js +3 -3
- package/dist/src/485.js +1 -0
- package/dist/src/495.js +5 -0
- package/dist/src/5484.js +1 -1
- package/dist/src/587.js +1 -1
- package/dist/src/5913.js +4 -0
- package/dist/src/6849.js +1 -0
- package/dist/src/6918.js +1 -1
- package/dist/src/6967.js +1 -0
- package/dist/src/760.js +1 -0
- package/dist/src/7871.js +1 -0
- package/dist/src/8225.js +1 -1
- package/dist/src/8391.js +1 -0
- package/dist/src/8404.js +2 -0
- package/dist/src/8414.js +2 -0
- package/dist/src/8875.js +1 -1
- package/dist/src/8936.js +1 -1
- package/dist/src/9581.js +3 -3
- package/dist/src/9624.js +1 -1
- package/dist/src/9722.js +37 -32
- package/dist/src/android-adb.d.ts +19 -54
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +5 -5
- package/dist/src/apps.js +9 -11
- package/dist/src/audio-probe.js +1 -0
- package/dist/src/batch.d.ts +33 -25
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-help.js +66 -16
- package/dist/src/cli.js +33 -21
- package/dist/src/contracts.d.ts +32 -122
- package/dist/src/contracts.js +1 -1
- package/dist/src/debug-symbols.js +3 -0
- package/dist/src/devices.js +1 -1
- package/dist/src/devices~1.js +1 -1
- package/dist/src/devices~2.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +2 -6
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -9
- package/dist/src/handler-utils.js +1 -0
- package/dist/src/index.d.ts +438 -171
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions~1.js +1 -1
- package/dist/src/install-source.d.ts +0 -26
- package/dist/src/install-source.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +1 -0
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/metro.d.ts +10 -134
- package/dist/src/metro.js +1 -1
- package/dist/src/notifications.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +3 -3
- package/dist/src/record-trace.js +1 -1
- package/dist/src/remote-config.d.ts +14 -16
- package/dist/src/remote-config.js +1 -1
- package/dist/src/runner-sequence.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +7 -3
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session.js +11 -11
- package/dist/src/simulator.js +2 -2
- package/dist/src/snapshot.js +2 -2
- package/dist/src/web.js +1 -1
- package/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +297 -0
- package/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +30 -0
- package/package.json +15 -11
- package/server.json +2 -2
- package/android-multitouch-helper/README.md +0 -41
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.0.apk.sha256 +0 -1
- package/android-snapshot-helper/README.md +0 -88
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.0.apk.sha256 +0 -1
- package/dist/src/1848.js +0 -4
- package/dist/src/2577.js +0 -1
- package/dist/src/2954.js +0 -2
- package/dist/src/4291.js +0 -1
- package/dist/src/4723.js +0 -1
- package/dist/src/5341.js +0 -1
- package/dist/src/5910.js +0 -2
- package/dist/src/6024.js +0 -1
- package/dist/src/733.js +0 -1
- package/dist/src/7394.js +0 -6
- package/dist/src/8275.js +0 -2
- package/dist/src/9919.js +0 -6
- package/dist/src/android-snapshot-helper.d.ts +0 -359
- package/dist/src/android-snapshot-helper.js +0 -1
- package/dist/src/apple.js +0 -1
- package/dist/src/device-ready.js +0 -2
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.swift +0 -17
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -36
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AppIcon.appiconset/logo.jpg +0 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Contents.json +0 -6
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Logo.imageset/Contents.json +0 -21
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Logo.imageset/logo.jpg +0 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/PoweredBy.imageset/Contents.json +0 -21
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/PoweredBy.imageset/powered-by.png +0 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/ContentView.swift +0 -34
- package/ios-runner/README.md +0 -53
- package/ios-runner/RUNNER_PROTOCOL.md +0 -76
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
- /package/dist/src/{4069.js → 4917.js} +0 -0
- /package/dist/src/{9836.js → 893.js} +0 -0
package/dist/src/9722.js
CHANGED
|
@@ -1,33 +1,38 @@
|
|
|
1
|
-
let e,t;import{__webpack_require__ as r}from"./rslib-runtime.js";import n,{createHash as i}from"node:crypto";import a from"node:path";import o,{existsSync as s,promises as l}from"node:fs";import d from"node:http";import{fileURLToPath as c,pathToFileURL as u}from"node:url";import
|
|
2
|
-
`}(e);return o.writeFileSync(t,n),{written:!0,path:t}}catch(r){return
|
|
3
|
-
`)}function rm(e){if(e&&o.existsSync(e))try{o.unlinkSync(e)}catch{}}let rh=new Set,rw=new Map,rg="request_canceled",rv="request canceled";function ry(e,t){if("string"==typeof e&&e.length>0)return e;let r=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",n=Math.random().toString(36).slice(2,10);return`req:${r}:${process.pid}:${Date.now()}:${n}`}function rS(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let r of e.keys()){if(t>=1e4)break;e.delete(r),t++}}(rw);let t=new AbortController;rw.set(e,t),rh.has(e)&&t.abort()}function rI(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(rh),rh.add(e),rw.get(e)?.abort())}function rA(e){e&&(rh.delete(e),rw.delete(e))}function rb(e){return!!e&&rh.has(e)}function r_(e){if(e)return rw.get(e)?.signal}function rx(){return new eG("COMMAND_FAILED",rv,{reason:rg})}function rM(e){if(rb(e))throw rx()}function rN(e){return e instanceof eG&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rg||e.message===rv)}let rP=new Map;function rD(e){let t=n.randomUUID(),r=setTimeout(()=>{rk(t)},9e5);return r.unref(),rP.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function rk(e){let t=rP.get(e);if(t&&(clearTimeout(t.timer),rP.delete(e),t.deleteAfterDownload))try{o.rmSync(t.artifactPath,{force:!0})}catch{}}let rE=new Map;function rC(e,t){let r=rE.get(e);if(!r)throw new eG("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rR(e){let t=rE.get(e);t&&(clearTimeout(t.timer),rE.delete(e),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rO(e){let t=await rT(e);await ej("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=a.join(e.tempDir,t);if(!o.existsSync(r))throw new eG("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rT(e){let t=await ej("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eG("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new eG("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rL),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new eG("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eG("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new eG("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new eG("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new eG("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await ej("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eG("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rL(e){if(e.includes("\0"))throw new eG("INVALID_ARGS",`Invalid archive entry: ${e}`);if(a.posix.isAbsolute(e))throw new eG("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=a.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eG("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function r$(e,t){return new Promise((r,n)=>{let i,a=!1,s=0,l=o.createWriteStream(t),d=e=>{if(!a){if(a=!0,i&&clearTimeout(i),e)return void rF(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eG("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),d(t)},6e4)},u=new m({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eG("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),h(e,u,l).then(()=>d(),e=>d(e))})}async function rF(e,t){if(e.destroy(),!e.closed)try{await f(e,"close")}catch{}await o.promises.rm(t,{force:!0}).catch(()=>{})}async function rU(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eG("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eG("INVALID_ARGS",`Invalid x-artifact-type: ${r}. Must be "file" or "app-bundle".`);!function(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let i=function(e){let t=e.trim(),r=a.basename(t);if(!r||"."===r||".."===r)throw new eG("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}(n),s=(t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}("upload"),o.mkdtempSync(a.join(p.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=a.join(s,i);return await r$(e,t),{artifactPath:t,tempDir:s}}let t=a.join(s,"artifact.tar");await r$(e,t);let n=await rO({archivePath:t,tempDir:s,platform:"ios",expectedRootName:i});return o.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw o.rmSync(s,{recursive:!0,force:!0}),e}}let rG=new w,rq=new w;async function rB(e,t){return await rG.run(e,t)}function rj(e){rG.getStore()?.(e)}async function rV(e,t){return await rq.run(e,t)}function rK(){return rq.getStore()}let rH=new Set(["replay","test"]),rW=new Set(["agent_device.command","agent-device.command"]),rX=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rz=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rJ={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},rZ=new Set([...rW,...rX,...rz,...Object.keys(rJ)]);function rY(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rQ(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function r0(e,t){e.destroyed||(e.write(e6(t)),e.end())}function r1(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function r2(e,t){let r="string"==typeof t.authorization?t.authorization:"",n=r.toLowerCase().startsWith("bearer ")?r.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??n??""}function r3(e,t){let r=e[t];return"string"==typeof r?r:void 0}function r5(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function r4(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eG("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function r6(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eG("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function r8(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=eU(new eG("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rY(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eU(new eG(e$(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rY(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eJ(r.tenantId);if(!e){let e=eU(new eG("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rY(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function r9(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=a.isAbsolute(t)?t:a.resolve(t);try{e=await import(u(n).href)}catch(e){throw new eG("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let i=e[r];if("function"!=typeof i)throw new eG("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return i}async function r7(e){let t=await r9(),{handleRequest:r,token:n}=e;return d.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify(eW("agent-device-daemon")));return}if("POST"===e.method&&"/upload"===e.url)return void ne(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nt(e,i,t,n);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||rQ(i,rY(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rQ(i,rY(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rQ(i,rY(n.id??null,-32600,"Invalid Request"),400);if(!rZ.has(n.method))return void rQ(i,rY(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rQ(i,rY(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rW.has(e))return{token:r2(t,r),session:t.session??"default",command:t.command??"",positionals:Array.isArray(t.positionals)?t.positionals:[],flags:t.flags,runtime:t.runtime,meta:t.meta};if(rX.has(e)){let e,n=r3(t,"platform");if("ios"!==n&&"android"!==n)throw new eG("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:r2(t,r),session:r3(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:r3(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eG("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eG("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new eG("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new eG("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new eG("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=r4(e,"owner"),n=r4(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eG("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eG("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eG("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:r6(e,"artifactId")}:(a&&(t=r6(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:r4(e,"artifactName")})}(t);throw new eG("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:r5(t,"retentionMs")}}}if(rz.has(e)){let e=r3(t,"materializationId")?.trim();if(!e)throw new eG("INVALID_ARGS","Invalid params: materializationId is required");return{token:r2(t,r),session:r3(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:r3(t,"requestId"),materializationId:e}}}let n=rJ[e];if(n)return{token:r2(t,r),session:r3(t,"session")??"default",command:n,positionals:[],meta:{tenantId:r3(t,"tenantId")??r3(t,"tenant"),runId:r3(t,"runId"),leaseId:r3(t,"leaseId"),leaseTtlMs:r5(t,"ttlMs"),leaseBackend:r3(t,"backend"),leaseProvider:r3(t,"leaseProvider")??r3(t,"provider"),deviceKey:r3(t,"deviceKey"),clientId:r3(t,"clientId")}};throw new eG("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rW.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rQ(i,rY(n.id??null,-32602,"Invalid params: command is required"),400);o=ry(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rS(o);let u=await r8(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rQ(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||rH.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rI(o),ef({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&nr(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eZ(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rB(e=>{!i.destroyed&&i.write(e4(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rY(n.id??null,-32e3,e.error.message,e.error);r0(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rQ(i,{jsonrpc:"2.0",id:n.id??null,result:h});rQ(i,rY(n.id??null,-32e3,h.error.message,h.error),r1(h.error.code))}catch(t){s=!0;let e=eU(t);if(i.headersSent)return void r0(i,rY(n.id??null,-32e3,e.message,e));rQ(i,rY(n.id??null,-32e3,e.message,e),r1(e.code))}finally{rA(o)}})})}async function ne(e,t,r,i){try{var a;let o,s,l=await nn({req:e,res:t,authHook:r,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rU(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=n.randomUUID(),(s=setTimeout(()=>{rR(o)},3e5)).unref(),rE.set(o,{artifactPath:a.artifactPath,tempDir:a.tempDir,tenantId:a.tenantId,timer:s}),o);t.statusCode=200,t.setHeader("content-type","application/json"),t.end(JSON.stringify({ok:!0,uploadId:c}))}catch(e){ni(t,eU(e))}}async function nt(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let a=await nn({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!a)return;let s=function(e,t){let r=rP.get(e);if(!r)throw new eG("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Artifact belongs to a different tenant");if(!o.existsSync(r.artifactPath))throw rk(e),new eG("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,a.tenantId),l=o.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=eU(e);t.statusCode=r1(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rk(i)}),l.pipe(t)}catch(e){ni(t,eU(e))}}async function nr(e){try{let t=Date.now()+15e3;for(;rb(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t6);if(await t(),!rb(e))break;await e8(200)}}catch(e){ef({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function nn(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=r2({},n.headers),d=(t=l,!(r=o)||e_(t,r)?null:eU(new eG("UNAUTHORIZED","Invalid token")));if(d)return ni(i,d),null;let c=await r8(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return c.ok?{tenantId:c.tenantId}:(i.statusCode=c.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:c.response.error?.data?.message??c.response.error?.message??"Unauthorized"})),null)}function ni(e,t){e.statusCode=r1(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}let na="default";function no(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function ns(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function nl(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new eG("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}function nd(e){if(void 0===e)return;let t=e.trim();if(!t||t.length>256||!/^[\x20-\x7E]+$/.test(t))throw new eG("INVALID_ARGS","Invalid device key. Use 1-256 printable characters.");return t}function nc(e){return np(e,"client id",128)}function nu(e){return np(e,"lease provider",64)}function np(e,t,r){if(void 0===e)return;let n=e.trim();if(!n||n.length>r||!/^[a-zA-Z0-9._-]+$/.test(n))throw new eG("INVALID_ARGS",`Invalid ${t}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return n}class nf{leases=new Map;runBindings=new Map;deviceBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t={backend:nl(e.leaseBackend),leaseProvider:nu(e.leaseProvider),deviceKey:nd(e.deviceKey),clientId:nc(e.clientId),tenantId:function(e){let t=eJ(e);if(!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.tenantId),runId:function(e){let t=no(e);if(!t)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.runId),ttlMs:e.ttlMs};this.cleanupExpiredLeases();let r=this.resolveLeaseTtlMs(t.ttlMs),n=this.refreshExistingRunBinding(t,r);if(n)return n;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=this.createLease(t,r);return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let r=this.bindingKey(e),n=this.runBindings.get(r);if(!n)return;let i=this.leases.get(n);return i?(this.canReuseRunBinding(i,e)||(i.deviceKey&&this.throwDeviceBusy(i),this.assertOptionalLeaseIdentityMatch(i,e)),this.refreshLease(i,t)):void this.runBindings.delete(r)}createLease(e,t){let r=this.now();return{leaseId:n.randomBytes(16).toString("hex"),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+t}}heartbeatLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.getActiveLease(t);this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e),this.leases.delete(t),this.unbindLease(r),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=nl(e.leaseBackend),r=eJ(e.tenantId);if(!r)throw new eG("INVALID_ARGS","tenant isolation requires tenant id.");let n=no(e.runId);if(!n)throw new eG("INVALID_ARGS","tenant isolation requires run id.");let i=ns(e.leaseId);if(!i)throw new eG("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.getActiveLease(i);this.assertOptionalScopeMatch(a,{tenantId:r,runId:n,leaseBackend:t,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}consumeExpiredLeases(){let e=this.now(),t=[];for(let r of this.leases.values())r.expiresAt>e||(this.leases.delete(r.leaseId),this.unbindLease(r),t.push({...r}));return t}consumeExpiredLease(e){let t=ns(e);if(!t)return;let r=this.leases.get(t);if(!(!r||r.expiresAt>this.now()))return this.leases.delete(r.leaseId),this.unbindLease(r),{...r}}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new eG("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new eG("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}normalizeRequiredLeaseId(e){let t=ns(e);if(!t)throw new eG("INVALID_ARGS","Invalid lease id.");return t}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new eG("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"})}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.bindLease(n),{...n}}bindLease(e){this.runBindings.set(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}),e.leaseId);let t=this.deviceBindingKey(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e){this.runBindings.delete(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}));let t=this.deviceBindingKey(e);t&&this.deviceBindings.delete(t)}bindingKey(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??na,e.deviceKey??"*"])}deviceBindingKey(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??na,e.deviceKey])}assertDeviceAvailable(e){let t=this.deviceBindingKey({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let r=this.deviceBindings.get(t);if(!r)return;let n=this.leases.get(r);n?this.throwDeviceBusy(n):this.deviceBindings.delete(t)}canReuseRunBinding(e,t){return e.clientId===t.clientId}throwDeviceBusy(e){throw new eG("COMMAND_FAILED","Device is already leased",{reason:"DEVICE_LEASE_BUSY",deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:"Retry after the lease expires or close the owning session."})}assertRequiredScopeForDeviceAwareLease(e,t){(e.leaseProvider??e.deviceKey??e.clientId)&&(t.tenantId&&t.runId&&[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)||this.throwScopeRequired())}assertOptionalScopeMatch(e,t){let r=this.normalizeOptionalScopeMatchRequest(t);(r.tenantId&&e.tenantId!==r.tenantId||r.runId&&e.runId!==r.runId||r.leaseBackend&&e.backend!==r.leaseBackend)&&this.throwScopeMismatch(),this.assertOptionalLeaseIdentityMatch(e,r)}normalizeOptionalScopeMatchRequest(e){let t=eJ(e.tenantId),r=no(e.runId);if(e.tenantId&&!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(e.runId&&!r)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return{tenantId:t,runId:r,leaseBackend:e.leaseBackend?nl(e.leaseBackend):void 0,leaseProvider:nu(e.leaseProvider),deviceKey:nd(e.deviceKey),clientId:nc(e.clientId)}}assertOptionalLeaseIdentityMatch(e,t){t.leaseProvider&&e.leaseProvider!==t.leaseProvider&&this.throwScopeMismatch(),t.deviceKey&&e.deviceKey!==t.deviceKey&&this.throwScopeMismatch(),t.clientId&&e.clientId!==t.clientId&&this.throwScopeMismatch()}throwScopeMismatch(){throw new eG("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}throwScopeRequired(){throw new eG("UNAUTHORIZED","Lease owner scope is required",{reason:"LEASE_SCOPE_REQUIRED"})}}let nm={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function nh(e){var t;if("web"===e.platform)return[nm];if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./3340.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let nw=new w,ng=new w;async function nv(e,t,r){var n,i;let a=await ny(e,t,r);if(n=t,i=a,!nS(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new eG("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function ny(e,t,r){try{return await tt(e,t,r)}catch(e){var n;if(n=e,!nS(t)&&n instanceof eG&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function nS(e){return!!(e.udid||e.serial||e.deviceName)}async function nI(e){let t=te(e.platform),r=e7({simulatorSetPath:ta(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=ty(e.androidDeviceAllowlist),i=function(e){let{flags:t,normalizedPlatform:r,iosSimulatorSetPath:n,androidSerialAllowlist:i}=e;return JSON.stringify({platform:r,target:t.target,device:t.device,udid:t.udid,serial:t.serial,iosSimulatorSetPath:n,androidSerialAllowlist:i?Array.from(i).sort():void 0})}({flags:e,normalizedPlatform:t,iosSimulatorSetPath:r,androidSerialAllowlist:n}),a={platform:t,target:e.target,cacheHit:!1};return await eu("resolve_target_device",async()=>{let o=function(e){let t=nw.getStore(),r=t?.get(e);if(r)return{...r}}(i);if(o)return a.cacheHit=!0,o;let s={platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial};if(s.target&&!s.platform)throw new eG("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nM({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nN(s)?nP(i,await nv(l,s,{simulatorSetPath:r})):nP(i,await tt(l,s,{simulatorSetPath:r}));let d=await nh({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nN(s)?nP(i,await nv(d,s,{simulatorSetPath:r})):nP(i,await tt(d,s,{simulatorSetPath:r}))},a)}async function nA(e){return nw.getStore()?await e():await nw.run(new Map,e)}async function nb(e,t){return e?await ng.run(e,t):await t()}async function n_(e,t){return await nb(e,async()=>await nA(t))}async function nx(e){return await nM(e)??await nh(e)}async function nM(e){let t=ng.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nN(e){return e9(e.platform)}function nP(e,t){return nw.getStore()?.set(e,{...t}),t}let nD=["platform","target","device","udid","serial"],nk=[...nD,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nE(e){return nR(e,nD)}function nC(e){return"string"==typeof e&&e.trim().length>0}function nR(e,t){return!!e&&t.some(t=>nC(e[t]))}let nO={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nT=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}([...nU("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tA.leaseAllocate,tA.leaseHeartbeat,tA.leaseRelease),nF(tA.sessionList,"session",{sessionKind:"inventory",...nO}),nF(tb.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nO}),nF(tb.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nU("session",{sessionKind:"state"},tb.boot,tb.shutdown,tb.appState),...nU("session",{sessionKind:"observability"},tb.perf,tb.logs,tb.network),...nU("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===tb.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},tb.replay,tb.test),nF(tA.runtime,"session"),nF(tb.clipboard,"session",{replayScopedAction:!0}),nF(tb.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nU("session",{},tb.install,tb.reinstall,tA.installSource),nF(tA.releaseMaterializedPaths,"session",nO),...nU("session",{},tb.push,tb.triggerAppEvent),nF(tb.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nU("session",{},tb.prepare,tb.batch),nF(tb.close,"session",{allowInvalidRecording:!0}),...nU("snapshot",{replayScopedAction:!0},tb.snapshot,tb.diff,tb.wait,tb.alert,tb.settings),nF(tb.reactNative,"reactNative",{replayScopedAction:!0}),nF(tb.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nF(tb.trace,"recordTrace"),nF(tb.find,"find",{replayScopedAction:!0}),...nU("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tb.click,tb.fill,tb.longPress,tb.press,tb.type),...nU("interaction",{replayScopedAction:!0},tb.get,tb.is),...nU("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tb.back,tb.gesture,tb.home,tb.rotate,tb.scroll,tb.swipe,"pinch"),nF(tb.focus,"generic",{androidBlockingDialogGuard:!0}),nF(tb.screenshot,"generic",{replayScopedAction:!0}),nF(tb.viewport,"generic",{replayScopedAction:!0}),...nU("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nL(e){return nG(e)?.sessionKind}function n$(e){return nG(e)?.leaseAdmissionExempt===!0}function nF(e,t,r={}){return{command:e,route:t,...r}}function nU(e,t,...r){return r.map(r=>nF(r,e,t))}function nG(e){return nT.descriptorsByCommand.get(e)}let nq=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./2954.js");nH(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&e9(t.device.platform)?{appleRunner:{provider:r(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:r}=await Promise.resolve(t8);nH(t,e.appleRunner,(t,n)=>r(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},n))}},{resolverKey:"appleToolProvider",resolve(e,t){let r=e.appleToolProvider;return r&&e9(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(t9);nH(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&"linux"===t.device.platform?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(re);nH(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&"web"===t.device.platform?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");nH(t,e.web,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(t5);nH(t,e.appLog,r)}},{resolverKey:"recordingProvider",resolve(e,t){let r=e.recordingProvider;return r?{recording:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:r}=await import("./recording-provider.js");nH(t,e.recording,r)}}];async function nB(e,t){let r=await nj(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nK(r);return await nW(i,async()=>await t(n))}async function nj(e){var t,r,n;if(t=e.providers,!nq.some(e=>!!t[e.resolverKey]))return{};let i=await nV(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nq.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nV(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nG(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nG(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nG(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nE(e.flags)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await nI(e.flags??{});case"skip":return}}async function nK(e){let t=[];for(let r of nq)await r.appendWrapper(e,t);return t}function nH(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nW(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nX(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"web":{let{createWebInteractor:e}=await import("./web.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nz=/^[A-Za-z0-9_.:-]{1,64}$/,nJ="--launch-console is supported only for iOS simulator app launches",nZ="--launch-console requires a direct app launch and cannot be used with URL opens",nY=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nQ(e,t){if(t<=0)return[0,0];let[r,n]=nY[e%nY.length];return[r*t,n*t]}async function n0(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await e8(t)}let n1=["tap","doubleTap","longPress","drag"];function n2(e,t,r){return new eG("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function n3(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw n2(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function n5(e,t){if(!Array.isArray(e)||0===e.length)throw new eG("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eG("INVALID_ARGS",`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});return e.forEach((e,t)=>(function(e,t){var r;if(!("string"==typeof(r=e.kind)&&n1.includes(r)))throw n2(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${n1.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw n2(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);if("drag"===e.kind&&(!Number.isFinite(e.x2)||!Number.isFinite(e.y2)))throw n2(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&n3(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&n3(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function n4(e){var t,r,n,i;let a=Array.isArray(t=e.sequenceResults)?t.map(e=>{let t=e??{};return{ok:!0===t.ok,kind:"string"==typeof t.kind?t.kind:"unknown",errorCode:"string"==typeof t.errorCode?t.errorCode:void 0,errorMessage:"string"==typeof t.errorMessage?t.errorMessage:void 0,gestureStartUptimeMs:"number"==typeof t.gestureStartUptimeMs?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:"number"==typeof t.gestureEndUptimeMs?t.gestureEndUptimeMs:void 0}}):[],o="number"==typeof e.completedSteps&&Number.isFinite(e.completedSteps)?e.completedSteps:a.filter(e=>e.ok).length,s="number"==typeof e.failedStepIndex&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:a.findIndex(e=>!e.ok)>=0?a.findIndex(e=>!e.ok):void 0;if(void 0!==s){let e,t,l;throw r=a,n=o,e=r[i=s],t=e?.kind??"step",l=e?.errorMessage??`sequence step ${i} (${t}) failed`,new eG(e$(e?.errorCode),l,{failedStepIndex:i,failedStepKind:t,completedSteps:n,sequenceResults:r,hint:"Run snapshot -i to inspect the current UI, then continue from the observed state."})}return{results:a,completedSteps:o,failedStepIndex:s}}async function n6(e,t){let{x:r,y:n}=ii(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...X(`Long pressed (${r}, ${n})`)}}async function n8(e,t){let{x:r,y:n}=ii(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...X(`Focused (${r}, ${n})`)}}async function n9(e,t,r){let n=eE(t[0]);if(n)throw new eG("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new eG("INVALID_ARGS","type requires text");let a=er(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...X(iP("Typed",i))}}async function n7(e,t,r){if(r?.directElementSelector)return await ie(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new eG("INVALID_ARGS","fill requires x y text");let o=er(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...X(iP("Filled",a))}}async function ie(e,t,r,n){if(!e.fillElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eG("INVALID_ARGS","fill requires text");let a=er(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...X(iP("Filled",i))}}async function it(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await ir(t,n.directElementSelector);let{x:o,y:s}=ii(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await ia(o,s,n);let l=k(n);if("primary"!==l)return await io(e,o,s,l,n);let d=(a=n,{count:il(a?.count,1,"count",1,200),intervalMs:il(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:il(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:il(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,e9(e.platform)&&i>1)?await ic(e,o,s,d,n):await iu(t,o,s,d)}async function ir(e,t){if(!e.tapElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...X(`Tapped ${t.raw}`)}}function ii(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eG("INVALID_ARGS",t,r);return{x:n,y:i}}async function ia(e,t,r){let n=k(r);if("primary"!==n)throw new eG("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(t4);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...X(iM({x:e,y:t}))}}async function io(e,t,r,n,i){if(function(e,t,r){let n=B({commandLabel:"click",platform:e.platform,button:t,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(n)throw n}(e,n,i),"linux"===e.platform)return await is(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(t6);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},ip(i)),{x:t,y:r,button:n,...X(iM({x:t,y:r,button:n}))}}async function is(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...X(iM({x:e,y:t,button:r}))}}function il(e,t,r,n,i){return er(void 0===e?t:e,r,n,i)}async function id(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(t6),o=function(e,t=2e4){if(0===e.length)return[];let r=[],n=[],i=0;for(let a of e){let e=(a.durationMs??0)+(a.pauseMs??0)+250,o=n.length>0&&i+e>t,s=n.length>=20;(o||s)&&(r.push(n),n=[],i=0),n.push(a),i+=e}return n.length>0&&r.push(n),r}(t),s=0,l=[],d=0;for(let t of o){let o,c=await a(e,n5(t,r?.appBundleId),ip(r));n??=c,i=c;try{o=n4(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eG)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eG(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,d)}s+=o.completedSteps,l.push(...o.results),d+=t.length}return{...n??{},completedSteps:s,sequenceResults:l,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function ic(e,t,r,n,i){var a,o,s,l;let d,c,u=await id(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&"ios"===a.platform&&"tv"!==a.target,Array.from({length:l.count},(e,t)=>{let[r,n]=nQ(t,l.jitterPx),i=t===l.count-1;return{kind:d,x:o+r,y:s+n,...c?{synthesized:!0}:{},...l.holdMs>0?{durationMs:l.holdMs}:{},...!i&&l.intervalMs>0?{pauseMs:l.intervalMs}:{}}})),i);return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-sequence",...u,...X(iM({x:t,y:r}))}}async function iu(e,t,r,n){let i;return await n0(n.count,n.intervalMs,async a=>{let[o,s]=nQ(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){let t=await e.doubleTap(l,d);i??=t??void 0;return}if(n.holdMs>0){let t=await e.longPress(l,d,n.holdMs);i??=t??void 0}else{let t=await e.tap(l,d);i??=t??void 0}}),R({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},iM({x:t,y:r}))}function ip(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function im(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new eG("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await iw({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function ih(e,t,r,n){let i=U(r[0]),a=r[1]?Number(r[1]):300,o=en((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eG("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=es(i,o,{platform:e.platform});return await iw({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function iw(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=er(l,"durationMs",16,1e4),u=er(n?.count??1,"count",1,200),p=er(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!M(W,f))throw new eG("INVALID_ARGS",`Invalid pattern: ${f}`);if(e9(t.platform)&&u>1){let e=await id(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c="ios"===t.platform&&"tv"!==t.target;return Array.from({length:o},(e,t)=>{let u="ping-pong"===l&&t%2==1,p=t===o-1;return{kind:"drag",x:u?i:r,y:u?a:n,x2:u?r:i,y2:u?n:a,durationMs:d,...c?{synthesized:!0}:{},...!p&&s>0?{pauseMs:s}:{}}})}({device:t,x1:i,y1:a,x2:o,y2:s,count:u,pauseMs:p,pattern:f,effectiveDurationMs:c}),n);return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-sequence",count:u,pauseMs:p,pattern:f,...e,...X(iN(u,f))}}return await n0(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,c):await r.swipe(i,a,o,s,c)}),R({x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"direct",count:u,pauseMs:p,pattern:f},d?`Swiped ${d}`:iN(u,f))}async function ig(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new eG("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=er(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,d=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...d??{},...X(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function iv(e,t){let r=ei(A,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new eG("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eG("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=er(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...X(`Flung ${r}`)}}async function iy(e,t,r){var n,i,a,o,s,l,d,c;let u,p=t[0],f=t[1]?Number(t[1]):void 0,m=r?.pixels,h=r?.durationMs;if(!p)throw new eG("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new eG("INVALID_ARGS","scroll amount must be a number")}(n),C(a),z({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:_(o)},g={amount:f,pixels:m,durationMs:h},{interactionResult:v,completedPasses:y}=await iS(e,r,w,g);return R((s=w,l=g,d=y,u=O(c=v),{direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==l.amount?{amount:l.amount}:{},...void 0!==l.pixels?{pixels:l.pixels}:{},...void 0!==u?{durationMs:u}:{},...c}),K(w.direction,w.edge,y,f,m))}async function iS(e,t,r,n){if(r.edge){let i=r.edge,a=await T({edge:i,captureState:async r=>await iI(e,t,i,r),scroll:async()=>await e.scroll(r.direction,n)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(r.direction,n)??{},completedPasses:1}}async function iI(e,t,r,n){if("function"!=typeof e.snapshot)throw new eG("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await Z({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function iA(e,t,r,n){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eG("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new eG("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...X(`Pinched to scale ${i}`)}}async function ib(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eG("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new eG("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new eG("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new eG("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new eG("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...X(`Rotated gesture ${n} degrees`)}}async function i_(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eG("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new eG("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eG("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:er(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...X(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ix(e,t,r){let{x:n,y:i}=ii(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(t7);return{action:"read",text:await e(n,i,r?.surface)}}if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(t4);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(t6),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function iM(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function iN(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function iP(e,t){return`${e} ${Array.from(t).length} chars`}function iD(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eG("INVALID_ARGS",`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!o.statSync(a).isFile())throw new eG("INVALID_ARGS",`${n} path is not a file: ${a}`);return{kind:"file",path:a}}catch(t){if(t instanceof eG)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eG("INVALID_ARGS",`${n} file is not readable: ${a}`);if(e&&"ENOENT"!==e)throw new eG("COMMAND_FAILED",`Unable to read ${n} file: ${a}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eG("INVALID_ARGS",`${n} file not found: ${a}`)}async function ik(e){let t=iD(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await iE(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eG("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eG)throw t;throw new eG("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function iE(e){try{return await l.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eG("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eG("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eG("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eG("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function iC(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir,runnerLeaseContext:i?.runnerLeaseContext},o=await nX(e,a);return ef({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await eu("platform_command",async()=>await iR(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function iR(e,t,r,n,i,a,o){switch(r){case"open":return await iO(e,t,n,a);case"close":{let r=n[0];if(!r)return"web"===e.platform&&await t.close(""),{closed:"session",...X("Closed session")};return await t.close(r),{app:r,...X(`Closed: ${r}`)}}case"press":return await it(e,t,n,a);case"swipe":return await im(e,t,n,a);case"swipe-preset":return await ih(e,t,n,a);case"pan":return await ig(t,n);case"fling":return await iv(t,n);case"longpress":return await n6(t,n);case"focus":return await n8(t,n);case"type":return await n9(t,n,a);case"fill":return await n7(t,n,a);case"scroll":return await iy(t,n,a);case"pinch":return await iA(e,t,n,a);case"rotate-gesture":return await ib(e,t,n);case"transform-gesture":return await i_(e,t,n);case"trigger-app-event":return await iT(e,t,n,a);case"screenshot":return await iL(t,n,i,a);case"viewport":return await i$(t,n);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...X("Back")};case"home":return await t.home(),{action:"home",...X("Home")};case"rotate":{let e=ea(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...X(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...X("Opened app switcher")};case"clipboard":return await iF(t,n);case"keyboard":return await iU(e,n,a,o);case"settings":return await iB(e,t,n,a);case"push":return await ij(e,n,a);case"snapshot":return await iV(t,a);case"read":return await ix(e,n,a);default:throw new eG("INVALID_ARGS",`Unknown command: ${r}`)}}async function iO(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eG("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eG("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eG("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...X("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eG("UNSUPPORTED_OPERATION",nJ);if("linux"===e.platform&&s&&s.length>0)throw new eG("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tS(i))throw new eG("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tS(a))throw new eG("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eG("INVALID_ARGS",nZ);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...X(`Opened: ${i}`)}}if(o&&tS(i))throw new eG("INVALID_ARGS",nZ);if(n?.clearAppState){if(tS(i))throw new eG("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...X(`Opened: ${i}`)}}async function iT(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eG("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nz.test(t))throw new eG("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new eG("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new eG("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new eG("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eG)throw t;throw new eG("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new eG("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new eG("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...X(`Triggered app event: ${i}`)}}async function iL(e,t,r,n){let i=t[0]??r??`./screenshot-${Date.now()}.png`;await l.mkdir(a.dirname(i),{recursive:!0});let o=J(n);return await e.screenshot(i,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:i,...X(`Saved screenshot: ${i}`)}}async function i$(e,t){if(2!==t.length)throw new eG("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=L(t[0],"width"),n=L(t[1],"height");if(!e.setViewport)throw new eG("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...X(`Viewport set: ${r}x${n}`)}}async function iF(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eG("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eG("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eG("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...X("Clipboard updated")}}async function iU(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!eh(i))throw new eG("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eG("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await iG(e,i);if("ios"===e.platform)return await iq(e,i,r,n);throw new eG("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function iG(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...X("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./9624.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function iq(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eG("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runIosRunnerCommand:t}=await Promise.resolve(t6),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...X("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(t6),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...X(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function iB(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eG("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eG("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ef({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?R({setting:i,state:"clear",...s},iK(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...X(`Cleared user data for ${r}`)}}if(!a)throw new eG("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,d=("permission"===i||l?r[4]:r[2])??n?.appBundleId,c="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:q(o,"latitude"),longitude:q(s,"longitude")}:void 0;ef({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let u=await t.setSetting(i,a,d,c);return u&&"object"==typeof u?R({setting:i,state:a,...u},iK(u)??`Updated setting: ${i}`):{setting:i,state:a,...X(`Updated setting: ${i}`)}}async function ij(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eG("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await ik(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...X(`Pushed notification to ${n}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,n,a);return{platform:"android",package:n,action:s.action,extrasCount:s.extrasCount,...X(`Pushed notification to ${n}`)}}async function iV(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,surface:t?.surface})}function iK(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iH=e=>"macos"!==e.platform,iW=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iX=e=>"macos"===e.platform?"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"tv"===e.target?"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.":"ios"===e.platform&&"device"===e.kind?"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.":void 0,iz={device:!0},iJ={},iZ={device:!0},iY=new Set(["open","close","record","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),iQ={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},i0={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},i1=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=iY.has(r)?{...n,web:iZ}:n;for(let t of iY)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}({alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},pinch:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||iW(e),unsupportedHint:iX},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},open:iQ,close:iQ,reinstall:i0,install:i0,"install-from-source":i0,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iJ},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz,supports:e=>"android"===e.platform||"linux"===e.platform||"macos"===e.platform||"simulator"===e.kind},keyboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},fill:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},snapshot:iQ,diff:iQ,screenshot:iQ,wait:iQ,get:iQ,find:iQ,is:iQ,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz,supports:iH},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:iH},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||"ios"===e.platform&&"tv"!==e.target},scroll:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iz},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},viewport:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iJ},type:iQ});function i2(e,t){let r=i1[e];if(!r)return!0;let n=e9(t.platform)?r.apple:"android"===t.platform?r.android:"linux"===t.platform?r.linux:r.web;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function i3(e,t=e=>e){let r=new w;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function i5(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function i4(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new eG("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new eG("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new eG("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await i6(e,t,r)}}async function i6(e,t,r){let n=["/Applications","/System/Applications",a.join(p.homedir(),"Applications")],i=new Set;for(let t of n){let r=await l.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&i.add(t)}}return i5((await Promise.all(Array.from(i).map(async e=>{let r=await i8(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??a.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function i8(e,t){for(let r of[a.join(e,"Contents","Info.plist"),a.join(e,"Info.plist")]){let e=await t(r),n=i9(e,"CFBundleIdentifier"),i=i9(e,"CFBundleDisplayName"),a=i9(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function i9(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let i7={runCommand:ej,simctl:{run:async(e,t)=>await ej("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await ej("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await al(ej,e)},macosHost:i4(ej,async e=>await al(ej,e)),whichCommand:eH},ae=i3(i7,function(e){return"function"==typeof e?at({runCommand:e}):at(e)});function at(e={}){let t={...i7,...e},r=e.plist??{readJson:async e=>await al(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,r)=>await t.runCommand("xcrun",["simctl",...e],r)},devicectl:e.devicectl??{run:async(e,r)=>await t.runCommand("xcrun",["devicectl",...e],r)},plist:r,macosHost:e.macosHost??i4(t.runCommand,async e=>await r.readJson(e))}}function ar(e){return ae.resolve(e)}async function an(e,t){return await ae.run(e,t)}function ai(){return ae.hasScope()}async function aa(e,t,r){return await ar().runCommand(e,t,r)}async function ao(e,t){let r=ar(),[n,...i]=e;return"simctl"===n?await (r.simctl?.run(i,t)??r.runCommand("xcrun",e,t)):"devicectl"===n?await (r.devicectl?.run(i,t)??r.runCommand("xcrun",e,t)):await aa("xcrun",e,t)}async function as(e){return await ar().plist?.readJson(e)??null}async function al(e,t){try{let r=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==r.exitCode||!r.stdout.trim())return null;return JSON.parse(r.stdout)}catch{return null}}let ad="agent-device-macos-helper",ac="AGENT_DEVICE_MACOS_HELPER_BIN",au=a.join(p.homedir(),".agent-device","macos-helper","current"),ap=a.join(au,"manifest.json"),af=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function am(e){let t=e.trim();if(!af.test(t))throw new eG("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function ah(e,t){t.bundleId&&e.push("--bundle-id",am(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function aw(){return function(e){let t=a.dirname(e);for(;;){let e=a.join(t,"macos-helper");if(s(a.join(e,"Package.swift")))return e;let r=a.dirname(t);if(r===t)break;t=r}throw new eG("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function ag(e){let t=await l.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=a.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await ag(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function av(e){let t=await ag(e),r=i("sha256");for(let n of t)r.update(a.relative(e,n)),r.update("\0"),r.update(await l.readFile(n)),r.update("\0");let n=await aa("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(n.stdout||n.stderr||`exit:${n.exitCode}`),r.update("\0"),r.digest("hex")}async function ay(){try{let e=JSON.parse(await l.readFile(ap,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function aS(){let e=await eK(process.env[ac],ac);if(e)return e;let t=aw(),r=await av(t),n=a.join(au,ad);try{if(await ay()===r)return await l.access(n),n}catch{}let i=a.join(aw(),".build","release",ad);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await aa("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await l.mkdir(au,{recursive:!0});let o=`${n}.tmp`;return await l.copyFile(i,o),await l.rename(o,n),await l.chmod(n,493),await l.writeFile(ap,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
-
`,"utf8"),n}async function aI(){let e=process.env[ac]?.trim();if(e){let t=await eK(e,ac);if(t)return t}if(ai())return ad;if("darwin"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await aS()}async function aA(e){let t={allowFailure:!0,timeoutMs:3e4},r=ar().macosHelper,n=r?ad:await aI(),i=r?await r.run(e,t):await aa(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new eG("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function ab(){return await aA(["app","frontmost"])}async function a_(e){return await aA(["app","quit","--bundle-id",am(e)])}async function ax(e,t){return await aA(["permission",e,t])}async function aM(e,t={}){let r=["alert",e];return ah(r,t),await aA(r)}async function aN(e,t={}){let r=["snapshot","--surface",e];return ah(r,t),await aA(r)}async function aP(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return ah(n,r),await aA(n)}async function aD(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return ah(n,r),await aA(n)}async function ak(e,t={}){let r=["screenshot","--out",e];return ah(r,t),t.fullscreen&&r.push("--fullscreen"),await aA(r)}let aE={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},aC={runCommand:ej,whichCommand:eH,desktop:a$(ej,eH),clipboard:aF(ej,eH),screenshot:aU(ej,eH)},aR=i3(aC,function(e={}){let t={...aC,...e};return{...t,desktop:e.desktop??a$(t.runCommand,t.whichCommand),clipboard:e.clipboard??aF(t.runCommand,t.whichCommand),screenshot:e.screenshot??aU(t.runCommand,t.whichCommand)}});function aO(e){return aR.resolve(e)}async function aT(e,t){return await aR.run(e,t)}async function aL(e,t,r){return await aO().runCommand(e,t,r)}function a$(e,t){return{async openTarget(r){if(r.includes("://")||r.startsWith("/"))return void await e("xdg-open",[r]);if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{ef({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await e8(500);return}await e("xdg-open",[r],{allowFailure:!0})},async closeApp(r){await t("wmctrl")?await e("wmctrl",["-c",r],{allowFailure:!0}):await e("pkill",["-x",r],{allowFailure:!0})}}}function aF(e,t){return{async readText(){let r=aB[await aK(t,aG)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aj[await aK(t,aG)](r);await e(n.cmd,n.args,n.options)}}}function aU(e,t){return{async capture(r){let n=aV[await aK(t,aq)](r);await e(n.cmd,n.args,n.options)}}}let aG={wayland:[{tool:"wl-clipboard",command:"wl-paste"}],x11:[{tool:"xclip",command:"xclip"},{tool:"xsel",command:"xsel"}],waylandError:"wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.",x11Error:"xclip or xsel is required for clipboard access on X11. Install via your package manager."},aq={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},aB={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},aj={"wl-clipboard":e=>({cmd:"wl-copy",args:["--",e],options:{allowFailure:!1,timeoutMs:5e3}}),xclip:e=>({cmd:"xclip",args:["-selection","clipboard"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}}),xsel:e=>({cmd:"xsel",args:["--clipboard","--input"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}})},aV={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function aK(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new eG("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let aH="atspi-dump.py",aW=null;async function aX(e,t={}){let r,n=aO().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await aO().whichCommand("python3"))throw new eG("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let i=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(aW)return aW;let e=a.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=a.join(e,"src","platforms","linux",aH);if(o.existsSync(r))return aW=r,r;if(0===t){let t=a.join(e,aH);if(o.existsSync(t))return aW=t,t}e=a.dirname(e)}throw new eG("TOOL_MISSING",`Cannot find ${aH}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(i),"--max-depth",String(s),"--max-apps",String(l)],u=await aL("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new eG("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eG("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=aE[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function az(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ef({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await aX(t);return{nodes:r.nodes,truncated:r.truncated}}async function aJ(e,t,r){let{nodes:n}=await az(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:aZ(e.rect)-aZ(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function aZ(e){return(e?.width??0)*(e?.height??0)}let aY=[250,400,600];function aQ(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=function(e,t){if(t?.comparisonSafe===!0)return t;let r=e.lastComparisonSafeSnapshot;return r&&!0===r.comparisonSafe&&Date.now()-r.createdAt<=5e3?r:t}(e,r),i=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(n??r)?.nodes.length??0,baselineSignatures:i?a3(n?.nodes??[]):void 0,routeComparable:i}}function a0(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function a1(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function a2(e){return"press"===e||"click"===e||"back"===e||"open"===e}function a3(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function a5(e){return N(e)}function a4(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}function a6(e,t,r,n,i,a){let o,s;return{requestId:i??ed().requestId,appBundleId:r,runnerLeaseContext:(o=({meta:a}).meta,Object.keys(s=tx({leaseId:a4(o?.leaseId),clientId:a4(o?.clientId),tenantId:a4(o?.tenantId),runId:a4(o?.runId),leaseProvider:a4(o?.leaseProvider),deviceKey:a4(o?.deviceKey)})).length>0?s:void 0),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...ee(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:k(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function a8(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!oi(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=ot(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:oe(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function a9(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function a7(e){let{session:t,pending:r,snapshot:n}=e,i=or(r.preSignature,ot(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await iC(t.device,r.command,r.positionals,r.flags?.out,{...a6(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ef({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function oe(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function ot(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function or(e,t){return 0===e.length||0===t.length?"ambiguous":on(e,t)?"unchanged":"changed"}function on(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function oi(e){return"ios"===e.device.platform||"android"===e.device.platform}function oa(e,t,r=[],n){var i,a,o;ol(e.device.platform)&&(i=t,a=r,o=n,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function oo(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function os(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!ol(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=ot(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await e8(200),a+=1;let l=await r(),d=ot(e.readSnapshot(l).nodes);if(on(s,d))return oo(t),ef({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=d}return oo(t),ef({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function ol(e){return"ios"===e||"android"===e}function od(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let oc=new WeakMap;function ou(e,t){if(!e[t])return[];let r=om(e)[t]??t+1;return e.slice(t+1,r)}function op(e,t,r){let n=om(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function of(e,t,r){let n=om(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function om(e){let t=oc.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return oc.set(e,r),r}function oh(e,t,r){for(let n of function(e,t){let r=[],n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),r.push(n),n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0;return r}(e,t))if(r(n))return n;return null}function ow(e,t){let r=tP(e.type??""),n=e.label?.trim();return!!(og(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function og(e){return"button"===tP(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function ov(e){let t=tP(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function oy(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function oS(e){let t;for(let i of e){var r,n;let e=tP(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||oI(r)>oI(n)))&&(t=i.rect)}return t}function oI(e){return e?e.width*e.height:0}function oA(e){let t=tP(e.type??"");return"scrollview"===t||"scrollarea"===t}function ob(e,t){return!0===e||!!t||void 0}function o_(e,t,r,n){of(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tP(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function ox(e,t,r,n){of(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tP((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function oM(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tP(n.type??"")&&t(n,i,r)}}function oN(e,t,r,n){for(let i of e)(ow(i,t)||n&&oD(i,n))&&r.add(i.index)}function oP(e,t,r){if("button"!==tP(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&j(e.rect,t.rect)}function oD(e,t){return"button"===tP(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&j(e.rect,t.rect)}let ok=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=oS(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===tP(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),of(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tP(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&V(t))})(r)&&function(e,t,r){var n,i,a,o;ov(e.type)||r.suppressedIndexes.add(e.index);let s=E(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&ov(e.type)?e:null)??oh(e,t,e=>ov(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,oy(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:ob(i.hiddenContentAbove,o.above),hiddenContentBelow:ob(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==tP(n.type??""))continue;if("Search"===n.label){ox(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=op(e,r,e=>"searchfield"===tP(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),ox(e,r,i.index,t))}})(e,o),r=e,n=o,oM(r,(e,t,i)=>{op(r,i,r=>{let n;return("button"===(n=tP(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(j(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=tP(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,oM(i,(e,t,r)=>{let n;Q(e)&&P(e,(n=[],of(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=tP(r.type??"");if("statictext"===a||"link"===a)return o_(e,t,n,i);if("other"===a){if(function(e,t,r){return!!op(e,t,e=>{let t=tP(e.type??"");return("link"===t||"searchfield"===t||ov(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);o_(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=oS(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tP(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!oh(e,t,oA)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=oI(e),i=oI(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&oy(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=tP(r.type??"");if("button"===a)return oN(ou(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=ou(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tP(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>oP(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&oy(n.replacements,i,{identifier:o}),n.suppressedIndexes.add(t.index),function(e,t,r,n,i){for(let a of e)a.index!==n.index&&(oP(a,t,r)||oD(a,t)||function(e,t){if("switch"!==tP(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||ow(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>oP(e,t,r));if(!i){e.some(og)&&oN(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&oy(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),oN(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function oE(e){let t=await oC(e);if(t)return t;let r=await oG(e);return a1(e.session),{snapshot:r.snapshot,...r.annotations}}async function oC(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!oi(e)||Date.now()-t.markedAt>3e4?void a9(e):t}(e.session);if(t&&e.session)return await oR({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oF({...e,session:e.session});let r=a0(e.session);if(r&&"android"===e.device.platform)return await oL(e,r)}async function oR(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await oO(e,t,await oU(e)),l=await a7({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await oO(e,t,await oU(e)),l=await a7({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(a9(i),s=await os({session:i,initial:s,capture:async()=>await oU(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&a1(i),"unchanged"===l.change)?ef({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):ef({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,...s.annotations}}async function oO(e,t,r){let n=r;return"unchanged"!==or(t.preSignature,ot(n.snapshot.nodes))?n:(await e8(500),n=await oU(e))}async function oT(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await az(r?.surface);return oj({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&r?.surface&&"app"!==r.surface?oj(await aN(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await iC(t,"snapshot",[],i,{...a6(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function oL(e,t){let r=await o$(e,t);return{snapshot:r.snapshot,...r.annotations}}async function o$(e,t){let r=await oG(e),n=oq(r,t,e),i=0,a=t.markedAt+1500;for(let o of aY){if(!n)break;let s=a-Date.now();if(s<=0)break;await e8(Math.min(o,s)),r=await oG(e),i+=1,n=oq(r,t,e)}n||a1(e.session);let o=i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0;return{...r,annotations:{...r.annotations,...et({freshness:o})}}}async function oF(e){let t=await os({session:e.session,capture:async()=>await oU(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function oU(e){let t=a0(e.session);return t&&"android"===e.device.platform?await o$(e,t):await oG(e)}async function oG(e){var t;let r=Date.now(),n=await oT(e);return e2(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:oB(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:et(n)}}function oq(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.annotations.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&a2(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=a3(t),i=Math.min(e.length,n.length),a=0;for(let t=0;t<i;t+=1)e[t]===n[t]&&(a+=1);let o=Math.max(0,n.length-e.length),s=Math.max(0,e.length-n.length),l=Math.max(3,Math.floor(.15*r));return a>=Math.floor(.9*r)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function oB(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=Y(s?o:tD(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?oV(l,t.snapshotScope):l,c=(r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of ok)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(d):d,u=t$(s?c:F(c)),p=et(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:tT(tC(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oj(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=oV(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:oK(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oK(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function oV(e,t){let r=tk(t$(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return oK(a,i)}function oK(e,t=0){let r=new Map;for(let[t,n]of e.entries())r.set(n.index,t);return e.map((e,n)=>({...e,index:n,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?r.get(e.parentIndex):void 0}))}function oH(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return od("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=tR(e.trim());if(!n)return od("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tO(e.nodes,n);if(r=t?tE(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:od("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function oW(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function oX(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?ef({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oz(e){let{session:t,sessionName:r,outPath:n,outputPlacement:i,dispatchContext:o}=e,s=ex({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...ee(a),surface:a?.surface};return"out"===r?e0(await iC(t.device,"screenshot",[],i,o)):e0(await iC(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:i,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eG("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-screenshot-")),r=a.join(t,"screenshot.png")),await l.mkdir(a.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await l.mkdtemp(a.join(p.tmpdir(),`${e.prefix}-`));return{path:a.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}}},sessions:oX({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eM()});return await s.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...J(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oJ(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oZ(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function oY(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oQ=new Set(["android","com.android.systemui"]);function o0(e,t,r,n){var i,a;return{reason:r,fallbackReason:n,diagnostics:(i=e,a=t,{helperNodeCount:i.nodeCount,helperWindowRootCount:i.windowRootCount,helperApplicationWindowRootCount:i.applicationWindowRootCount,helperMeaningfulNodeCount:i.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:i.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:i.nonSystemMeaningfulNodeCount,...void 0!==i.foregroundAppPackage?{helperForegroundAppPackage:i.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:i.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2}:{},helperWindowTypes:i.windowTypes,...a.captureMode?{helperCaptureMode:a.captureMode}:{}})}}function o1(e){return null!==e&&""!==e.trim()}let o2=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function o3(e,t={}){let r=tQ(e,t.helperAdb).exec;return(await o9(e,t,r)).xml}async function o5(e,t={}){let r=tQ(e,t.helperAdb).exec,n=await o9(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tU(i,void 0,t),s=o4(o.truncated,n.metadata);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await sd(e,o.nodes,i,r),o.nodes),{...o,...o6(s),androidSnapshot:n.metadata}}let o=tq(i),s=tJ(o,void 0,t),l=o4(s.truncated,n.metadata);a&&await o8({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...o6(l),androidSnapshot:n.metadata}}function o4(e,t){return!0===e||!0===t.helperTruncated||e}function o6(e){return!0===e?{truncated:!0}:{}}async function o8(e){if(su(e.interactiveSnapshot.nodes).size>0||sc(e.xml))return;let t=tJ(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await sd(e.device,t.nodes,e.xml,e.adb);sg(r,t,e.interactiveSnapshot),0===r.size&&sg(D(t$(t.nodes)),t,e.interactiveSnapshot)}async function o9(e,t,r){let n=await eu("android_snapshot_helper_artifact_resolution",async()=>await ss(t.helperArtifact));return n.artifact?await o7(e,t,r,n.artifact):(ef({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await sl(e,n.fallbackReason,r))}async function o7(e,t,r,n){let i=tG(e),a=tQ(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await se(t,r,a,n,i);o.installed&&await tz(i);let c=(s=await st({options:t,adb:r,adbProvider:a,artifact:n,helperDeviceKey:i}),l=n,d=o.reason,{xml:s.xml,metadata:{backend:"android-helper",helperVersion:l.manifest.version,helperApiVersion:s.metadata.helperApiVersion,helperTransport:s.metadata.transport,helperSessionReused:s.metadata.sessionReused,installReason:d,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:s.metadata.waitForIdleQuietMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}),u=function(e,t,r={}){if("android-helper"!==t.backend)return;let n=function(e,t){var r,n;let i=(r=t,{nodeCount:0,windowRootCount:0,applicationWindowRootCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,...void 0!==r?{foregroundAppPackage:r,foregroundAppMeaningfulNodeCount:0}:{},windowTypes:new Set});for(let t of tW(e))!function(e,t){var r,n;e.nodeCount+=1,r=e,n=t,void 0!==n.windowType&&(r.currentWindowType=n.windowType,r.windowRootCount+=1,r.windowTypes.add(n.windowType),1===n.windowType&&(r.applicationWindowRootCount+=1)),function(e,t){var r,n;r=t,!1!==r.visibleToUser&&(o1(r.text)||o1(r.desc)||o1(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||oQ.has(n)||(e.nonSystemMeaningfulNodeCount+=1),void 0!==e.foregroundAppPackage&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1))}(e,t)}(i,t);return{nodeCount:(n=i).nodeCount,windowRootCount:n.windowRootCount,applicationWindowRootCount:n.applicationWindowRootCount,meaningfulNodeCount:n.meaningfulNodeCount,applicationMeaningfulNodeCount:n.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:n.nonSystemMeaningfulNodeCount,...void 0!==n.foregroundAppPackage?{foregroundAppPackage:n.foregroundAppPackage,foregroundAppMeaningfulNodeCount:n.foregroundAppMeaningfulNodeCount??0}:{},windowTypes:[...n.windowTypes].sort((e,t)=>e-t).slice(0,8)}}(e,r.foregroundAppPackage);if(0===n.nodeCount||0===t.nodeCount||!1===t.rootPresent)return o0(n,t,"empty-helper-output","Android snapshot helper returned no accessibility nodes");let i=n.foregroundAppMeaningfulNodeCount;return void 0!==i&&(0===i||i<2&&n.meaningfulNodeCount>i)?o0(n,t,"content-poor-app-window","Android snapshot helper returned insufficient foreground app content"):void 0===i&&n.applicationWindowRootCount>0&&n.applicationMeaningfulNodeCount<2||void 0===i&&0===n.windowRootCount&&(t.windowCount??0)>1&&n.nonSystemMeaningfulNodeCount<2?o0(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?o0(n,t,"system-window-only","Android snapshot helper returned only non-application windows"):void 0}(c.xml,c.metadata,{foregroundAppPackage:t.appBundleId});if(!u)return c;return await sr({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await sn({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await tz(i)}}async function se(e,t,r,n,i){let a=await eu("android_snapshot_helper_install",async()=>await tB({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return ef({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function st(e){let{options:t,adb:r,adbProvider:n,artifact:i,helperDeviceKey:a}=e,o={adb:r,adbProvider:n,deviceKey:a,helperVersion:i.manifest.version,helperVersionCode:i.manifest.versionCode,packageName:i.manifest.packageName,instrumentationRunner:i.manifest.instrumentationRunner,waitForIdleTimeoutMs:t.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await eu("android_snapshot_helper_session_capture",async()=>await tV(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ef({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eU(e).message}}),await si(r,i.manifest.packageName)}return await eu("android_snapshot_helper_capture",async()=>await tj(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function sr(e){return ef({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await si(e.adb,e.artifact.manifest.packageName),await sl(e.device,e.contentRecovery.fallbackReason,e.adb)}async function sn(e){let t=function(e){var t;let r=eU(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=so(e)??t;return/TimeoutException/.test(r)||/timed out/i.test(n)}(r.details?.helper,r.message)&&(t=r,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let n=sa(e);return new eG(e$(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(t)throw t;let r=sa(e.error);return ef({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tz(e.helperDeviceKey),await si(e.adb,e.artifact.manifest.packageName),tX({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await sl(e.device,r,e.adb)}async function si(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await e8(150),ef({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ef({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eU(e).message}})}}function sa(e){let t=eU(e),r=so(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let n=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return n?`${t.message}: ${n}`:t.message}function so(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function ss(e){if(e)return{artifact:e};let t=tZ(),r=a.join(tY(),"android-snapshot-helper","dist"),n=a.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await g.access(n)}catch{return{}}try{let e=tH(JSON.parse(await g.readFile(n,"utf8"))),t=a.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await g.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eU(e).message}}}async function sl(e,t,r){let n;try{n=await eu("android_snapshot_stock_capture",async()=>await sp(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eG(e$((r=eU(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function sd(e,t,r,n){if(!t.some(e=>tF(e.type)))return new Map;let i=su(t);if(i.size>0||sc(r))return i;let a=await sw(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,d]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===d)continue;let c=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(d)-p)},children:[]};for(;r.length>1&&c<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:c,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(tF(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>oY(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!tF(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>oY(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=oJ(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*n)),a=Math.max(24,Math.round(.25*n)),o=t.start>=i,s=e.contentExtent-(r.start+r.size)>=a;return o||s?{above:o,below:s}:null}(n),a=function(e,t){let r=new Map;for(let n of e)for(let e of t){if(!oZ(n,e))continue;let t=n.start-e.start,i=8*Math.round(t/8),a=r.get(i)??[];a.push(t),r.set(i,a)}let n=null;for(let e of r.values())(!n||e.length>n.length)&&(n=e);if(!n||n.length<2)return null;let i=[...n].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(n.contentBlocks,r)??function(e){let{nativeBlocks:t,visibleBlocks:r,viewportExtent:n,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of r){if(!oZ(e,t))continue;let r=e.start-t.start;16>=Math.abs(r)&&a.push(r),16>=Math.abs(r+n-i)&&o.push(r)}return o.length>0?oJ(o):a.length>0?oJ(a):null}({nativeBlocks:n.contentBlocks,visibleBlocks:r,viewportExtent:t.height,contentExtent:n.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<n.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:r});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&i.set(t.index,s)}return i}(t,a):new Map}function sc(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function su(e){let t=new Map;for(let r of e){let e={};r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(r.index,e)}return t}async function sp(e,t=t0(e)){try{return await ts(()=>sf(t),{shouldRetry:sh})}catch(t){var r,n;let e;if((r=t)instanceof eG&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new eG("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function sf(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=sm(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),d=(t=l.stdout,r=l.stderr,n=`${t}
|
|
5
|
-
${r}`,
|
|
6
|
-
${
|
|
7
|
-
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function sg(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let sv=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,sy=/^close app$/i,sS="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function sI(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await sN(r)}catch(e){return ef({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=sD(t);if(!n?.rect)return{status:"absent"};try{let e=await sP(r,n);if(!e.ok)return ef({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await sk(r))return ef({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await tc(r.device,r.appBundleId),!await sE(r,r.appBundleId)))return ef({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return ef({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return ef({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function sA(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await to(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await sb(n)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${n.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw sx({session:n,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${n.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw sx({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${sM(a)}. Automatic recovery failed.`,hint:sS})}throw sx({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${sM(a)}.`,hint:sS})}async function sb(e){try{return await s_(e)}catch(t){return ef({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function s_(e){if(!e.appBundleId)return!1;let t=sD(await sN(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await sP(e,t);if(!r.ok)return!1;await tc(e.device,e.appBundleId);let n=await sE(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ef({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function sx(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eG("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function sM(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function sN(e){return t$(tD((await o5(e.device,{interactiveOnly:!1})).nodes))}async function sP(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=tL(t.rect),i=await ti(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function sD(e,t={}){if(!1===t.requireDialogSignal||sO(e))return e.find(e=>sR(e).some(e=>sy.test(e))&&e.rect)}async function sk(e){for(let t=0;t<12;t+=1){if(!sO(await sN(e)))return!0;await e8(500)}return!sO(await sN(e))}async function sE(e,t,r={}){for(let n=0;n<12;n+=1){if(await sC(e,t,r))return!0;await e8(500)}return await sC(e,t,r)}async function sC(e,t,r){return!(r.requireNoBlockingDialog&&await to(e.device))&&(await tg(e.device)).package===t}function sR(e){let t=[e.label,e.identifier];return"string"==typeof e.value&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>"string"==typeof e&&e.trim().length>0).map(e=>e.trim())}function sO(e){return e.some(e=>{let t=sR(e).join(" ").trim();return t.length>0&&sv.test(t)})}function sT(e){return!!(e&&e.width>0&&e.height>0)}function sL(e){return e.width*e.height}function s$(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let sF=[255,59,48,255],sU=[255,214,10,255],sG=[0,0,0,255],sq=["scroll","list","recyclerview","edittext","textfield"],sB=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sj={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function sV(e){let t=await l.readFile(e.screenshotPath),r=await eI(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sW(r)&&sT(r.rect)&&(!t||sL(r.rect)>sL(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&sT(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return sT(e.rect)&&!("image"===tP((t=e).type??"")&&!sz(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(sJ)||sZ(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sT(r.rect)||sW(r))return!1;let n=tP(r.type??"");return!(sq.some(e=>n.includes(e))||t&&sL(r.rect)>.25*sL(t))}(e,t,r)||(sH(r)?n:n&&function(e){let t=tP(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return sH(e)&&!sW(e)}(s=n)?s:null,tN(o,s,e=>(function(e){return sH(e)&&!sW(e)})(e)),s.hittable?s:null,tN(o,s,e=>!0===e.hittable)].find(sX)??null);if(!l?.rect||!sT(l.rect))continue;let d=function(e,t,r){let n=sY(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=sY(n);if(!i)continue;let a=function(e){let t=0;return tP(e.type??"").includes("text")&&(t+=2),sJ(e.label)&&(t+=2),sJ(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sY(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sH(t)&&(n+=3),sH(e)&&(n+=2),r&&(n+=2),sZ(t.identifier)&&(n+=1),sz(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sH,i=e=>!!sY(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=tP(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sT(t.rect)&&s$(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),d=Math.round(i.height+2*s);return d<=0||d>=n.height?null:{x:n.x,y:l,width:n.width,height:d}}(t,r,i))??t.rect)}(e,l,e.nodes),p=sK(e,i,u,t,r);if(!sT(p))continue;let f=a.get(l.ref);(!f||c>f.score)&&a.set(l.ref,{ref:l.ref,label:d,rect:l.rect,overlayRect:p,score:c})}return function(e,t,r,n,i){let a=G(e.nodes).primaryAction;if(!a?.ref||!a.rect||!sT(a.rect))return;let o=sK(e,t,a.rect,n,i);if(!sT(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>sL(e.overlayRect)-sL(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(s$(e.overlayRect,r.overlayRect)||s$(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}sL(r.overlayRect)<sL(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(s4).slice(0,n.maxRefs??24).sort(s5).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:tL(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)s1(e,t.x,t.x+t.width-1,t.y+n,r),s1(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),s2(e,t.x+n,t.y,t.y+t.height-1,r),s2(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sF),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=s0(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:s0(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)s3(e,t+o,r+a,i)})(e,i,o,n,sU),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sj[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&s3(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sG)}(i,a.overlayRect,a.ref)}return await l.writeFile(e.screenshotPath,await eg(r)),n}function sK(e,t,r,n,i){if("android"===e.backend||!t)return sQ(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(r),n,i);let a=n/t.width,o=i/t.height;return sQ({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function sH(e){let t=[e.type,e.role,e.subrole].map(e=>tP(e??"")).join(" ");return sB.some(e=>t.includes(e))}function sW(e){let t=[e.type,e.role,e.subrole].map(e=>tP(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sX(e){return!!(e?.rect&&sT(e.rect)&&!sW(e))}function sz(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sJ(e){var t;let r;return!!sz(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sZ(e){var t;return"string"==typeof e&&!!sJ(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sY(e){let t=[e.label,e.value].find(sJ);return t?t.trim():sZ(e.identifier)?e.identifier.trim():void 0}function sQ(e,t,r){let n=s0(e.x,0,Math.max(0,t-1)),i=s0(e.y,0,Math.max(0,r-1)),a=Math.max(1,t-n),o=Math.max(1,r-i);return{x:n,y:i,width:s0(e.width,1,a),height:s0(e.height,1,o)}}function s0(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function s1(e,t,r,n,i){for(let a=t;a<=r;a+=1)s3(e,a,n,i)}function s2(e,t,r,n,i){for(let a=r;a<=n;a+=1)s3(e,t,a,i)}function s3(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function s5(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function s4(e,t){return t.score!==e.score?t.score-e.score:s5(e,t)}function s6(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let s8=new WeakMap;function s9(e){if(!e)return;let t=s8.get(e);if(t)return t;let r=s7(e.nodes??[]);if(r)return s8.set(e,r),r}let s7=en,le={referenceWidth:1e3,referenceHeight:1e3};function lt(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},I=ld(S.effectiveDurationMs)??ld(S.durationMs),A={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:ld(S.gestureStartUptimeMs),gestureEndUptimeMs:ld(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:ld(S.gestureStartUptimeMs),gestureEndUptimeMs:ld(S.gestureEndUptimeMs),reportedDurationMs:I,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),_="ios"===e.device.platform&&void 0===ld(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=lc(ld(t.count),1)??1,r=!0===t.doubleTap,n=lc(ld(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,S)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return s6(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:b}):s6(A),x=(l=e.snapshot,w=ld((d=S).referenceWidth),g=ld(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:s9(l)),M=(c=t,u=r,p=S,f=_,m=b,h=x,v=lr[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),ef({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:_,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let lr={click:(e,t,r,n,i)=>ln(e,t,r,i),press:(e,t,r,n,i)=>ln(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?ln(e,t,r,i):[],fill:(e,t,r,n,i)=>li(e,t,r,i),focus:(e,t,r,n,i)=>li(e,t,r,i),longpress:function(e,t,r,n,i){let a=lu(t,e);if(!a)return[];let{x:o,y:s}=a;return[ls(r,o,s,lm(n,[ld(t.durationMs),ld(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=lp(t,e),o=ll(t.contentDirection)??ll(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=lm(n,[],250),p=ld(t.amount)??ld(e[1]),f=ld(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:d,y2:c,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:la,fling:la,swipe:la,pinch:function(e,t,r,n,i){let a=lu(t,e,1),o=ld(t.scale)??ld(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:lm(n,[],280)}]}};function ln(e,t,r,n){let i=lu(t,e);if(!i)return[];let{x:a,y:o}=i,s=lc(ld(t.count),1)??1,l=lc(ld(t.intervalMs),0)??0,d=!0===t.doubleTap,c=lc(ld(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==c&&c>0){u.push(ls(t,a,o,c,n));continue}u.push(lo(t,a,o,n)),d&&u.push(lo(t+90,a,o,n))}return u}function li(e,t,r,n){let i=lu(t,e);if(!i)return[];let{x:a,y:o}=i;return[lo(r,a,o,n)]}function la(e,t,r,n,i){let a=lp(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=lm(n,[ld(t.effectiveDurationMs),ld(t.durationMs),ld(e[4])],250),u=lc(ld(t.count),1)??1,p=lc(ld(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,I,A,b;let _,{startX:x,startY:M,endX:N,endY:P}=(n=t,a=f,u=o,m=s,h=l,w=d,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return g=r+t*(c+p),v=x,y=M,S=N,I=P,A=c,"back-swipe"===(_=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,I,b=i))?{kind:_,tMs:g,x:v,y,x2:S,y2:I,...b,durationMs:A,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(v,S,b)}:{kind:_,tMs:g,x:v,y,x2:S,y2:I,...b,durationMs:A}})}function lo(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function ls(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function ll(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function ld(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function lc(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function lu(e,t,r=0){let n=ld(e.x)??ld(t[r]),i=ld(e.y)??ld(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function lp(e,t){let r=lf(e.x1,e.x,t[0]),n=lf(e.y1,e.y,t[1]),i=lf(e.x2,t[2]),a=lf(e.y2,t[3]);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x1:r,y1:n,x2:i,y2:a}}function lf(...e){return e.map(ld).find(e=>void 0!==e)}function lm(e,t,r){return lc(e,1)??t.map(e=>lc(e,1)).find(e=>void 0!==e)??r}let lh={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function lw(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?lh[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:t_}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:I}=v,A=await lv(m,y);if(A)return A;let b=await lg(m,y);if("response"in b)return b.response;let{resolvedPositionals:_,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[rl.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?rl.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:d,resolvedOut:c,recordedPositionals:d,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},P=Date.now(),D={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await ly({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:_,out:x,dispatchContext:D}),E=await lg(m,y,"after-command");if("response"in E)return E.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=I===y?M:f.positionals??[],O=I===y?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=s9(e.snapshot),a={...n??{}},o=ll(a.direction)??ll(r[0]);if(!o)return n;let s=ld(a.amount)??ld(r[1]),l=ld(a.pixels),d=lp(a,[]),c=ld(a.referenceWidth),u=ld(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??le;if(d&&(d.x1!==d.x2||d.y1!==d.y2))return{...a,x1:d.x1,y1:d.y1,x2:d.x2,y2:d.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=eo({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);lt(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:I,resolvedPositionals:_,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:P,actionFinishedAt:C,flags:f.flags??{}}),a2(y)&&aQ(m,y),oa(m,y,_,f.flags),{ok:!0,data:k??{}}}async function lg(e,t,r="before-command"){if("android"!==e.device.platform||nG(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await sA({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eU(e)}}}}async function lv(e,t){if(!i2(t,e.device)){var r;let n=(r=e.device,i1[t]?.unsupportedHint?.(r));return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:`${t} is not supported on this device`,...n?{hint:n}:{}}}}return"android"===e.device.platform&&e.recording&&"record"!==t&&"failed"===(await sI({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function ly(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await iC(r.device,n,a,o,{...s});let l=await oz({session:r,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await lS(r,l,e.logPath),l}async function lS(e,t,r){let n={snapshotInteractiveOnly:!0},i=oB(await oT({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);oW(e,i);let a=await sV({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let lI=lL(()=>import("./lease.js")),lA=lL(()=>import("./session.js").then(e=>e.session_namespaceObject)),lb=lL(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),l_=lL(()=>import("./react-native.js")),lx=lL(()=>import("./record-trace.js")),lM=lL(()=>import("./find.js")),lN=lL(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function lP(e){var t;switch(t=e.req.command,nG(t)?.route??"generic"){case"lease":return await lD(e);case"session":return await lk(e);case"snapshot":return await lE(e);case"reactNative":return await lC(e);case"recordTrace":return await lR(e);case"find":return await lO(e);case"interaction":return await lT(e);case"generic":return null}}async function lD(e){let{handleLeaseCommands:t}=await lI();return l$(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function lk(e){let{handleSessionCommands:t}=await lA();return l$(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function lE(e){let{handleSnapshotCommands:t}=await lb();return l$(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function lC(e){let{handleReactNativeCommands:t}=await l_();return l$(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function lR(e){let{handleRecordTraceCommands:t}=await lx();return l$(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function lO(e){let{handleFindCommands:t}=await lM();return l$(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function lT(e){let{handleInteractionCommands:t}=await lN();return l$(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function lL(e){let t;return()=>t??=e()}function l$(e,t,r){if(r)return r;throw new eG("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lF=new w;async function lU(e,t,r){let n=lF.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lF.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lG(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lq(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=e3(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,d="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${d} Run agent-device session list to inspect active sessions.`):(i=e,a=t,c=e3(i.name),u=`agent-device close --session ${c}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c}. To open a new session on this device, first run ${u}.`)}function lB(e,t){if(!t)return[];let r=[],n=e.device,i=te(t.platform);if(i&&!tn(n.platform,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&("ios"!==n.platform||t.udid!==n.id)&&r.push({key:"udid",value:t.udid}),t.serial&&("android"!==n.platform||t.serial!==n.id)&&r.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==n.name.trim().toLowerCase()&&r.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=n.simulatorSetPath?.trim();("ios"!==n.platform||"simulator"!==n.kind||e!==i)&&r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=th(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lj(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let lV="default";function lK(e){return e.session||lV}function lH(e){if(e.meta?.sessionExplicit===!0||(e.session||lV)!==lV||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=a.resolve(e);try{return o.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(o.existsSync(a.join(t,".git")))return t;let e=a.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,n.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function lW(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lX(e,t){let r=lH(e);return!!r&&!!t.sessionScope&&!lW(t,r)}function lz(e,t){if("open"!==e.command)return;let r=$(t);if(0!==r.length)throw new eG("INVALID_ARGS","Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.",{missing:r})}function lJ(e,t,r){if(t&&r&&t!==r)throw new eG("UNAUTHORIZED",`Lease does not match session owner (${e})`,{reason:"LEASE_SESSION_MISMATCH",field:e})}async function lZ(e){let t=e.sessionStore.get(e.sessionName),r=t?.lease;return!!t&&!!r&&!!e.leaseRegistry.consumeExpiredLease(r.leaseId)&&(ef({level:"info",phase:"leased_session_expired",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,deviceKey:r.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{ef({level:"debug",phase:"leased_session_expiry_cleanup_failed",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function lY(e){return function(e,t){let r=a5(e),n=r.leaseId??t?.leaseId,i=r.tenantId??t?.tenantId,a=r.runId??t?.runId;if(i&&a&&n)return tx({tenantId:i,runId:a,leaseId:n,leaseBackend:r.leaseBackend??t?.backend,leaseProvider:r.leaseProvider??t?.leaseProvider,deviceKey:r.deviceKey??t?.deviceKey,clientId:r.clientId??t?.clientId,expiresAt:t?.expiresAt})}(e.req,e.req.internal?.admittedLease)??e.existingLease}function lQ(e){let t=e.session.lease;if(!t)return;let r=e.leaseRegistry.releaseLease(x({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}));ef({level:"info",phase:"session_lease_released",data:{session:e.session.name,leaseId:t.leaseId,released:r.released}})}function l0(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,nG(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?lB(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=te(i),void 0!==n.platform&&m&&(a=te(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!e9(o):"apple"!==o||!e9(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,d=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return l2(t)}}(h,d)&&s.push({key:"target",value:h}),function(e,t,r){for(let n of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var r;return"desktop"===(r=t).target||"macos"===te(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return l2(e)}}(r,t)){let r=t[n];nC(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=g,!S||u||void 0!==p.platform||c&&nR(p,nk)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){l1(e,t),e.platform=n.device.platform;return}l1(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eG("INVALID_ARGS",function(e,t,r){let n=t.map(lj).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${lG(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,y,t),{session:e.session,conflicts:y.map(lj),hint:function(e,t){if(t)return lq(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${e3(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function l1(e,t){for(let r of t)delete e[r.key]}function l2(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function l3(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[l5(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return l0(e)}catch{return e}}(n);if("open"===(r=l).command||nE(r.flags))try{let e=await nI(l.flags??{});s.add(l5(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=l4(e)-l4(t);return 0!==r?r:e.localeCompare(t)})}function l5(e){return`device:${e}`}function l4(e){return+!e.startsWith("session:")}function l6(e,t={}){let r=ta(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function l8(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:l6(t,{simulatorSetPath:e.simulatorSetPath})}function l9(e,t,r){return ao(l8(e,t),r)}let l7="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/ios-runner/derived, then retry.";function de(e){if(!(e instanceof eG)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function dt(e){return!(e instanceof eG)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function dr(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eG("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tu({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tf("IOS_RUNNER_CONNECT_TIMEOUT")})}async function dn(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=tu({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eG("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,r=s.stderr,(n=`${l}
|
|
1
|
+
let e,t;import{__webpack_require__ as r}from"./rslib-runtime.js";import n,{createHash as i}from"node:crypto";import a from"node:path";import o,{existsSync as s,promises as l}from"node:fs";import d from"node:http";import{fileURLToPath as c,pathToFileURL as u}from"node:url";import{AsyncLocalStorage as p}from"node:async_hooks";import{pipeline as f}from"node:stream/promises";import"node:https";import m from"node:os";import{once as h}from"node:events";import{Transform as w}from"node:stream";import v from"node:fs/promises";import y from"node:net";import{setTimeout as g}from"node:timers/promises";import{resolveUserPath as b}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as A,SCROLL_DIRECTIONS as S,leaseScopeToHeartbeatRequest as I,parseScrollDirection as _,leaseScopeToReleaseRequest as M,isStringMember as x,leaseScopeFromRequest as N,isReactNativeCollapsedWarningWrapperWithVisibleBanner as D,intersectArea as P,resolveClickButton as k,deriveMobileSnapshotHiddenContentHints as E,inferVerticalScrollIndicatorDirections as C,isScrollableType as R,normalizeScrollDurationMs as O,withSuccessText as T,honoredScrollDurationMs as L,runScrollEdgePasses as F,readViewportDimension as $,findMissingProxyLeaseFields as U,annotateCoveredSnapshotNodes as B,parseSwipePreset as q,analyzeReactNativeOverlay as G,readLocationCoordinate as V,getClickButtonValidationError as j,areRectsApproximatelyEqual as K,isSystemScrollIndicatorLabel as H,formatScrollEdgeMessage as W,isProxyLeaseScope as z,SWIPE_PATTERNS as X,successText as J,assertExclusiveScrollDistanceInputs as Z,screenshotOptionsFromFlags as Y,captureScrollEdgeState as Q,normalizeSnapshotTree as ee,isReactNativeCollapsedWarningWrapperCandidate as et,screenshotFlagsFromOptions as er,snapshotCaptureAnnotationsFrom as en,requireIntInRange as ei,inferGestureReferenceFrame as ea,parseStringMember as eo,parseDeviceRotation as es,buildScrollGesturePlan as el,buildSwipePresetGesturePlan as ed}from"./2948.js";import{withDiagnosticsScope as ec,getDiagnosticsMeta as eu,flushDiagnosticsToSessionFile as ep,withDiagnosticTimer as ef,updateDiagnosticsScope as em,countDiagnosticEventsByPhase as eh,emitDiagnostic as ew}from"./432.js";import{prewarmPngWorker as ev,isKeyboardAction as ey,formatScriptArg as eg,encodePngAsync as eb,decodePngAsync as eA,appendScriptSeriesFlags as eS,terminatePngWorker as eI,formatScriptStringLiteral as e_,formatPortableActionLine as eM,timingSafeStringEqual as ex,createAgentDevice as eN,localCommandPolicy as eD,isTouchTargetCommand as eP,CLOUD_WEBDRIVER_PROVIDERS as ek,isClickLikeCommand as eE,findMistargetedTypeRefToken as eC}from"./7871.js";import{readProcessStartTime as eR,readProcessCommand as eO,isProcessGroupAlive as eT,isAgentDeviceDaemonProcess as eL,isProcessAlive as eF}from"./9414.js";import{retriableForErrorCode as e$,toAppErrorCode as eU,asAppError as eB,normalizeError as eq,AppError as eG}from"./485.js";import{runCmdBackground as eV,runCmdStreaming as ej,runCmd as eK,runCmdSync as eH,resolveExecutableOverridePath as eW,whichCmd as ez}from"./8875.js";import{consumeTextLines as eX,normalizeTenantId as eJ,resolveSessionIsolationMode as eZ,readScreenshotResultData as eY,shellQuoteIfNeeded as eQ,serializeDaemonRpcResponseEnvelope as e0,buildDaemonHealthPayload as e1,serializeDaemonResponseEnvelope as e2,shouldStreamRequestProgress as e3,resolveDaemonPaths as e5,resolveDaemonServerMode as e4,readNodeHttpRequestBody as e6,recordSnapshotTiming as e8,resolveDaemonCodeSignature as e9,serializeDaemonProgressEnvelope as e7}from"./5913.js";import{isTvOsDevice as te,resolveAppleSimulatorSetPathForSelector as tt,normalizeRef as tr,resolveApplePlatformName as tn,isMobilePlatform as ti,matchesPlatformSelector as ta,snapshotPresentationOptionsFromFlags as to,isApplePlatform as ts,findNodeByRef as tl,centerOfRect as td,resolveDevice as tc,commandRpcParamsSchema as tu,buildSnapshotPresentationKey as tp,attachRefs as tf}from"./6849.js";import{sleep as tm}from"./5560.js";import{readVersion as th,findProjectRoot as tw}from"./1404.js";import{runAndroidAdb as tv,resolveIosSimulatorDeviceSetPath as ty,getAndroidBlockingDialogFocus as tg,withRetry as tb,Deadline as tA,isEnvTruthy as tS,openAndroidApp as tI,classifyBootFailure as t_,streamAndroidLogcatWithAdb as tM,resolveAndroidAdbProvider as tx,installAndroidAdbPackage as tN,bootFailureHint as tD,androidDeviceForSerial as tP,parseSerialAllowlist as tk,retryWithPolicy as tE,getAndroidAppState as tC,captureAndroidLogcatWithAdb as tR,resolveAndroidSerialAllowlist as tO,isDeepLinkTarget as tT,resolveAndroidAdbExecutor as tL}from"./3340.js";import{isRecord as tF,PUBLIC_COMMANDS as t$,GESTURE_SUBCOMMAND_ERROR as tU,stripUndefined as tB,splitNonEmptyTrimmedLines as tq,commandDescriptors as tG,deriveCapabilityMatrix as tV,deriveDaemonCommandDescriptors as tj}from"./1986.js";import{findNearestAncestor as tK,normalizeType as tH,pruneGroupNodes as tW,findNodeByLabel as tz,resolveRefLabel as tX}from"./893.js";import{mapManagedAgentBrowserError as tJ,acquireProcessLock as tZ,resolveAgentBrowserTool as tY}from"./8391.js";import{applyCommandDefaults as tQ}from"./9581.js";var t0,t1,t2={};r.r(t2),r.d(t2,{IH:()=>hb,ug:()=>hA,sE:()=>hu,Bx:()=>hf,hQ:()=>hp,WX:()=>hg,Co:()=>hh,wg:()=>hy,withAppLogProvider:()=>hl});var t3={};r.r(t3),r.d(t3,{bu:()=>px,abortAllIosRunnerSessions:()=>f5,hv:()=>f0,Nr:()=>mL,xN:()=>mR,gE:()=>mO,FS:()=>p_,runAppleRunnerCommand:()=>mC,stopAllIosRunnerSessions:()=>f4,yA:()=>f3});var t5={};r.r(t5),r.d(t5,{v:()=>md,M:()=>mc,withAppleRunnerProvider:()=>mu});var t4={};r.r(t4),r.d(t4,{qx:()=>oT,Ly:()=>o$,Gr:()=>oR,vT:()=>oL,Cc:()=>oF,withAppleToolProvider:()=>oO});var t6={};r.r(t6),r.d(t6,{IO:()=>o2,LB:()=>o1,xY:()=>o5,eN:()=>o3,runMacOsPressAction:()=>o8,runMacOsReadTextAction:()=>o6,rR:()=>o9,r5:()=>o4,Vi:()=>oQ});var t8={};r.r(t8),r.d(t8,{readLinuxTextAtPoint:()=>sy,r:()=>sv});var t9={};function t7(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}r.r(t9),r.d(t9,{uK:()=>sr,nE:()=>si,withLinuxToolProvider:()=>sn});let re=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...A,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function rt(e){let t=e.result?.text;if("string"==typeof t&&t.trim().length>0)return t;let r=e.positionals??[];if(0===r.length)return"";let n=r[0];return n?.startsWith("@")?r.length>=3?r.slice(2).join(" ").trim():r.slice(1).join(" ").trim():!(r.length>=3)||Number.isNaN(Number(r[0]))||Number.isNaN(Number(r[1]))?r.slice(1).join(" ").trim():r.slice(2).join(" ").trim()}function rr(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class rn{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=a.dirname(t);o.existsSync(r)||o.mkdirSync(r,{recursive:!0});let n=function(e){var t=e,r=function(e){let t=[];for(let r of e.actions){if("snapshot"===r.command)continue;let n=function(e){let t=function(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>"string"==typeof e)?e.result.selectorChain:[];return t.length>0?t.join(" || "):void 0}(e);if(t&&ri(e.command))return eE(e.command)?{...e,positionals:[t]}:"longpress"===e.command?function(e,t){let r="number"==typeof e.result?.durationMs?String(e.result.durationMs):function(e){let t=e.at(-1);if(!(e.length<=1)&&void 0!==t&&""!==t.trim())return Number.isFinite(Number(t))?t:void 0}(e.positionals??[]);return{...e,positionals:r?[t,r]:[t]}}(e,t):"fill"===e.command?function(e,t){let r=rt(e);return r.length>0?{...e,positionals:[t,r]}:void 0}(e,t):function(e,t){let r=e.positionals?.[0];return"text"===r||"attrs"===r?{...e,positionals:[r,t]}:void 0}(e,t)}(r);if(n){t.push(n);continue}let i=function(e,t){if(!ri(t.command))return;let r=t.result?.refLabel;if("string"!=typeof r||0===r.trim().length)return;let n=r.trim();return{ts:t.ts,command:"snapshot",positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:n},result:{scope:n}}}(e,r);i&&t.push(i),t.push(r)}return t}(e);let n=[],i=t.device.kind?` kind=${t.device.kind}`:"";for(let e of(n.push(`context platform=${t.device.platform} device=${e_(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,eE(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(eg(r)),ra(e,t),eS(e,t),e.join(" ");if(1===t.positionals.length)return e.push(eg(r)),eS(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(eg(r)),ra(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(eg(n)),eS(e,t),e.join(" ")}(t,r):"get"===r.command?function(e,t){let r=t.positionals?.[0],n=t.positionals?.[1];if(r&&n)return e.push(eg(r)),e.push(eg(n)),n.startsWith("@")&&ra(e,t),e.join(" ")}(t,r):void 0);return n||eM(e)}(e));return`${n.join("\n")}
|
|
2
|
+
`}(e);return o.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ew({level:"warn",phase:"session_script_write_failed",data:{session:e.name,path:t,error:r instanceof Error?r.message:String(r)}}),{written:!1}}}resolveScriptPath(e){if(e.saveScriptPath)return b(e.saveScriptPath,{cwd:void 0});o.existsSync(this.sessionsDir)||o.mkdirSync(this.sessionsDir,{recursive:!0});let t=t7(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.ad`)}}function ri(e){return eP(e)||"fill"===e||"get"===e}function ra(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(eg(r))}class ro{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new rn(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){t.flags?.noRecord||(t.flags?.saveScript&&(e.recordSession=!0,"string"==typeof t.flags.saveScript&&(e.saveScriptPath=b(t.flags.saveScript,{cwd:void 0}))),e.actions.push({ts:Date.now(),command:t.command,positionals:t.positionals,runtime:t.runtime,flags:function(e){if(!e)return{};let t={};for(let r of re)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ew({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ew({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=t7(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return a.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return a.join(this.sessionsDir,t7(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return o.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return a.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return a.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return b(e,{cwd:t})}}function rs(e){return a.join(e,"runner.log")}function rl(e,t){let r=t7(t&&t.length>0?t:"unknown");return a.join(e,"requests",`${r}.ndjson`)}let rd="app-log.pid";function rc(e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t))return{pid:Number.parseInt(t,10)};try{let e=JSON.parse(t);if(!Number.isInteger(e.pid)||e.pid<=0)return null;return e}catch{return null}}function ru(e,t){if(!e)return;let r=a.dirname(e);o.existsSync(r)||o.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:eR(t)??void 0,command:eO(t)??void 0};o.writeFileSync(e,`${JSON.stringify(n)}
|
|
3
|
+
`)}function rp(e){if(e&&o.existsSync(e))try{o.unlinkSync(e)}catch{}}let rf=new Set,rm=new Map,rh="request_canceled",rw="request canceled";function rv(e,t){if("string"==typeof e&&e.length>0)return e;let r=("string"==typeof t?t:"number"==typeof t&&Number.isFinite(t)?String(t):"generated").trim().replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,32)||"generated",n=Math.random().toString(36).slice(2,10);return`req:${r}:${process.pid}:${Date.now()}:${n}`}function ry(e){if(!e)return;!function(e){if(e.size<=5e4)return;let t=0;for(let r of e.keys()){if(t>=1e4)break;e.delete(r),t++}}(rm);let t=new AbortController;rm.set(e,t),rf.has(e)&&t.abort()}function rg(e){e&&(!function(e){if(e.size<=5e4)return;let t=0;for(let r of e){if(t>=1e4)break;e.delete(r),t++}}(rf),rf.add(e),rm.get(e)?.abort())}function rb(e){e&&(rf.delete(e),rm.delete(e))}function rA(e){return!!e&&rf.has(e)}function rS(e){if(e)return rm.get(e)?.signal}function rI(){return new eG("COMMAND_FAILED",rw,{reason:rh})}function r_(e){if(rA(e))throw rI()}function rM(e){return e instanceof eG&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rh||e.message===rw)}let rx=new Map;function rN(e){let t=n.randomUUID(),r=setTimeout(()=>{rD(t)},9e5);return r.unref(),rx.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:r}),t}function rD(e){let t=rx.get(e);if(t&&(clearTimeout(t.timer),rx.delete(e),t.deleteAfterDownload))try{o.rmSync(t.artifactPath,{force:!0})}catch{}}let rP=new Map;function rk(e,t){let r=rP.get(e);if(!r)throw new eG("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rE(e){let t=rP.get(e);t&&(clearTimeout(t.timer),rP.delete(e),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}let rC=new p,rR=new p;async function rO(e,t){return await rC.run(e,t)}function rT(e){rC.getStore()?.(e)}async function rL(e,t){return await rR.run(e,t)}function rF(){return rR.getStore()}function r$(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rU(e,t){e.statusCode=r$(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}async function rB(e){let t=await rq(e);await eK("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=a.join(e.tempDir,t);if(!o.existsSync(r))throw new eG("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rq(e){let t=await eK("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eG("INVALID_ARGS","Artifact is not a valid tar archive",{archivePath:e.archivePath,stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===r.length)throw new eG("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rG),i=e.expectedRootName??function(e,t){let r=new Set;for(let t of e){let[e]=t.split("/");e&&r.add(e)}let n=[...r];if("ios"===t){let e=n.filter(e=>e.toLowerCase().endsWith(".app")),t=e[0];if(void 0!==t&&1===e.length)return t;if(0===e.length)throw new eG("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eG("INVALID_ARGS",`iOS app bundle archives must contain exactly one top-level .app directory, found: ${e.join(", ")}`)}let i=n[0];if(void 0!==i&&1===n.length)return i;throw new eG("INVALID_ARGS",`Archive must contain a single top-level bundle, found: ${n.join(", ")}`)}(n,e.platform);if(!n.some(e=>e===i||e.startsWith(`${i}/`)))throw new eG("INVALID_ARGS",`Uploaded archive must contain a top-level "${i}" bundle`);for(let e of n){var a=e,o=i;if(a!==o&&!a.startsWith(`${o}/`))throw new eG("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eK("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eG("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rG(e){if(e.includes("\0"))throw new eG("INVALID_ARGS",`Invalid archive entry: ${e}`);if(a.posix.isAbsolute(e))throw new eG("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=a.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eG("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rV(e){let t=e.trim(),r=a.basename(t);if(!r||"."===r||".."===r)throw new eG("INVALID_ARGS",`Invalid artifact filename: ${e}`);return r}function rj(e){let t=function(e){let t=e?.trim();if(!t)return"request";let r=t.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0?r.slice(0,48):"request"}(e);return o.mkdtempSync(a.join(m.tmpdir(),`agent-device-artifact-${t}-`))}function rK(e){if(void 0===e)return;let t=Number(e);if(Number.isFinite(t)&&t>0x80000000)throw new eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}function rH(e,t){return new Promise((r,n)=>{let i,a=!1,s=0,l=o.createWriteStream(t),d=e=>{if(!a){if(a=!0,i&&clearTimeout(i),e)return void rW(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eG("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),d(t)},6e4)},u=new w({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eG("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eG("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),f(e,u,l).then(()=>d(),e=>d(e))})}async function rW(e,t){if(e.destroy(),!e.closed)try{await h(e,"close")}catch{}await o.promises.rm(t,{force:!0}).catch(()=>{})}let rz=new Map,rX=new Map;async function rJ(e){let t=r0(e.uploadId,e.tenantId),r=r1(t),n=function(e,t){var r,n;let i,a=Array.isArray(e)?e[0]:e;if(!a)return;let o=(i=a.match(/^bytes (\d+)-(\d+)\/(\d+)$/))?{start:Number(i[1]),end:Number(i[2]),size:Number(i[3])}:null;if(!o||(r=o,n=t,!(Number.isSafeInteger(r.start)&&Number.isSafeInteger(r.end)&&Number.isSafeInteger(r.size))||!(r.start>=0)||!(r.end>=r.start)||r.size!==n))throw new eG("INVALID_ARGS","Invalid content-range header");return{start:o.start,end:o.end}}(e.req.headers["content-range"],t.sizeBytes);if(n&&n.start!==r||!n&&r>0)return{complete:!1,offset:r};rK(e.req.headers["content-length"]),await f(e.req,o.createWriteStream(t.payloadPath,{flags:"a"})),rY(t);let i=r1(t);return{complete:i>=t.sizeBytes,offset:i}}async function rZ(e,t){let r=r0(e,t),n=r1(r);if(n!==r.sizeBytes)throw new eG("INVALID_ARGS","Upload is incomplete",{uploadId:e,offset:n,sizeBytes:r.sizeBytes});let i=await r2(r.payloadPath);if(i!==r.sha256)throw rQ(r.id),new eG("INVALID_ARGS","Upload hash mismatch",{uploadId:e,expectedSha256:r.sha256,actualSha256:i});if(rz.delete(r.id),rX.delete(r.key),clearTimeout(r.timer),"file"===r.artifactType){let e=a.join(r.tempDir,r.fileName);return o.renameSync(r.payloadPath,e),{artifactPath:e,tempDir:r.tempDir}}let s=await rB({archivePath:r.payloadPath,tempDir:r.tempDir,platform:"android"===r.platform?"android":"ios",expectedRootName:r.fileName});return o.rmSync(r.payloadPath,{force:!0}),{artifactPath:s,tempDir:r.tempDir}}function rY(e){clearTimeout(e.timer),e.timer=setTimeout(()=>rQ(e.id),3e5),e.timer.unref()}function rQ(e){let t=rz.get(e);t&&(clearTimeout(t.timer),rz.delete(e),rX.delete(t.key),o.rmSync(t.tempDir,{recursive:!0,force:!0}))}function r0(e,t){let r=rz.get(e);if(!r)throw new eG("INVALID_ARGS",`Upload not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Upload belongs to a different tenant");return r}function r1(e){return o.existsSync(e.payloadPath)?Math.min(o.statSync(e.payloadPath).size,e.sizeBytes):0}async function r2(e){let t=n.createHash("sha256");return await f(o.createReadStream(e),async function*(e){for await(let r of e)t.update(r),yield r}),t.digest("hex")}async function r3(e){let t=e.headers["x-artifact-type"],r=e.headers["x-artifact-filename"];if(!t||!r)throw new eG("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==t&&"app-bundle"!==t)throw new eG("INVALID_ARGS",`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);rK(e.headers["content-length"]);let n=rV(r),i=rj("upload");try{if("file"===t){let t=a.join(i,n);return await rH(e,t),{artifactPath:t,tempDir:i}}let r=a.join(i,"artifact.tar");await rH(e,r);let s=await rB({archivePath:r,tempDir:i,platform:"ios",expectedRootName:n});return o.rmSync(r,{force:!0}),{artifactPath:s,tempDir:i}}catch(e){throw o.rmSync(i,{recursive:!0,force:!0}),e}}let r5="/upload/direct/";async function r4(e,t,r,n,i){switch(e.kind){case"preflight":await r8(t,r,n,i);return;case"direct":await r9(e.uploadId,t,r,n);return;case"finalize":await r7(t,r,n);return;case"upload":await r6(t,r,n);return}}async function r6(e,t,r){try{let n=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:[]}});if(!n)return;nt(t,await r3(e),n.tenantId)}catch(e){rU(t,eq(e))}}async function r8(e,t,r,i){try{var o,s,l,d,c,u,p;let f,m,h,w,v,y,g=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:["preflight"]}});if(!g)return;let b=(s=await nr(e,65536),{sha256:nn(s,"sha256"),uploadAttemptId:nn(s,"uploadAttemptId"),fileName:nn(s,"fileName"),sizeBytes:function(e,t){let r=e[t];if("number"!=typeof r||!Number.isSafeInteger(r))throw new eG("INVALID_ARGS",`${t} must be an integer`);return r}(s,"sizeBytes"),artifactType:function(e){let t=nn(e,"artifactType");if("file"===t||"app-bundle"===t)return t;throw new eG("INVALID_ARGS",'artifactType must be "file" or "app-bundle"')}(s),platform:ni(s,"platform"),contentType:ni(s,"contentType")}),A=(o={baseUrl:function(e){let t="string"==typeof e.headers.host?e.headers.host:"";if(!t)throw new eG("INVALID_ARGS","Missing host header");let r=e.headers["x-forwarded-proto"],n=Array.isArray(r)?r[0]:r;return`${n||"http"}://${t}`}(e),tokenHeaders:(l=i,{authorization:`Bearer ${l}`,"x-agent-device-token":l}),...b,tenantId:g.tenantId},function(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new eG("INVALID_ARGS","Invalid upload sha256");if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new eG("INVALID_ARGS","Invalid upload sizeBytes");if(rK(String(e.sizeBytes)),rV(e.fileName),!e.uploadAttemptId.trim())throw new eG("INVALID_ARGS","uploadAttemptId is required")}(o),w=[(d=o).tenantId??"",d.uploadAttemptId,d.sha256.toLowerCase(),String(d.sizeBytes),rV(d.fileName),d.artifactType,d.platform??""].join("\0"),y=((v=rX.get(w))?rz.get(v):void 0)??(c=o,u=w,f=n.randomUUID(),m=rj("upload"),(h={id:f,key:u,tempDir:m,payloadPath:a.join(m,"payload"),fileName:rV(c.fileName),sizeBytes:c.sizeBytes,sha256:c.sha256.toLowerCase(),artifactType:c.artifactType,platform:c.platform,tenantId:c.tenantId,timer:setTimeout(()=>rQ(f),3e5)}).timer.unref(),rz.set(f,h),rX.set(u,f),h),rY(y),{uploadId:y.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${y.id}`,(p=o.baseUrl).endsWith("/")?p:`${p}/`).toString(),headers:{...o.tokenHeaders,"content-type":o.contentType||"application/octet-stream"}}});ne(t,{ok:!0,...A})}catch(e){rU(t,eq(e))}}async function r9(e,t,r,n){try{let i=await n({req:t,res:r,daemonRequest:{command:"upload",positionals:["direct",e]}});if(!i)return;let a=await rJ({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){r.statusCode=200,r.end("ok");return}r.statusCode=308,a.offset>0&&r.setHeader("range",`bytes=0-${a.offset-1}`),r.setHeader("x-upload-offset",String(a.offset)),r.end()}catch(e){rU(r,eq(e))}}async function r7(e,t,r){try{var n;let i=await r({req:e,res:t,daemonRequest:{command:"upload",positionals:["finalize"]}});if(!i)return;let a=(n=await nr(e,65536),{uploadId:nn(n,"uploadId")});nt(t,await rZ(a.uploadId,i.tenantId),i.tenantId)}catch(e){rU(t,eq(e))}}function ne(e,t){e.statusCode=200,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nt(e,t,r){var i;let a,o;ne(e,{ok:!0,uploadId:(i={artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:r},a=n.randomUUID(),(o=setTimeout(()=>{rE(a)},3e5)).unref(),rP.set(a,{artifactPath:i.artifactPath,tempDir:i.tempDir,tenantId:i.tenantId,timer:o}),a)})}async function nr(e,t){let r=(await e6(e,t,"Request body is too large.")).toString("utf8");try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("expected object");return e}catch(e){throw new eG("INVALID_ARGS","Invalid JSON request body",{},e)}}function nn(e,t){let r=ni(e,t)?.trim();if(!r)throw new eG("INVALID_ARGS",`${t} is required`);return r}function ni(e,t){let r=e[t];return"string"==typeof r?r:void 0}let na=new Set(["replay","test"]),no=new Set(["agent_device.command","agent-device.command"]),ns=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),nl=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),nd={"agent_device.lease.allocate":"lease_allocate","agent-device.lease.allocate":"lease_allocate","agent_device.lease.heartbeat":"lease_heartbeat","agent-device.lease.heartbeat":"lease_heartbeat","agent_device.lease.release":"lease_release","agent-device.lease.release":"lease_release"},nc=new Set([...no,...ns,...nl,...Object.keys(nd)]);function nu(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function np(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function nf(e,t){e.destroyed||(e.write(e0(t)),e.end())}function nm(e,t){let r="string"==typeof t.authorization?t.authorization:"",n=r.toLowerCase().startsWith("bearer ")?r.slice(7):void 0,i="string"==typeof t["x-agent-device-token"]?t["x-agent-device-token"]:void 0;return("string"==typeof e.token?e.token:void 0)??i??n??""}function nh(e,t){let r=e[t];return"string"==typeof r?r:void 0}function nw(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function nv(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eG("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function ny(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eG("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function ng(e,t){if(!e)return{ok:!0};let r=await e(t);if(void 0===r||!0===r)return{ok:!0};if(!1===r){let e=eq(new eG("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:nu(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eq(new eG(eU(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:nu(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eJ(r.tenantId);if(!e){let e=eq(new eG("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:nu(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function nb(){let e,t=process.env.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let r=process.env.AGENT_DEVICE_HTTP_AUTH_EXPORT||"default",n=a.isAbsolute(t)?t:a.resolve(t);try{e=await import(u(n).href)}catch(e){throw new eG("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let i=e[r];if("function"!=typeof i)throw new eG("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return i}async function nA(e){let t=await nb(),{handleRequest:r,token:n}=e;return d.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify(e1("agent-device-daemon")));return}if(function(e){var t;let{req:r,res:n,authorize:i,token:a}=e,o="POST"===(t=r).method&&"/upload/preflight"===t.url?{kind:"preflight"}:"PUT"===t.method&&t.url?.startsWith(r5)?{kind:"direct",uploadId:t.url.slice(r5.length).replace(/\?.*$/,"")}:"POST"===t.method&&"/upload/finalize"===t.url?{kind:"finalize"}:"POST"===t.method&&"/upload"===t.url?{kind:"upload"}:null;return null!==o&&(r4(o,r,n,i,a),!0)}({req:e,res:i,token:nm({},e.headers),authorize:async e=>await n_({req:e.req,res:e.res,authHook:t,expectedToken:n,daemonRequest:e.daemonRequest})}))return;if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void nS(e,i,t,n);if("POST"!==e.method||"/rpc"!==e.url){i.statusCode=404,i.end("Not found");return}let a="";e.setEncoding("utf8"),e.on("data",t=>{(a+=t).length>1048576&&e.destroy(Error("request too large"))}),e.on("error",()=>{i.headersSent||np(i,nu(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{np(i,nu(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void np(i,nu(n.id??null,-32600,"Invalid Request"),400);if(!nc.has(n.method))return void np(i,nu(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void np(i,nu(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(no.has(e))return n=function(e){try{return tu.parse(e)}catch(t){let e=t instanceof Error?function(e){let t=e.indexOf(": ");if(-1===t||!e.startsWith("$"))return e;let r=e.slice(0,t).replace(/^\$\.?/,""),n=e.slice(t+2);return r?`${r}: ${n}`:n}(t.message):"invalid command params";throw new eG("INVALID_ARGS",`Invalid params: ${e}`)}}(t),{token:nm(n,r),session:n.session??"default",command:n.command??"",positionals:n.positionals??[],flags:n.flags,runtime:n.runtime,meta:n.meta};if(ns.has(e)){var n;let e,i=nh(t,"platform");if("ios"!==i&&"android"!==i)throw new eG("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:nm(t,r),session:nh(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:i},meta:{requestId:nh(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eG("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eG("INVALID_ARGS","Invalid params: source.url is required for url sources");let r=t.headers,n={};if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw new eG("INVALID_ARGS","Invalid params: source.headers must be a string map");for(let[e,t]of Object.entries(r)){if("string"!=typeof t)throw new eG("INVALID_ARGS","Invalid params: source.headers values must be strings");n[e]=t}}return Object.keys(n).length>0?{kind:"url",url:e,headers:n}:{kind:"url",url:e}}if("path"===t.kind){let e="string"==typeof t.path?t.path.trim():"";if(!e)throw new eG("INVALID_ARGS","Invalid params: source.path is required for path sources");return{kind:"path",path:e}}if("github-actions-artifact"===t.kind)return function(e){let t,r=nv(e,"owner"),n=nv(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eG("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eG("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eG("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:ny(e,"artifactId")}:(a&&(t=ny(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:nv(e,"artifactName")})}(t);throw new eG("INVALID_ARGS",'Invalid params: source.kind must be "url", "path", or "github-actions-artifact"')}(t),retainMaterializedPaths:(e=t.retainPaths,"boolean"==typeof e?e:void 0),materializedPathRetentionMs:nw(t,"retentionMs")}}}if(nl.has(e)){let e=nh(t,"materializationId")?.trim();if(!e)throw new eG("INVALID_ARGS","Invalid params: materializationId is required");return{token:nm(t,r),session:nh(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:nh(t,"requestId"),materializationId:e}}}let i=nd[e];if(i)return{token:nm(t,r),session:nh(t,"session")??"default",command:i,positionals:[],meta:{tenantId:nh(t,"tenantId")??nh(t,"tenant"),runId:nh(t,"runId"),leaseId:nh(t,"leaseId"),leaseTtlMs:nw(t,"ttlMs"),leaseBackend:nh(t,"backend"),leaseProvider:nh(t,"leaseProvider")??nh(t,"provider"),deviceKey:nh(t,"deviceKey"),clientId:nh(t,"clientId")}};throw new eG("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,no.has(l)&&("string"!=typeof c.command||0===c.command.length))return void np(i,nu(n.id??null,-32602,"Invalid params: command is required"),400);o=rv(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},ry(o);let u=await ng(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void np(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||na.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rg(o),ew({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&nI(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),e3(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rO(e=>{!i.destroyed&&i.write(e7(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:nu(n.id??null,-32e3,e.error.message,e.error);nf(i,t);return}let h=await r(c);if(s=!0,h.ok)return void np(i,{jsonrpc:"2.0",id:n.id??null,result:h});np(i,nu(n.id??null,-32e3,h.error.message,h.error),r$(h.error.code))}catch(r){s=!0;let e=eq(r),t="INVALID_ARGS"===e.code?-32602:-32e3;if(i.headersSent)return void nf(i,nu(n.id??null,t,e.message,e));np(i,nu(n.id??null,t,e.message,e),r$(e.code))}finally{rb(o)}})})}async function nS(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let a=await n_({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!a)return;let s=function(e,t){let r=rx.get(e);if(!r)throw new eG("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Artifact belongs to a different tenant");if(!o.existsSync(r.artifactPath))throw rD(e),new eG("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,a.tenantId),l=o.createReadStream(s.artifactPath);t.statusCode=200,t.setHeader("content-type","application/octet-stream"),s.fileName&&t.setHeader("content-disposition",`attachment; filename="${s.fileName.replace(/"/g,"")}"`),l.on("error",e=>{if(t.headersSent)t.destroy(e);else{let r=eq(e);t.statusCode=r$(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rD(i)}),l.pipe(t)}catch(e){rU(t,eq(e))}}async function nI(e){try{let t=Date.now()+15e3;for(;rA(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(t3);if(await t(),!rA(e))break;await tm(200)}}catch(e){ew({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function n_(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=nm({},n.headers),d=(t=l,!(r=o)||ex(t,r)?null:eq(new eG("UNAUTHORIZED","Invalid token")));if(d)return rU(i,d),null;let c=await ng(a,{headers:n.headers,rpcRequest:{jsonrpc:"2.0",id:null,method:"agent_device.command"},daemonRequest:{token:l,session:"default",command:s.command,positionals:s.positionals}});return c.ok?{tenantId:c.tenantId}:(i.statusCode=c.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:c.response.error?.data?.message??c.response.error?.message??"Unauthorized"})),null)}function nM(e){return{provider:e.provider,providerSessionId:e.providerSessionId,status:e.artifacts.length>0?"ready":"pending",cloudArtifacts:e.artifacts,...e.artifacts.length>0?{}:{message:e.pendingMessage}}}let nx={support:"supported"},nN={support:"unsupported"},nD={lease:nx,inventory:{support:"partial",note:"Inventory exposes only the leased cloud device, not the provider catalog."},install:{support:"partial",note:"Requires provider-specific upload or a path visible to the remote Appium server."},open:nx,close:nx,snapshot:{support:"partial",note:"Uses Appium page source XML, not agent-device native snapshot backends."},screenshot:nx,tap:nx,doubleTap:nx,longPress:nx,swipe:nx,scroll:{support:"partial",note:"Implemented as viewport-relative W3C pointer gestures."},fill:nx,type:nx,back:nx,home:{support:"partial",note:"Uses provider/Appium mobile pressButton support where available."},rotate:{support:"partial",note:"Uses provider/Appium mobile rotate support where available."},appSwitcher:{support:"partial",note:"Uses provider/Appium mobile pressButton support where available."},"clipboard.read":{support:"partial",note:"Uses provider/Appium clipboard extension support where available."},"clipboard.write":{support:"partial",note:"Uses provider/Appium clipboard extension support where available."},settings:nN,pinch:nN,rotateGesture:nN,transformGesture:nN,logs:nN,record:nN,artifacts:nN,portReverse:nN,nativeSnapshotBackend:{support:"unsupported",note:"Cloud WebDriver cannot upload or run agent-device native runner/helper backends."}};function nP(e){return{provider:e.provider,platform:e.platform,snapshotBackend:"ios"===e.platform?"xctest":"android",snapshotSource:"appium-page-source",operations:function(e,t){let r={...e};for(let[n,i]of Object.entries(t??{}))r[n]="string"==typeof i?{...e[n],support:i}:{...e[n],...i};return r}(nD,e.overrides)}}function nk(e,t){return"unsupported"!==e.operations[t].support}function nE(e,t){let r=e.operations[t],n=r.note?` ${r.note}`:"";return`${e.provider} WebDriver runtime does not support ${t}.${n}`}function nC(){return{"x-agent-device-client":"agent-device-cli","x-agent-device-version":th()}}function nR(e){return`Basic ${Buffer.from(`${e.username}:${e.accessKey}`).toString("base64")}`}class nO{endpoint;headers;requestPolicy;sessionId;constructor(e){this.endpoint=function(e){if(e.pathname.endsWith("/"))return e;let t=new URL(e);return t.pathname=`${t.pathname}/`,t}(new URL(e.endpoint)),this.headers={...nC(),...e.auth?{Authorization:nR(e.auth)}:{},...e.headers},this.requestPolicy={timeoutMs:e.requestPolicy?.timeoutMs??3e4,retryAttempts:e.requestPolicy?.retryAttempts??1,retryDelayMs:e.requestPolicy?.retryDelayMs??250}}async createSession(e){var t;let r=function(e){if(!e||"object"!=typeof e)throw new eG("COMMAND_FAILED","WebDriver create-session response was empty.");let t="string"==typeof e.sessionId?e.sessionId:"string"==typeof e.session_id?e.session_id:void 0;if(!t)throw new eG("COMMAND_FAILED","WebDriver create-session response missed sessionId.",{response:e});return{sessionId:t,capabilities:e.capabilities&&"object"==typeof e.capabilities?e.capabilities:{}}}(await this.requestValue("POST","/session",{capabilities:"alwaysMatch"in(t=e)||"firstMatch"in t?t:{alwaysMatch:t}}));return this.sessionId=r.sessionId,r}async deleteSession(){let e=this.requireSessionId();await this.requestValue("DELETE",`/session/${e}`),this.sessionId=void 0}async installApp(e){await this.sessionRequest("POST","/appium/device/install_app",{appPath:e})}async activateApp(e){try{await this.sessionRequest("POST","/appium/device/activate_app",{appId:e})}catch{await this.executeScript("mobile: activateApp",[{appId:e,bundleId:e}])}}async terminateApp(e){try{await this.sessionRequest("POST","/appium/device/terminate_app",{appId:e})}catch{await this.executeScript("mobile: terminateApp",[{appId:e,bundleId:e}])}}async performActions(e){await this.sessionRequest("POST","/actions",{actions:e})}async releaseActions(){await this.sessionRequest("DELETE","/actions",void 0,{retryAttempts:0})}async sendKeys(e){await this.sessionRequest("POST","/keys",{value:Array.from(e)})}async hideKeyboard(){await this.sessionRequest("POST","/appium/device/hide_keyboard",void 0,{retryAttempts:0})}async back(){await this.sessionRequest("POST","/back")}async source(){let e=await this.sessionRequest("GET","/source");if("string"!=typeof e)throw new eG("COMMAND_FAILED","WebDriver source response was not a string",{valueType:typeof e});return e}async screenshot(e){let t=await this.sessionRequest("GET","/screenshot");if("string"!=typeof t)throw new eG("COMMAND_FAILED","WebDriver screenshot response was not base64 text",{valueType:typeof t});await v.writeFile(e,Buffer.from(t,"base64"))}async windowRect(){var e=await this.sessionRequest("GET","/window/rect");if(!e||"object"!=typeof e)throw new eG("COMMAND_FAILED","WebDriver window rect response was empty.");let t={x:nT(e,"x"),y:nT(e,"y"),width:nT(e,"width"),height:nT(e,"height")};if(void 0===t.x||void 0===t.y||void 0===t.width||void 0===t.height)throw new eG("COMMAND_FAILED","WebDriver window rect response was invalid.",{response:e});return t}async executeScript(e,t=[]){return await this.sessionRequest("POST","/execute/sync",{script:e,args:t})}async sessionRequest(e,t,r,n){let i=this.requireSessionId();return await this.requestValue(e,`/session/${i}${t}`,r,n)}requireSessionId(){if(!this.sessionId)throw new eG("SESSION_NOT_FOUND","WebDriver session has not been created yet.");return this.sessionId}async requestValue(e,t,r,n){let i,a=n?.retryAttempts??this.requestPolicy.retryAttempts;for(let n=0;n<=a;n+=1)try{return await this.requestValueOnce(e,t,r)}catch(e){if(i=e,!function(e){if(e instanceof eG){let t=e.details?.status;return"number"==typeof t&&t>=500}return e instanceof TypeError||e instanceof Error&&"TimeoutError"===e.name}(e)||n>=a)throw e;await tm(this.requestPolicy.retryDelayMs)}throw i}async requestValueOnce(e,t,r){var n,i,a;let o=await fetch(new URL(function(e){let t=0;for(;t<e.length&&47===e.charCodeAt(t);)t+=1;return 0===t?e:e.slice(t)}(t),this.endpoint),{method:e,headers:{Accept:"application/json",...void 0===r?{}:{"Content-Type":"application/json"},...this.headers},body:void 0===r?void 0:JSON.stringify(r),signal:AbortSignal.timeout(this.requestPolicy.timeoutMs)}),s=await o.text(),l=s?function(e){try{return JSON.parse(e)}catch(t){throw new eG("COMMAND_FAILED","WebDriver response was not valid JSON.",{text:e},t)}}(s):{};if(!o.ok){let e;throw n=o.status,new eG("COMMAND_FAILED",(e=(i=l)&&"object"==typeof i&&"value"in i?i.value:i)&&"object"==typeof e&&"string"==typeof e.message?e.message:`WebDriver request failed with HTTP ${n}.`,{status:n,response:i})}return(a=l)&&"object"==typeof a&&"value"in a?a.value:a}}function nT(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function nL(e){if(!e)return;let t=/\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]/.exec(e);if(!t)return;let r=Number(t[1]),n=Number(t[2]);return{x:r,y:n,width:Math.max(0,Number(t[3])-r),height:Math.max(0,Number(t[4])-n)}}let nF=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),n$=new Set([" "," ","\n","\r"]),nU=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function nB(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new nG(e).parse()}function nq(e,t){for(let r of e){if("dict"===r.name)for(let e=0;e<r.children.length-1;e+=1){let n=r.children[e],i=r.children[e+1];n?.name==="key"&&n.text&&i&&t(n.text,i)}nq(r.children,t)}}class nG{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){"<"!==this.xml[this.index]?this.readText():this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith("\x3c!--")?()=>this.skipUntil("--\x3e","Comment is not closed."):this.startsWith("<?")?()=>this.skipUntil("?>","Processing instruction is not closed."):this.startsWith("<![CDATA[")?()=>this.readCdata():this.startsWith("<!")?()=>this.skipDeclaration():this.startsWith("</")?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??"unknown"}>.`)}}skipByteOrderMark(){65279===this.xml.charCodeAt(0)&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:r}=this.readOpeningTagBody(),n={name:e,attributes:t,text:null,children:[]};this.addNode(n),r||this.pushOpenNode(n)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let r=this.readAttribute();e[r.name]=r.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error("Opening XML tag is not closed.");return">"===this.xml[this.index]?(this.index+=1,"open"):"/"===this.xml[this.index]&&">"===this.xml[this.index+1]?(this.index+=2,"self-closing"):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(function(e){if(nU.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}(e),this.skipWhitespace(),"="!==this.xml[this.index])throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error("Maximum XML nesting depth of 256 exceeded.");this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),">"!==this.xml[this.index])throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf("<",this.index),t=-1===e?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf("]]>",e);if(-1===t)throw Error("CDATA section is not closed.");this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(e,t){let r=e.trim();if(!r)return;let n=this.stack[this.stack.length-1];n&&(n.text=`${n.text??""}${t?nV(r):r}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){var e;let t=this.index;for(;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&nF.has(e);)this.index+=1;return this.xml.slice(t,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(e){let t=this.xml[this.index];if('"'!==t&&"'"!==t)throw Error(`XML attribute "${e}" must use a quoted value.`);this.index+=1;let r=this.index,n=this.xml.indexOf(t,r);if(-1===n)throw Error(`XML attribute "${e}" is not closed.`);return this.index=n+1,nV(this.xml.slice(r,n).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(function(e,t){var r,n,i;return!(void 0===t||(r=e,n=t,r.quote?(n===r.quote&&(r.quote=null),!0):('"'===n||"'"===n)&&(r.quote=n,!0)))&&(function(e,t){if("["===t){e.bracketDepth+=1;return}"]"===t&&e.bracketDepth>0&&(e.bracketDepth-=1)}(e,t),i=e,">"===t&&0===i.bracketDepth)}(e,this.xml[t])){this.index=t+1;return}throw Error("XML declaration is not closed.")}skipUntil(e,t){let r=this.xml.indexOf(e,this.index+e.length);if(-1===r)throw Error(t);this.index=r+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&n$.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function nV(e){return e.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,(e,t)=>{switch(t){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:var r=e,n=t;let i=n.startsWith("#x")?Number.parseInt(n.slice(2),16):Number(n.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return r;try{return String.fromCodePoint(i)}catch{return r}}})}function nj(e){let t=nB(e),r=[];for(let e of t)!function e(t,r,n,i=0){let a=0===Object.keys(r.attributes).length?n:function(e,t,r,n){let i=e.length;return e.push(function(e,t,r,n,i){var a;let o=function(e){let t=nL(e.bounds??null);if(t)return t;let r=nz(e.x),n=nz(e.y),i=nz(e.width),a=nz(e.height);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x:r,y:n,width:i,height:a}}(r),s=nW(r.enabled,!0),l=nW(r.displayed??r.visible,!0);return{index:e,type:t,role:(a=t,nH(r.class)??nH(a.replace(/^XCUIElementType/,"").toLowerCase())),label:nK(r,["content-desc","label","text","name"]),value:nH(r.value),identifier:nK(r,["resource-id","id","accessibility-id","name"]),rect:o,enabled:s,selected:nW(r.selected),focused:nW(r.focused),visibleToUser:l,hittable:l&&s&&void 0!==o&&o.width>0&&o.height>0,depth:i,parentIndex:n}}(i,t.name,t.attributes,r,n)),i}(t,r,n,i),o=a===n?i:i+1;for(let n of r.children)e(t,n,a,o)}(r,e);return r}function nK(e,t){for(let r of t){let t=nH(e[r]);if(void 0!==t)return t}}function nH(e){return e||void 0}function nW(e,t=!1){return void 0===e?t:"true"===e||"1"===e}function nz(e){if(void 0===e||""===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}class nX{client;backend;capabilities;constructor(e,t,r){this.client=e,this.backend=t,this.capabilities=r}async open(e,t){if(this.requireSupport("open"),t?.url)return void await this.client.executeScript("mobile: deepLink",[{url:t.url,package:e}]);let r=t?.appBundleId??e;r&&await this.client.activateApp(r)}async openDevice(){this.requireSupport("open"),await this.client.executeScript("mobile: activateApp",[{}])}async close(e){this.requireSupport("close"),e&&await this.client.terminateApp(e)}async tap(e,t){return this.requireSupport("tap"),await this.pointerGesture("tap",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t}}async doubleTap(e,t){return this.requireSupport("doubleTap"),await this.pointerGesture("doubleTap",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerUp",button:0},{type:"pause",duration:80},{type:"pointerDown",button:0},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t}}async swipe(e,t,r,n,i=400){return this.requireSupport("swipe"),await this.pointerGesture("swipe",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pointerMove",duration:i,x:r,y:n},{type:"pointerUp",button:0}]),{backend:"webdriver",x1:e,y1:t,x2:r,y2:n,durationMs:i}}async pan(e,t,r,n,i){return await this.swipe(e,t,r,n,i)}async fling(e,t,r,n,i=150){return await this.swipe(e,t,r,n,i)}async longPress(e,t,r=600){return this.requireSupport("longPress"),await this.pointerGesture("longPress",[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:r},{type:"pointerUp",button:0}]),{backend:"webdriver",x:e,y:t,durationMs:r}}async focus(e,t){return await this.tap(e,t)}async type(e){this.requireSupport("type"),await this.client.sendKeys(e)}async fill(e,t,r,n){return this.requireSupport("fill"),await this.tap(e,t),await this.type(r),{backend:"webdriver",x:e,y:t,text:r}}async scroll(e,t){this.requireSupport("scroll");let r=t?.durationMs??350;await this.client.hideKeyboard().catch(()=>void 0);let n=await this.scrollGestureFrame(),i=el({direction:e,amount:t?.amount,pixels:t?.pixels,referenceWidth:n.width,referenceHeight:n.height}),a={...i,x1:i.x1+n.x,y1:i.y1+n.y,x2:i.x2+n.x,y2:i.y2+n.y};return await this.swipe(a.x1,a.y1,a.x2,a.y2,r),{backend:"webdriver",...a,distance:i.pixels,durationMs:r}}async pinch(e,t,r){this.unsupported("pinch")}async screenshot(e,t){this.requireSupport("screenshot"),await this.client.screenshot(e)}async snapshot(e){return this.requireSupport("snapshot"),{backend:this.backend,nodes:nj(await this.client.source())}}async back(e){this.requireSupport("back"),await this.client.back()}async home(){this.requireSupport("home"),await this.client.executeScript("mobile: pressButton",[{name:"home"}])}async rotate(e){this.requireSupport("rotate"),await this.client.executeScript("mobile: rotate",[{orientation:e}])}async rotateGesture(e,t,r,n){this.unsupported("rotateGesture")}async transformGesture(e){this.unsupported("transformGesture")}async appSwitcher(){this.requireSupport("appSwitcher"),await this.client.executeScript("mobile: pressButton",[{name:"appSwitch"}])}async readClipboard(){this.requireSupport("clipboard.read");let e=await this.client.executeScript("mobile: getClipboard",[{}]);return"string"==typeof e?e:""}async writeClipboard(e){this.requireSupport("clipboard.write"),await this.client.executeScript("mobile: setClipboard",[{content:e}])}async setSetting(e,t,r,n){this.unsupported("settings")}async pointerGesture(e,t){await this.client.performActions([{type:"pointer",id:e,parameters:{pointerType:"touch"},actions:t}]),await this.client.releaseActions().catch(()=>void 0)}async scrollGestureFrame(){let e=await this.client.source().then(e=>{let t;return(t=nj(e).flatMap(e=>{var t,r;let n;return(t=e,n=t.type?.toLowerCase()??"",!1!==t.visibleToUser&&(n.includes("scrollview")||n.includes("listview")||n.includes("recyclerview"))&&(r=e.rect)&&r.width>=50&&r.height>=50)?[e.rect]:[]}).sort((e,t)=>t.width*t.height-e.width*e.height)[0])?{x:t.x,y:t.y,width:t.width,height:t.height}:void 0}).catch(()=>void 0);return e||await this.client.windowRect()}requireSupport(e){nk(this.capabilities,e)||this.unsupported(e)}unsupported(e){throw new eG("UNSUPPORTED_OPERATION",nE(this.capabilities,e),{provider:this.capabilities.provider,platform:this.capabilities.platform,operation:e})}}function nJ(e,t,r={}){return{platformName:"ios"===e?"iOS":"Android","appium:deviceName":t,...r}}class nZ{provider;leaseLifecycle;cloudArtifacts;deviceInventoryProvider;capabilities;sessionsByLeaseId=new Map;options;constructor(e){this.options=e,this.provider=e.provider,this.capabilities=nP({provider:e.provider,platform:e.platform,overrides:e.capabilityOverrides}),this.leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t?.req),heartbeat:async e=>this.heartbeat(e),release:async e=>await this.release(e)},this.cloudArtifacts={listCloudArtifacts:async e=>await this.listCloudArtifacts(e)},this.deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider)return null;if(!e.leaseId)return[];let t=this.sessionsByLeaseId.get(e.leaseId);return t?[t.device]:[]}}ownsDevice(e){return[...this.sessionsByLeaseId.values()].some(t=>t.device.id===e.id)}getInteractor(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)?.interactor}async installApp(e,t,r,n){let i,a,o=this.findSessionForDevice(e);if(!o)return;let s=await this.uploadAppIfNeeded(o,e,t,r,n);return await o.client.installApp(s?.appReference??r),i=s?.bundleId??n?.appIdentifierHint,{bundleId:i,packageName:a=s?.packageName??n?.packageNameHint,appName:s?.appName,launchTarget:function(...e){return e.find(e=>void 0!==e)}(s?.launchTarget,i,a)}}async installInstallablePath(e,t,r){return await this.installApp(e,"",t,r)}async shutdown(){await Promise.allSettled([...this.sessionsByLeaseId.values()].map(async e=>await this.closeSession(e))),this.sessionsByLeaseId.clear()}async allocate(e,t){var r;if(e.leaseProvider!==this.provider)return;if(this.sessionsByLeaseId.has(e.leaseId))return this.heartbeat(e);let n=await this.prepareSession(e,t),i=new nO({endpoint:n.endpoint,auth:n.auth,headers:n.headers,requestPolicy:this.options.requestPolicy}),a=await this.createSessionWithPreparedCleanup(i,n),o=this.deviceForLease(e,n),s=n.providerSessionId??a.sessionId,l=this.capabilitiesForPlatform(n.platform);return this.sessionsByLeaseId.set(e.leaseId,{lease:e,device:o,client:i,prepared:n,capabilities:l,webDriverSessionId:a.sessionId,providerSessionId:s,interactor:new nX((r={client:i,backend:"ios"===n.platform?"xctest":"android",capabilities:l}).client,r.backend,r.capabilities)}),{provider:this.provider,deviceId:o.id,sessionId:a.sessionId,providerSessionId:s,capabilities:l,...n.providerData}}async createSessionWithPreparedCleanup(e,t){try{return await e.createSession(t.webdriverCapabilities)}catch(e){throw await nQ(t,e),e}}heartbeat(e){if(e.leaseProvider===this.provider&&this.sessionsByLeaseId.has(e.leaseId))return{provider:this.provider}}async release(e){if(e.leaseProvider!==this.provider)return;let t=this.sessionsByLeaseId.get(e.leaseId);if(!t)return;this.sessionsByLeaseId.delete(e.leaseId);let r=await this.closeSession(t),n=await this.safeListArtifacts(t);return{provider:this.provider,providerSessionId:t.providerSessionId,...r.cleanup,...r.warnings.length>0?{warnings:r.warnings}:{},...n?{cloudArtifacts:n}:{}}}async listCloudArtifacts(e){if(e.provider!==this.provider)return;let t=e.leaseId?this.sessionsByLeaseId.get(e.leaseId):void 0;return t?await this.safeListArtifacts(t):e.providerSessionId&&this.options.listArtifacts?await this.options.listArtifacts({provider:this.provider,providerSessionId:e.providerSessionId}):void 0}async prepareSession(e,t){let r=this.baseSessionForLease(e);return this.options.prepareSession?await this.options.prepareSession({lease:e,req:t,base:r}):r}capabilitiesForPlatform(e){return nP({provider:this.provider,platform:e,overrides:this.options.capabilityOverrides})}baseSessionForLease(e){let t="function"==typeof this.options.webdriverCapabilities?this.options.webdriverCapabilities(e):this.options.webdriverCapabilities??{};return{provider:this.provider,endpoint:this.options.endpoint,platform:this.options.platform,deviceName:this.options.deviceName,auth:this.options.auth,headers:this.options.headers,webdriverCapabilities:nJ(this.options.platform,this.options.deviceName,t)}}deviceForLease(e,t){return{platform:t.platform,id:t.deviceId??this.options.deviceId?.(e)??`${this.provider}:${t.platform}:${e.leaseId}`,name:t.deviceName,kind:"device",target:"mobile",booted:!0}}findSessionForDevice(e){return[...this.sessionsByLeaseId.values()].find(t=>t.device.id===e.id)}async uploadAppIfNeeded(e,t,r,n,i){if(!nk(e.capabilities,"install"))throw new eG("UNSUPPORTED_OPERATION",nE(e.capabilities,"install"),{provider:this.provider,deviceId:t.id,platform:t.platform});let a=e.prepared.uploadApp??this.options.uploadApp;if(a)return await a({provider:this.provider,lease:e.lease,device:t,app:r,appPath:n,options:i})}async closeSession(e){let t,r=[];try{await e.client.deleteSession()}catch(e){r.push({code:"WEBDRIVER_SESSION_DELETE_FAILED",message:nY(e)})}try{t=await e.prepared.cleanup?.()}catch(e){r.push({code:"PROVIDER_CLEANUP_FAILED",message:nY(e)})}return{cleanup:t,warnings:r}}async safeListArtifacts(e){let t=e.prepared.listArtifacts??this.options.listArtifacts;if(t)try{return await t({provider:this.provider,lease:e.lease,device:e.device,webDriverSessionId:e.webDriverSessionId,providerSessionId:e.providerSessionId})}catch(t){var r;return{provider:(r={provider:this.provider,providerSessionId:e.providerSessionId,error:t}).provider,providerSessionId:r.providerSessionId,status:"unavailable",cloudArtifacts:[],message:r.error instanceof Error?r.error.message:String(r.error)}}}}function nY(e){return e instanceof Error?e.message:String(e)}async function nQ(e,t){try{await e.cleanup?.()}catch(e){t instanceof eG&&(t.details={...t.details,cleanupError:nY(e)})}}async function n0(e,t,r){if(!t)return;let n=(await Promise.all([r.listArtifacts(t,"FILE"),r.listArtifacts(t,"LOG")])).flat().flatMap(r=>{var n,i,a;let o;return n=e,i=t,"string"!=typeof(o=(a=r).url)||0===o.length?[]:[{provider:n,providerSessionId:i,kind:function(e){switch(e){case"VIDEO":return"video";case"APPIUM_SERVER_OUTPUT":return"appium-log";case"DEVICE_LOG":return"device-log";case"MESSAGE_LOG":case"UNKNOWN":return"automation-log";default:return"raw"}}(a.type),name:a.name??a.type??"AWS Device Farm artifact",url:o,providerArtifactId:a.arn,extension:a.extension,availability:"ready",metadata:{awsType:a.type,...a.metadata?{awsMetadata:a.metadata}:{}}}]});return nM({provider:e,providerSessionId:t,artifacts:n,pendingMessage:"AWS Device Farm artifacts are not ready yet."})}ek.awsDeviceFarm;let n1={install:{support:"unsupported",note:"Pass appArn when creating the remote access session; local artifact upload/install is not implemented."},portReverse:{support:"unsupported",note:"AWS Device Farm remote access does not expose agent-device port reverse."},artifacts:{support:"supported",note:"AWS Device Farm remote access exposes provider-hosted video, Appium logs, and device logs after session completion."}};function n2(e={}){var t;let r,n,i=(r=(t=e).region?["--region",t.region]:[],n=t.awsCommand??"aws",async(e,t)=>await n5(n,["devicefarm",e,...r,...t,"--output","json"]));return{createRemoteAccessSession:async e=>n4(await i("create-remote-access-session",["--project-arn",e.projectArn,"--device-arn",e.deviceArn,"--name",e.name,...e.appArn?["--app-arn",e.appArn]:[],...e.interactionMode?["--interaction-mode",e.interactionMode]:[],...e.configuration?["--configuration",JSON.stringify(e.configuration)]:[]])),getRemoteAccessSession:async e=>n4(await i("get-remote-access-session",["--arn",e])),stopRemoteAccessSession:async e=>n4(await i("stop-remote-access-session",["--arn",e])),listArtifacts:async(e,t)=>{var r=await i("list-artifacts",["--arn",e,"--type",t]);if(!r||"object"!=typeof r)return[];let n=r.artifacts;return Array.isArray(n)?n:[]}}}async function n3(e,t){let r=t.startupTimeoutMs??12e4,n=t.pollIntervalMs??5e3,i=Date.now(),a=await t.client.getRemoteAccessSession(e);for(;Date.now()-i<r;){if("RUNNING"===a.status)return a;if("ERRORED"===a.status||"STOPPED"===a.status||"COMPLETED"===a.status)throw new eG("COMMAND_FAILED","AWS Device Farm remote access session did not start.",{sessionArn:e,status:a.status,result:a.result});await tm(n),a=await t.client.getRemoteAccessSession(e)}throw new eG("COMMAND_FAILED","Timed out waiting for AWS Device Farm remote access.",{sessionArn:e,status:a.status,result:a.result,timeoutMs:r})}async function n5(e,t){return JSON.parse((await eK(e,t,{maxBuffer:0xa00000})).stdout)}function n4(e){if(!e||"object"!=typeof e)throw new eG("COMMAND_FAILED","AWS Device Farm response was not an object.",{response:e});let t=e.remoteAccessSession;if(!t||"object"!=typeof t)throw new eG("COMMAND_FAILED","AWS Device Farm response missed remoteAccessSession.",{response:e});return t}ek.browserStack;let n6="https://api-cloud.browserstack.com/app-automate/upload",n8={install:{support:"partial",note:"Local app artifacts are uploaded to BrowserStack App Automate, then installed with Appium."},portReverse:{support:"unsupported",note:"Use BrowserStack Local for network tunneling; agent-device port reverse is not available."},artifacts:{support:"supported",note:"BrowserStack session details expose provider-hosted video, Appium logs, device logs, and dashboard links."}};async function n9(e,t,r){var n,i,a;if(!t)return;let o=await ie(t,r),s=[it(n=e,i=t,a=o,"video_url","video","Session video"),it(n,i,a,"appium_logs_url","appium-log","Appium logs"),it(n,i,a,"device_logs_url","device-log","Device logs"),it(n,i,a,"browser_url","provider-session","BrowserStack dashboard"),it(n,i,a,"public_url","provider-session","Public session link")].filter(e=>void 0!==e);return nM({provider:e,providerSessionId:t,artifacts:s,pendingMessage:"BrowserStack artifacts are not ready yet."})}async function n7(e,t){let r=await v.readFile(e),n=new FormData;n.set("file",new Blob([r]),a.basename(e));let i=await fetch(t.endpoint??n6,{method:"POST",headers:{...nC(),Authorization:nR(t)},body:n}),o=await i.json(),s=function(e){if(!e||"object"!=typeof e)return;let t=e.app_url;return"string"==typeof t?t:void 0}(o);if(!i.ok||!s)throw new eG("COMMAND_FAILED","BrowserStack app upload failed.",{status:i.status,response:o});return s}async function ie(e,t){let r=new URL(`${function(e){let t=e.length-1;for(;t>=0&&47===e.charCodeAt(t);)t-=1;return t===e.length-1?e:e.slice(0,t+1)}(String(t.endpoint??"https://api-cloud.browserstack.com/app-automate/sessions"))}/${e}.json`),n=await fetch(r,{headers:{...nC(),Authorization:nR(t)}}),i=await n.json();if(!n.ok||!i||"object"!=typeof i)throw new eG("COMMAND_FAILED","BrowserStack session details lookup failed.",{status:n.status,response:i});let a=i.automation_session??i;return a&&"object"==typeof a?a:{}}function it(e,t,r,n,i,a){let o=r[n];if("string"==typeof o&&0!==o.length)return{provider:e,providerSessionId:t,kind:i,name:a,url:o,availability:"ready"}}let ir=[{provider:ek.browserStack,createRuntime:e=>new nZ({provider:ek.browserStack,platform:"android",deviceName:"BrowserStack device",endpoint:e.BROWSERSTACK_WEBDRIVER_ENDPOINT??"https://hub-cloud.browserstack.com/wd/hub/",capabilityOverrides:n8,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=id(e,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),i=id(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await n9(t,r,{username:n,accessKey:i,endpoint:e.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})},prepareSession:async({req:t,lease:r,base:n})=>{var i,a;let o=ia(t,"BrowserStack"),s=id(e,"BROWSERSTACK_USERNAME","BrowserStack"),l=id(e,"BROWSERSTACK_ACCESS_KEY","BrowserStack"),d=io(o,"BrowserStack"),c=is(o,"device","BrowserStack requires --device <name>."),u=is(o,"providerOsVersion","BrowserStack requires --provider-os-version <version>."),p=await ii({app:is(o,"providerApp","BrowserStack requires --provider-app <bs://app-id-or-local-path>."),cwd:o.meta?.cwd,username:s,accessKey:l,uploadEndpoint:e.BROWSERSTACK_APP_UPLOAD_ENDPOINT});return{...n,platform:d,deviceName:c,auth:{username:s,accessKey:l},uploadApp:(i={username:s,accessKey:l,endpoint:e.BROWSERSTACK_APP_UPLOAD_ENDPOINT??n6},async({appPath:e,options:t})=>({appReference:await n7(e,i),bundleId:t?.appIdentifierHint,packageName:t?.packageNameHint,launchTarget:t?.appIdentifierHint??t?.packageNameHint})),webdriverCapabilities:{device:(a={deviceName:c,osVersion:u,app:p,projectName:il(o,"providerProject"),buildName:il(o,"providerBuild")??r.runId,sessionName:il(o,"providerSessionName")??r.leaseId,configured:nJ(d,c)}).deviceName,os_version:a.osVersion,...a.app?{app:a.app}:{},"bstack:options":{...a.projectName?{projectName:a.projectName}:{},buildName:a.buildName,sessionName:a.sessionName},...a.configured??{}}}}}),listArtifactsFromEnv:async(e,t)=>{let r=id(t,"BROWSERSTACK_USERNAME","BrowserStack artifact lookup"),n=id(t,"BROWSERSTACK_ACCESS_KEY","BrowserStack artifact lookup");return await n9(ek.browserStack,e,{username:r,accessKey:n,endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT})}},{provider:ek.awsDeviceFarm,createRuntime:e=>new nZ({provider:ek.awsDeviceFarm,endpoint:"http://127.0.0.1/",platform:"android",deviceName:"AWS Device Farm device",capabilityOverrides:n1,listArtifacts:async({provider:t,providerSessionId:r})=>{let n=n2({region:e.AWS_REGION??e.AWS_DEFAULT_REGION??iu(r??"")});return await n0(t,r,n)},prepareSession:async({req:t,lease:r,base:n})=>{let i=ia(t,"AWS Device Farm"),a=io(i,"AWS Device Farm"),o={client:n2({region:il(i,"awsRegion")??e.AWS_REGION??e.AWS_DEFAULT_REGION}),projectArn:ic(i,e,"awsProjectArn","AGENT_DEVICE_AWS_DEVICE_FARM_PROJECT_ARN","AWS_DEVICE_FARM_PROJECT_ARN"),deviceArn:ic(i,e,"awsDeviceArn","AGENT_DEVICE_AWS_DEVICE_FARM_DEVICE_ARN","AWS_DEVICE_FARM_DEVICE_ARN"),appArn:il(i,"awsAppArn")??e.AGENT_DEVICE_AWS_DEVICE_FARM_APP_ARN??e.AWS_DEVICE_FARM_APP_ARN,platform:a,deviceName:il(i,"device")??"AWS Device Farm device",sessionName:il(i,"providerSessionName")??r.leaseId,interactionMode:function(e){let t=il(e,"awsInteractionMode");if("INTERACTIVE"===t||"NO_VIDEO"===t||"VIDEO_ONLY"===t)return t}(i)};return await (async({lease:e,base:t})=>{var r,n,i;let a,s,l=await o.client.createRemoteAccessSession({projectArn:o.projectArn,deviceArn:o.deviceArn,appArn:o.appArn,name:(r=o.sessionName,("function"==typeof r?r(e):r)??`agent-device-${e.leaseId}`),interactionMode:o.interactionMode,configuration:o.configuration}),d=await n3(l.arn,o),c=(a=(n=d).endpoints&&"object"==typeof n.endpoints?Object.values(n.endpoints):[],(s=[n.remoteDriverEndpoint,n.endpoint,...a,n.remoteDebugUrl,n.remoteRecordAppUrl].filter(e=>"string"==typeof e&&e.length>0).find(e=>!/^wss?:\/\//i.test(e)))?(i=s,/^https?:\/\//i.test(i)?i:`http://${i}`):void 0);if(!c)throw new eG("COMMAND_FAILED","AWS Device Farm did not expose a WebDriver endpoint.",{sessionArn:d.arn,status:d.status});return{...t,endpoint:c,platform:o.platform,deviceName:d.device?.name??o.deviceName,cleanup:async()=>(await o.client.stopRemoteAccessSession(d.arn),{awsDeviceFarmSessionArn:d.arn}),listArtifacts:async({provider:e,providerSessionId:t})=>await n0(e,t,o.client),providerSessionId:d.arn,providerData:{awsDeviceFarmSessionArn:d.arn}}})({lease:r,req:t,base:n})}}),listArtifactsFromEnv:async(e,t)=>{let r=n2({region:t.AWS_REGION??t.AWS_DEFAULT_REGION??iu(e)});return await n0(ek.awsDeviceFarm,e,r)}}];async function ii(e){var t;if((t=e.app).startsWith("bs://")||/^https?:\/\//.test(t))return e.app;let r=a.resolve(e.cwd??process.cwd(),e.app);if(!o.existsSync(r))throw new eG("INVALID_ARGS","BrowserStack --provider-app must be a bs:// app id, URL, or existing local app path.",{providerApp:e.app});return await n7(r,{username:e.username,accessKey:e.accessKey,endpoint:e.uploadEndpoint})}function ia(e,t){if(e)return e;throw new eG("INVALID_ARGS",`${t} lease allocation requires provider profile flags on the request.`)}function io(e,t){let r=e.flags?.platform;if("android"===r||"ios"===r)return r;throw new eG("INVALID_ARGS",`${t} requires --platform ios|android.`)}function is(e,t,r){let n=il(e,t);if(n)return n;throw new eG("INVALID_ARGS",r)}function il(e,t){let r=e.flags?.[t];return"string"==typeof r&&r.length>0?r:void 0}function id(e,t,r){let n=e[t];if(n)return n;throw new eG("INVALID_ARGS",`${r} requires ${t} in the environment.`)}function ic(e,t,r,n,i){let a=il(e,r)??t[n]??t[i];if(a)return a;throw new eG("INVALID_ARGS",`AWS Device Farm requires --${String(r).replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)} or ${i}.`)}function iu(e){return/^arn:[^:]+:devicefarm:([^:]+):/.exec(e)?.[1]}async function ip(e,t){if(e.providerSessionId){var r;return await (r=e.provider,ir.find(e=>e.provider===r))?.listArtifactsFromEnv(e.providerSessionId,t)}}let im=[],ih=new p;async function iw(e,t){return await ih.run([...e],t)}function iv(e){return iS().some(t=>t.ownsDevice(e))}async function iy(e,t,r,n){for(let i of iS()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw ix(i,e,"install");let a=await i.installApp?.(e,t,r,n);if(a)return a;throw ix(i,e,"install")}}async function ig(e,t,r){for(let n of iS()){if(!n.ownsDevice(e))continue;if(!n.installInstallablePath)throw ix(n,e,"install_from_source");let i=await n.installInstallablePath?.(e,t,r);if(i)return i;throw ix(n,e,"install_from_source")}}async function ib(e){for(let t of iS()){if(!iM(t,e.provider))continue;let r=await t.configurePortReverse?.(e);if(r)return r}}async function iA(e){for(let t of iS()){if(!iM(t,e.provider))continue;let r=await t.removePortReverse?.(e);if(r)return r}}function iS(){return ih.getStore()??im}async function iI(e,t){for(let r of e){if(!iM(r,t.provider))continue;let e=await r.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function i_(e,t,r,n){for(let i of e){if(!iM(i,r.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(r,n):void 0;if(a)return a}}function iM(e,t){return e.provider===t}function ix(e,t,r){throw new eG("UNSUPPORTED_OPERATION",`Provider device runtime ${e.provider} does not support ${r} for this device.`,{provider:e.provider,deviceId:t.id,platform:t.platform})}let iN="default";function iD(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function iP(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function ik(e){let t=(e??"").trim().toLowerCase();if(!t||"ios-simulator"===t)return"ios-simulator";if("ios-instance"===t||"android-instance"===t)return t;throw new eG("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}function iE(e){if(void 0===e)return;let t=e.trim();if(!t||t.length>256||!/^[\x20-\x7E]+$/.test(t))throw new eG("INVALID_ARGS","Invalid device key. Use 1-256 printable characters.");return t}function iC(e){return iO(e,"client id",128)}function iR(e){return iO(e,"lease provider",64)}function iO(e,t,r){if(void 0===e)return;let n=e.trim();if(!n||n.length>r||!/^[a-zA-Z0-9._-]+$/.test(n))throw new eG("INVALID_ARGS",`Invalid ${t}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return n}class iT{leases=new Map;runBindings=new Map;deviceBindings=new Map;maxActiveSimulatorLeases;defaultLeaseTtlMs;minLeaseTtlMs;maxLeaseTtlMs;now;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.defaultLeaseTtlMs=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,this.minLeaseTtlMs=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):5e3,this.maxLeaseTtlMs=Number.isInteger(e.maxLeaseTtlMs)?Math.max(this.minLeaseTtlMs,Number(e.maxLeaseTtlMs)):6e5,this.now=e.now??(()=>Date.now())}allocateLease(e){let t={backend:ik(e.leaseBackend),leaseProvider:iR(e.leaseProvider),deviceKey:iE(e.deviceKey),clientId:iC(e.clientId),tenantId:function(e){let t=eJ(e);if(!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.tenantId),runId:function(e){let t=iD(e);if(!t)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return t}(e.runId),ttlMs:e.ttlMs};this.cleanupExpiredLeases();let r=this.resolveLeaseTtlMs(t.ttlMs),n=this.refreshExistingRunBinding(t,r);if(n)return n;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=this.createLease(t,r);return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}refreshExistingRunBinding(e,t){let r=this.bindingKey(e),n=this.runBindings.get(r);if(!n)return;let i=this.leases.get(n);return i?(this.canReuseRunBinding(i,e)||(i.deviceKey&&this.throwDeviceBusy(i),this.assertOptionalLeaseIdentityMatch(i,e)),this.refreshLease(i,t)):void this.runBindings.delete(r)}createLease(e,t){let r=this.now();return{leaseId:n.randomBytes(16).toString("hex"),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+t}}heartbeatLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.getActiveLease(t);this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=this.normalizeRequiredLeaseId(e.leaseId);this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertRequiredScopeForDeviceAwareLease(r,e),this.assertOptionalScopeMatch(r,e),this.leases.delete(t),this.unbindLease(r),{released:!0,lease:{...r}}):{released:!1}}assertLeaseAdmission(e){let t=ik(e.leaseBackend),r=eJ(e.tenantId);if(!r)throw new eG("INVALID_ARGS","tenant isolation requires tenant id.");let n=iD(e.runId);if(!n)throw new eG("INVALID_ARGS","tenant isolation requires run id.");let i=iP(e.leaseId);if(!i)throw new eG("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.getActiveLease(i);this.assertOptionalScopeMatch(a,{tenantId:r,runId:n,leaseBackend:t,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}consumeExpiredLeases(){let e=this.now(),t=[];for(let r of this.leases.values())r.expiresAt>e||(this.leases.delete(r.leaseId),this.unbindLease(r),t.push({...r}));return t}consumeExpiredLease(e){let t=iP(e);if(!t)return;let r=this.leases.get(t);if(!(!r||r.expiresAt>this.now()))return this.leases.delete(r.leaseId),this.unbindLease(r),{...r}}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if("ios-simulator"!==e||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>"ios-simulator"===e.backend).length;if(!(t<this.maxActiveSimulatorLeases))throw new eG("COMMAND_FAILED","No simulator lease capacity available",{reason:"LEASE_CAPACITY_EXCEEDED",activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:"Retry after releasing another simulator lease."})}resolveLeaseTtlMs(e){if(!Number.isInteger(e))return this.defaultLeaseTtlMs;let t=Number(e);if(t<this.minLeaseTtlMs||t>this.maxLeaseTtlMs)throw new eG("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}normalizeRequiredLeaseId(e){let t=iP(e);if(!t)throw new eG("INVALID_ARGS","Invalid lease id.");return t}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new eG("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"})}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.bindLease(n),{...n}}bindLease(e){this.runBindings.set(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}),e.leaseId);let t=this.deviceBindingKey(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e){this.runBindings.delete(this.bindingKey({tenantId:e.tenantId,runId:e.runId,backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey}));let t=this.deviceBindingKey(e);t&&this.deviceBindings.delete(t)}bindingKey(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??iN,e.deviceKey??"*"])}deviceBindingKey(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??iN,e.deviceKey])}assertDeviceAvailable(e){let t=this.deviceBindingKey({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let r=this.deviceBindings.get(t);if(!r)return;let n=this.leases.get(r);n?this.throwDeviceBusy(n):this.deviceBindings.delete(t)}canReuseRunBinding(e,t){return e.clientId===t.clientId}throwDeviceBusy(e){throw new eG("COMMAND_FAILED","Device is already leased",{reason:"DEVICE_LEASE_BUSY",deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:"Retry after the lease expires or close the owning session."})}assertRequiredScopeForDeviceAwareLease(e,t){(e.leaseProvider??e.deviceKey??e.clientId)&&(t.tenantId&&t.runId&&[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)||this.throwScopeRequired())}assertOptionalScopeMatch(e,t){let r=this.normalizeOptionalScopeMatchRequest(t);(r.tenantId&&e.tenantId!==r.tenantId||r.runId&&e.runId!==r.runId||r.leaseBackend&&e.backend!==r.leaseBackend)&&this.throwScopeMismatch(),this.assertOptionalLeaseIdentityMatch(e,r)}normalizeOptionalScopeMatchRequest(e){let t=eJ(e.tenantId),r=iD(e.runId);if(e.tenantId&&!t)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(e.runId&&!r)throw new eG("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");return{tenantId:t,runId:r,leaseBackend:e.leaseBackend?ik(e.leaseBackend):void 0,leaseProvider:iR(e.leaseProvider),deviceKey:iE(e.deviceKey),clientId:iC(e.clientId)}}assertOptionalLeaseIdentityMatch(e,t){t.leaseProvider&&e.leaseProvider!==t.leaseProvider&&this.throwScopeMismatch(),t.deviceKey&&e.deviceKey!==t.deviceKey&&this.throwScopeMismatch(),t.clientId&&e.clientId!==t.clientId&&this.throwScopeMismatch()}throwScopeMismatch(){throw new eG("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}throwScopeRequired(){throw new eG("UNAUTHORIZED","Lease owner scope is required",{reason:"LEASE_SCOPE_REQUIRED"})}}let iL=["android","apple","linux"],iF={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function i$(e){if("web"===e.platform)return[iF];if(iB(e)){let{listMacosDevices:e}=await import("./devices~1.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~2.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let t=[];for(let r of iL)try{t.push(...await i$({...e,platform:r}))}catch{}return t}function iU(e){let t={android:{available:0,booted:0},apple:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}};for(let n of e){var r;let e="ios"===(r=n).platform||"macos"===r.platform?"apple":r.platform;t[e].available+=1,!0===n.booted&&(t[e].booted+=1)}return t}function iB(e){return"macos"===e.platform||"apple"===e.platform&&"desktop"===e.target}let iq=new p,iG=new p;async function iV(e,t,r){var n,i;let a=await ij(e,t,r);if(n=t,i=a,!iK(n)&&(!n.platform||"apple"===n.platform||"ios"===n.platform)&&"desktop"!==n.target&&(!i||"device"===i.kind)){let{findBootableIosSimulator:e}=await import("./devices.js"),n=await e({simulatorSetPath:r.simulatorSetPath,target:t.target});if(n)return n}if(a)return a;throw new eG("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function ij(e,t,r){try{return await tc(e,t,r)}catch(e){var n;if(n=e,!iK(t)&&n instanceof eG&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function iK(e){return!!(e.udid||e.serial||e.deviceName)}async function iH(e,t={}){var r;let n=iW(e),{iosSimulatorSetPath:i,...a}=n,o=(r=n,JSON.stringify({request:r,options:t})),s={simulatorSetPath:i,allowStoppedAndroidAvdPlaceholders:t.allowStoppedAndroidAvdPlaceholders},l={platform:n.platform,target:e.target,cacheHit:!1};return await ef("resolve_target_device",async()=>{let e=function(e){let t=iq.getStore(),r=t?.get(e);if(r)return{...r}}(o);if(e)return l.cacheHit=!0,e;let t=await iY(n);if(t)return iQ(a)?i0(o,await iV(t,a,{simulatorSetPath:i})):i0(o,await tc(t,a,s));let r=await i$(n);return iQ(a)?i0(o,await iV(r,a,{simulatorSetPath:i})):i0(o,await tc(r,a,s))},l)}function iW(e){let t=e.platform;if(e.target&&!t)throw new eG("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let r=tt({simulatorSetPath:ty(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tO(e.androidDeviceAllowlist);return{platform:t,target:e.target,deviceName:e.device,udid:e.udid,serial:e.serial,leaseId:e.leaseId,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0}}async function iz(e){return iq.getStore()?await e():await iq.run(new Map,e)}async function iX(e,t){return e?await iG.run(e,t):await t()}async function iJ(e,t){return await iX(e,async()=>await iz(t))}async function iZ(e){return await iY(e)??await i$(e)}async function iY(e){let t=iG.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function iQ(e){return ts(e.platform)}function i0(e,t){return iq.getStore()?.set(e,{...t}),t}let i1=new Map;function i2(e){return i1.get(e)}let i3={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1,multiTouchSynthesis:!0},i5={ios:i3,ipados:i3,visionos:i3,tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1,multiTouchSynthesis:!1,multiTouchUnsupportedHint:"tvOS has no touch input — this gesture is supported on Android and the iOS simulator only."},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0,multiTouchSynthesis:!1,multiTouchUnsupportedHint:"macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only."},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1,multiTouchSynthesis:!1}};function i4(e){return ts(e.platform)?i5[e.appleOs?e.appleOs:"macos"===e.platform?"macos":te(e)?"tvos":"ios"]:void 0}function i6(e){return"darwin"===process.platform&&("macos"===e.platform||"ios"===e.platform&&"simulator"===e.kind||"android"===e.platform&&"emulator"===e.kind)}function i8(e){return"web"===e.platform||i6(e)}let i9=e=>{let t=i4(e);return t?t.appAndDeviceLifecycle:"macos"!==e.platform},i7=e=>{let t=i4(e);return t&&t.physicalDeviceSurfaces||"simulator"===e.kind},ae=e=>{let t=i4(e);return t?t.multiTouchSynthesis&&"simulator"===e.kind:"android"===e.platform},at=e=>{let t=i4(e);if(t){if(t.multiTouchUnsupportedHint)return t.multiTouchUnsupportedHint;if("device"===e.kind)return"Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices."}},ar=[{id:"apple",platforms:["ios","macos"],familySelector:"apple",capability:{bucket:"apple",supportsByDefault:{[t$.boot]:i9,[t$.install]:i9,[t$.reinstall]:i9,[t$.installFromSource]:i9,[t$.push]:i9,[t$.home]:i9,[t$.appSwitcher]:i9,[t$.clipboard]:e=>"android"===e.platform||"linux"===e.platform||i7(e),[t$.keyboard]:e=>{let t=i4(e);return t?t.keyboard:"android"===e.platform},[t$.rotate]:e=>{let t=i4(e);return t?t.orientation:"android"===e.platform},[t$.alert]:e=>"android"===e.platform||i7(e),[t$.settings]:e=>"android"===e.platform||i7(e),[t$.audio]:i8,pinch:ae,"rotate-gesture":ae,"transform-gesture":ae},unsupportedHintByDefault:{pinch:at,"rotate-gesture":at,"transform-gesture":at}},appLog:{resolveBackend:e=>"macos"===e.platform?"macos":"device"===e.kind?"ios-device":"ios-simulator"},perf:{supportsMetrics:()=>!0},createInteractor:async(e,t)=>{let{createAppleInteractor:r}=await import("./interactor.js");return r(e,t)},discoverDevices:async e=>{if(iB(e)){let{listMacosDevices:e}=await import("./devices~1.js");return await e()}let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}},{id:"android",platforms:["android"],capability:{bucket:"android",supportsByDefault:{[t$.audio]:i8}},appLog:{resolveBackend:()=>"android"},perf:{supportsMetrics:()=>!0},createInteractor:async e=>{let{createAndroidInteractor:t}=await import("./android.js");return t(e)},discoverDevices:async e=>{let{listAndroidDevices:t}=await import("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}},{id:"linux",platforms:["linux"],capability:{bucket:"linux"},createInteractor:async()=>{let{createLinuxInteractor:e}=await import("./linux.js");return e()},discoverDevices:async()=>{let{listLinuxDevices:e}=await import("./devices~2.js");return await e()}},{id:"web",platforms:["web"],capability:{bucket:"web"},createInteractor:async()=>{let{createWebInteractor:e}=await import("./web.js");return e()},discoverDevices:async()=>[iF]}],an=!1;function ai(){if(!an){for(let e of ar)for(let t of e.platforms){if(i1.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);i1.set(t,e)}an=!0}}ai();let aa={device:!0},ao=new Set(["open","close","record","audio","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type","viewport"]),as=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=ao.has(r)?{...n,web:aa}:n;for(let t of ao)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}(tV(tG));function al(e,t){let r=as[e];if(!r)return!0;let n=i2(t.platform);if(!n)return!1;let i=r[n.capability.bucket];if(!i)return!1;let a=n.capability.supportsByDefault?.[e];return(!a||!!a(t))&&!0===i[t.kind??"unknown"]}let ad=["role","type","subrole","label","value","identifier","enabled","selected","focused","hittable"];function ac(e,t){if("digest"!==t)return e;let r=e.node;if(!r||"object"!=typeof r)return e;if("string"==typeof e.text){let{node:t,...r}=e;return r}return{...e,node:function(e){let t={ref:e.ref};for(let r of ad){let n=e[r];void 0!==n&&(t[r]=n)}return t}(r)}}let au={snapshot:function(e,t){if("digest"!==t)return e;let r=Array.isArray(e.nodes)?e.nodes:[],n=r.filter(e=>!0===e.hittable&&"covered"!==e.interactionBlocked).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier}));return{nodeCount:r.length,refs:n,truncated:e.truncated,...void 0!==e.visibility?{visibility:e.visibility}:{},...void 0!==e.snapshotQuality?{snapshotQuality:e.snapshotQuality}:{}}},screenshot:function(e,t){if("digest"!==t)return e;let r=Array.isArray(e.overlayRefs)?e.overlayRefs:[],n=r.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{..."string"==typeof e.path?{path:e.path}:{},overlayCount:r.length,overlayRefs:n,...void 0!==e.artifacts?{artifacts:e.artifacts}:{}}},find:ac,get:ac},ap="No active session. Run open first.";function af(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}function am(){return af("SESSION_NOT_FOUND",ap)}function ah(e,t,r){if(al(e,t))return null;let n=r?.hint?i2(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t):void 0;return{ok:!1,error:{code:"UNSUPPORTED_OPERATION",message:r?.message??`${e} is not supported on this device`,...n?{hint:n}:{}}}}let aw=["platform","target","device","udid","serial"],av=[...aw,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function ay(e){return ab(e,aw)}function ag(e){return"string"==typeof e&&e.trim().length>0}function ab(e,t){return!!e&&t.some(t=>ag(e[t]))}let aA=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}(tj(tG));function aS(e){return a_(e)?.sessionKind}function aI(e){return a_(e)?.leaseAdmissionExempt===!0}function a_(e){return aA.descriptorsByCommand.get(e)}let aM=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./3340.js");ak(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&ts(t.device.platform)?{appleRunner:{provider:r(t),deviceId:t.device.id,requestId:t.req.meta?.requestId}}:{}},async appendWrapper(e,t){if(!e.appleRunner?.provider)return;let{withAppleRunnerProvider:r}=await Promise.resolve(t5);ak(t,e.appleRunner,(t,n)=>r(t,{deviceId:e.appleRunner?.deviceId??"",requestId:e.appleRunner?.requestId},n))}},{resolverKey:"appleToolProvider",resolve(e,t){let r=e.appleToolProvider;return r&&ts(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(t4);ak(t,e.appleTool,r)}},{resolverKey:"linuxToolProvider",resolve(e,t){let r=e.linuxToolProvider;return r&&"linux"===t.device.platform?{linuxTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.linuxTool?.provider)return;let{withLinuxToolProvider:r}=await Promise.resolve(t9);ak(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&"web"===t.device.platform?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");ak(t,e.web,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(t2);ak(t,e.appLog,r)}},{resolverKey:"recordingProvider",resolve(e,t){let r=e.recordingProvider;return r?{recording:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.recording?.provider)return;let{withRecordingProvider:r}=await import("./recording-provider.js");ak(t,e.recording,r)}}];async function ax(e,t){let r=await aN(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await aP(r);return await aE(i,async()=>await t(n))}async function aN(e){var t,r,n;if(t=e.providers,!aM.some(e=>!!t[e.resolverKey]))return{};let i=await aD(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return aM.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function aD(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return a_(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=a_(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=a_(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:ay(e.flags)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await iH(e.flags??{});case"skip":return}}async function aP(e){let t=[];for(let r of aM)await r.appendWrapper(e,t);return t}function ak(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function aE(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function aC(e,t){if(iv(e)){let t=function(e){for(let t of iS()){if(!t.ownsDevice(e))continue;let r=t.getInteractor(e);if(r)return r}}(e);if(t)return t;throw new eG("UNSUPPORTED_OPERATION","Provider device runtime does not have an active interactor for this device.",{deviceId:e.id,platform:e.platform})}return await (function(e){let t=i1.get(e);if(!t)throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e}`);return t})(e.platform).createInteractor(e,t)}ai();let aR=/^[A-Za-z0-9_.:-]{1,64}$/,aO="--launch-console is supported only for iOS simulator app launches",aT="--launch-console requires a direct app launch and cannot be used with URL opens",aL=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function aF(e,t){if(t<=0)return[0,0];let[r,n]=aL[e%aL.length];return[r*t,n*t]}async function a$(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await tm(t)}async function aU(e,t){let{x:r,y:n}=aH(t,"longpress requires x y [durationMs]",{hint:"Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs."}),i=t[2]?Number(t[2]):void 0;return await e.longPress(r,n,i),{x:r,y:n,durationMs:i,...J(`Long pressed (${r}, ${n})`)}}async function aB(e,t){let{x:r,y:n}=aH(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...J(`Focused (${r}, ${n})`)}}async function aq(e,t,r){let n=eC(t[0]);if(n)throw new eG("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});let i=t.join(" ");if(!i)throw new eG("INVALID_ARGS","type requires text");let a=ei(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...J(oa("Typed",i))}}async function aG(e,t,r){if(r?.directElementSelector)return await aV(e,r.directElementSelector,t,r);let n=Number(t[0]),i=Number(t[1]),a=t.slice(2).join(" ");if(Number.isNaN(n)||Number.isNaN(i)||!a)throw new eG("INVALID_ARGS","fill requires x y text");let o=ei(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...J(oa("Filled",a))}}async function aV(e,t,r,n){if(!e.fillElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eG("INVALID_ARGS","fill requires text");let a=ei(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...J(oa("Filled",i))}}async function aj(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await aK(t,n.directElementSelector);let{x:o,y:s}=aH(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await aW(o,s,n);let l=k(n);if("primary"!==l)return await az(e,o,s,l,n);let d=(a=n,{count:aJ(a?.count,1,"count",1,200),intervalMs:aJ(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:aJ(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:aJ(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eG("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,ts(e.platform)&&i>1)?await aY(e,o,s,d,n):await aQ(t,o,s,d)}async function aK(e,t){if(!e.tapElementSelector)throw new eG("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...J(`Tapped ${t.raw}`)}}function aH(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eG("INVALID_ARGS",t,r);return{x:n,y:i}}async function aW(e,t,r){let n=k(r);if("primary"!==n)throw new eG("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(t6);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...J(on({x:e,y:t}))}}async function az(e,t,r,n,i){if(function(e,t,r){let n=j({commandLabel:"click",platform:e.platform,button:t,count:r?.count,intervalMs:r?.intervalMs,holdMs:r?.holdMs,jitterPx:r?.jitterPx,doubleTap:r?.doubleTap});if(n)throw n}(e,n,i),"linux"===e.platform)return await aX(t,r,n);let{runAppleRunnerCommand:a}=await Promise.resolve(t3);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},a0(i)),{x:t,y:r,button:n,...J(on({x:t,y:r,button:n}))}}async function aX(e,t,r){if("secondary"===r){let{rightClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}else{let{middleClickLinux:r}=await import("./input-actions~1.js");await r(e,t)}return{x:e,y:t,button:r,...J(on({x:e,y:t,button:r}))}}function aJ(e,t,r,n,i){return ei(void 0===e?t:e,r,n,i)}async function aZ(e,t,r){let n,i,{runAppleRunnerCommand:a}=await Promise.resolve(t3),{MAX_RUNNER_SEQUENCE_STEPS:o,buildRunnerSequenceCommand:s,parseRunnerSequenceResult:l}=await import("./runner-sequence.js"),d=function(e,t,r=2e4){if(0===e.length)return[];let n=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>r,l=a.length>=n;(s||l)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}(t,o),c=0,u=[],p=0;for(let t of d){let o,d=await a(e,s(t,r?.appBundleId),a0(r));n??=d,i=d;try{o=l(d)}catch(e){throw function(e,t){if(0===t||!(e instanceof eG)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eG(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,..."number"==typeof n?{completedSteps:t+n}:{}},e.cause)}(e,p)}c+=o.completedSteps,u.push(...o.results),p+=t.length}return{...n??{},completedSteps:c,sequenceResults:u,...i?.gestureEndUptimeMs!==void 0?{gestureEndUptimeMs:i.gestureEndUptimeMs}:{}}}async function aY(e,t,r,n,i){var a,o,s,l;let d,c,u=await aZ(e,(a=e,o=t,s=r,c="tap"==(d=(l=n).doubleTap?"doubleTap":l.holdMs>0?"longPress":"tap")&&"ios"===a.platform&&!te(a),Array.from({length:l.count},(e,t)=>{let[r,n]=aF(t,l.jitterPx),i=t===l.count-1;return{kind:d,x:o+r,y:s+n,...c?{synthesized:!0}:{},...l.holdMs>0?{durationMs:l.holdMs}:{},...!i&&l.intervalMs>0?{pauseMs:l.intervalMs}:{}}})),i);return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-sequence",...u,...J(on({x:t,y:r}))}}async function aQ(e,t,r,n){let i;return await a$(n.count,n.intervalMs,async a=>{let[o,s]=aF(a,n.jitterPx),l=t+o,d=r+s;if(n.doubleTap){let t=await e.doubleTap(l,d);i??=t??void 0;return}if(n.holdMs>0){let t=await e.longPress(l,d,n.holdMs);i??=t??void 0}else{let t=await e.tap(l,d);i??=t??void 0}}),T({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},on({x:t,y:r}))}function a0(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function a1(e,t,r,n){let i=Number(r[0]),a=Number(r[1]),o=Number(r[2]),s=Number(r[3]);if([i,a,o,s].some(Number.isNaN))throw new eG("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await a3({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function a2(e,t,r,n){let i=q(r[0]),a=r[1]?Number(r[1]):300,o=ea((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eG("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=ed(i,o,{platform:e.platform});return await a3({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function a3(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=ei(l,"durationMs",16,1e4),u=ei(n?.count??1,"count",1,200),p=ei(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!x(X,f))throw new eG("INVALID_ARGS",`Invalid pattern: ${f}`);if(ts(t.platform)&&u>1){let e=await aZ(t,function(e){let{device:t,x1:r,y1:n,x2:i,y2:a,count:o,pauseMs:s,pattern:l,effectiveDurationMs:d}=e,c="ios"===t.platform&&!te(t);return Array.from({length:o},(e,t)=>{let u="ping-pong"===l&&t%2==1,p=t===o-1;return{kind:"drag",x:u?i:r,y:u?a:n,x2:u?r:i,y2:u?n:a,durationMs:d,...c?{synthesized:!0}:{},...!p&&s>0?{pauseMs:s}:{}}})}({device:t,x1:i,y1:a,x2:o,y2:s,count:u,pauseMs:p,pattern:f,effectiveDurationMs:c}),n);return{x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"runner-sequence",count:u,pauseMs:p,pattern:f,...e,...J(oi(u,f))}}return await a$(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,c):await r.swipe(i,a,o,s,c)}),T({x1:i,y1:a,x2:o,y2:s,...d?{preset:d}:{},durationMs:c,effectiveDurationMs:c,timingMode:"direct",count:u,pauseMs:p,pattern:f},d?`Swiped ${d}`:oi(u,f))}async function a5(e,t){let r=Number(t[0]),n=Number(t[1]),i=Number(t[2]),a=Number(t[3]);if([r,n,i,a].some(e=>!Number.isFinite(e)))throw new eG("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ei(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,d=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...d??{},...J(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function a4(e,t){let r=eo(S,t[0],{message:"fling direction must be up, down, left, or right"}),n=Number(t[1]),i=Number(t[2]);if(![n,i].every(Number.isFinite))throw new eG("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eG("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ei(t[4]?Number(t[4]):50,"durationMs",16,1e3),{x2:s,y2:l}=function(e,t,r,n){switch(r){case"up":return{x2:e,y2:t-n};case"down":return{x2:e,y2:t+n};case"left":return{x2:e-n,y2:t};case"right":return{x2:e+n,y2:t}}}(n,i,r,a);return await e.fling(n,i,s,l,o),{direction:r,x:n,y:i,x2:s,y2:l,distance:a,durationMs:o,...J(`Flung ${r}`)}}async function a6(e,t,r){var n,i,a,o,s,l,d,c;let u,p=t[0],f=t[1]?Number(t[1]):void 0,m=r?.pixels,h=r?.durationMs;if(!p)throw new eG("INVALID_ARGS","scroll requires direction");n=f,i=m,a=h,function(e){if(void 0!==e&&!Number.isFinite(e))throw new eG("INVALID_ARGS","scroll amount must be a number")}(n),O(a),Z({amount:n,pixels:i});let w="bottom"===(o=p)?{direction:"down",edge:"bottom"}:"top"===o?{direction:"up",edge:"top"}:{direction:_(o)},v={amount:f,pixels:m,durationMs:h},{interactionResult:y,completedPasses:g}=await a8(e,r,w,v);return T((s=w,l=v,d=g,u=L(c=y),{direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==l.amount?{amount:l.amount}:{},...void 0!==l.pixels?{pixels:l.pixels}:{},...void 0!==u?{durationMs:u}:{},...c}),W(w.direction,w.edge,g,f,m))}async function a8(e,t,r,n){if(r.edge){let i=r.edge,a=await F({edge:i,captureState:async r=>await a9(e,t,i,r),scroll:async()=>await e.scroll(r.direction,n)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(r.direction,n)??{},completedPasses:1}}async function a9(e,t,r,n){if("function"!=typeof e.snapshot)throw new eG("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await Q({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function a7(e,t,r,n){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eG("UNSUPPORTED_OPERATION","gesture pinch is only supported in macOS app sessions. Re-open the target app without --surface desktop|menubar|frontmost-app first.");let i=Number(r[0]),a=r[1]?Number(r[1]):void 0,o=r[2]?Number(r[2]):void 0;if(Number.isNaN(i)||i<=0)throw new eG("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...J(`Pinched to scale ${i}`)}}async function oe(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eG("UNSUPPORTED_OPERATION","gesture rotate is not supported on macOS; XCTest rotation gestures are available only for iOS app sessions.");let{degrees:n,x:i,y:a,velocity:o}=function(e){let t=Number(e[0]);if(!Number.isFinite(t))throw new eG("INVALID_ARGS","gesture rotate requires degrees [x] [y] [velocity]");let r=function(e,t){if(void 0===e&&void 0===t)return{};if(void 0===e||void 0===t)throw new eG("INVALID_ARGS","gesture rotate center requires both x and y");let r=Number(e),n=Number(t);if(!Number.isFinite(r)||!Number.isFinite(n))throw new eG("INVALID_ARGS","gesture rotate center requires finite x and y");return{x:r,y:n}}(e[1],e[2]),n=Number(e[3]??(t>=0?1:-1));if(!Number.isFinite(n)||0===n)throw new eG("INVALID_ARGS","gesture rotate velocity must be a non-zero number");return{degrees:t,...r,velocity:Math.abs(n)*(t>=0?1:-1)}}(r),s=await t.rotateGesture(n,i,a,o);return{degrees:n,...void 0!==i&&void 0!==a?{x:i,y:a}:{},velocity:o,...s,...J(`Rotated gesture ${n} degrees`)}}async function ot(e,t,r){if("tv"===e.target)throw new eG("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eG("UNSUPPORTED_OPERATION","gesture transform is currently supported on Android and iOS simulators");let i=function(e){let t=Number(e[0]),r=Number(e[1]),n=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=Number(e[5]);if(![t,r,n,i,a,o].every(Number.isFinite))throw new eG("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eG("INVALID_ARGS","gesture transform scale must be > 0");return{x:t,y:r,dx:n,dy:i,scale:a,degrees:o,durationMs:void 0===e[6]?void 0:ei(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...J(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function or(e,t,r){let{x:n,y:i}=aH(t,"read requires x y");if("android"===e.platform){let{readAndroidTextAtPoint:t}=await import("./input-actions.js");return{action:"read",text:await t(e,n,i)??""}}if("linux"===e.platform){let{readLinuxTextAtPoint:e}=await Promise.resolve(t8);return{action:"read",text:await e(n,i,r?.surface)}}if("macos"===e.platform&&r?.surface&&"app"!==r.surface){let{runMacOsReadTextAction:e}=await Promise.resolve(t6);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runAppleRunnerCommand:a}=await Promise.resolve(t3),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function on(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function oi(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function oa(e,t){return`${e} ${Array.from(t).length} chars`}function oo(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eG("INVALID_ARGS",`${n} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!o.statSync(a).isFile())throw new eG("INVALID_ARGS",`${n} path is not a file: ${a}`);return{kind:"file",path:a}}catch(t){if(t instanceof eG)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eG("INVALID_ARGS",`${n} file is not readable: ${a}`);if(e&&"ENOENT"!==e)throw new eG("COMMAND_FAILED",`Unable to read ${n} file: ${a}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eG("INVALID_ARGS",`${n} file not found: ${a}`)}async function os(e){let t=oo(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await ol(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eG("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eG)throw t;throw new eG("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function ol(e){try{return await l.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eG("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eG("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eG("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eG("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function od(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir,runnerLeaseContext:i?.runnerLeaseContext},o=await aC(e,a);return ew({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await ef("platform_command",async()=>await ou(e,o,t,r,n,i,a),{command:t,platform:e.platform})}let oc={open:({device:e,interactor:t,positionals:r,context:n})=>op(e,t,r,n),close:async({device:e,interactor:t,positionals:r})=>{let n=r[0];return n?(await t.close(n),{app:n,...J(`Closed: ${n}`)}):("web"===e.platform&&await t.close(""),{closed:"session",...J("Closed session")})},press:({device:e,interactor:t,positionals:r,context:n})=>aj(e,t,r,n),swipe:({device:e,interactor:t,positionals:r,context:n})=>a1(e,t,r,n),"swipe-preset":({device:e,interactor:t,positionals:r,context:n})=>a2(e,t,r,n),pan:({interactor:e,positionals:t})=>a5(e,t),fling:({interactor:e,positionals:t})=>a4(e,t),longpress:({interactor:e,positionals:t})=>aU(e,t),focus:({interactor:e,positionals:t})=>aB(e,t),type:({interactor:e,positionals:t,context:r})=>aq(e,t,r),fill:({interactor:e,positionals:t,context:r})=>aG(e,t,r),scroll:({interactor:e,positionals:t,context:r})=>a6(e,t,r),pinch:({device:e,interactor:t,positionals:r,context:n})=>a7(e,t,r,n),"rotate-gesture":({device:e,interactor:t,positionals:r})=>oe(e,t,r),"transform-gesture":({device:e,interactor:t,positionals:r})=>ot(e,t,r),"trigger-app-event":({device:e,interactor:t,positionals:r,context:n})=>of(e,t,r,n),screenshot:({interactor:e,positionals:t,outPath:r,context:n})=>om(e,t,r,n),viewport:({interactor:e,positionals:t})=>oh(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:"back",mode:t?.backMode??"in-app",...J("Back")}),home:async({interactor:e})=>(await e.home(),{action:"home",...J("Home")}),rotate:async({interactor:e,positionals:t})=>{let r=es(t[0]);return await e.rotate(r),{action:"rotate",orientation:r,...J(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:"app-switcher",...J("Opened app switcher")}),clipboard:({interactor:e,positionals:t})=>ow(e,t),keyboard:({device:e,positionals:t,context:r,runnerCtx:n})=>ov(e,t,r,n),settings:({device:e,interactor:t,positionals:r,context:n})=>ob(e,t,r,n),push:({device:e,positionals:t,context:r})=>oA(e,t,r),snapshot:({interactor:e,context:t})=>oS(e,t),read:({device:e,positionals:t,context:r})=>or(e,t,r)};async function ou(e,t,r,n,i,a,o){let s=Object.hasOwn(oc,r)?oc[r]:void 0;if(!s)throw new eG("INVALID_ARGS",`Unknown command: ${r}`);return await s({device:e,interactor:t,positionals:n,outPath:i,context:a,runnerCtx:o})}async function op(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eG("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eG("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eG("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...J("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eG("UNSUPPORTED_OPERATION",aO);if("linux"===e.platform&&s&&s.length>0)throw new eG("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tT(i))throw new eG("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tT(a))throw new eG("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eG("INVALID_ARGS",aT);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...J(`Opened: ${i}`)}}if(o&&tT(i))throw new eG("INVALID_ARGS",aT);if(n?.clearAppState){if(tT(i))throw new eG("INVALID_ARGS","Clearing app state requires an app target, not a deep link.");await t.setSetting("clear-app-state","clear",i)}return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchConsole:o,launchArgs:s}),{app:i,...o?{launchConsole:o}:{},...J(`Opened: ${i}`)}}async function of(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eG("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!aR.test(t))throw new eG("INVALID_ARGS",`Invalid trigger-app-event event name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});if(e.length>2)throw new eG("INVALID_ARGS","trigger-app-event accepts at most two arguments: <event> [payloadJson]");let n=function(e,t){if(e)try{let r=JSON.parse(e);if(!r||"object"!=typeof r||Array.isArray(r))throw new eG("INVALID_ARGS",`trigger-app-event payload for "${t}" must be a JSON object`);let n=JSON.stringify(r);if(Buffer.byteLength(n,"utf8")>8192)throw new eG("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eG)throw t;throw new eG("INVALID_ARGS",`Invalid trigger-app-event payload JSON: ${e}`)}}(r,t);return{eventName:t,payload:n}}(r),o=function(e,t,r){var n;let i,a=(i=("ios"===(n=e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:"macos"===n?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE,i?.trim()||void 0);if(!a)throw new eG("UNSUPPORTED_OPERATION",`No app event URL template configured for ${e}.`,{hint:`Set AGENT_DEVICE_${e.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):"",s=a.replaceAll("{event}",encodeURIComponent(t)).replaceAll("{payload}",encodeURIComponent(o)).replaceAll("{platform}",encodeURIComponent(e));if(s.length>4096)throw new eG("INVALID_ARGS","trigger-app-event URL exceeds maximum supported length",{hint:"Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.",length:s.length,maxLength:4096});return s}(e.platform,i,a);return await t.open(o,{appBundleId:n?.appBundleId}),{event:i,eventUrl:o,transport:"deep-link",...J(`Triggered app event: ${i}`)}}async function om(e,t,r,n){let i=t[0]??r??`./screenshot-${Date.now()}.png`;await l.mkdir(a.dirname(i),{recursive:!0});let o=Y(n);return await e.screenshot(i,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:n?.surface,skipIosSimulatorBootCheck:n?.skipIosSimulatorBootCheck}),{path:i,...J(`Saved screenshot: ${i}`)}}async function oh(e,t){if(2!==t.length)throw new eG("INVALID_ARGS","viewport requires exactly two arguments: <width> <height>");let r=$(t[0],"width"),n=$(t[1],"height");if(!e.setViewport)throw new eG("UNSUPPORTED_OPERATION","viewport is not supported by this backend");return await e.setViewport(r,n),{width:r,height:n,...J(`Viewport set: ${r}x${n}`)}}async function ow(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eG("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eG("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eG("INVALID_ARGS",'clipboard write requires text (use "" to clear clipboard)');let n=t.slice(1).join(" ");return await e.writeClipboard(n),{action:r,textLength:Array.from(n).length,...J("Clipboard updated")}}async function ov(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ey(i))throw new eG("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eG("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await oy(e,i);if("ios"===e.platform)return await og(e,i,r,n);throw new eG("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function oy(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...J("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./9624.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function og(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eG("UNSUPPORTED_OPERATION","keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS");if("enter"===t||"return"===t){let{runAppleRunnerCommand:t}=await Promise.resolve(t3),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...J("Keyboard enter pressed")}}let{runAppleRunnerCommand:i}=await Promise.resolve(t3),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...J(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function ob(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eG("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eG("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ew({level:"debug",phase:"settings_apply",data:{setting:i,state:"clear",appBundleId:r,platform:e.platform}});let s=await t.setSetting(i,"clear",r);return s&&"object"==typeof s?T({setting:i,state:"clear",...s},oI(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...J(`Cleared user data for ${r}`)}}if(!a)throw new eG("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,d=("permission"===i||l?r[4]:r[2])??n?.appBundleId,c="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:V(o,"latitude"),longitude:V(s,"longitude")}:void 0;ew({level:"debug",phase:"settings_apply",data:l?{setting:i,state:a,latitude:o,longitude:s,platform:e.platform}:"permission"===i?{setting:i,state:a,permissionTarget:o,permissionMode:s,platform:e.platform}:{setting:i,state:a,appBundleId:d,platform:e.platform}});let u=await t.setSetting(i,a,d,c);return u&&"object"==typeof u?T({setting:i,state:a,...u},oI(u)??`Updated setting: ${i}`):{setting:i,state:a,...J(`Updated setting: ${i}`)}}async function oA(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eG("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await os(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...J(`Pushed notification to ${n}`)}}let{pushAndroidNotification:o}=await import("./notifications.js"),s=await o(e,n,a);return{platform:"android",package:n,action:s.action,extrasCount:s.extrasCount,...J(`Pushed notification to ${n}`)}}async function oS(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,surface:t?.surface})}function oI(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}function o_(e,t=e=>e){let r=new p;return{resolve:n=>n?t(n):r.getStore()??e,run:async(e,n)=>e?await r.run(t(e),n):await n(),hasScope:()=>!!r.getStore()}}function oM(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function ox(e,t){return{openBundle:async(t,r)=>{var n,i;let a;await e("open",(n=t,i=r,a=["-b",n],i&&a.push(i),a))},openTarget:async t=>{await e("open",[t])},readClipboard:async()=>{let t=await e("pbpaste",[],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to read macOS clipboard",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});return t.stdout.replace(/\r\n/g,"\n").replace(/\n$/,"")},writeClipboard:async t=>{let r=await e("pbcopy",[],{allowFailure:!0,stdin:t});if(0!==r.exitCode)throw new eG("COMMAND_FAILED","Failed to write macOS clipboard",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode})},readDarkMode:async()=>{let t=await e("osascript",["-e",'tell application "System Events" to tell appearance preferences to get dark mode'],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to read macOS appearance",{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode});let r=t.stdout.trim().toLowerCase();if("true"===r)return!0;if("false"===r)return!1;throw new eG("COMMAND_FAILED",`Unable to determine current macOS appearance from osascript output: ${t.stdout.trim()}`)},setDarkMode:async t=>{let r=`tell application "System Events" to tell appearance preferences to set dark mode to ${t?"true":"false"}`,n=await e("osascript",["-e",r],{allowFailure:!0});if(0!==n.exitCode)throw new eG("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await oN(e,t,r)}}async function oN(e,t,r){let n=["/Applications","/System/Applications",a.join(m.homedir(),"Applications")],i=new Set;for(let t of n){let r=await l.stat(t).catch(()=>null);if(!r?.isDirectory())continue;let n=await e("find",[t,"-maxdepth","4","-type","d","-name","*.app"],{allowFailure:!0});if(0===n.exitCode)for(let e of n.stdout.split("\n")){let t=e.trim();t&&i.add(t)}}return oM((await Promise.all(Array.from(i).map(async e=>{let r=await oD(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??a.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function oD(e,t){for(let r of[a.join(e,"Contents","Info.plist"),a.join(e,"Info.plist")]){let e=await t(r),n=oP(e,"CFBundleIdentifier"),i=oP(e,"CFBundleDisplayName"),a=oP(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function oP(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let ok={runCommand:eK,simctl:{run:async(e,t)=>await eK("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eK("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await oU(eK,e)},macosHost:ox(eK,async e=>await oU(eK,e)),whichCommand:ez},oE=o_(ok,function(e){return"function"==typeof e?oC({runCommand:e}):oC(e)});function oC(e={}){let t={...ok,...e},r=e.plist??{readJson:async e=>await oU(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,r)=>await t.runCommand("xcrun",["simctl",...e],r)},devicectl:e.devicectl??{run:async(e,r)=>await t.runCommand("xcrun",["devicectl",...e],r)},plist:r,macosHost:e.macosHost??ox(t.runCommand,async e=>await r.readJson(e))}}function oR(e){return oE.resolve(e)}async function oO(e,t){return await oE.run(e,t)}function oT(){return oE.hasScope()}async function oL(e,t,r){return await oR().runCommand(e,t,r)}async function oF(e,t){let r=oR(),[n,...i]=e;return"simctl"===n?await (r.simctl?.run(i,t)??r.runCommand("xcrun",e,t)):"devicectl"===n?await (r.devicectl?.run(i,t)??r.runCommand("xcrun",e,t)):await oL("xcrun",e,t)}async function o$(e){return await oR().plist?.readJson(e)??null}async function oU(e,t){try{let r=await e("plutil",["-convert","json","-o","-",t],{allowFailure:!0});if(0!==r.exitCode||!r.stdout.trim())return null;return JSON.parse(r.stdout)}catch{return null}}let oB="agent-device-macos-helper",oq="AGENT_DEVICE_MACOS_HELPER_BIN",oG=a.join(m.homedir(),".agent-device","macos-helper","current"),oV=a.join(oG,"manifest.json"),oj=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function oK(e){let t=e.trim();if(!oj.test(t))throw new eG("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function oH(e,t){t.bundleId&&e.push("--bundle-id",oK(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function oW(){return function(e){let t=a.dirname(e);for(;;){let e=a.join(t,"macos-helper");if(s(a.join(e,"Package.swift")))return e;let r=a.dirname(t);if(r===t)break;t=r}throw new eG("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function oz(e){let t=await l.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=a.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await oz(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function oX(e){let t=await oz(e),r=i("sha256");for(let n of t)r.update(a.relative(e,n)),r.update("\0"),r.update(await l.readFile(n)),r.update("\0");let n=await oL("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(n.stdout||n.stderr||`exit:${n.exitCode}`),r.update("\0"),r.digest("hex")}async function oJ(){try{let e=JSON.parse(await l.readFile(oV,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function oZ(){let e=await eW(process.env[oq],oq);if(e)return e;let t=oW(),r=await oX(t),n=a.join(oG,oB);try{if(await oJ()===r)return await l.access(n),n}catch{}let i=a.join(oW(),".build","release",oB);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await oL("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await l.mkdir(oG,{recursive:!0});let o=`${n}.tmp`;return await l.copyFile(i,o),await l.rename(o,n),await l.chmod(n,493),await l.writeFile(oV,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
+
`,"utf8"),n}async function oY(){let e=process.env[oq]?.trim();if(e){let t=await eW(e,oq);if(t)return t}if(oT())return oB;if("darwin"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await oZ()}async function oQ(e){return eV(await oY(),["audio-probe","--duration-ms",String(e.durationMs),"--bucket-ms",String(e.bucketMs),"--out",e.statusPath],{allowFailure:!0,captureOutput:!0})}async function o0(e){let t={allowFailure:!0,timeoutMs:3e4},r=oR().macosHelper,n=r?oB:await oY(),i=r?await r.run(e,t):await oL(n,e,t),a=i.stdout.trim(),o=null;if(a)try{o=JSON.parse(a)}catch{o=null}if(0===i.exitCode&&o?.ok)return o.data;throw new eG("COMMAND_FAILED",o&&!o.ok?o.error?.message??`macOS helper exited with code ${i.exitCode}`:a||i.stderr.trim()||`macOS helper exited with code ${i.exitCode}`,{helperPath:n,args:e,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,...o&&!o.ok?o.error?.details:{}})}async function o1(){return await o0(["app","frontmost"])}async function o2(e){return await o0(["app","quit","--bundle-id",oK(e)])}async function o3(e,t){return await o0(["permission",e,t])}async function o5(e,t={}){let r=["alert",e];return oH(r,t),await o0(r)}async function o4(e,t={}){let r=["snapshot","--surface",e];return oH(r,t),await o0(r)}async function o6(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return oH(n,r),await o0(n)}async function o8(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return oH(n,r),await o0(n)}async function o9(e,t={}){let r=["screenshot","--out",e];return oH(r,t),t.fullscreen&&r.push("--fullscreen"),await o0(r)}let o7={"push button":"Button","toggle button":"Button","push button menu":"Button",label:"StaticText",static:"StaticText",caption:"StaticText",text:"TextField",entry:"TextField","password text":"TextField","spin button":"TextField",terminal:"TextArea","document text":"TextArea",paragraph:"TextArea",frame:"Window",window:"Window",dialog:"Dialog",alert:"Alert","file chooser":"Dialog","color chooser":"Dialog","font chooser":"Dialog",panel:"Group",filler:"Group",section:"Group",form:"Group",grouping:"Group","layered pane":"Group","glass pane":"Group","root pane":"Group","option pane":"Group","internal frame":"Group","desktop frame":"Group","block quote":"Group",article:"Group",comment:"Group",landmark:"Group",log:"Group",marquee:"Group",math:"Group",notification:"Group","content deletion":"Group","content insertion":"Group",mark:"Group",suggestion:"Group","scroll pane":"ScrollArea","scroll bar":"ScrollBar","menu bar":"MenuBar",menu:"Menu","popup menu":"Menu","menu item":"MenuItem","check menu item":"MenuItem","radio menu item":"MenuItem","tearoff menu item":"MenuItem","check box":"CheckBox","radio button":"RadioButton",switch:"Switch","combo box":"ComboBox","page tab":"Tab","page tab list":"TabList",table:"Table","tree table":"Table","table cell":"Cell","table row":"Row","table column header":"Cell","table row header":"Cell","column header":"Cell","row header":"Cell",list:"List","list item":"ListItem","list box":"List",tree:"Tree","tree item":"TreeItem","description list":"List","description term":"ListItem","description value":"ListItem","tool bar":"Toolbar","status bar":"StatusBar","info bar":"StatusBar",slider:"Slider","progress bar":"ProgressBar","level bar":"ProgressBar",image:"Image",icon:"Image",animation:"Image",canvas:"Image","drawing area":"Image",video:"Video",audio:"Audio",link:"Link",hyperlink:"Link",separator:"Separator",application:"Application","tool tip":"Tooltip",timer:"Timer",heading:"Heading",footnote:"Footnote","title bar":"TitleBar","date editor":"DateEditor",rating:"Slider"},se={runCommand:eK,whichCommand:ez,desktop:sa(eK,ez),clipboard:so(eK,ez),screenshot:ss(eK,ez)},st=o_(se,function(e={}){let t={...se,...e};return{...t,desktop:e.desktop??sa(t.runCommand,t.whichCommand),clipboard:e.clipboard??so(t.runCommand,t.whichCommand),screenshot:e.screenshot??ss(t.runCommand,t.whichCommand)}});function sr(e){return st.resolve(e)}async function sn(e,t){return await st.run(e,t)}async function si(e,t,r){return await sr().runCommand(e,t,r)}function sa(e,t){return{async openTarget(r){if(r.includes("://")||r.startsWith("/"))return void await e("xdg-open",[r]);if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{ew({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await tm(500);return}await e("xdg-open",[r],{allowFailure:!0})},async closeApp(r){await t("wmctrl")?await e("wmctrl",["-c",r],{allowFailure:!0}):await e("pkill",["-x",r],{allowFailure:!0})}}}function so(e,t){return{async readText(){let r=sc[await sf(t,sl)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=su[await sf(t,sl)](r);await e(n.cmd,n.args,n.options)}}}function ss(e,t){return{async capture(r){let n=sp[await sf(t,sd)](r);await e(n.cmd,n.args,n.options)}}}let sl={wayland:[{tool:"wl-clipboard",command:"wl-paste"}],x11:[{tool:"xclip",command:"xclip"},{tool:"xsel",command:"xsel"}],waylandError:"wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.",x11Error:"xclip or xsel is required for clipboard access on X11. Install via your package manager."},sd={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},sc={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},su={"wl-clipboard":e=>({cmd:"wl-copy",args:["--",e],options:{allowFailure:!1,timeoutMs:5e3}}),xclip:e=>({cmd:"xclip",args:["-selection","clipboard"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}}),xsel:e=>({cmd:"xsel",args:["--clipboard","--input"],options:{allowFailure:!1,timeoutMs:5e3,stdin:e}})},sp={grim:e=>({cmd:"grim",args:[e]}),scrot:e=>({cmd:"scrot",args:[e]}),import:e=>({cmd:"import",args:["-window","root",e]}),"gnome-screenshot":e=>({cmd:"gnome-screenshot",args:["-f",e]})};async function sf(e,t){let r=process.env.WAYLAND_DISPLAY||"wayland"===process.env.XDG_SESSION_TYPE?"wayland":"x11";for(let n of t[r])if(await e(n.command))return n.tool;throw new eG("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let sm="atspi-dump.py",sh=null;async function sw(e,t={}){let r,n=sr().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eG("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await sr().whichCommand("python3"))throw new eG("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let i=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(sh)return sh;let e=a.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=a.join(e,"src","platforms","linux",sm);if(o.existsSync(r))return sh=r,r;if(0===t){let t=a.join(e,sm);if(o.existsSync(t))return sh=t,t}e=a.dirname(e)}throw new eG("TOOL_MISSING",`Cannot find ${sm}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(i),"--max-depth",String(s),"--max-apps",String(l)],u=await si("python3",d,{allowFailure:!0,timeoutMs:3e4});if(0!==u.exitCode){let e=u.stderr.trim();if(e.includes("No module named")||e.includes("gi.require_version"))throw new eG("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eG("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eG("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=o7[t=e.role.toLowerCase().trim()])||t.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(""),role:e.role,label:e.label??void 0,value:e.value??void 0,rect:e.rect??void 0,enabled:e.enabled??void 0,selected:e.selected??void 0,hittable:e.hittable??void 0,depth:e.depth,parentIndex:e.parentIndex??void 0,pid:e.pid??void 0,appName:e.appName??void 0,windowTitle:e.windowTitle??void 0}}),truncated:r.truncated,surface:e}}async function sv(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ew({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await sw(t);return{nodes:r.nodes,truncated:r.truncated}}async function sy(e,t,r){let{nodes:n}=await sv(r);for(let r of n.filter(r=>{let n=r.rect;return!!n&&e>=n.x&&t>=n.y&&e<=n.x+n.width&&t<=n.y+n.height}).sort((e,t)=>{let r=e.depth??0,n=t.depth??0;return r!==n?n-r:sg(e.rect)-sg(t.rect)})){let e=function(e){for(let t of[e.value,e.label,e.identifier])if("string"==typeof t&&t.length>0)return t;return""}(r);if(e.trim())return e}return""}function sg(e){return(e?.width??0)*(e?.height??0)}let sb=[250,400,600];function sA(e,t,r=e.snapshot){if("android"!==e.device.platform)return;let n=function(e,t){if(t?.comparisonSafe===!0)return t;let r=e.lastComparisonSafeSnapshot;return r&&!0===r.comparisonSafe&&Date.now()-r.createdAt<=5e3?r:t}(e,r),i=n?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(n??r)?.nodes.length??0,baselineSignatures:i?sM(n?.nodes??[]):void 0,routeComparable:i}}function sS(e){if(!e||"android"!==e.device.platform)return;let t=e.androidSnapshotFreshness;if(t)return Date.now()-t.markedAt>2500?void delete e.androidSnapshotFreshness:t}function sI(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function s_(e){return"press"===e||"click"===e||"back"===e||"open"===e}function sM(e){return e.map(e=>[e.depth??0,e.type??"",e.role??"",e.label??"",e.value??"",e.identifier??"",!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].join("|"))}function sx(e){return N(e)}function sN(e,t){let r=sx(e),n=t?.lease??t?.deviceLease??void 0;return tB({tenantId:r.tenantId??n?.tenantId,runId:r.runId??n?.runId,leaseId:r.leaseId??n?.leaseId,leaseTtlMs:r.leaseTtlMs,leaseBackend:r.leaseBackend??n?.leaseBackend,leaseProvider:r.leaseProvider??n?.leaseProvider,deviceKey:r.deviceKey??n?.deviceKey,clientId:r.clientId??n?.clientId})}function sD(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}function sP(e,t,r,n,i,a){let o,s;return{requestId:i??eu().requestId,appBundleId:r,runnerLeaseContext:(o=({meta:a}).meta,Object.keys(s=tB({leaseId:sD(o?.leaseId),clientId:sD(o?.clientId),tenantId:sD(o?.tenantId),runId:sD(o?.runId),leaseProvider:sD(o?.leaseProvider),deviceKey:sD(o?.deviceKey)})).length>0?s:void 0),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...er(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:k(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function sk(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!sF(r))return;let s=function(e){if("click"===e||"press"===e)return"press"}(n);if(!s||!(2===(t=i).length&&t.every(e=>Number.isFinite(Number(e)))))return;let l=sO(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:sR(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function sE(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function sC(e){let{session:t,pending:r,snapshot:n}=e,i=sT(r.preSignature,sO(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await od(t.device,r.command,r.positionals,r.flags?.out,{...sP(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ew({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function sR(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function sO(e){let t=new Map,r=[];for(let n of e){let e=function(e,t){var r,n;if(!e.rect||!([(r=e.rect).x,r.y,r.width,r.height].every(e=>Number.isFinite(e))&&r.width>0&&r.height>0)||(n=e,`${n.label??""} ${n.identifier??""}`.toLowerCase().includes("scroll bar")))return;let i=function(e){let t=[e.identifier,e.label,e.value,e.type,e.role,!1===e.enabled?"disabled":"enabled",!0===e.selected?"selected":"unselected",!0===e.hittable?"hittable":"not-hittable"].map(e=>"string"==typeof e?e.trim():"").join("|");return t.replaceAll("|","")?t:void 0}(e);if(!i)return;let a=t.get(i)??0;return t.set(i,a+1),{key:`${i}|#${a}`,x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height)}}(n,t);e&&r.push(e)}return r}function sT(e,t){return 0===e.length||0===t.length?"ambiguous":sL(e,t)?"unchanged":"changed"}function sL(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r+=1){let n=e[r],i=t[r];if(!n||!i||n.key!==i.key||Math.abs(n.x-i.x)>1||Math.abs(n.y-i.y)>1||Math.abs(n.width-i.width)>1||Math.abs(n.height-i.height)>1)return!1}return!0}function sF(e){return ti(e.device.platform)}function s$(e,t,r=[],n){var i,a,o;ti(e.device.platform)&&(i=t,a=r,o=n,(o?.postGestureStabilization===!0||"swipe"===i||"scroll"===i||"gesture"===i&&"swipe"===a[0])&&(e.postGestureStabilization={action:t,markedAt:Date.now()}))}function sU(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function sB(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!ti(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=sO(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await tm(200),a+=1;let l=await r(),d=sO(e.readSnapshot(l).nodes);if(sL(s,d))return sU(t),ew({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=d}return sU(t),ew({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}let sq=new WeakMap;function sG(e,t){if(!e[t])return[];let r=sK(e)[t]??t+1;return e.slice(t+1,r)}function sV(e,t,r){let n=sK(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function sj(e,t,r){let n=sK(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function sK(e){let t=sq.get(e);if(t)return t;let r=Array(e.length),n=[];for(let[t,i]of e.entries()){let e=i?.depth??0;for(;n.length>0&&e<=n[n.length-1].depth;)r[n.pop().position]=t;n.push({depth:e,position:t})}for(let t of n)r[t.position]=e.length;return sq.set(e,r),r}function sH(e,t,r){for(let n of function(e,t){let r=[],n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),r.push(n),n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0;return r}(e,t))if(r(n))return n;return null}function sW(e,t){let r=tH(e.type??""),n=e.label?.trim();return!!(sz(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function sz(e){return"button"===tH(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function sX(e){let t=tH(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function sJ(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function sZ(e){let t;for(let i of e){var r,n;let e=tH(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||sY(r)>sY(n)))&&(t=i.rect)}return t}function sY(e){return e?e.width*e.height:0}function sQ(e){let t=tH(e.type??"");return"scrollview"===t||"scrollarea"===t}function s0(e,t){return!0===e||!!t||void 0}function s1(e,t,r,n){sj(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tH(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function s2(e,t,r,n){sj(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tH((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function s3(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tH(n.type??"")&&t(n,i,r)}}function s5(e,t,r,n){for(let i of e)(sW(i,t)||n&&s6(i,n))&&r.add(i.index)}function s4(e,t,r){if("button"!==tH(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&K(e.rect,t.rect)}function s6(e,t){return"button"===tH(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&K(e.rect,t.rect)}let s8=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=sZ(e),n=r?r.y+r.height:null;if(null!==n)for(let r=0;r<e.length;r+=1){var i,a;let o=e[r];o&&(i=o,a=n,i.rect&&"keyboard"===tH(i.type??"")&&i.rect.y>=a)&&(t.add(o.index),function(e,t,r,n){let i=new Map(t.map(e=>[e.index,e])),a="number"==typeof e.parentIndex?i.get(e.parentIndex):void 0;for(;a?.rect&&a.rect.y>=n;)r.add(a.index),a="number"==typeof a.parentIndex?i.get(a.parentIndex):void 0}(o,e,t,n),sj(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tH(r.type??"")||!0===r.hittable||r.label?.trim()||r.value?.trim())&&r.identifier?.trim()&&t.add(r.index)}(e,o);let s=new Map(e.map(e=>[e.index,e]));for(let r of e)(function(e){let t=e.label?.trim();return!!(t&&H(t))})(r)&&function(e,t,r){var n,i,a,o;sX(e.type)||r.suppressedIndexes.add(e.index);let s=C(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&sX(e.type)?e:null)??sH(e,t,e=>sX(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,sJ(n.replacements,i,{rect:function(e,t){if(e&&t&&!(t.height<=0)&&!(t.height>=e.height)&&!(t.y<e.y)&&!(t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}(i.rect,a.rect)??i.rect,hiddenContentAbove:s0(i.hiddenContentAbove,o.above),hiddenContentBelow:s0(i.hiddenContentBelow,o.below)}))}(r,s,t);(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r];if(!n||"searchfield"!==tH(n.type??""))continue;if("Search"===n.label){s2(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=sV(e,r,e=>"searchfield"===tH(e.type??"")&&"Search"===e.label);i&&(t.add(n.index),function(e,t,r){let n=new Map(t.map(e=>[e.index,e])),i=e;for(;"number"==typeof i.parentIndex;){let e=n.get(i.parentIndex);if(!e||"Toolbar"!==e.label)return;r.add(e.index),i=e}}(n,e,t),s2(e,r,i.index,t))}})(e,o),r=e,n=o,s3(r,(e,t,i)=>{sV(r,i,r=>{let n;return("button"===(n=tH(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(K(r.rect,e.rect)||function(e,t){var r,n,i,a,o;let s;if(t.label?.trim()!==e.label?.trim())return!1;let l=tH(t.type??"");return r=e,n=l,s=r.label?.trim(),"button"===n&&("Dismiss"===s||"Back"===s)||"textfield"===l||(i=e,a=l,o=t,"button"===a&&!!i.rect&&!!o.rect&&0===i.rect.x&&0===i.rect.y&&i.rect.width>=300&&i.rect.height>=600&&o.rect.width<i.rect.width)}(e,r))})&&n.add(e.index)}),i=e,a=o,s3(i,(e,t,r)=>{let n;et(e)&&D(e,(n=[],sj(i,r,e=>{n.push(e)}),n))&&a.add(e.index)}),function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();!(!n||t.has(n.index))&&i&&function(e,t,r,n,i){let a=tH(r.type??"");if("statictext"===a||"link"===a)return s1(e,t,n,i);if("other"===a){if(function(e,t,r){return!!sV(e,t,e=>{let t=tH(e.type??"");return("link"===t||"searchfield"===t||sX(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);s1(e,t,n,i)}}(e,r,n,i,t)}}(e,o)},function(e,t){let r=new Map(e.map(e=>[e.index,e])),n=sZ(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tH(e.type??"")||!1===e.enabled||!e.rect||!function(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith("!,")||/debugger|fast refresh/i.test(t))}(e.label)||!sH(e,t,sQ)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=sY(e),i=sY(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&sJ(t.replacements,i,{type:"Cell"})},function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n?.rect&&i&&function(e,t,r,n,i){let a=tH(r.type??"");if("button"===a)return s5(sG(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=sG(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tH(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r})(e,t,r));if(!i)return!1;let a=e.find(e=>s4(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&sJ(n.replacements,i,{identifier:o}),n.suppressedIndexes.add(t.index),function(e,t,r,n,i){for(let a of e)a.index!==n.index&&(s4(a,t,r)||s6(a,t)||function(e,t){if("switch"!==tH(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||sW(a,r))&&i.add(a.index)}(e,t,r,i,n.suppressedIndexes),!0}(o,r,n,i)&&function(e,t,r,n){let i=e.find(e=>s4(e,t,r));if(!i){e.some(sz)&&s5(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&sJ(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),s5(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function s9(e){let t=await s7(e);if(t)return t;let r=await ls(e);return sI(e.session),{snapshot:r.snapshot,...r.annotations}}async function s7(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!sF(e)||Date.now()-t.markedAt>3e4?void sE(e):t}(e.session);if(t&&e.session)return await le({...e,session:e.session},t);if(ti(e.device.platform)&&e.session?.postGestureStabilization)return await la({...e,session:e.session});let r=sS(e.session);if(r&&"android"===e.device.platform)return await ln(e,r)}async function le(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await lt(e,t,await lo(e)),l=await sC({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await lt(e,t,await lo(e)),l=await sC({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(sE(i),s=await sB({session:i,initial:s,capture:async()=>await lo(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&sI(i),"unchanged"===l.change)?ew({level:"warn",phase:"interaction_settle_timeout",data:{action:(r={pending:t,attempts:o,startedAt:a}).pending.action,attempts:r.attempts,durationMs:Date.now()-r.startedAt}}):ew({level:(n={pending:t,change:l.change,attempts:o,startedAt:a}).attempts>0?"info":"debug",phase:"interaction_settled",data:{action:n.pending.action,change:n.change,attempts:n.attempts,durationMs:Date.now()-n.startedAt}}),{snapshot:s.snapshot,...s.annotations}}async function lt(e,t,r){let n=r;return"unchanged"!==sT(t.preSignature,sO(n.snapshot.nodes))?n:(await tm(500),n=await lo(e))}async function lr(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await sv(r?.surface);return lc({nodes:e.nodes,truncated:e.truncated,backend:"linux-atspi"},{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o})}return"macos"===t.platform&&r?.surface&&"app"!==r.surface?lc(await o4(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await od(t,"snapshot",[],i,{...sP(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath),snapshotIncludeRects:e.includeRects})}async function ln(e,t){let r=await li(e,t);return{snapshot:r.snapshot,...r.annotations}}async function li(e,t){let r=await ls(e),n=ll(r,t,e),i=0,a=t.markedAt+1500;for(let o of sb){if(!n)break;let s=a-Date.now();if(s<=0)break;await tm(Math.min(o,s)),r=await ls(e),i+=1,n=ll(r,t,e)}n||sI(e.session);let o=i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0;return{...r,annotations:{...r.annotations,...en({freshness:o})}}}async function la(e){let t=await sB({session:e.session,capture:async()=>await lo(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function lo(e){let t=sS(e.session);return t&&"android"===e.device.platform?await li(e,t):await ls(e)}async function ls(e){var t;let r=Date.now(),n=await lr(e);return e8(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:ld(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:en(n)}}function ll(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.annotations.analysis;if(a&&0===e.snapshot.nodes.length&&o&&o.rawNodeCount>=12)return"empty-interactive";if("ref-refresh"===r.androidFreshnessMode)return null;return(n=t.baselineCount,i=e.snapshot.nodes.length,!(n<12)&&i<=Math.floor(.2*n))?e.snapshot.nodes.some(e=>!0===e.hittable||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())?null:"sharp-drop":t.routeComparable&&s_(t.action)&&function(e,t){if(!e||0===e.length)return!1;let r=Math.max(e.length,t.length);if(r<12)return!1;let n=sM(t),i=Math.min(e.length,n.length),a=0;for(let t=0;t<i;t+=1)e[t]===n[t]&&(a+=1);let o=Math.max(0,n.length-e.length),s=Math.max(0,e.length-n.length),l=Math.max(3,Math.floor(.15*r));return a>=Math.floor(.9*r)&&o<=l&&s<=l}(t.baselineSignatures,e.snapshot.nodes)?"stuck-route":null}function ld(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=ee(s?o:tW(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?lu(l,t.snapshotScope):l,c=(r=e?.backend,n=t,"xctest"===r&&n?.snapshotInteractiveOnly===!0&&!0!==n.snapshotRaw)?function(e){if(0===e.length)return e;let t=new Map,r=new Set;for(let n of s8)n(e,{replacements:t,suppressedIndexes:r});if(0===r.size&&0===t.size)return e;var n=e.filter(e=>!r.has(e.index)).map(e=>t.get(e.index)??e);let i=new Map(e.map(e=>[e.index,e])),a=new Map;for(let[e,t]of n.entries())a.set(t.index,e);return n.map((e,t)=>{let n="number"==typeof e.parentIndex?a.get(e.parentIndex):void 0;return void 0===n&&"number"==typeof e.parentIndex&&(n=function(e,t,r,n){let i=e,a=new Set;for(;"number"==typeof i&&!a.has(i);){if(a.add(i),!t.has(i))return n.get(i);i=r.get(i)?.parentIndex}}(e.parentIndex,r,i,a)),{...e,index:t,parentIndex:n}})}(d):d,u=tf(s?c:B(c)),p=en(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:tp(to(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function lc(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=lu(i,t.snapshotScope)),t.snapshotInteractiveOnly&&(i=function(e){if(0===e.length)return e;let t=new Map;for(let r of e)t.set(r.index,r);let r=new Set;for(let n of e){if(!function(e){if(e.focused||e.hittable||e.rect)return!0;let t=`${e.type??""} ${e.role??""} ${e.subrole??""}`.toLowerCase();return t.includes("button")||t.includes("menu")||t.includes("textfield")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")}(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0}return 0===r.size?e:lp(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=lp(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function lu(e,t){let r=tz(tf(e),t);if(!r)return[];let n=e.findIndex(e=>e.index===r.index);if(-1===n)return[];let i=e[n]?.depth??0,a=[];for(let t=n;t<e.length;t+=1){let r=e[t];if(!r)continue;let o=r.depth??0;if(t>n&&o<=i)break;a.push(r)}return lp(a,i)}function lp(e,t=0){let r=new Map;for(let[t,n]of e.entries())r.set(n.index,t);return e.map((e,n)=>({...e,index:n,depth:Math.max(0,(e.depth??0)-t),parentIndex:"number"==typeof e.parentIndex?r.get(e.parentIndex):void 0}))}function lf(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return af("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=tr(e.trim());if(!n)return af("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tl(e.nodes,n);if(r=t?tX(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:af("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function lm(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function lh(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?ew({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function lw(e){let{session:t,sessionName:r,outPath:n,outputPlacement:i,dispatchContext:o}=e,s=eN({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...er(a),surface:a?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??("ios"===t.device.platform&&"simulator"===t.device.kind)};return"out"===r?eY(await od(t.device,"screenshot",[],i,o)):eY(await od(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:i,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eG("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-screenshot-")),r=a.join(t,"screenshot.png")),await l.mkdir(a.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await l.mkdtemp(a.join(m.tmpdir(),`${e.prefix}-`));return{path:a.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await l.rm(t,{recursive:!0,force:!0})}}}},sessions:lh({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eD()});return await s.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...Y(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function*lv(e){let t=/<node\b[^>]*>/g,r=t.exec(e);for(;r;)yield ly(r[0]),r=t.exec(e)}function ly(e){let t,r,n,i,a,o=(t=function(e){let t=new Map,r=e.indexOf(" "),n=e.lastIndexOf(">");if(r<0||n<=r)return t;let i=r;for(;i<n;){let r=function(e,t,r){var n,i;if((t=lb(e,t,r))>=r||"/"===(n=e[t])||">"===n)return;let a=t;t=function(e,t,r){for(var n;t<r&&!("="===(n=e[t]??"")||"/"===n||">"===n||lA(n));)t+=1;return t}(e,t,r);let o=e.slice(a,t);if(t=lb(e,t,r),!o||"="!==e[t])return;t=lb(e,t+1,r);let s=e[t];if('"'!==(i=s)&&"'"!==i)return;let l=t+1,d=e.indexOf(s,l);if(!(d<0)&&!(d>=r))return{name:o,value:function(e){let t="",r=0;for(;r<e.length;){let n=e.indexOf("&",r);if(n<0){t+=e.slice(r);break}t+=e.slice(r,n);let i=e.indexOf(";",n+1);if(i<0){t+=e.slice(n);break}t+=function(e){switch(e){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:return function(e){if(!e.startsWith("#"))return;let t=e[1]?.toLowerCase()==="x"?16:10,r=16===t?e.slice(2):e.slice(1);if(!r||!function(e,t){for(let r of e){let e=r.charCodeAt(0),n=e>=48&&e<=57;if(10===t){if(!n)return!1;continue}let i=e>=65&&e<=70,a=e>=97&&e<=102;if(!n&&!i&&!a)return!1}return!0}(r,t))return;let n=Number.parseInt(r,t);if(Number.isFinite(n))try{return String.fromCodePoint(n)}catch{return}}(e)}}(e.slice(n+1,i))??e.slice(n,i+1),r=i+1}return t}(e.slice(l,d)),nextCursor:d+1}}(e,i,n);if(!r)break;t.set(r.name,r.value),i=r.nextCursor}return t}(e),r=e=>{let r=lS(t,e);if(null!==r)return"true"===r},n=(e,r)=>{let n=(e=>{let r=lS(t,e);if(null===r||""===r.trim())return;let n=Number(r);return Number.isFinite(n)?n:void 0})(r);return void 0===n?{}:{[e]:n}},i=(e,t)=>{let n=r(t);return void 0===n?{}:{[e]:n}},{text:lS(t,"text"),desc:lS(t,"content-desc"),resourceId:lS(t,"resource-id"),packageName:lS(t,"package"),className:lS(t,"class"),bounds:lS(t,"bounds"),clickable:r("clickable"),enabled:r("enabled"),focusable:r("focusable"),focused:r("focused"),password:r("password"),...i("visibleToUser","visible-to-user"),...n("drawingOrder","drawing-order"),...i("scrollable","scrollable"),...i("canScrollForward","can-scroll-forward"),...i("canScrollBackward","can-scroll-backward"),...n("windowIndex","window-index"),...n("windowType","window-type"),...n("windowLayer","window-layer"),...i("windowActive","window-active"),...i("windowFocused","window-focused"),...void 0===(a=nL(lS(t,"window-bounds")))?{}:{windowRect:a}}),s=nL(o.bounds);return{...o,...s?{rect:s}:{}}}function lg(e,t,r){let n={nodes:[],sourceNodes:[],...void 0!==t?{maxNodes:t}:{},maxDepth:r.depth??1/0,options:r,analysis:function(e){let t=0,r=0,n=[...e.children];for(;n.length>0;){let e=n.pop();t+=1,r=Math.max(r,e.depth),n.push(...e.children)}return{rawNodeCount:t,maxDepth:r}}(e),interactiveDescendantMemo:new Map,truncated:!1},i=r.scope?function(e,t){let r=t.toLowerCase(),n=[...e.children],i=0;for(;i<n.length;){let e=n[i++],t=e.label?.toLowerCase()??"",a=e.value?.toLowerCase()??"",o=e.identifier?.toLowerCase()??"";if(t.includes(r)||a.includes(r)||o.includes(r))return e;n.push(...e.children)}return null}(e,r.scope):null;for(let t of i?[i]:e.children)if(function e(t,r,n,i,a=!1,o=!1){if(void 0!==t.maxNodes&&t.nodes.length>=t.maxNodes){t.truncated=!0;return}if(n>t.maxDepth)return;let s=t.options.raw||function(e,t,r,n,i){var a,o,s;if(!1===e.visibleToUser)return!1;let l=function(e){let t=lD(e.type),r=!!(e.label&&e.label.trim().length>0),n=!!(e.identifier&&e.identifier.trim().length>0);return{type:t,hasMeaningfulText:r&&!lP(e.label??""),hasMeaningfulId:n&&!lP(e.identifier??""),isStructural:function(e){let t=e.split(".").pop()??e;return t.includes("layout")||"viewgroup"===t||"view"===t}(t),isVisual:"imageview"===t||"imagebutton"===t}}(e);return t.interactiveOnly?function(e,t,r,n,i){var a,o,s,l,d;return!((a=e).rect&&(a.rect.width<=0||a.rect.height<=0))&&(!!(e.hittable||R(t.type)&&n)||(o=t,s=r,l=n,d=i,(!!o.hasMeaningfulText||!!o.hasMeaningfulId)&&!o.isVisual&&(!o.isStructural||!!d)&&(s||l||d)))}(e,l,r,n,i):!l.isStructural&&!l.isVisual||(a=e,o=l,s=n,!!a.hittable||!!o.hasMeaningfulText||!!o.hasMeaningfulId||s)}(r,t.options,a,function e(t,r){let n=t.interactiveDescendantMemo.get(r);if(void 0!==n)return n;for(let n of r.children)if(!1!==n.visibleToUser&&(n.hittable||e(t,n)))return t.interactiveDescendantMemo.set(r,!0),!0;return t.interactiveDescendantMemo.set(r,!1),!1}(t,r),o)?function(e,t,r,n){let i=e.nodes.length;return e.sourceNodes.push(t),e.nodes.push({index:i,type:t.type??void 0,label:t.label??void 0,value:t.value??void 0,identifier:t.identifier??void 0,bundleId:t.packageName??void 0,rect:t.rect,enabled:t.enabled,visibleToUser:t.visibleToUser,hittable:t.hittable,depth:r,parentIndex:n,...t.hiddenContentAbove?{hiddenContentAbove:!0}:{},...t.hiddenContentBelow?{hiddenContentBelow:!0}:{}}),i}(t,r,n,i):i,l=a||!!r.hittable,d=o||function(e){if(!e)return!1;let t=lD(e);return t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")}(r.type);for(let i of r.children)if(e(t,i,n+1,s,l,d),t.truncated)return}(n,t,0),n.truncated)break;let a={nodes:n.nodes,sourceNodes:n.sourceNodes,analysis:n.analysis};return n.truncated?{...a,truncated:!0}:a}function lb(e,t,r){for(;t<r&&lA(e[t]??"");)t+=1;return t}function lA(e){return" "===e||"\n"===e||"\r"===e||" "===e}function lS(e,t){return e.get(t)??null}function lI(e){let t={type:null,label:null,value:null,identifier:null,packageName:null,depth:-1,children:[]},r=[t],n=/<node\b[^>]*>|<\/node>/g,i=n.exec(e);for(;i;){let t=i[0];if(t.startsWith("</node")){r.length>1&&r.pop(),i=n.exec(e);continue}let a=ly(t),o=r[r.length-1],s={type:a.className,label:a.text||a.desc,value:a.text,identifier:a.resourceId,packageName:a.packageName,rect:a.rect,enabled:a.enabled,visibleToUser:a.visibleToUser,drawingOrder:a.drawingOrder,hittable:a.clickable??a.focusable,scrollable:a.scrollable,canScrollForward:a.canScrollForward,canScrollBackward:a.canScrollBackward,windowIndex:a.windowIndex,windowType:a.windowType,windowLayer:a.windowLayer,windowActive:a.windowActive,windowFocused:a.windowFocused,windowRect:a.windowRect,depth:o.depth+1,parentIndex:void 0,children:[]};o.children.push(s),t.endsWith("/>")||r.push(s),i=n.exec(e)}return function e(t){let r=0;for(let n of t.children)!1!==n.visibleToUser&&(e(n),t.children[r]=n,r+=1);r<t.children.length&&(t.children.length=r)}(t),function(e){let t,r=e.children.filter(lM);if(r.length<2)return;let n=r.filter(e=>lx(e)&&lN(e));if(0===n.length)return;let i=(t=n.map(e=>e.windowLayer).filter(e=>void 0!==e)).length>0?Math.max(...t):void 0;e.children=e.children.filter(e=>!lx(e)||!!lN(e)&&(void 0===i||e.windowLayer===i))}(t),function e(t,r){for(let n of t.children)e(n,r);if(t.children.length<2)return;let n=t.children,i=n.filter(e=>{var t,n;return t=e,n=r,!1!==t.visibleToUser&&void 0!==t.drawingOrder&&l_(t)&&(function(e){if(!1===e.visibleToUser)return!1;if(e.hittable)return!0;let t=e.label?.trim()??"";if(t&&!lP(t))return!0;let r=e.identifier?.trim()??"";return!(!r||lP(r))}(t)||function e(t,r){let n=r.actionableContentMemo.get(t);if(void 0!==n)return n;let i=t.children.some(t=>!1!==t.visibleToUser&&(!!t.hittable||e(t,r)));return r.actionableContentMemo.set(t,i),i}(t,n))});0!==i.length&&(t.children=n.filter(e=>!function(e,t){if(!1===e.visibleToUser||void 0===e.drawingOrder||!l_(e))return!1;for(let r of t)if(r!==e&&!(r.drawingOrder<=e.drawingOrder)&&function(e,t){let r=t.width*t.height;return r<=0?0:P(e,t)/r}(r.rect,e.rect)>=.9)return!0;return!1}(e,i)))}(t,{actionableContentMemo:new WeakMap}),function(e){let t=[...e.children];for(;t.length>0;){let e=t.pop();t.push(...e.children),function(e){if(!e.scrollable||!R(e.type)||`${e.type??""}`.toLowerCase().includes("horizontalscrollview"))return!1;let t=function(e){if(!e.rect||0===e.children.length)return null;let t=e.children.map(e=>e.rect).filter(e=>void 0!==e);if(0===t.length)return null;let r=Math.min(...t.map(e=>e.x)),n=Math.max(...t.map(e=>e.x+e.width)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y+e.height));return{horizontal:Math.max(0,n-r-e.rect.width),vertical:Math.max(0,a-i-e.rect.height)}}(e);return!t||!(t.horizontal>t.vertical)||!(t.horizontal>16)}(e)&&(e.canScrollBackward&&(e.hiddenContentAbove=!0),e.canScrollForward&&(e.hiddenContentBelow=!0))}}(t),t}function l_(e){return!!(e.rect&&e.rect.width>0&&e.rect.height>0)}function lM(e){return void 0!==e.windowIndex||void 0!==e.windowType}function lx(e){return 1===e.windowType}function lN(e){return!0===e.windowActive||!0===e.windowFocused}function lD(e){return e?e.toLowerCase():""}function lP(e){let t=e.trim();return!!t&&/^[\w.]+:id\/[\w.-]+$/i.test(t)}function lk(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function lE(e,t){let r=Math.max(24,Math.round(.2*Math.min(e.size,t.size))),n=Math.max(48,Math.round(.15*Math.min(e.crossSize,t.crossSize)));return Math.abs(e.size-t.size)<=r&&Math.abs(e.crossSize-t.crossSize)<=n}function lC(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}function lR(e){var t;let r={status:[],results:[],currentStatus:null,currentResult:null};for(let t of e.split(/\r?\n/))!function(e,t){if(e.startsWith("INSTRUMENTATION_STATUS: ")){t.currentStatus??={},lL(e.slice(24),t.currentStatus);return}if(e.startsWith("INSTRUMENTATION_STATUS_CODE: "))return lO(t);if(e.startsWith("INSTRUMENTATION_RESULT: ")){t.currentResult??={},lL(e.slice(24),t.currentResult);return}e.startsWith("INSTRUMENTATION_CODE: ")&&lT(t)}(t,r);return lO(t=r),lT(t),{status:r.status,results:r.results}}function lO(e){e.currentStatus&&(e.status.push(e.currentStatus),e.currentStatus=null)}function lT(e){e.currentResult&&(e.results.push(e.currentResult),e.currentResult=null)}function lL(e,t){let r=e.indexOf("=");r<0||(t[e.slice(0,r)]=e.slice(r+1))}function lF(e){if(void 0===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function l$(e){return"true"===e||"false"!==e&&void 0}function lU(e,t,r){if("number"!=typeof e||!Number.isInteger(e))throw new eG("INVALID_ARGS",`Android ${r} manifest ${t} must be an integer.`);return e}function lB(e,t,r,n){if(e!==r)throw new eG("INVALID_ARGS",`Android ${n} manifest ${t} must be "${r}".`);return r}let lq="android-snapshot-helper-v1",lG="uiautomator-xml",lV={"-r":"replace","-t":"allowTestPackages","-d":"allowDowngrade","-g":"grantPermissions"};async function lj(e){let t=await lz(e.apkPath);if(t!==e.manifest.sha256)throw new eG("COMMAND_FAILED","Android snapshot helper APK checksum mismatch",{apkPath:e.apkPath,expectedSha256:e.manifest.sha256,actualSha256:t})}function lK(e,t){return lU(e,t,"snapshot helper")}function lH(e,t,r){return lB(e,t,r,"snapshot helper")}function lW(e){let t=function(e,t){if(!Array.isArray(e)||!e.every(e=>"string"==typeof e))throw new eG("INVALID_ARGS",`Android snapshot helper manifest ${t} must be a string array.`);return e}(e,"installArgs");if("install"!==t[0])throw new eG("INVALID_ARGS",'Android snapshot helper manifest installArgs must start with "install".');if(t.some(e=>e.includes("\0")))throw new eG("INVALID_ARGS","Android snapshot helper manifest installArgs must not contain null bytes.");let r=t.slice(1).find(e=>void 0===lZ(e));if(r)throw new eG("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);return t}async function lz(e){return await new Promise((t,r)=>{let i=n.createHash("sha256"),a=o.createReadStream(e);a.on("error",r),a.on("data",e=>i.update(e)),a.on("end",()=>t(i.digest("hex")))})}function lX(e,t){if("string"!=typeof e||0===e.trim().length)throw new eG("INVALID_ARGS",`Android snapshot helper manifest ${t} is required.`);return e}function lJ(e){return"string"==typeof e&&e.trim().length>0?e:void 0}function lZ(e){if(Object.hasOwn(lV,e))return lV[e]}async function lY(e){let t=lQ(e),r=await e.adb(l1(t),{allowFailure:!0,timeoutMs:t.commandTimeoutMs}),{output:n,cleanupDone:i}=await l2(e,t,r);if(t.outputPath&&!i&&await l6(e.adb,t.outputPath),0!==r.exitCode)throw new eG("COMMAND_FAILED","Android snapshot helper failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode,helper:n.metadata});return n}function lQ(e){let t=l0(e.timeoutMs,8e3),r=l0(e.packageName,"com.callstack.agentdevice.snapshothelper");return{waitForIdleTimeoutMs:l0(e.waitForIdleTimeoutMs,500),waitForIdleQuietMs:l0(e.waitForIdleQuietMs,100),timeoutMs:t,commandTimeoutMs:l0(e.commandTimeoutMs,t+5e3),maxDepth:l0(e.maxDepth,128),maxNodes:l0(e.maxNodes,5e3),packageName:r,runner:l0(e.instrumentationRunner,`${r}/.SnapshotInstrumentation`),...e.outputPath?{outputPath:e.outputPath}:{},...void 0!==e.emitChunks?{emitChunks:e.emitChunks}:{}}}function l0(e,t){return void 0===e?t:e}function l1(e){return["shell","am","instrument","-w","-e","waitForIdleTimeoutMs",String(e.waitForIdleTimeoutMs),"-e","waitForIdleQuietMs",String(e.waitForIdleQuietMs),"-e","timeoutMs",String(e.timeoutMs),"-e","maxDepth",String(e.maxDepth),"-e","maxNodes",String(e.maxNodes),...e.outputPath?["-e","outputPath",e.outputPath]:[],...void 0!==e.emitChunks?["-e","emitChunks",String(e.emitChunks)]:[],e.runner]}async function l2(e,t,r){try{var n;let e,t;return{output:(n=`${r.stdout}
|
|
5
|
+
${r.stderr}`,e=lR(n),t=l8(e.results),{xml:function(e,t){if(0===e.length)throw new eG("COMMAND_FAILED","Android snapshot helper did not return XML chunks",{helper:t});let r=function(e){let t=e[0]?.count??e.length;if(t<1||e.length!==t||e.some(e=>e.count!==t))throw new eG("COMMAND_FAILED","Android snapshot helper returned incomplete XML chunks",{expectedChunks:t,actualChunks:e.length});return t}(e),n=Buffer.concat(function(e,t){let r=[];for(let n=0;n<t;n+=1){let i=e.get(n);if(void 0===i)throw new eG("COMMAND_FAILED","Android snapshot helper returned incomplete XML chunks",{missingChunkIndex:n,expectedChunks:t});r.push(Buffer.from(i,"base64"))}return r}(function(e,t){let r=new Map;for(let n of e){if(void 0===n.index||n.index<0||n.index>=t)throw new eG("COMMAND_FAILED","Android snapshot helper returned invalid chunk index",{chunkIndex:n.index,expectedChunks:t});if(r.has(n.index))throw new eG("COMMAND_FAILED","Android snapshot helper returned duplicate XML chunks",{chunkIndex:n.index});r.set(n.index,n.payloadBase64)}return r}(e,r),r)).toString("utf8");if(!n.includes("<hierarchy")||!n.includes("</hierarchy>"))throw new eG("COMMAND_FAILED","Android snapshot helper output did not contain XML",{xml:n});return n}(function(e){let t=[];for(let r of e){if(r.agentDeviceProtocol!==lq||r.outputFormat!==lG)continue;let{payloadBase64:e}=r;void 0!==e&&t.push({index:l7(r.chunkIndex),count:l7(r.chunkCount),payloadBase64:e})}return t}(e.status),t),metadata:{...l9(t),transport:"instrumentation"}}),cleanupDone:!1}}catch(n){return await l3(e,t,r,n)}}async function l3(e,t,r,n){if(n instanceof eG&&0!==r.exitCode&&n.details?.helper)throw n;let i=await l5(e,t,r);if(i)return{output:i,cleanupDone:!0};throw new eG("COMMAND_FAILED",0===r.exitCode?"Android snapshot helper output could not be parsed":"Android snapshot helper failed before returning parseable output",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode},n)}async function l5(e,t,r){if(0===r.exitCode&&t.outputPath){var n;return await l4(e.adb,t.outputPath,function(e){try{let t=lR(e);return l9(l8(t.results))}catch{return null}}(`${r.stdout}
|
|
6
|
+
${r.stderr}`)??{outputFormat:lG,waitForIdleTimeoutMs:(n=t).waitForIdleTimeoutMs,waitForIdleQuietMs:n.waitForIdleQuietMs,timeoutMs:n.timeoutMs,maxDepth:n.maxDepth,maxNodes:n.maxNodes,transport:"instrumentation"})}}async function l4(e,t,r){let n;try{var i;n=await e((i=t,["shell","sh","-c",'cat "$1"; status=$?; rm -f "$1"; exit "$status"',"agent-device-snapshot-helper-output",i]),{allowFailure:!0,timeoutMs:5e3})}catch{return}if(0!==n.exitCode)return;let a=n.stdout.trim();if(a.includes("<hierarchy")&&a.includes("</hierarchy>"))return{xml:a,metadata:r}}async function l6(e,t){try{await e(["shell","rm","-f",t],{allowFailure:!0,timeoutMs:5e3})}catch{}}function l8(e){let t=e.find(e=>e.agentDeviceProtocol===lq);if(!t)throw new eG("COMMAND_FAILED","Android snapshot helper did not return a final result");if("true"!==t.ok){var r;throw new eG("COMMAND_FAILED",(r=t).message&&"null"!==r.message?r.message:r.errorType||"Android snapshot helper returned an error",{errorType:t.errorType,helper:t})}return t}function l9(e){var t;return{helperApiVersion:e.helperApiVersion,outputFormat:lG,waitForIdleTimeoutMs:l7(e.waitForIdleTimeoutMs),waitForIdleQuietMs:l7(e.waitForIdleQuietMs),timeoutMs:l7(e.timeoutMs),maxDepth:l7(e.maxDepth),maxNodes:l7(e.maxNodes),rootPresent:de(e.rootPresent),captureMode:"interactive-windows"===(t=e.captureMode)||"active-window"===t?t:void 0,windowCount:l7(e.windowCount),nodeCount:l7(e.nodeCount),truncated:de(e.truncated),elapsedMs:l7(e.elapsedMs)}}let l7=lF,de=l$,dt=new Map,dr=new Map;async function dn(e){var t,r,n;let i;if(!(void 0===(i=process.env.AGENT_DEVICE_ANDROID_SNAPSHOT_HELPER_SESSION)||!/^(0|false|no|off)$/i.test(i))||!e.adbProvider?.spawn)return;let a=lQ(e),o=e.deviceKey??"android:default",s=(t=o,r=a,n=e,JSON.stringify({deviceKey:t,packageName:r.packageName,runner:r.runner,helperVersion:n.helperVersion,helperVersionCode:n.helperVersionCode,waitForIdleTimeoutMs:r.waitForIdleTimeoutMs,waitForIdleQuietMs:r.waitForIdleQuietMs,timeoutMs:r.timeoutMs,maxDepth:r.maxDepth,maxNodes:r.maxNodes}));if(dr.get(o)===s)return;let l=dt.get(o);if(l&&l.identity!==s&&(await di(o),l=void 0),!l)try{l=await dl({deviceKey:o,identity:s,options:e,resolved:a})}catch(e){dr.set(o,s),ew({level:"warn",phase:"android_snapshot_helper_session_disabled",data:{deviceKey:o,reason:e instanceof Error?e.message:String(e)}});return}try{let e=l.capturedCount>0,t=await dc(l,a);return l.capturedCount+=1,{xml:t.xml,metadata:{...t.metadata,transport:"persistent-session",sessionReused:e}}}catch(e){throw await di(o),e}}async function di(e){let t=dt.get(e);if(t){dt.delete(e);try{await du(t,`quit ${Date.now()}`,1e3)}catch{}try{await t.process.kill("SIGTERM")}catch{}await dd(t.process,2e3);try{await dp(t)}catch{}ew({phase:"android_snapshot_helper_session_stop",data:{deviceKey:e,port:t.port,capturedCount:t.capturedCount,lifetimeMs:Date.now()-t.startedAtMs}})}}async function da(e){await di(ds(e))}function ds(e){return`${e.platform}:${e.id}`}async function dl(e){let t=await new Promise((e,t)=>{let r=y.createServer();r.unref(),r.on("error",t),r.listen(0,"127.0.0.1",()=>{let n=r.address();if(!n||"string"==typeof n)return void r.close(()=>t(Error("Failed to allocate a local TCP port")));let i=n.port;r.close(()=>e(i))})});await e.options.adb(["forward",`tcp:${t}`,`tcp:${t}`],{allowFailure:!1,timeoutMs:5e3});let r=l1({...e.resolved,outputPath:void 0,emitChunks:!1}),n=r[r.length-1];if(!n)throw new eG("INVALID_ARGS","Android snapshot helper runner was not resolved");let i=[...r.slice(0,-1),"-e","sessionPort",String(t),n],a=e.options.adbProvider.spawn(i,{allowFailure:!0,captureOutput:!1}),o={identity:e.identity,deviceKey:e.deviceKey,port:t,adb:e.options.adb,process:a,startedAtMs:Date.now(),capturedCount:0};try{var s;return await (s=a,new Promise((e,t)=>{let r="",n=setTimeout(()=>{t(new eG("COMMAND_FAILED","Android snapshot helper session did not become ready",{output:r,timeoutMs:1e4}))},1e4),i=t=>{(r+=t.toString()).includes(`agentDeviceProtocol=${lq}`)&&r.includes("sessionReady=true")&&(clearTimeout(n),e())};s.stdout?.on("data",i),s.stderr?.on("data",i),s.once("exit",(e,i)=>{clearTimeout(n),t(new eG("COMMAND_FAILED","Android snapshot helper session exited before ready",{output:r,exitCode:e,signal:i}))}),s.on("error",e=>{clearTimeout(n),t(e)})})),dt.set(e.deviceKey,o),ew({phase:"android_snapshot_helper_session_ready",data:{deviceKey:e.deviceKey,port:t,packageName:e.resolved.packageName,runner:e.resolved.runner}}),o}catch(e){await dp(o);try{a.kill("SIGTERM")}catch{}throw await dd(a,2e3),e}}function dd(e,t){return new Promise(r=>{let n=setTimeout(r,t);e.once("close",()=>{clearTimeout(n),r()}),e.once("exit",()=>{clearTimeout(n),r()})})}async function dc(e,t){let r=`snapshot-${Date.now()}-${Math.random().toString(16).slice(2)}`,n=Math.min(t.commandTimeoutMs,Math.max(t.timeoutMs+1e4,3e3));return function(e,t){var r;let{headers:n,xml:i}=function(e){let t=e.indexOf("\n\n");if(t<0)throw new eG("COMMAND_FAILED","Android snapshot helper session returned malformed output",{response:e});return{headers:function(e){let t={};for(let r of e.split(/\r?\n/)){let e=r.indexOf("=");e<0||(t[r.slice(0,e)]=r.slice(e+1))}return t}(e.slice(0,t)),xml:e.slice(t+2)}}(e);return function(e,t){if(e.agentDeviceProtocol!==lq)throw new eG("COMMAND_FAILED","Android snapshot helper session returned wrong protocol",{headers:e});if(e.outputFormat!==lG)throw new eG("COMMAND_FAILED","Android snapshot helper session returned wrong output format",{headers:e});if(e.requestId!==t)throw new eG("COMMAND_FAILED","Android snapshot helper session returned stale output",{headers:e,requestId:t});if("true"!==e.ok)throw new eG("COMMAND_FAILED",e.message||e.errorType||"Android snapshot helper session returned an error",{helper:e})}(n,t),function(e,t){let r=lF(e.byteLength);if(void 0!==r&&Buffer.byteLength(t,"utf8")!==r)throw new eG("COMMAND_FAILED","Android snapshot helper session returned truncated XML",{headers:e,actualByteLength:Buffer.byteLength(t,"utf8")});if(!t.includes("<hierarchy")||!t.includes("</hierarchy>"))throw new eG("COMMAND_FAILED","Android snapshot helper session did not return XML",{headers:e,xml:t})}(n,i),{xml:i,metadata:{helperApiVersion:(r=n).helperApiVersion,outputFormat:lG,waitForIdleTimeoutMs:lF(r.waitForIdleTimeoutMs),waitForIdleQuietMs:lF(r.waitForIdleQuietMs),timeoutMs:lF(r.timeoutMs),maxDepth:lF(r.maxDepth),maxNodes:lF(r.maxNodes),rootPresent:l$(r.rootPresent),captureMode:"interactive-windows"===r.captureMode||"active-window"===r.captureMode?r.captureMode:void 0,windowCount:lF(r.windowCount),nodeCount:lF(r.nodeCount),truncated:l$(r.truncated),elapsedMs:lF(r.elapsedMs)}}}(await du(e,`snapshot ${r}`,n),r)}function du(e,t,r){return new Promise((n,i)=>{let a=y.connect({host:"127.0.0.1",port:e.port}),o=[],s=setTimeout(()=>{a.destroy(),i(new eG("COMMAND_FAILED","Android snapshot helper session request timed out",{command:t,timeoutMs:r,port:e.port}))},r);a.on("connect",()=>{a.write(`${t}
|
|
7
|
+
`)}),a.on("data",e=>{o.push(Buffer.from(e))}),a.on("error",e=>{clearTimeout(s),i(e)}),a.on("close",()=>{clearTimeout(s),n(Buffer.concat(o).toString("utf8"))})})}async function dp(e){await e.process.stdin?.end(),await e.process.stdout?.destroy(),await e.process.stderr?.destroy(),await df(e)}async function df(e){await e.adb(["forward","--remove",`tcp:${e.port}`],{allowFailure:!0,timeoutMs:5e3})}let dm=new Map;function dh(e,t,r){return e?`${e}\0${t}\0${r}`:void 0}function dw(e){e&&dm.delete(e)}async function dv(e){var t,r,n;let{adb:i,artifact:a}=e,o=e.installPolicy??"missing-or-outdated",s=a.manifest.packageName,l=a.manifest.versionCode;if("never"===o)return{packageName:s,versionCode:l,installed:!1,reason:"skipped"};let d=dh(e.deviceKey,s,l),c=d?dm.get(d):void 0;if(d&&"always"!==o&&void 0!==c)return{packageName:s,versionCode:l,installedVersionCode:c,installed:!1,reason:"current"};let u=await dy(i,s,e.timeoutMs),p=(t=o,r=u,n=l,"never"===t?"skipped":"always"===t?"forced":void 0===r?"missing":r<n?"outdated":"current");if("current"===p){if(void 0===u)throw Error("Expected installed versionCode for current Android snapshot helper");return d&&dm.set(d,u),{packageName:s,versionCode:l,installedVersionCode:u,installed:!1,reason:p}}await lj(a);let f=await dg(i,e.adbProvider??i,a.apkPath,function(e){let t={};for(let r of e.slice(1)){let e=lZ(r);if(!e)throw new eG("INVALID_ARGS",`Android snapshot helper manifest installArgs contains unsupported install flag "${r}".`);t[e]=!0}return t}(lW(a.manifest.installArgs)),{packageName:s,timeoutMs:e.timeoutMs});if(0!==f.exitCode)throw dw(d),new eG("COMMAND_FAILED","Failed to install Android snapshot helper",{packageName:s,versionCode:l,stdout:f.stdout,stderr:f.stderr,exitCode:f.exitCode});return d&&dm.set(d,l),{packageName:s,versionCode:l,installedVersionCode:u,installed:!0,reason:p}}async function dy(e,t,r){let n=await e(["shell","cmd","package","list","packages","--show-versioncode",t],{allowFailure:!0,timeoutMs:r});if(0===n.exitCode){var i=`${n.stdout}
|
|
8
|
+
${n.stderr}`,a=t;let e=`package:${a}`;for(let t of i.split(/\r?\n/)){if(!t.startsWith(e)||t.length>e.length&&!/\s/.test(t[e.length]??""))continue;let r=/(?:^|\s)versionCode:(\d+)(?:\s|$)/.exec(t);if(r)return Number(r[1])}return}}async function dg(e,t,r,n,i){var a;let o=async()=>await tN(r,{allowFailure:!0,provider:t,...n,timeoutMs:i.timeoutMs}),s=await o();if(0===s.exitCode||(a=s,!`${a.stdout}
|
|
9
|
+
${a.stderr}`.includes("INSTALL_FAILED_UPDATE_INCOMPATIBLE")))return s;let l=await e(["uninstall",i.packageName],{allowFailure:!0,timeoutMs:i.timeoutMs}),d=await o();return 0===d.exitCode?d:{...d,stderr:[d.stderr,l.stderr?`Previous uninstall stderr after INSTALL_FAILED_UPDATE_INCOMPATIBLE: ${l.stderr}`:""].filter(Boolean).join("\n")}}let db=new Set(["android","com.android.systemui"]);function dA(e,t,r,n){var i,a;return{reason:r,fallbackReason:n,diagnostics:(i=e,a=t,{helperNodeCount:i.nodeCount,helperWindowRootCount:i.windowRootCount,helperApplicationWindowRootCount:i.applicationWindowRootCount,helperMeaningfulNodeCount:i.meaningfulNodeCount,helperApplicationMeaningfulNodeCount:i.applicationMeaningfulNodeCount,helperNonSystemMeaningfulNodeCount:i.nonSystemMeaningfulNodeCount,...void 0!==i.foregroundAppPackage?{helperForegroundAppPackage:i.foregroundAppPackage,helperForegroundAppMeaningfulNodeCount:i.foregroundAppMeaningfulNodeCount,helperForegroundAppMeaningfulNodeThreshold:2}:{},helperWindowTypes:i.windowTypes,...a.captureMode?{helperCaptureMode:a.captureMode}:{}})}}function dS(e){return null!==e&&""!==e.trim()}let dI=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function d_(e,t={}){let r=tx(e,t.helperAdb).exec;return(await dP(e,t,r)).xml}async function dM(e,t={}){let r=tx(e,t.helperAdb).exec,n=await dP(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=function(e,t,r){let{sourceNodes:n,...i}=lg(lI(e),t,r);return i}(i,void 0,t),s=dx(o.truncated,n.metadata);return a&&function(e,t){for(let[r,n]of e){let e=t[r];e&&(n.hiddenContentAbove&&(e.hiddenContentAbove=!0),n.hiddenContentBelow&&(e.hiddenContentBelow=!0))}}(await dB(e,o.nodes,i,r),o.nodes),{...o,...dN(s),androidSnapshot:n.metadata}}let o=lI(i),s=lg(o,void 0,t),l=dx(s.truncated,n.metadata);a&&await dD({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...dN(l),androidSnapshot:n.metadata}}function dx(e,t){return!0===e||!0===t.helperTruncated||e}function dN(e){return!0===e?{truncated:!0}:{}}async function dD(e){if(dG(e.interactiveSnapshot.nodes).size>0||dq(e.xml))return;let t=lg(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await dB(e.device,t.nodes,e.xml,e.adb);dz(r,t,e.interactiveSnapshot),0===r.size&&dz(E(tf(t.nodes)),t,e.interactiveSnapshot)}async function dP(e,t,r){let n=await ef("android_snapshot_helper_artifact_resolution",async()=>await d$(t.helperArtifact));return n.artifact?await dk(e,t,r,n.artifact):(ew({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await dU(e,n.fallbackReason,r))}async function dk(e,t,r,n){let i=ds(e),a=tx(e,t.helperAdb),o="daemon-session"!==t.helperSessionScope;try{var s,l,d;let o=await dE(t,r,a,n,i);o.installed&&await di(i);let c=(s=await dC({options:t,adb:r,adbProvider:a,artifact:n,helperDeviceKey:i}),l=n,d=o.reason,{xml:s.xml,metadata:{backend:"android-helper",helperVersion:l.manifest.version,helperApiVersion:s.metadata.helperApiVersion,helperTransport:s.metadata.transport,helperSessionReused:s.metadata.sessionReused,installReason:d,waitForIdleTimeoutMs:s.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:s.metadata.waitForIdleQuietMs,timeoutMs:s.metadata.timeoutMs,maxDepth:s.metadata.maxDepth,maxNodes:s.metadata.maxNodes,rootPresent:s.metadata.rootPresent,captureMode:s.metadata.captureMode,windowCount:s.metadata.windowCount,nodeCount:s.metadata.nodeCount,helperTruncated:s.metadata.truncated,elapsedMs:s.metadata.elapsedMs}}),u=function(e,t,r={}){if("android-helper"!==t.backend)return;let n=function(e,t){var r,n;let i=(r=t,{nodeCount:0,windowRootCount:0,applicationWindowRootCount:0,meaningfulNodeCount:0,applicationMeaningfulNodeCount:0,nonSystemMeaningfulNodeCount:0,...void 0!==r?{foregroundAppPackage:r,foregroundAppMeaningfulNodeCount:0}:{},windowTypes:new Set});for(let t of lv(e))!function(e,t){var r,n;e.nodeCount+=1,r=e,n=t,void 0!==n.windowType&&(r.currentWindowType=n.windowType,r.windowRootCount+=1,r.windowTypes.add(n.windowType),1===n.windowType&&(r.applicationWindowRootCount+=1)),function(e,t){var r,n;r=t,!1!==r.visibleToUser&&(dS(r.text)||dS(r.desc)||dS(r.resourceId))&&(e.meaningfulNodeCount+=1,1===e.currentWindowType&&(e.applicationMeaningfulNodeCount+=1),n=t.packageName,null===n||db.has(n)||(e.nonSystemMeaningfulNodeCount+=1),void 0!==e.foregroundAppPackage&&t.packageName===e.foregroundAppPackage&&(e.foregroundAppMeaningfulNodeCount=(e.foregroundAppMeaningfulNodeCount??0)+1))}(e,t)}(i,t);return{nodeCount:(n=i).nodeCount,windowRootCount:n.windowRootCount,applicationWindowRootCount:n.applicationWindowRootCount,meaningfulNodeCount:n.meaningfulNodeCount,applicationMeaningfulNodeCount:n.applicationMeaningfulNodeCount,nonSystemMeaningfulNodeCount:n.nonSystemMeaningfulNodeCount,...void 0!==n.foregroundAppPackage?{foregroundAppPackage:n.foregroundAppPackage,foregroundAppMeaningfulNodeCount:n.foregroundAppMeaningfulNodeCount??0}:{},windowTypes:[...n.windowTypes].sort((e,t)=>e-t).slice(0,8)}}(e,r.foregroundAppPackage);if(0===n.nodeCount||0===t.nodeCount||!1===t.rootPresent)return dA(n,t,"empty-helper-output","Android snapshot helper returned no accessibility nodes");let i=n.foregroundAppMeaningfulNodeCount;return void 0!==i&&(0===i||i<2&&n.meaningfulNodeCount>i)?dA(n,t,"content-poor-app-window","Android snapshot helper returned insufficient foreground app content"):void 0===i&&n.applicationWindowRootCount>0&&n.applicationMeaningfulNodeCount<2||void 0===i&&0===n.windowRootCount&&(t.windowCount??0)>1&&n.nonSystemMeaningfulNodeCount<2?dA(n,t,"content-poor-app-window","Android snapshot helper returned insufficient application window content"):n.windowRootCount>0&&0===n.applicationWindowRootCount?dA(n,t,"system-window-only","Android snapshot helper returned only non-application windows"):void 0}(c.xml,c.metadata,{foregroundAppPackage:t.appBundleId});if(!u)return c;return await dR({contentRecovery:u,helperDeviceKey:i,artifact:n,device:e,adb:r})}catch(t){return await dO({error:t,helperDeviceKey:i,artifact:n,device:e,adb:r})}finally{o&&await di(i)}}async function dE(e,t,r,n,i){let a=await ef("android_snapshot_helper_install",async()=>await dv({adb:t,adbProvider:r,artifact:n,deviceKey:i,installPolicy:e.helperInstallPolicy,timeoutMs:3e4}),{packageName:n.manifest.packageName,versionCode:n.manifest.versionCode,installPolicy:e.helperInstallPolicy??"missing-or-outdated"});return ew({phase:"android_snapshot_helper_install_decision",data:{packageName:a.packageName,versionCode:a.versionCode,installedVersionCode:a.installedVersionCode,installed:a.installed,reason:a.reason}}),a}async function dC(e){let{options:t,adb:r,adbProvider:n,artifact:i,helperDeviceKey:a}=e,o={adb:r,adbProvider:n,deviceKey:a,helperVersion:i.manifest.version,helperVersionCode:i.manifest.versionCode,packageName:i.manifest.packageName,instrumentationRunner:i.manifest.instrumentationRunner,waitForIdleTimeoutMs:t.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await ef("android_snapshot_helper_session_capture",async()=>await dn(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ew({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eq(e).message}}),await dT(r,i.manifest.packageName)}return await ef("android_snapshot_helper_capture",async()=>await lY(o),{packageName:i.manifest.packageName,version:i.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function dR(e){return ew({level:"warn",phase:"android_snapshot_helper_content_fallback",data:{reason:e.contentRecovery.reason,fallbackReason:e.contentRecovery.fallbackReason,...e.contentRecovery.diagnostics}}),await dT(e.adb,e.artifact.manifest.packageName),await dU(e.device,e.contentRecovery.fallbackReason,e.adb)}async function dO(e){var t;let r=function(e){var t;let r=eq(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=dF(e)??t;return/TimeoutException/.test(r)||/timed out/i.test(n)}(r.details?.helper,r.message)&&(t=r,!(t.details?.exitCode===137&&/Android snapshot helper (failed before returning parseable output|output could not be parsed)/.test(t.message))))return;let n=dL(e);return new eG(eU(r.code),`${n}. Stock UIAutomator fallback was skipped because this usually means the Android accessibility tree is busy or stalled.`,{...r.details,hint:"Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout and report the busy UI if it persists."},e)}(e.error);if(r)throw r;let n=dL(e.error);return ew({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:n}}),await di(e.helperDeviceKey),await dT(e.adb,e.artifact.manifest.packageName),dw(dh((t={deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}).deviceKey,t.packageName,t.versionCode)),await dU(e.device,n,e.adb)}async function dT(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await tm(150),ew({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ew({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eq(e).message}})}}function dL(e){let t=eq(e),r=dF(t.details?.helper);if(r&&r!==t.message)return`${t.message}: ${r}`;if(r)return r;let n=("string"==typeof t.details?.stderr?t.details.stderr.trim():"").split(/\r?\n/).find(e=>e.trim());return n?`${t.message}: ${n}`:t.message}function dF(e){if(!e||"object"!=typeof e||!("message"in e))return;let t=String(e.message).trim();return t&&"null"!==t?t:void 0}async function d$(e){if(e)return{artifact:e};let t=th(),r=a.join(tw(),"android-snapshot-helper","dist"),n=a.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await v.access(n)}catch{return{}}try{let e=function(e){var t,r;if(!e||"object"!=typeof e||Array.isArray(e))throw new eG("INVALID_ARGS","Android snapshot helper manifest must be an object.");return{name:lH(e.name,"name","android-snapshot-helper"),version:lX(e.version,"version"),releaseTag:lJ(e.releaseTag),assetName:lJ(e.assetName),apkUrl:(t=e.apkUrl,r="apkUrl",null===t?null:lX(t,r)),sha256:function(e){let t=lX(e,"sha256").trim().toLowerCase();if(64!==t.length||!function(e){for(let t of e){let e=t.charCodeAt(0),r=e>=48&&e<=57,n=e>=97&&e<=102;if(!r&&!n)return!1}return!0}(t))throw new eG("INVALID_ARGS","Android snapshot helper manifest sha256 must be a 64-character hex string.");return t}(e.sha256),checksumName:lJ(e.checksumName),packageName:lX(e.packageName,"packageName"),versionCode:lK(e.versionCode,"versionCode"),instrumentationRunner:lX(e.instrumentationRunner,"instrumentationRunner"),minSdk:lK(e.minSdk,"minSdk"),targetSdk:void 0===e.targetSdk?void 0:lK(e.targetSdk,"targetSdk"),outputFormat:lH(e.outputFormat,"outputFormat",lG),statusProtocol:lH(e.statusProtocol,"statusProtocol",lq),installArgs:lW(e.installArgs)}}(JSON.parse(await v.readFile(n,"utf8"))),t=a.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await v.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eq(e).message}}}async function dU(e,t,r){let n;try{n=await ef("android_snapshot_stock_capture",async()=>await dV(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eG(eU((r=eq(i)).code),`${r.message} Android snapshot helper failed before stock fallback: ${a}`,{...r.details,androidSnapshotHelperFallbackReason:a,...r.hint?{hint:r.hint}:{}},i)}throw e}return{xml:n,metadata:{backend:"uiautomator-dump",...t?{fallbackReason:t}:{}}}}async function dB(e,t,r,n){if(!t.some(e=>R(e.type)))return new Map;let i=dG(t);if(i.size>0||dq(r))return i;let a=await dW(e,n);return a?function(e,t){let r=function(e){let t={className:"root",rect:{x:0,y:0,width:0,height:0},children:[]},r=[{indent:-1,node:t}],n=/^(\s*)([\w.$]+)\{[^}]* (-?\d+),(-?\d+)-(-?\d+),(-?\d+) #/;for(let t of e.split("\n")){let e=n.exec(t);if(!e)continue;let[i,a,o,s,l,d]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===d)continue;let c=i.length,u=Number(o),p=Number(s),f={className:a,rect:{x:u,y:p,width:Math.max(0,Number(l)-u),height:Math.max(0,Number(d)-p)},children:[]};for(;r.length>1&&c<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:c,node:f})}return t.children.length>0?t:null}(t);if(!r)return new Map;let n=function(e){let t=[],r=[e];for(;r.length>0;){let e=r.pop();if(R(e.className)){let r=function(e){let t=e.children[0];if(!t)return null;let r=Math.max(t.rect.height,...t.children.map(e=>e.rect.y+e.rect.height)),n=t.children.filter(e=>e.rect.height>0).map(t=>lC(t.rect,e.rect)).sort((e,t)=>e.start-t.start);return 0===n.length?null:{rect:e.rect,contentExtent:r,contentBlocks:n}}(e);r&&t.push(r)}r.push(...e.children)}return t}(r);if(0===n.length)return new Map;let i=new Map;for(let t of e){if(!t.rect||!R(t.type))continue;let r=function(e,t){let r=null,n=1/0;for(let i of t){let t=Math.abs(i.rect.width-e.width)+Math.abs(i.rect.height-e.height);if(t>32)continue;let a=4*t+(Math.abs(i.rect.x-e.x)+Math.abs(i.rect.y-e.y));a<n&&(r=i,n=a)}return r}(t.rect,n);if(!r)continue;let a=function(e,t){let r=function(e,t){let r=t,n=new Set;for(;!n.has(r.index);){var i,a;n.add(r.index);let o=e.filter(e=>e.parentIndex===r.index&&e.rect);if(1!==o.length)return r;let s=o[0];if(i=s.rect,a=t.rect,i.x!==a.x||i.y!==a.y||i.width!==a.width||i.height!==a.height)return r;r=s}return t}(e,t);return e.filter(e=>e.parentIndex===r.index&&e.rect).map(e=>e.rect).filter(e=>e.height>0).sort((e,t)=>e.y-t.y).map(e=>lC(e,t.rect))}(e,t),o=function(e){let{viewportRect:t,visibleBlocks:r,nativeScrollView:n}=e;if(0===r.length||0===n.contentBlocks.length)return null;let i=function(e){if(0===e.contentBlocks.length)return null;let t=e.contentBlocks[0],r=e.contentBlocks[e.contentBlocks.length-1];if(!t||!r)return null;let n=lk(e.contentBlocks.map(e=>e.size))??e.rect.height,i=Math.max(48,Math.round(.5*n)),a=Math.max(24,Math.round(.25*n)),o=t.start>=i,s=e.contentExtent-(r.start+r.size)>=a;return o||s?{above:o,below:s}:null}(n),a=function(e,t){let r=new Map;for(let n of e)for(let e of t){if(!lE(n,e))continue;let t=n.start-e.start,i=8*Math.round(t/8),a=r.get(i)??[];a.push(t),r.set(i,a)}let n=null;for(let e of r.values())(!n||e.length>n.length)&&(n=e);if(!n||n.length<2)return null;let i=[...n].sort((e,t)=>e-t);return i[Math.floor(i.length/2)]??null}(n.contentBlocks,r)??function(e){let{nativeBlocks:t,visibleBlocks:r,viewportExtent:n,contentExtent:i}=e,a=[],o=[];for(let e of t)for(let t of r){if(!lE(e,t))continue;let r=e.start-t.start;16>=Math.abs(r)&&a.push(r),16>=Math.abs(r+n-i)&&o.push(r)}return o.length>0?lk(o):a.length>0?lk(a):null}({nativeBlocks:n.contentBlocks,visibleBlocks:r,viewportExtent:t.height,contentExtent:n.contentExtent});if(null===a)return i;let o=t.height;return{above:(i?.above??!1)||a>16,below:(i?.below??!1)||a+o<n.contentExtent-16}}({viewportRect:t.rect,visibleBlocks:a,nativeScrollView:r});if(!o)continue;let s={};o.above&&(s.hiddenContentAbove=!0),o.below&&(s.hiddenContentBelow=!0),(s.hiddenContentAbove||s.hiddenContentBelow)&&i.set(t.index,s)}return i}(t,a):new Map}function dq(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function dG(e){let t=new Map;for(let r of e){let e={};r.hiddenContentAbove&&(e.hiddenContentAbove=!0),r.hiddenContentBelow&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(r.index,e)}return t}async function dV(e,t=tL(e)){try{return await tb(()=>dj(t),{shouldRetry:dH})}catch(t){var r,n;let e;if((r=t)instanceof eG&&"COMMAND_FAILED"===r.code&&"number"==typeof r.details?.timeoutMs&&r.details?.cmd==="adb"&&(e=Array.isArray(n=r.details?.args)?n.map(String):"string"==typeof n?n.split(/\s+/):[]).includes("uiautomator")&&e.includes("dump")){let e="Android accessibility snapshots can be blocked by busy or continuously changing app UI. Use screenshot as visual truth after this timeout. Stock Android UIAutomator may still time out on app-owned infinite animations.";throw new eG("COMMAND_FAILED",`Android UI hierarchy dump timed out while waiting for the UI to become idle. ${e}`,{...t.details??{},hint:e},t)}throw t}}async function dj(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=dK(a.stdout,a.stderr);if(o)return o;let s="/sdcard/window_dump.xml",l=await e(["shell","uiautomator","dump",s],{allowFailure:!0,timeoutMs:8e3}),d=(t=l.stdout,r=l.stderr,n=`${t}
|
|
10
|
+
${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new eG("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode,reason:"missing_fresh_dump"});let c=await e(["shell","cat",d??s]),u=dK(c.stdout,c.stderr);if(!u)throw new eG("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function dK(e,t){let r=`${e}
|
|
11
|
+
${t}`,n=r.indexOf("<?xml"),i=n>=0?n:r.indexOf("<hierarchy");if(i<0)return null;let a=r.lastIndexOf("</hierarchy>");if(a<0||a<i)return null;let o=r.slice(i,a+12).trim();return o.length>0?o:null}function dH(e){if(!(e instanceof eG)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return dI.some(e=>r.includes(e))}async function dW(e,t=tL(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
|
|
12
|
+
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function dz(e,t,r){if(0===e.size)return;let n=new Map;for(let[e,t]of r.sourceNodes.entries()){let i=r.nodes[e];i&&n.set(t,i)}for(let[r,i]of e){let e=t.sourceNodes[r];if(!e)continue;let a=n.get(e);a&&(i.hiddenContentAbove&&(a.hiddenContentAbove=!0),i.hiddenContentBelow&&(a.hiddenContentBelow=!0))}}let dX=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,dJ=/^close app$/i,dZ="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function dY(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await d5(r)}catch(e){return ew({level:"warn",phase:"android_blocking_dialog_inspection_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"unknown",reason:"inspection-failed"}}let n=d6(t);if(!n?.rect)return{status:"absent"};try{let e=await d4(r,n);if(!e.ok)return ew({level:"warn",phase:"android_blocking_dialog_tap_failed",data:{session:r.name,deviceId:r.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:"failed",reason:"tap-failed"};if(!await d8(r))return ew({level:"warn",phase:"android_blocking_dialog_still_present",data:{session:r.name,deviceId:r.device.id}}),{status:"failed",reason:"dismiss-failed"};if(r.appBundleId&&(await tI(r.device,r.appBundleId),!await d9(r,r.appBundleId)))return ew({level:"warn",phase:"android_blocking_dialog_relaunch_unfocused",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId}}),{status:"failed",reason:"relaunch-failed"};return ew({level:"warn",phase:"android_blocking_dialog_recovered",data:{session:r.name,deviceId:r.device.id,appBundleId:r.appBundleId,x:e.x,y:e.y}}),{status:"recovered"}}catch(e){return ew({level:"warn",phase:"android_blocking_dialog_recovery_failed",data:{session:r.name,deviceId:r.device.id,error:e instanceof Error?e.message:String(e)}}),{status:"failed",reason:"error"}}}async function dQ(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await tg(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await d0(n)){let t=`Recovered Android app ANR before ${i}: closed and relaunched ${n.appBundleId}.`;if("before-command"===e.phase)return{status:"recovered",warning:t};throw d2({session:n,command:i,focus:a,message:`Android app ANR appeared after ${i}; ${n.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:"Retry the command. If the ANR returns, inspect app logs or restart the emulator."})}throw d2({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${d3(a)}. Automatic recovery failed.`,hint:dZ})}throw d2({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${d3(a)}.`,hint:dZ})}async function d0(e){try{return await d1(e)}catch(t){return ew({level:"warn",phase:"android_app_anr_recovery_failed",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}async function d1(e){if(!e.appBundleId)return!1;let t=d6(await d5(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await d4(e,t);if(!r.ok)return!1;await tI(e.device,e.appBundleId);let n=await d9(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ew({level:"warn",phase:"android_app_anr_recovered",data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),n}function d2(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eG("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function d3(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function d5(e){return tf(tW((await dM(e.device,{interactiveOnly:!1})).nodes))}async function d4(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=td(t.rect),i=await tv(e.device,["shell","input","tap",String(Math.round(r)),String(Math.round(n))],{allowFailure:!0});return 0!==i.exitCode?{ok:!1,exitCode:i.exitCode,stdout:i.stdout.trim(),stderr:i.stderr.trim()}:{ok:!0,x:r,y:n}}function d6(e,t={}){if(!1===t.requireDialogSignal||ct(e))return e.find(e=>ce(e).some(e=>dJ.test(e))&&e.rect)}async function d8(e){for(let t=0;t<12;t+=1){if(!ct(await d5(e)))return!0;await tm(500)}return!ct(await d5(e))}async function d9(e,t,r={}){for(let n=0;n<12;n+=1){if(await d7(e,t,r))return!0;await tm(500)}return await d7(e,t,r)}async function d7(e,t,r){return!(r.requireNoBlockingDialog&&await tg(e.device))&&(await tC(e.device)).package===t}function ce(e){let t=[e.label,e.identifier];return"string"==typeof e.value&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>"string"==typeof e&&e.trim().length>0).map(e=>e.trim())}function ct(e){return e.some(e=>{let t=ce(e).join(" ").trim();return t.length>0&&dX.test(t)})}function cr(e){return!!(e&&e.width>0&&e.height>0)}function cn(e){return e.width*e.height}function ci(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}let ca=[255,59,48,255],co=[255,214,10,255],cs=[0,0,0,255],cl=["scroll","list","recyclerview","edittext","textfield"],cd=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],cc={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function cu(e){let t=await l.readFile(e.screenshotPath),r=await eA(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)cm(r)&&cr(r.rect)&&(!t||cn(r.rect)>cn(t))&&(t=r.rect);return t||function(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)a.rect&&cr(a.rect)&&(t=Math.min(t,a.rect.x),r=Math.min(r,a.rect.y),n=Math.max(n,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(r)||n<=t||i<=r?null:{x:t,y:r,width:n-t,height:i-r}}(e.filter(e=>{var t;return cr(e.rect)&&!("image"===tH((t=e).type??"")&&!cw(t.label))}))}(e.nodes),a=new Map;for(let n of e.nodes){var o,s;if(!function(e,t,r){let n=[r.label,r.value].some(cv)||cy(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!cr(r.rect)||cm(r))return!1;let n=tH(r.type??"");return!(cl.some(e=>n.includes(e))||t&&cn(r.rect)>.25*cn(t))}(e,t,r)||(cf(r)?n:n&&function(e){let t=tH(e.type??"");return t.includes("statictext")||t.includes("image")||t.includes("text")||t.includes("other")}(r))}(e,i,n))continue;let l=(o=e.nodes,[function(e){return cf(e)&&!cm(e)}(s=n)?s:null,tK(o,s,e=>(function(e){return cf(e)&&!cm(e)})(e)),s.hittable?s:null,tK(o,s,e=>!0===e.hittable)].find(ch)??null);if(!l?.rect||!cr(l.rect))continue;let d=function(e,t,r){let n=cg(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=cg(n);if(!i)continue;let a=function(e){let t=0;return tH(e.type??"").includes("text")&&(t+=2),cv(e.label)&&(t+=2),cv(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||cg(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),cf(t)&&(n+=3),cf(e)&&(n+=2),r&&(n+=2),cy(t.identifier)&&(n+=1),cw(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=cf,i=e=>!!cg(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=tH(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&cr(t.rect)&&ci(n,t.rect)).map(e=>e.rect);return a.length<2?null:function(e){let t=e[0];if(void 0===t)throw Error("unionRects requires at least one rect");let r=t.x,n=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))r=Math.min(r,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:r,y:n,width:i-r,height:a-n}}(a)}(e,t,r);if(!i)return null;let a=i.y-n.y,o=n.y+n.height-(i.y+i.height);if(a<0||o<0||16>Math.abs(o-a))return null;let s=Math.min(a,o),l=Math.round(i.y-s),d=Math.round(i.height+2*s);return d<=0||d>=n.height?null:{x:n.x,y:l,width:n.width,height:d}}(t,r,i))??t.rect)}(e,l,e.nodes),p=cp(e,i,u,t,r);if(!cr(p))continue;let f=a.get(l.ref);(!f||c>f.score)&&a.set(l.ref,{ref:l.ref,label:d,rect:l.rect,overlayRect:p,score:c})}return function(e,t,r,n,i){let a=G(e.nodes).primaryAction;if(!a?.ref||!a.rect||!cr(a.rect))return;let o=cp(e,t,a.rect,n,i);if(!cr(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},l=r.get(a.ref);r.set(a.ref,l?{...l,score:Math.max(l.score,s.score)}:s)}(e,i,a,t,r),(function(e){let t=[];for(let r of e.sort((e,t)=>cn(e.overlayRect)-cn(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(ci(e.overlayRect,r.overlayRect)||ci(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}cn(r.overlayRect)<cn(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(cx).slice(0,n.maxRefs??24).sort(cM).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:td(e.overlayRect)}))}(e.snapshot,r.width,r.height,{maxRefs:e.maxRefs});for(let e of n){var i,a;(function(e,t,r){for(let n=0;n<2;n+=1)cS(e,t.x,t.x+t.width-1,t.y+n,r),cS(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),cI(e,t.x+n,t.y,t.y+t.height-1,r),cI(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,ca),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=cA(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:cA(t.y+2,0,Math.max(0,e.height-11));(function(e,t,r,n,i){for(let a=0;a<11;a+=1)for(let o=0;o<n;o+=1)c_(e,t+o,r+a,i)})(e,i,o,n,co),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=cc[t];if(n)for(let t=0;t<n.length;t+=1)for(let o=0;o<n[t].length;o+=1)"1"===n[t][o]&&c_(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,cs)}(i,a.overlayRect,a.ref)}return await l.writeFile(e.screenshotPath,await eb(r)),n}function cp(e,t,r,n,i){if("android"===e.backend||!t)return cb(function(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}(r),n,i);let a=n/t.width,o=i/t.height;return cb({x:Math.round((r.x-t.x)*a),y:Math.round((r.y-t.y)*o),width:Math.max(1,Math.round(r.width*a)),height:Math.max(1,Math.round(r.height*o))},n,i)}function cf(e){let t=[e.type,e.role,e.subrole].map(e=>tH(e??"")).join(" ");return cd.some(e=>t.includes(e))}function cm(e){let t=[e.type,e.role,e.subrole].map(e=>tH(e??"")).join(" ");return t.includes("application")||t.includes("window")}function ch(e){return!!(e?.rect&&cr(e.rect)&&!cm(e))}function cw(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function cv(e){var t;let r;return!!cw(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function cy(e){var t;return"string"==typeof e&&!!cv(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function cg(e){let t=[e.label,e.value].find(cv);return t?t.trim():cy(e.identifier)?e.identifier.trim():void 0}function cb(e,t,r){let n=cA(e.x,0,Math.max(0,t-1)),i=cA(e.y,0,Math.max(0,r-1)),a=Math.max(1,t-n),o=Math.max(1,r-i);return{x:n,y:i,width:cA(e.width,1,a),height:cA(e.height,1,o)}}function cA(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function cS(e,t,r,n,i){for(let a=t;a<=r;a+=1)c_(e,a,n,i)}function cI(e,t,r,n,i){for(let a=r;a<=n;a+=1)c_(e,t,a,i)}function c_(e,t,r,n){if(t<0||r<0||t>=e.width||r>=e.height)return;let i=(e.width*r+t)*4;e.data[i]=n[0],e.data[i+1]=n[1],e.data[i+2]=n[2],e.data[i+3]=n[3]}function cM(e,t){var r,n;let i=e.overlayRect.y-t.overlayRect.y;if(0!==i)return i;let a=e.overlayRect.x-t.overlayRect.x;return 0!==a?a:(r=e.ref,n=t.ref,Number.parseInt(r.replace(/^\D+/,""),10)-Number.parseInt(n.replace(/^\D+/,""),10))}function cx(e,t){return t.score!==e.score?t.score-e.score:cM(e,t)}function cN(e){return"number"==typeof e.gestureClockOriginAtMs&&"number"==typeof e.gestureClockOriginUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs)-e.recordingStartedAt):"number"==typeof e.runnerStartedAtUptimeMs&&"number"==typeof e.gestureStartUptimeMs?Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs):"number"==typeof e.gestureStartUptimeMs&&"number"==typeof e.gestureEndUptimeMs?Math.max(0,e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs)-e.recordingStartedAt):Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}let cD=new WeakMap;function cP(e){if(!e)return;let t=cD.get(e);if(t)return t;let r=ck(e.nodes??[]);if(r)return cD.set(e,r),r}let ck=ea,cE={referenceWidth:1e3,referenceHeight:1e3};function cC(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,v,y,g=e.recording;if(!g)return;let b={...i,...n??{}},A=cB(b.effectiveDurationMs)??cB(b.durationMs),S={recordingStartedAt:g.startedAt,gestureClockOriginAtMs:g.gestureClockOriginAtMs,gestureClockOriginUptimeMs:g.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===g.platform?g.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:cB(b.gestureStartUptimeMs),gestureEndUptimeMs:cB(b.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},I="number"==typeof(s={gestureStartUptimeMs:cB(b.gestureStartUptimeMs),gestureEndUptimeMs:cB(b.gestureEndUptimeMs),reportedDurationMs:A,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),_="ios"===e.device.platform&&void 0===cB(b.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=cq(cB(t.count),1)??1,r=!0===t.doubleTap,n=cq(cB(t.holdMs),1);return 1===e&&!r&&void 0===n}case"react-native":return"dismiss-overlay"===t.action;default:return!1}}(t,b)?function(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return cN(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...S,gestureDurationMs:I}):cN(S),M=(l=e.snapshot,w=cB((d=b).referenceWidth),v=cB(d.referenceHeight),void 0!==w&&w>0&&void 0!==v&&v>0?{referenceWidth:w,referenceHeight:v}:cP(l)),x=(c=t,u=r,p=b,f=_,m=I,h=M,y=cR[c],y?.(u,p,f,m,h)??[]);0!==x.length&&(g.gestureEvents.push(...x),ew({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:x.length,tMs:_,gestureDurationMs:I,kinds:x.map(e=>e.kind)}}))}let cR={click:(e,t,r,n,i)=>cO(e,t,r,i),press:(e,t,r,n,i)=>cO(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?cO(e,t,r,i):[],fill:(e,t,r,n,i)=>cT(e,t,r,i),focus:(e,t,r,n,i)=>cT(e,t,r,i),longpress:function(e,t,r,n,i){let a=cG(t,e);if(!a)return[];let{x:o,y:s}=a;return[c$(r,o,s,cK(n,[cB(t.durationMs),cB(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=cV(t,e),o=cU(t.contentDirection)??cU(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=cK(n,[],250),p=cB(t.amount)??cB(e[1]),f=cB(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:d,y2:c,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:cL,fling:cL,swipe:cL,pinch:function(e,t,r,n,i){let a=cG(t,e,1),o=cB(t.scale)??cB(e[0]);if(!a||void 0===o||o<=0)return[];let{x:s,y:l}=a;return[{kind:"pinch",tMs:r,x:s,y:l,...i,scale:o,durationMs:cK(n,[],280)}]}};function cO(e,t,r,n){let i=cG(t,e);if(!i)return[];let{x:a,y:o}=i,s=cq(cB(t.count),1)??1,l=cq(cB(t.intervalMs),0)??0,d=!0===t.doubleTap,c=cq(cB(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==c&&c>0){u.push(c$(t,a,o,c,n));continue}u.push(cF(t,a,o,n)),d&&u.push(cF(t+90,a,o,n))}return u}function cT(e,t,r,n){let i=cG(t,e);if(!i)return[];let{x:a,y:o}=i;return[cF(r,a,o,n)]}function cL(e,t,r,n,i){let a=cV(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=cK(n,[cB(t.effectiveDurationMs),cB(t.durationMs),cB(e[4])],250),u=cq(cB(t.count),1)??1,p=cq(cB(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,v,y,g,b,A,S,I;let _,{startX:M,startY:x,endX:N,endY:D}=(n=t,a=f,u=o,m=s,h=l,w=d,"ping-pong"===a&&n%2==1?{startX:h,startY:w,endX:u,endY:m}:{startX:u,startY:m,endX:h,endY:w});return v=r+t*(c+p),y=M,g=x,b=N,A=D,S=c,"back-swipe"===(_=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(y,g,b,A,I=i))?{kind:_,tMs:v,x:y,y:g,x2:b,y2:A,...I,durationMs:S,edge:function(e,t,r){if(r){let t=.08*r.referenceWidth;if(e<=t)return"left";if(e>=r.referenceWidth-t)return"right"}return t>=e?"left":"right"}(y,b,I)}:{kind:_,tMs:v,x:y,y:g,x2:b,y2:A,...I,durationMs:S}})}function cF(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function c$(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function cU(e){if("string"!=typeof e)return;let t=e.trim().toLowerCase();switch(t){case"up":case"down":case"left":case"right":return t;default:return}}function cB(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"!=typeof e||0===e.trim().length)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function cq(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function cG(e,t,r=0){let n=cB(e.x)??cB(t[r]),i=cB(e.y)??cB(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function cV(e,t){let r=cj(e.x1,e.x,t[0]),n=cj(e.y1,e.y,t[1]),i=cj(e.x2,t[2]),a=cj(e.y2,t[3]);if(void 0!==r&&void 0!==n&&void 0!==i&&void 0!==a)return{x1:r,y1:n,x2:i,y2:a}}function cj(...e){return e.map(cB).find(e=>void 0!==e)}function cK(e,t,r){return cq(e,1)??t.map(e=>cq(e,1)).find(e=>void 0!==e)??r}let cH={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function cW(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:v}=e,y=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?cH[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tU}}(f);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:g,dispatchRequest:b,recordedCommand:A}=y,S=await cX(m,g);if(S)return S;let I=await cz(m,g);if("response"in I)return I.response;let{resolvedPositionals:_,resolvedOut:M,recordedPositionals:x,recordedFlags:N}="screenshot"===(t=b).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[ro.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?ro.expandHome(a,o):a))?{...r.flags??{},out:c}:r.flags??{},{resolvedPositionals:d,resolvedOut:c,recordedPositionals:d,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},D=Date.now(),P={...v(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await cJ({session:m,sessionName:e.sessionName,logPath:h,command:g,request:b,positionals:_,out:M,dispatchContext:P}),E=await cz(m,g,"after-command");if("response"in E)return E.response;"status"in I&&"recovered"===I.status&&(!k||"object"==typeof k)&&((k??={}).warning=I.warning);let C=Date.now(),R=A===g?x:f.positionals??[],O=A===g?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=cP(e.snapshot),a={...n??{}},o=cU(a.direction)??cU(r[0]);if(!o)return n;let s=cB(a.amount)??cB(r[1]),l=cB(a.pixels),d=cV(a,[]),c=cB(a.referenceWidth),u=cB(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??cE;if(d&&(d.x1!==d.x2||d.y1!==d.y2))return{...a,x1:d.x1,y1:d.y1,x2:d.x2,y2:d.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=el({direction:o,amount:s,pixels:l,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:f.x1,y1:f.y1,x2:f.x2,y2:f.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==f.pixels?{pixels:f.pixels}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250}}(t,n,a,l);cC(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:g,recordedCommand:A,resolvedPositionals:_,recordedPositionals:R,recordedFlags:O,data:k,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),s_(g)&&sA(m,g),s$(m,g,_,f.flags),{ok:!0,data:k??{}}}async function cz(e,t,r="before-command"){if("android"!==e.device.platform||a_(t)?.androidBlockingDialogGuard!==!0||iv(e.device))return{status:"clear"};try{return await dQ({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eq(e)}}}}async function cX(e,t){let r=ah(t,e.device,{hint:!0});return r||("android"!==e.device.platform||iv(e.device)||!e.recording||"record"===t||"failed"!==(await dY({session:e})).status?null:{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}})}async function cJ(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await od(r.device,n,a,o,{...s});let l=await lw({session:r,sessionName:e.sessionName,outPath:a[0]??o,outputPlacement:"screenshot"!==(t=i).command?"default":(t.positionals??[])[0]?"positional":t.flags?.out?"out":"default",dispatchContext:s});return i.flags?.overlayRefs&&"string"==typeof l?.path&&await cZ(r,l,e.logPath),l}async function cZ(e,t,r){let n={snapshotInteractiveOnly:!0},i=ld(await lr({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);lm(e,i);let a=await cu({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let cY=un(()=>import("./lease.js")),cQ=un(()=>import("./session.js").then(e=>e.session_namespaceObject)),c0=un(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),c1=un(()=>import("./react-native.js")),c2=un(()=>import("./record-trace.js")),c3=un(()=>import("./find.js")),c5=un(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function c4(e){var t;switch(t=e.req.command,a_(t)?.route??"generic"){case"lease":return await c6(e);case"session":return await c8(e);case"snapshot":return await c9(e);case"reactNative":return await c7(e);case"recordTrace":return await ue(e);case"find":return await ut(e);case"interaction":return await ur(e);case"generic":return null}}async function c6(e){let{handleLeaseCommands:t}=await cY();return ui(e.req.command,"lease",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,cloudArtifactProvider:e.cloudArtifactProvider}))}async function c8(e){let{handleSessionCommands:t}=await cQ();return ui(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function c9(e){let{handleSnapshotCommands:t}=await c0();return ui(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function c7(e){let{handleReactNativeCommands:t}=await c1();return ui(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function ue(e){let{handleRecordTraceCommands:t}=await c2();return ui(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function ut(e){let{handleFindCommands:t}=await c3();return ui(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function ur(e){let{handleInteractionCommands:t}=await c5();return ui(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function un(e){let t;return()=>t??=e()}function ui(e,t,r){if(r)return r;throw new eG("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let ua=new p;async function uo(e,t,r){let n=ua.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>ua.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function us(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function ul(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=eQ(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,d="selector-conflict"===n?`To keep using this device, rerun the command with --session ${o} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${o} for commands that should attach to the recording session.`,`Recording session "${r.name}" owns this device. Run ${l}; if the session still appears in agent-device session list, run ${s}. ${d} Run agent-device session list to inspect active sessions.`):(i=e,a=t,c=eQ(i.name),u=`agent-device close --session ${c}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c} and remove conflicting device selectors. To switch devices, first run ${u}, then open the desired device with a different --session name.`:`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${c}. To open a new session on this device, first run ${u}.`)}function ud(e,t){if(!t)return[];let r=[],n=e.device,i=t.platform;if(i&&!ta(n.platform,i)&&r.push({key:"platform",value:t.platform}),t.target&&t.target!==(n.target??"mobile")&&r.push({key:"target",value:t.target}),t.udid&&("ios"!==n.platform||t.udid!==n.id)&&r.push({key:"udid",value:t.udid}),t.serial&&("android"!==n.platform||t.serial!==n.id)&&r.push({key:"serial",value:t.serial}),t.device&&t.device.trim().toLowerCase()!==n.name.trim().toLowerCase()&&r.push({key:"device",value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=n.simulatorSetPath?.trim();("ios"!==n.platform||"simulator"!==n.kind||e!==i)&&r.push({key:"iosSimulatorDeviceSet",value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=tk(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function uc(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let uu="default";function up(e){return e.session||uu}function uf(e){if(e.meta?.sessionExplicit===!0||(e.session||uu)!==uu||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=a.resolve(e);try{return o.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(o.existsSync(a.join(t,".git")))return t;let e=a.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var r;return{kind:"cwd",id:(r=t,n.createHash("sha256").update(r).digest("hex").slice(0,16))}}}function um(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function uh(e,t){let r=uf(e);return!!r&&!!t.sessionScope&&!um(t,r)}function uw(e,t){if("open"!==e.command)return;let r=U(t);if(0!==r.length)throw new eG("INVALID_ARGS","Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.",{missing:r})}function uv(e,t,r){if(t&&r&&t!==r)throw new eG("UNAUTHORIZED",`Lease does not match session owner (${e})`,{reason:"LEASE_SESSION_MISMATCH",field:e})}async function uy(e){let t=e.sessionStore.get(e.sessionName),r=t?.lease;return!!t&&!!r&&!!e.leaseRegistry.consumeExpiredLease(r.leaseId)&&(ew({level:"info",phase:"leased_session_expired",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,deviceKey:r.deviceKey}}),await e.teardownSession(t,t.name).catch(e=>{ew({level:"debug",phase:"leased_session_expiry_cleanup_failed",data:{reason:"LEASE_EXPIRED",leaseId:r.leaseId,session:t.name,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.delete(t.name),!0)}function ug(e){return function(e,t){let r=sx(e),n=r.leaseId??t?.leaseId,i=r.tenantId??t?.tenantId,a=r.runId??t?.runId;if(i&&a&&n)return tB({tenantId:i,runId:a,leaseId:n,leaseBackend:r.leaseBackend??t?.backend,leaseProvider:r.leaseProvider??t?.leaseProvider,deviceKey:r.deviceKey??t?.deviceKey,clientId:r.clientId??t?.clientId,expiresAt:t?.expiresAt})}(e.req,e.req.internal?.admittedLease)??e.existingLease}async function ub(e){let t=e.session.lease;if(!t)return;let r=e.leaseRegistry.releaseLease(M({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}));return ew({level:"info",phase:"session_lease_released",data:{session:e.session.name,leaseId:t.leaseId,released:r.released}}),r.lease?await e.leaseLifecycleProvider?.release?.(r.lease):void 0}function uA(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h=e.meta?.lockPolicy;if(!h)return e;let w={...e.flags??{}},v=(r=e.command,a_(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?ud(t,w):(n=w,i=e.meta?.lockPlatform,f=[],void 0!==n.platform&&i&&(a=n.platform,o=i,a&&o&&a!==o&&("apple"===a?!ts(o):"apple"!==o||!ts(a)))&&f.push({key:"platform",value:n.platform}),i&&(s=f,l=n,d=i,(m=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return uI(t)}}(m,d)&&s.push({key:"target",value:m}),function(e,t,r){for(let n of function(e,t){switch(e){case"android":return["udid","iosSimulatorDeviceSet"];case"ios":return["serial","androidDeviceAllowlist"];case"apple":var r;return"desktop"===(r=t).target||"macos"===r.platform?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return uI(e)}}(r,t)){let r=t[n];ag(r)&&e.push({key:n,value:r})}}(f,n,i)),f),g=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=w,!g||u||void 0!==p.platform||c&&ab(p,av)||(w.platform=g),{...e,flags:w}}if("strip"===h)return function(e,t,r,n){if(n){uS(e,t),e.platform=n.device.platform;return}uS(e,t),r&&void 0===e.platform&&(e.platform=r)}(w,y,g,t),{...e,flags:w};throw new eG("INVALID_ARGS",function(e,t,r){let n=t.map(uc).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${us(r)}, but this request selected ${n}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:"";return`${e.command} is using a bound-session lock${a}, but this request selected ${n}.`}(e,y,t),{session:e.session,conflicts:y.map(uc),hint:function(e,t){if(t)return ul(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${eQ(e.session)}`:"";return"Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. "+(r?`Run agent-device open <app>${n} --platform ${r} first if no session is active. `:`Run agent-device open <app>${n} first if no session is active. `)+"Run agent-device session list to inspect active sessions."}(e,t)})}function uS(e,t){for(let r of t)delete e[r.key]}function uI(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function u_(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[uM(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return uA(e)}catch{return e}}(n);if("open"===(r=l).command||ay(r.flags))try{let e=await iH(l.flags??{});s.add(uM(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=ux(e)-ux(t);return 0!==r?r:e.localeCompare(t)})}function uM(e){return`device:${e}`}function ux(e){return+!e.startsWith("session:")}function uN(e,t={}){let r=ty(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function uD(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:uN(t,{simulatorSetPath:e.simulatorSetPath})}function uP(e,t,r){return oF(uD(e,t),r)}let uk="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/apple-runner/derived, then retry.";function uE(e){if(!(e instanceof eG)||"COMMAND_FAILED"!==e.code)return!1;let t=`${e.message??""}`.toLowerCase();return!(t.includes("xcodebuild exited early")||t.includes("device is busy")&&t.includes("connecting"))&&!!(t.includes("runner did not accept connection")||t.includes("fetch failed")||t.includes("econnrefused")||t.includes("socket hang up"))}function uC(e){return!(e instanceof eG)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function uR(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eG("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:t_({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tD("IOS_RUNNER_CONNECT_TIMEOUT")})}async function uO(e){var t,r;let n,{session:i,port:a,logPath:o}=e,s=await i.testPromise,l="Runner did not accept connection (xcodebuild exited early)",d=t_({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eG("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:d,hint:(t=s.stdout,r=s.stderr,(n=`${l}
|
|
8
13
|
${t}
|
|
9
|
-
${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${tf("IOS_RUNNER_CONNECT_TIMEOUT")} ${l7}`)})}function di(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function da(e){if(rb(e))throw rx()}let ds=new Map;async function dl(e,t,r,n,i=45e3,a,o){let s=tl.fromTimeoutMs(i),{getEndpoints:l}=dh(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tw(async({deadline:s})=>{let u=await dd({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:d,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{d=e},setLastError:e=>{c=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rx();return new eG("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:d,lastError:c,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:dt},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rN(e))throw rx();c||(c=e)}if(o?.aborted)throw rx();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw dr({port:t,endpoints:d,logPath:n,lastError:c});let a=await dI(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw dr({port:t,endpoints:d,logPath:n,lastError:c})}async function dd(e){await dc(e);let t=await du(e);if(t.response)return t.response;let r=await dp(e);return r||await df(e,t.usedCachedTunnelIp)}async function dc(e){if(e.attemptDeadline?.isExpired())throw new eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await dn({session:e.session,port:e.port,logPath:e.logPath})}async function du(e){let t=e.endpoints,r=!1;if("device"===e.device.kind){let n=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=n.endpoints,r=n.cached,e.setEndpoints(t)}let n=r?t[0]:null;return{response:await dw(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{var i;e.setLastError(r),"device"===e.device.kind&&t===n&&(i=e.device.id,ds.delete(i))}}),usedCachedTunnelIp:r}}async function dp(e){return"simulator"===e.device.kind&&e.session?.ready?await dg(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function df(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,ds.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await dw(n.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{e.setLastError(r)}})}async function dm(e,t,r,n=45e3,i){if(i?.aborted)throw rx();let a=tl.fromTimeoutMs(n),{getEndpoints:o}=dh(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eG("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await dy(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function dh(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await dv({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=d.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:d.sharedCacheHit}}}}async function dw(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await dy(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rN(e))throw rx();s(t,e)}return null}async function dg(e,t,r,n){let{signal:i,attemptDeadline:a,onError:o}=n,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let n=await dI(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rN(e))throw rx();return o(e),null}}async function dv(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=ds.get(t))?e.expiresAt<=Date.now()?(ds.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await dS(i.id,a);return l(d),d&&(r=i.id,n=d,ds.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function dy(e,t,r,n){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;return await fetch(e,{...t,signal:a})}async function dS(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=a.join(p.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await ao(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!o.existsSync(n))return null;let a=JSON.parse(o.readFileSync(n,"utf8"));if(a.info?.outcome&&"success"!==a.info.outcome)return null;let s=(a.result?.connectionProperties?.tunnelIPAddress??a.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{dM(n)}}async function dI(e,t,r,n,i){let a=JSON.stringify(r),o=l8(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await ao(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tu({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eG("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tf(e)})}return{status:200,body:l}}async function dA(){return await new Promise((e,t)=>{let r=v.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new eG("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function db(e,t,r,n){t&&dx(t,e),r&&dx(r,e),n&&process.stderr.write(e)}let d_=new Map;function dx(e,t){let r=(d_.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await o.promises.mkdir(a.dirname(e),{recursive:!0}),await o.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{d_.get(e)===r&&d_.delete(e)});d_.set(e,r)}function dM(e){try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}let dN=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function dP(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eG("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!o.existsSync(e))throw new eG("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await dD(e)){await aa("codesign",["--remove-signature",e],{allowFailure:!0});try{await aa("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eG?n:new eG("COMMAND_FAILED",String(n));throw new eG("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function dD(e){return 0===(await aa("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let dk=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),dE=new Set([" "," ","\n","\r"]),dC=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function dR(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new dT(e).parse()}function dO(e,t){for(let r of e){if("dict"===r.name)for(let e=0;e<r.children.length-1;e+=1){let n=r.children[e],i=r.children[e+1];n?.name==="key"&&n.text&&i&&t(n.text,i)}dO(r.children,t)}}class dT{roots=[];stack=[];index=0;xml;constructor(e){this.xml=e}parse(){for(this.skipByteOrderMark();this.index<this.xml.length;)this.readNextToken();return this.assertFullyClosed(),this.roots}readNextToken(){"<"!==this.xml[this.index]?this.readText():this.resolveMarkupReader()()}resolveMarkupReader(){return this.startsWith("\x3c!--")?()=>this.skipUntil("--\x3e","Comment is not closed."):this.startsWith("<?")?()=>this.skipUntil("?>","Processing instruction is not closed."):this.startsWith("<![CDATA[")?()=>this.readCdata():this.startsWith("<!")?()=>this.skipDeclaration():this.startsWith("</")?()=>this.readClosingTag():()=>this.readOpeningTag()}assertFullyClosed(){if(this.stack.length>0){let e=this.stack[this.stack.length-1];throw Error(`Unclosed XML tag <${e?.name??"unknown"}>.`)}}skipByteOrderMark(){65279===this.xml.charCodeAt(0)&&(this.index=1)}readOpeningTag(){this.index+=1,this.skipWhitespace();let e=this.readRequiredName(`Missing XML tag name at offset ${this.index}.`),{attributes:t,selfClosing:r}=this.readOpeningTagBody(),n={name:e,attributes:t,text:null,children:[]};this.addNode(n),r||this.pushOpenNode(n)}readOpeningTagBody(){let e={};for(;;){this.skipWhitespace();let t=this.readOpeningTagEnd();if(t)return{attributes:e,selfClosing:"self-closing"===t};let r=this.readAttribute();e[r.name]=r.value}}readOpeningTagEnd(){if(this.index>=this.xml.length)throw Error("Opening XML tag is not closed.");return">"===this.xml[this.index]?(this.index+=1,"open"):"/"===this.xml[this.index]&&">"===this.xml[this.index+1]?(this.index+=2,"self-closing"):null}readAttribute(){let e=this.readRequiredName(`Invalid XML attribute at offset ${this.index}.`);if(function(e){if(dC.has(e))throw Error(`Unsupported XML attribute name "${e}".`)}(e),this.skipWhitespace(),"="!==this.xml[this.index])throw Error(`Missing value for XML attribute "${e}".`);return this.index+=1,this.skipWhitespace(),{name:e,value:this.readAttributeValue(e)}}pushOpenNode(e){if(this.stack.length>=256)throw Error("Maximum XML nesting depth of 256 exceeded.");this.stack.push(e)}readClosingTag(){this.index+=2,this.skipWhitespace();let e=this.readName();if(this.skipWhitespace(),">"!==this.xml[this.index])throw Error(`Closing XML tag </${e}> is not closed.`);this.index+=1;let t=this.stack.pop();if(!t)throw Error(`Unexpected closing XML tag </${e}>.`);if(t.name!==e)throw Error(`Expected </${t.name}> before </${e}>.`)}readText(){let e=this.xml.indexOf("<",this.index),t=-1===e?this.xml.length:e;this.appendText(this.xml.slice(this.index,t),!0),this.index=t}readCdata(){let e=this.index+9,t=this.xml.indexOf("]]>",e);if(-1===t)throw Error("CDATA section is not closed.");this.appendText(this.xml.slice(e,t),!1),this.index=t+3}appendText(e,t){let r=e.trim();if(!r)return;let n=this.stack[this.stack.length-1];n&&(n.text=`${n.text??""}${t?dL(r):r}`)}addNode(e){let t=this.stack[this.stack.length-1];t?t.children.push(e):this.roots.push(e)}readName(){var e;let t=this.index;for(;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&dk.has(e);)this.index+=1;return this.xml.slice(t,this.index)}readRequiredName(e){let t=this.readName();if(!t)throw Error(e);return t}readAttributeValue(e){let t=this.xml[this.index];if('"'!==t&&"'"!==t)throw Error(`XML attribute "${e}" must use a quoted value.`);this.index+=1;let r=this.index,n=this.xml.indexOf(t,r);if(-1===n)throw Error(`XML attribute "${e}" is not closed.`);return this.index=n+1,dL(this.xml.slice(r,n).trim())}skipDeclaration(){let e={quote:null,bracketDepth:0};for(let t=this.index+2;t<this.xml.length;t+=1)if(function(e,t){var r,n,i;return!(void 0===t||(r=e,n=t,r.quote?(n===r.quote&&(r.quote=null),!0):('"'===n||"'"===n)&&(r.quote=n,!0)))&&(function(e,t){if("["===t){e.bracketDepth+=1;return}"]"===t&&e.bracketDepth>0&&(e.bracketDepth-=1)}(e,t),i=e,">"===t&&0===i.bracketDepth)}(e,this.xml[t])){this.index=t+1;return}throw Error("XML declaration is not closed.")}skipUntil(e,t){let r=this.xml.indexOf(e,this.index+e.length);if(-1===r)throw Error(t);this.index=r+e.length}skipWhitespace(){for(var e;this.index<this.xml.length&&void 0!==(e=this.xml[this.index])&&dE.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function dL(e){return e.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,(e,t)=>{switch(t){case"amp":return"&";case"lt":return"<";case"gt":return">";case"quot":return'"';case"apos":return"'";default:var r=e,n=t;let i=n.startsWith("#x")?Number.parseInt(n.slice(2),16):Number(n.slice(1));if(!Number.isInteger(i)||i<0||i>1114111)return r;try{return String.fromCodePoint(i)}catch{return r}}})}let d$=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dF(e){var t;let r=await dU(e);if(!r||0===r.length)return null;let n=a.dirname(e),i=new Set,s=function(e,t){let r=[],n=new Set,i=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){i.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(a.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&n.add(a.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:i}}(r,n);for(let e of s.testRootPaths){if(!o.existsSync(e))return null;i.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>o.existsSync(a.join(t,e)));return r?a.join(r,e):null})){if(!e)return null;i.add(e)}return Array.from(i)}async function dU(e){let t=await as(e);if(t){var r,n,i=t;let e=new Set;for(let t of[i,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!tM(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(tM))}return r}(i),...Object.values(i).filter(e=>tM(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(d$.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=o.readFileSync(e,"utf8"),n=dR(r),t=new Set,dO(n,(e,r)=>{if(d$.has(e)){if("string"===r.name&&r.text)return void t.add(r.text);if("array"===r.name)for(let e of r.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}let dG=["CFBundleIcons","CFBundleIcons~ipad"];async function dq(e){let t=e.filter(dH);if(0===t.length)return;let r=e.filter(e=>dX(e)&&!dW(e));for(let e of t){let t=function(e,t){let r=a.dirname(e);return t.find(e=>a.dirname(e)===r&&"AgentDeviceRunner.app"===a.basename(e))??t.find(t=>a.dirname(t)===r&&t!==e)??null}(e,r);t&&await dB(t,e)}}async function dB(e,t){var r;let n,i=function(e,t){let r=!1;for(let i of o.readdirSync(e,{withFileTypes:!0})){var n;if(i.isFile()&&(n=i.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(o.existsSync(t)){let r=o.readFileSync(e),n=o.readFileSync(t);return!r.equals(n)&&(o.copyFileSync(e,t),!0)}return o.copyFileSync(e,t),!0})(a.join(e,i.name),a.join(t,i.name))&&(r=!0)}return r}(e,t),s=await dj(e,t);(i||s)&&(await dK(t),r=t,n=new Date,o.utimesSync(r,n,n))}async function dj(e,t){var r,n;let i=a.join(e,"Info.plist"),o=a.join(t,"Info.plist"),s=await as(i),l=await as(o);if(!s||!l)return!1;let d=(r=s,n=l,dG.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===d.length)return!1;for(let e of d)await dV(o,e.key,e.value,e.shouldInsert);return!0}async function dV(e,t,r,n){let i=await aa("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eG("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dK(e){let t=await aa("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dH(e){return dX(e)&&dW(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dW(e){return a.basename(e).endsWith("-Runner.app")}function dX(e){return a.basename(e).endsWith(".app")}let dz={iOS:{sdkName:{simulator:"iphonesimulator",device:"iphoneos"},derivedBaseName:{simulator:"ios-simulator",device:"ios-device"},xctestrunHints:{simulator:{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]},device:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]}}},tvOS:{sdkName:{simulator:"appletvsimulator",device:"appletvos"},derivedBaseName:{simulator:"tvos-simulator",device:"tvos-device"},xctestrunHints:{simulator:{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]},device:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}}},macOS:{sdkName:{simulator:"macosx",device:"macosx"},derivedBaseName:{simulator:"macos",device:"macos"},xctestrunHints:{simulator:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]},device:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}}}};function dJ(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":tr(e.target)}function dZ(e){return"simulator"===e?"simulator":"device"}function dY(){return"arm64"===process.arch?"arm64":"x86_64"}let dQ="XCTestDevices",d0=".agent-device-backup",d1=".agent-device-xctestdevices-backup-",d2=a.join(p.homedir(),".agent-device","ios-runner"),d3=".agent-device-runner-cache.json",d5={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},d4=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO","OTHER_SWIFT_FLAGS=$(inherited) -disable-sandbox"],d6=new Map,d8=new Set,d9=new Map,d7=new Set;function ce(e){return e?.trim()??""}function ct(e=process.env){return ce(e.AGENT_DEVICE_IOS_BUNDLE_ID)||ce(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cr(e=process.env){let t=ce(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${ct(e)}.uitests`}let cn=function(e=process.env){let t=ct(e),r=cr(e);return Array.from(new Set([ce(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function ci(e=p.homedir()){return a.join(e,"Library","Developer","XCTestDevices")}async function ca(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=ta(e.simulatorSetPath);if(!r)return null;let n=a.resolve(r),i=a.resolve(t.xctestDeviceSetPath??ci()),s=a.resolve(t.backupPath??function(e=ci()){return`${e}${d0}`}(i)),l=a.resolve(t.lockDirPath??function(e=p.homedir()){return a.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??eC(process.pid),c=await cl({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(co({xctestDeviceSetPath:i,backupPath:s}),function(e,t){if(a.resolve(e)===a.resolve(t))return!0;try{return o.realpathSync.native(e)===o.realpathSync.native(t)}catch{return!1}}(n,i))return await c(),null;o.mkdirSync(n,{recursive:!0}),o.existsSync(i)&&o.renameSync(i,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=a.dirname(r),i=a.join(n,`${dQ}.agent-device-link-${process.pid}-${Date.now()}`);o.mkdirSync(n,{recursive:!0});try{o.symlinkSync(t,i,"dir"),o.renameSync(i,r)}catch(e){throw o.existsSync(i)&&cs(i),e}}({requestedSetPath:n,xctestDeviceSetPath:i})}catch(e){throw co({xctestDeviceSetPath:i,backupPath:s}),await c(),new eG("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:i,backupPath:s,error:String(e)})}let u=!1;return{release:async()=>{if(!u){u=!0;try{co({xctestDeviceSetPath:i,backupPath:s})}finally{await c()}}}}}function co(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=a.dirname(e),r=a.basename(e).replace(d0,""),n=r===dQ?d1:`${r}${d1}`;try{return o.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>a.join(t,e))}catch{return[]}}(r)],i=n.find(e=>o.existsSync(e)),s=o.existsSync(t)&&o.lstatSync(t).isSymbolicLink();if(i){if(s&&cs(t),o.existsSync(t))if(!s)return void ef({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?o.rmSync(i,{recursive:!0,force:!0}):o.rmSync(r,{recursive:!0,force:!0});else o.mkdirSync(a.dirname(t),{recursive:!0}),o.renameSync(i,t);for(let e of n)e!==i&&o.existsSync(e)&&o.rmSync(e,{recursive:!0,force:!0});return}s&&(ef({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),cs(t))}function cs(e){!o.existsSync(e)||o.lstatSync(e).isSymbolicLink()&&o.unlinkSync(e)}async function cl(e){return await ev({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function cd(e){var t;return await cl({lockDirPath:(t=e,a.join(a.dirname(t),`${a.basename(t)}.lock`)),owner:{pid:process.pid,startTime:eC(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cc(e,t){let r=function(e){var t;let r,i,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=a.resolve(s);if(!o.existsSync(l))throw new eG("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?a.resolve(d):(t=l,(r=n.createHash("sha1")).update(t),i=r.digest("hex").slice(0,12),a.join(p.tmpdir(),"agent-device-ios-xctest-derived",i));return cK("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(r)return r;let i=tY(),s=cg(e,i),l=cF(e,s);return await lU(d6,l,async()=>{let r=await cd(l);try{return await cu({device:e,options:t,projectRoot:i,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function cu(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(td(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||d8.has(t))&&(cK("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cj(t),ch(t),d8.delete(t));let l=await cV({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cD(e,n),xctestrunReferencesProjectRoot:cE,resolveExistingXctestrunProductPaths:dF}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cK("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await cp({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(cj(s),ch(s)),await cf({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function cp(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cm(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cf(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:i,derived:s,cache:l,reason:d}=e,c=a.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!o.existsSync(c))throw new eG("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await c$(t,c,s,r);let p=Math.max(0,Date.now()-u),f=cD(s,t);if(!f)throw new eG("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dF(f);if(!m)throw new eG("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await dP(t,m,f),await dq(m),cy(s,cb(i,f,m)),cK("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function cm(e,t,r,n){try{var i,a,o,s;return await dP(e,n.productPaths,n.xctestrunPath),cK("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cy(i,cb(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eG))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&dN.has(t)}(e))throw e;return cK("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function ch(e){try{if(!o.existsSync(e))return;if("derived"!==a.basename(e))return void o.rmSync(e,{recursive:!0,force:!0});for(let r of o.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,cw.has(t)&&o.rmSync(a.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let cw=new Set([d3,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cg(e,t=tY()){let r,i=dJ(e);return{schemaVersion:2,packageVersion:tZ(),runnerSourceFingerprint:function(e){let t=a.join(e,"ios-runner","AgentDeviceRunner"),r=function(e){if(!o.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of o.readdirSync(e,{withFileTypes:!0})){var n,i;let o=a.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(o);continue}s.isFile()&&(n=s.name,i=o,"project.pbxproj"===n?i.includes(`${a.sep}.xcodeproj${a.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(a.extname(n)))&&t.push(o)}}return t.sort((e,t)=>e.localeCompare(t))}(t),i=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=a.relative(e,n),i=o.statSync(n);r.update(t),r.update("\0"),r.update(String(i.size)),r.update("\0"),r.update(String(Math.trunc(i.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=cP.get(t);if(s?.fileStatsFingerprint===i)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let r=a.relative(t,e);l.update(r),l.update("\0"),l.update(o.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return cP.set(t,{fileStatsFingerprint:i,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=cv("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dz[e].sdkName[dZ(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cv("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cv("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(i,e.kind),platformName:i,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=dJ(e))?`platform=macOS,arch=${dY()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:cq(process.env),runnerSigningBuildSettings:cG(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cB(),runnerSandboxBuildArgs:[...d4]}}function cv(e,t){let r=JSON.stringify([e,t]),n=d9.get(r);if(void 0!==n)return n;try{let n=eV(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return d9.set(r,i),i}catch{return d9.set(r,"unknown"),"unknown"}}function cy(e,t){o.mkdirSync(e,{recursive:!0}),o.writeFileSync(a.join(e,d3),`${JSON.stringify(t,null,2)}
|
|
10
|
-
`)}async function
|
|
11
|
-
${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??l7);throw new eG("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function cF(e,t){let r,i=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(i)return a.resolve(i);let o=(r=n.createHash("sha256").update(cA(cI(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return a.join(d2,"derived",dz[dJ(e)].derivedBaseName[dZ(e.kind)])}(e);return a.join(s,o)}function cU(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cG(e=process.env,t=!1,r="ios"){if("macos"===r)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let n=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return n&&o.push(`DEVELOPMENT_TEAM=${n}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function cq(e=process.env){let t=ct(e),r=cr(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cB(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cj(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=a.resolve(tY(),".tmp"),""===(n=a.relative(t,a.resolve(r)))||n.startsWith("..")||a.isAbsolute(n))throw new eG("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${a.join(tY(),".tmp")}.`})}}async function cV(e){var t,r;let n,i=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(o.readFileSync(a.join(e,d3),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cA(cI(n))!==cA(cI(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=i.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(c_))||!cN(n.xctestrunPath,e)||!cM(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cN(t.path,e)||!cM(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,i.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l,c=d?"manifest":"scan",u=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?i.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:i.reason,xctestrunPath:l,productPaths:u,source:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:c}}function cK(e,t,r){ef({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cH={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},cW={...cH,readOnly:!0},cX={...cW,readinessProbe:!0},cz={...cH,readinessPreflightSkipEligibleAfterHealthyMutation:!0},cJ=Object.fromEntries(Object.entries({tap:"preflightSkippableTouchMutation",mouseClick:"default",longPress:"preflightSkippableTouchMutation",drag:"preflightSkippableTouchMutation",remotePress:"default",type:"default",swipe:"preflightSkippableTouchMutation",scroll:"preflightSkippableTouchMutation",desktopScroll:"preflightSkippableTouchMutation",findText:"readOnly",querySelector:"readOnly",readText:"readOnly",snapshot:"readOnly",screenshot:"readOnly",back:"default",backInApp:"default",backSystem:"default",home:"default",rotate:"default",rotateGesture:"default",transformGesture:"default",appSwitcher:"default",keyboardDismiss:"default",keyboardReturn:"default",alert:"readOnly",pinch:"default",sequence:"preflightSkippableTouchMutation",recordStart:"default",recordStop:"default",status:"readOnlyReadinessProbe",uptime:"readOnlyReadinessProbe",shutdown:"default"}).map(([e,t])=>[e,function(e){switch(e){case"default":return cH;case"readOnly":return cW;case"readOnlyReadinessProbe":return cX;case"preflightSkippableTouchMutation":return cz}}(t)]));function cZ(e){return cJ[e].readOnly}function cY(e){return cJ[e].readinessPreflightSkipEligibleAfterHealthyMutation}let cQ=process.pid,c0=eC(process.pid),c1=(t2=cQ,t3=c0,(t=n.createHash("sha256")).update(String(t2)),t.update("\0"),t.update(t3??"unknown-start"),`owner-${t2}-${t.digest("hex").slice(0,8)}`);function c2(t){e=t?.trim()||void 0}async function c3(e,t){let r=await ev({lockDirPath:`${ue(e)}.lock`,owner:{pid:cQ,startTime:c0,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function c5(e){try{let a;var t,r,n=JSON.parse(o.readFileSync(ue(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let s=(t=n,a={ownerToken:ut(t.ownerToken),ownerPid:un(t.ownerPid),sessionId:ut(t.sessionId),port:un(t.port),xctestrunPath:ut(t.xctestrunPath),jsonPath:ut(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return s?{schemaVersion:1,deviceId:i,...s,ownerStartTime:ur(n.ownerStartTime),ownerStateDir:ur(n.ownerStateDir)??void 0,runnerPid:un(n.runnerPid)}:null}catch{return null}}function c4(e){var t;return e?e.ownerToken===c1?{type:"owned",lease:e}:eL((t=e).ownerPid)&&(!t.ownerStartTime||eC(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function c6(e,t,r){let n=c4(c5(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type){var i,o,s,l,d;let c,u,p,f,m;if(i=n.lease,(c=c8())&&i.ownerStateDir&&a.resolve(c)===a.resolve(i.ownerStateDir))return void await ui(n.lease,"same-state-dir",t);if(o=n.lease,(s=r)&&"proxy"===s.leaseProvider&&s.leaseId&&s.clientId&&function(e,t){if(!e)return!1;if(e===t)return!0;let[,,r]=e.split(":",3);return r===t}(s.deviceKey,o.deviceId))return void await ui(n.lease,"logical-lease-takeover",t);throw new eG("COMMAND_FAILED",r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerStateDir:n.lease.ownerStateDir,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:(l=n.lease,d=r,u=`PID ${l.ownerPid}`,p=l.ownerStateDir?` with AGENT_DEVICE_STATE_DIR=${l.ownerStateDir}`:"",m=(f=c8())&&f!==l.ownerStateDir?` Current daemon state dir is ${f}.`:"",d?`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission. Runner owner: ${u}${p}.${m} Retry after the owning session closes or after the five-minute inactivity lease expires. If this persists after expiry, inspect the runner owner details and clean the stale daemon state on the machine with simulator access.`:`Runner owner details: ${u}${p}.${m} Retry after the owning runner finishes. Do not run prepare ios-runner from another daemon/client to recover this; a live foreign runner lease cannot be released by the remote client.`)})}await ui(n.lease,n.type,t)}function c8(){return e||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function c9(e,t){let r=c4(c5(e));"owned"===r.type&&await ui(r.lease,"owned",t)}function c7(e){e&&function(e){let t=c5(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{o.unlinkSync(ue(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function ue(e){let t;return a.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?a.resolve(t):a.join(p.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function ut(e){return"string"==typeof e&&e.length>0?e:null}function ur(e){return"string"==typeof e?e:null}function un(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function ui(e,t,r){ef({level:"stale"===t||"same-state-dir"===t||"logical-lease-takeover"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),c7(e)}let ua={cleanupRunnerProcessTree:ug,cleanupRunnerXcodebuildProcesses:uv,cleanupTempFile:dM};async function uo(e,t={}){var r;!1!==t.graceful?await uc(e):await ug(e.child.pid,"SIGTERM"),await uu(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(um(r)||eO(r))&&await ug(e.child.pid,"SIGKILL"),await up(e)}async function us(e){await c9(e,ua)}async function ul(e){let t=Array.from(d7);await uh(e,"SIGINT"),await uw(t,"SIGINT"),await uh(e,"SIGTERM"),await uw(t,"SIGTERM"),await uh(e,"SIGKILL"),await uw(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await up(e)}))}async function ud(){let e=Array.from(d7);await Promise.allSettled(e.map(async e=>{try{await ug(e.pid,"SIGTERM"),await ug(e.pid,"SIGKILL")}finally{d7.delete(e)}}))}async function uc(e){try{await dl(e.device,e.port,di({command:"shutdown"}),void 0,15e3)}catch{await ug(e.child.pid,"SIGTERM")}}async function uu(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function up(e){await uf(e.device),dM(e.xctestrunPath),dM(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{c7(e.lease)}}async function uf(e){"simulator"===e.kind&&await Promise.allSettled(cn.map(async t=>{try{await ao(l8(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ef({level:"warn",phase:"ios_runner_simulator_app_terminate_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:2e3,error:r instanceof Error?r.message:String(r)}})}}))}function um(e){return!!e&&eL(e)}async function uh(e,t){await Promise.allSettled(e.map(async e=>{await ug(e.child.pid,t)}))}async function uw(e,t){await Promise.allSettled(e.map(async e=>{await ug(e.pid,t),"SIGKILL"===t&&d7.delete(e)}))}async function ug(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let r="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await aa("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function uv(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${uy(e)}-${uy(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${uy(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await aa("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ef({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function uy(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function uS(e){let t=await uI(e.logPath);return t?new eG(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:"string"==typeof e.error.details?.hint?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function uI(e){if(!e)return;let t=await uA(e,65536);if(t){var r,n;let e;return(r=e=t.toLowerCase()).includes("axruntime")&&r.includes("coretext")&&(r.includes("attributesforelement")||r.includes("axuielementcopymultipleattributevalues")||r.includes("reconstitutedsmuggledctfontfromdictionary")||r.includes("reconstitutedsmuggledattributedstringfromdictionary"))?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_axruntime_coretext_crash",hint:"The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:(n=e).includes("process crashed")||n.includes("the application under test")||n.includes("terminated unexpectedly")||n.includes("exception type:")&&n.includes("thread 0 crashed")?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_crash",hint:"The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:void 0}}async function uA(e,t){let r;try{let n=await g.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await g.open(e,"r");let o=Buffer.alloc(a);return await r.read(o,0,a,i),o.toString("utf8")}catch{return}finally{await r?.close().catch(()=>{})}}let ub=new Map,u_=new Map;async function ux(e,t){return await lU(u_,e.id,async()=>{let r=ub.get(e.id);if(r){let t=await uN(e,r);if(t)return t}return await c3(e.id,async()=>await uM(e,t))})}async function uM(e,t){var r,n;let i,s,l,d={},c=function(e,t){if(!e)return;let r=Object.entries({leaseId:uW(e.leaseId),clientId:uW(e.clientId),tenantId:uW(e.tenantId),runId:uW(e.runId),leaseProvider:uW(e.leaseProvider),deviceKey:uW(e.deviceKey)??t}).filter(([,e])=>void 0!==e);return r.length>0?Object.fromEntries(r):void 0}(t.runnerLeaseContext,e.id);ef({level:"debug",phase:"ios_runner_session_startup",data:{deviceId:e.id,logicalLeaseContext:c}}),await uH(d,"cleanup_stale_xcodebuild",async()=>{await c6(e.id,ua,c)}),await uH(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ef({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):uL(t))}),await uH(d,"verify_developer_mode",async()=>{await u$(e)}),t.cleanStaleBundles?await uH(d,"cleanup_stale_bundles",async()=>{await uP(e)}):(d.cleanup_stale_bundles=0,ef({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let u=await uH(d,"ensure_xctestrun",async()=>await cc(e,t));d.build_xctestrun=u.buildMs;let p=await uH(d,"allocate_port",async()=>await dA()),{xctestrunPath:f,jsonPath:m}=await uH(d,"prepare_xctestrun_env",async()=>await cC(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(p)},`session-${e.id}-${c1}-${p}`,{iosXctestEnvDir:t.iosXctestEnvDir})),h=await uH(d,"simulator_set_redirect",async()=>await ca(e)),w=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cU(e),"1","-destination-timeout",String(20),"-xctestrun",f,"-derivedDataPath",u.derived,"-destination","macOS"===(l=dJ(e))?`platform=macOS,arch=${dY()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:i,wait:s}=await uH(d,"launch_xcodebuild",()=>eq("xcodebuild",w,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(p)},detached:!0})))}catch(e){throw await h?.release(),e}i.stdout?.on("data",e=>{db(e,t.logPath,t.traceLogPath,t.verbose)}),i.stderr?.on("data",e=>{db(e,t.logPath,t.traceLogPath,t.verbose)});let g=`${e.id}:${p}:${Date.now()}`,v={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:g,runnerPid:i.pid,port:p,xctestrunPath:f,jsonPath:m}).deviceId,ownerToken:c1,ownerPid:cQ,ownerStartTime:c0,ownerStateDir:c8(),sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},y={sessionId:g,device:e,deviceId:e.id,port:p,xctestrunPath:f,xctestrunArtifact:u,jsonPath:m,testPromise:s,child:i,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,logicalLeaseContext:c,simulatorSetRedirect:h??void 0,lease:v};try{let e,t;e=ue(v.deviceId),o.mkdirSync(a.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,o.writeFileSync(t,JSON.stringify(v,null,2),"utf8"),o.renameSync(t,e)}catch(t){throw await uC(e.id,y,{graceful:!1,waitTimeoutMs:1e3}),t}return ub.set(e.id,y),y}async function uN(e,t){if(!um(t.child.pid))return await uH({},"stop_stale_session",async()=>{await uC(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ef({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let n=cF(e,cg(e));return r?.derived!==n?(ef({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await uH({},"stop_stale_artifact_session",async()=>{await uC(e.id,t)}),null):(ef({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function uP(e){if("simulator"===e.kind)for(let t of cn){let r=await uD(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
|
|
12
|
-
${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function
|
|
13
|
-
${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eG("COMMAND_FAILED","Developer mode is disabled for Apple development tools",{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function uF(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eG("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function uU(e,t,r,n,i,a){var o,s,l,d,c,u;let p;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,ef({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,logicalLeaseContext:o.logicalLeaseContext,timings:o.startupTimings}}));let f=di(r),m=cZ(f.command),h=tl.fromTimeoutMs(i),w=function(e,t){let r=cZ(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(cJ[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!cY(t.command))return{action:"run",reason:"conservative_command"};let n=e.lastHealthyMutation;if(!n)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==n.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let i=Date.now()-n.atMs;return i>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:i}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:i}}(t,f);"run"===w.action?await uB({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ef({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:c.reason,lastHealthyMutationAgeMs:"recent_healthy_mutation"===c.reason?c.lastHealthyMutationAgeMs:void 0,sessionReady:d.ready}}));try{p=await uq({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw uG(e,t,w)}try{let e=await uj(p,t,n),r=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return r?(t.lastHealthyMutation=void 0,await uE(t,r)):cY(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eG){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);if(e)throw t.lastHealthyMutation=void 0,await uE(t,e),r;if((u=r)instanceof eG&&u.details?.runner!==void 0)throw r;throw uG(r,t,w)}}function uG(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,uV(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function uq(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let c=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:n.command,commandId:n.commandId};return await eu("ios_runner_command_send",async()=>l?await dl(t,r.port,n,i,d,r,s):await dm(t,r.port,n,d,s),c)}async function uB(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,signal:o,decision:s}=e,l=r.ready?Math.min(1e3,a.remainingMs()):Math.min(uK(r),a.remainingMs());try{let e=await eu("ios_runner_readiness_preflight",async()=>await dl(t,r.port,di({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await uj(e,r,i)}catch(e){throw uV(e,{runnerReadinessPreflightFailed:!0})}}async function uj(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eG("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?e$(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw await uS({error:new eG(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r}),logPath:r})}if(t.ready=!0,n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&ef({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function uV(e,t){let r=e instanceof eG?e:new eG("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eG(r.code,r.message,{...r.details??{},...t},r.cause??e)}function uK(e){return e.startupTimeoutMs??45e3}async function uH(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ef({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}function uW(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}let uX=new w;function uz(e,t={}){return{runCommand:e,...t}}function uJ(e,t,r,n={}){if(r)return uY(r);let i=function(e,t={}){let r=uX.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?uY(i.provider):uY(t)}async function uZ(e,t,r){if(!e)return await r();let n={provider:uY(e),deviceId:t.deviceId,requestId:t.requestId};return await uX.run(n,r)}function uY(e){return"function"==typeof e?{runCommand:e}:e}async function uQ(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await u2(t,r,n,i,a,o);return await u0(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function u0(e,t){var r,n,i,a;if(!e)return await u1(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,u4({command:(n=t).command,session:n.session,transportError:n.transportError,decision:"skipped",reason:r.reason,lifecycleState:r.lifecycleState}),r.data}if("skipInvalidation"===e.type){throw i=e,u4({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await u1(t,e.reason,e.lifecycleState,e.error)}async function u1(e,t,r,n){throw u4({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await e.invalidateSession(e.session,e.invalidationReason),n??e.transportError}async function u2(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let v,y,S,I,A;if("status"===r.command||!r.commandId?.trim())return;let b=u5(n);try{v=await uU(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ef({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),...b}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof v.lifecycleState?v.lifecycleState:"";return ef({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...b}}),o=v,s=_,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(cZ(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=u5(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eG("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...s,hint:(i=t.command,a=s,`${u3(a)}The runner is still reachable and reports "${i}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,y="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",I="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=u5(f),new eG(e$(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:I??(h=p.command,w=A,`${u3(w)}The runner is still reachable and reports "${h}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){var i,a,o;if(cZ(t.command))return r;let s=u5(r);return new eG("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...s,hint:(i=t.command,a=e,o=s,`${u3(o)}The runner is still reachable and reports "${i}" is ${a}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}(s,l,d,c)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new eG("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(g=l.command,`The runner did not confirm that "${g}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:c.logPath,transportError:d.message},d)}}function u3(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. "}function u5(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}function u4(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ef({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}async function u6(e,t){let r;da(t.requestId);let n=r_(t.requestId),i=di({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await u8({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eG("COMMAND_FAILED","iOS runner prepare failed")}async function u8(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await ux(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await pi(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,pa(c,u),u)}}catch(e){return await u9({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function u9(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eG?d:new eG("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&pt(t)))return{kind:"prepared",result:await u7({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!pt(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await pe(i,"prepare_runner_health_failed"),d;return da(o.requestId),await uE(i,"prepare_runner_health_retry"),ef({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function u7(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:d,signal:c,error:u}=e,p=u.message||"runner_health_failed";await uE(s,"prepare_cached_runner_health_failed"),await cS(s.xctestrunArtifact,p);let f=Date.now(),m=await ux(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await pi(o,m,l,d,c,h,{recoveryReason:p});return ef({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,pa(t,r),r}catch(r){let e;await pe(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eG?n:new eG("COMMAND_FAILED",String(n)),new eG(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw pa(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function pe(e,t){try{await uE(e,t)}catch{}}function pt(e){let t;return!rN(e)&&(de(e)||dt(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function pr(e,t,r){let n;da(r.requestId);let i=r_(r.requestId);try{let a=(n=await ux(e,r)).ready?45e3:uK(n);return await uU(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eG?o:new eG("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&dt(a)&&n)return da(r.requestId),await pn({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(de(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return da(r.requestId),await pn({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(n&&de(a))return await uQ({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:uE});throw o}}async function pn(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await uE(e.session,a);let o=await ux(t,{...n,cleanStaleBundles:!0});try{let a=await uU(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ef({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof eG?a:new eG("COMMAND_FAILED",String(a));if(de(e))return await uQ({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:uE});throw a}}async function pi(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await uU(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,d=a,c=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),...f}}function pa(e,t){ef({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function po(e,t,r={}){uF(e),da(r.requestId);let n=di(t),i=pd(e,r);return cZ(n.command)?ts(()=>(da(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(da(r.requestId),de(e))}):i.runCommand(e,n,r)}function ps(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=pd(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(ef({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void ef({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function pl(e,t){uF(e),da(t.requestId);let r=di({command:"uptime"}),n=pd(e,t);if(n.prepare)return await n.prepare(e,t);let i=Date.now();return{runner:await n.runCommand(e,r,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function pd(e,t){return uJ(e,pc,void 0,{requestId:t.requestId})}let pc=uz(pr,{prepare:u6,prewarm:async(e,t)=>{await u6(e,{...t,healthTimeoutMs:45e3})}});async function pu(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function pp(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
|
|
14
|
-
`)},flush:()=>{n&&(i(n),n="")}}}function
|
|
15
|
-
`,recoveredLineCount:l.length}}async function pS(e,t,r,n,i,a){let o=await pA({deviceId:e,appBundleId:t,simulatorSetPath:i});return px({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return l6(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",pv(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function pI(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pA(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,i=await ao(l6(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==i.exitCode)return;let o=i.stdout.trim();if(!o)return;let s=a.join(o,"Info.plist"),l=await ej("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function pb(e,t,r,n){return px({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pv(e)],stream:t,redactionPatterns:r,pidPath:n})}async function p_(e,t,r,n){return px({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function px(e){let t="active",r=eq(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=pp(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&rf(e.pidPath,n.pid);let a=pf(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rm(e.pidPath),r),r=>{throw t="failed",rm(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await pu(a),n.killed||n.kill("SIGKILL"),await pu(a),rm(e.pidPath)}}}let pM=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),pN=/https?:\/\/[^\s"'<>\])]+/i,pP=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function pD(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pE(e)));for(let e of t.entries){let t=pE(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pk(e,t){let r=pq(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=pq(t?.maxPayloadChars,2048,64,16384),o=pq(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),d=s.slice(l),c=[];for(let e=d.length-1;e>=0&&c.length<r;e-=1){let t=d[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=p$(s,["method","httpMethod"]),d=p$(s,["url","requestUrl"]),c=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=pM.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=pN.exec(o),h=d??m?.[0];if(!h)return null;let w=c??pR(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let g={method:f,url:h,status:w,timestamp:pO(o),packetId:pT(o)??void 0,durationMs:pL(o)??void 0,raw:pG(o,a),line:r};if("android"===n&&function(e,t,r){let n=pC(t,r,5),i=e.packetId??n.map(e=>pT(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?pC(t,r,12).filter(e=>pT(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>pO(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>pR(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pL(e)).find(e=>"number"==typeof e))}(g,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return pU(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pG(e,a))}if("body"===i||"all"===i){let e=pF(o,s,["requestBody","body","payload","request"]),t=pF(o,s,["responseBody","response"]);e&&(g.requestBody=pG(e,a)),t&&(g.responseBody=pG(t,a))}return g}(d,e,l+e+1,n,i,a);r&&c.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:d.length,matchedLines:c.length,entries:c,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function pE(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function pC(e,t,r){let n=[],i=Math.max(0,t-r),a=Math.min(e.length-1,t+r);for(let t=i;t<=a;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function pR(e){for(let t of pP){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function pO(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function pT(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pL(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function p$(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function pF(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pU(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function pU(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pG(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function pq(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let pB={start:async e=>await pY(e)},pj=i3(pB,function(e={}){return{...pB,...e}});async function pV(e,t){return await pj.run(e,t)}function pK(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function pH(e){let t=a.dirname(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),function(e,t){if(o.existsSync(e)&&!(o.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;o.existsSync(t)&&(o.existsSync(n)&&o.unlinkSync(n),o.renameSync(t,n))}}(e,{maxBytes:pK("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:pK("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function pW(e){if(!o.existsSync(e))return{exists:!1,sizeBytes:0};let t=o.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function pX(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pz(e){var t,r,n,i;let a,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y=pX(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},a=pq(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pq(t?.maxPayloadChars,2048,64,16384),d=pq(t?.maxScanLines,4e3,100,2e4),o.existsSync(m)?pk(o.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:a,maxPayloadChars:l,maxScanLines:d}}),I=[],A=await pJ({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await pw(c.id,u);if(e){let t=pk(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=pD(t,S,h),I.push((r=A,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===c.platform&&"simulator"===c.kind&&u&&0===S.entries.length){let e=await pQ({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=pD(e.dump,S,h),I.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&I.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?I.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===I.length&&("ios"===c.platform&&"simulator"===c.kind?I.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):I.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&I.push("ios"===(i=c).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:I}}async function pJ(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:i}=e;if("android"!==t.platform||!r)return null;if(void 0!==i&&"active"!==i)return{reason:"inactive"};if("active"!==i)return null;let s=function(e){let t=function(e){if(!e||!o.existsSync(e))return null;try{return rp(o.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(a.join(a.dirname(n),ru));if(!s)return null;let l=await ph(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pZ(e,t,r,n){return await pj.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pY({device:e,appBundleId:t,outPath:r,pidPath:n}){pH(r);let i=o.createWriteStream(r,{flags:"a"}),a=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await p_(e.id,i,a,n):await pS(e.id,t,i,a,e.simulatorSetPath,n);if("android"===e.platform)return pm(t),await pg(e.id,t,i,a,n);if("macos"===e.platform)return await pb(t,i,a,n);throw i.end(),new eG("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pQ(e){let t=await py({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pk(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function p0(e){await e.stop(),await pu(e.wait)}async function p1(e,t){let r={},n=[];if(t||n.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await ti(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ti(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await ao(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await ao(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await ej("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function p2(e,t){pH(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
16
|
-
`;o.appendFileSync(e,r,"utf8")}function
|
|
17
|
-
${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}async function fo(e,t){try{let r=await as(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await aa("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===r.exitCode){let e=String(r.stdout??"").trim();if(e.length>0)return e}}catch{}try{var r,n;let i;return r=await l.readFile(e,"utf8"),n=t,dO(dR(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let fs="xctrace-animation-hitches";function fl(e,t){let r=dR(e),n=p6(r,t);return{rows:0===n.length?[]:p4(r,e=>"row"===e.name),schema:n}}function fd(e,t){for(let r of e)fd(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:p8(r),process:fc(r)})}function fc(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=p8(p5(e.children,e=>"pid"===e.name)),r=(e.attributes.fmt??"").replace(/\s+\(\d+\)$/,"").trim();return null===t&&0===r.length?null:{pid:t??void 0,name:r.length>0?r:void 0}}let fu="ps-process-snapshot",fp="ps-process-snapshot",ff="xctrace-activity-monitor",fm="xctrace-activity-monitor",fh="leaks-output-graph",fw="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fg(e,t){if("ios"===e.platform&&"device"===e.kind)return await fL(e,t);let r=await fT(e,t),n=await fB(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});let i=new Date().toISOString();return fX({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:fu,memoryMethod:fp})}async function fv(e,t,r){let n,i=fx(e);if(!i.memgraph)return{available:!1,kind:"memgraph",reason:i.reason,hint:i.hint,support:i};let o=await fV(e,t,i);if(!1===o.available)return o;let{process:s}=o;await l.mkdir(a.dirname(r),{recursive:!0});let d=await fS(r);try{n=await fy(e,r,s.pid)}catch(n){throw await fI(r,d),function(e,t,r,n,i){if(i instanceof eG){let o=i.details??{};return new eG(i.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(fW(r.command)),path:n,hint:fK(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:i.message)},i)}return new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(fW(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},i)}(e,t,s,r,n)}if(0!==n.exitCode)throw await fI(r,d),new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:s.pid,processName:a.basename(fW(s.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:fK(e,n.stdout,n.stderr)});let c=await l.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await fI(r,d),new eG("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:s.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:c.size,measuredAt:new Date().toISOString(),method:fh,appBundleId:t,pid:s.pid,processName:a.basename(fW(s.command)),support:i}}async function fy(e,t,r){return"macos"===e.platform?await aa("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await ao(l8(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function fS(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function fI(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function fA(e,t){var r;let n,i,o,s,l,d;if("ios"!==e.platform||"device"!==e.kind)throw new eG("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:e.platform,deviceKind:e.kind});let u=await f$(e,t),p=await fM(e,t,u);return n=fl((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:ri(u.map(e=>a.basename(c(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,i=function(e){if(!e)return;let{rows:t,schema:r}=fl(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){fd(e.children,i);let t=p9(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=dR(e),i=Object.values(r={start:(t=p6(n,"hitches")).indexOf("start"),duration:t.indexOf("duration"),process:t.indexOf("process"),isSystem:t.indexOf("is-system")}).every(e=>e>=0)?r:null;if(!i)return[];let a=new Map;return p4(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(fd(e.children,r),!0===(n=e.children[t.isSystem],null===(o=p9(n,r))?null:0!==o))return null;let s=p9(e.children[t.start],r),l=p9(e.children[t.duration],r);if(null===s||null===l)return null;let d=(i=e.children[t.process],a=r,i?i.attributes.ref?a.get(i.attributes.ref)?.process??null:fc(i):null);return{startNs:s,durationNs:l,pid:d?.pid,processName:d?.name}})(e,i,a)).filter(e=>!!e)})(r.hitchesXml).filter(e=>{var t,n,i;return t=e,n=r.processIds,i=r.processNames,!!(void 0!==t.pid&&n.includes(t.pid))||!!t.processName&&i.includes(t.processName)})).length,l=Math.max(0,Math.round(Date.parse(r.windowEndedAt)-Date.parse(r.windowStartedAt))),d=function(e,t){if(0===e.length)return[];let r=[...e].sort((e,t)=>e.startNs-t.startNs),n=[],i=[];for(let e of r){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}n.push(i),i=[e]}return i.length>0&&n.push(i),n.map(e=>{var r,n;let i,a,o,s;return r=e,n=t,i=Math.min(...r.map(e=>e.startNs)),a=Math.max(...r.map(e=>e.startNs+e.durationNs)),s=Math.max(o=Math.max(0,Math.round(i/1e6)),Math.round(a/1e6)),{startOffsetMs:o,endOffsetMs:s,startAt:new Date(n+o).toISOString(),endAt:new Date(n+s).toISOString(),missedDeadlineFrameCount:r.length,worstFrameMs:p7(Math.max(...r.map(e=>e.durationNs))/1e6)}}).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}(o,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?p7(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:fs,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===i?void 0:p7(1e3/i),refreshRateHz:i,worstWindows:d.length>0?d:void 0}}function fb(e){return"ios"===e.platform&&"device"===e.kind?{method:fs,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:fs,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 f_(e){let t=fb(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:fm,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:ff,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r="macos"===e.platform?"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{fps:t,memory:{method:fp,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:fu,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function fx(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fh,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."}:"ios"===e.platform&&"simulator"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fh,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."}:"macos"===e.platform?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:fh,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fh,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 fM(e,t,r){let n=await l.mkdtemp(a.join(p.tmpdir(),"agent-device-ios-frame-perf-")),i=a.join(n,"animation-hitches.trace"),o=a.join(n,"hitches.xml"),s=a.join(n,"frame-lifetimes.xml"),d=a.join(n,"display-info.xml");try{let n=await fN({device:e,appBundleId:t,tracePath:i,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await fC(e,t,i,"hitches",o),await fC(e,t,i,"hitches-frame-lifetimes",s);let a=await fR(e,t,i,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await l.readFile(o,"utf8"),frameLifetimesXml:await l.readFile(s,"utf8"),displayInfoXml:a?await l.readFile(d,"utf8"):void 0}}finally{await l.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function fN(e){let{device:t,appBundleId:r,tracePath:n,template:i,duration:a}=e,o=e.allProcesses?["--all-processes"]:(e.targetPids??[]).flatMap(e=>["--attach",String(e)]),s=["xctrace","record","--template",i,"--device",t.id,...o,"--time-limit",a,"--output",n,"--quiet","--no-prompt"],l=await fP(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fE(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eG("COMMAND_FAILED",e.failureMessage,{cmd:"xcrun",args:s,exitCode:l.result.exitCode,stdout:l.result.stdout,stderr:l.result.stderr,appBundleId:r,deviceId:t.id,hint:fJ(l.result.stdout,l.result.stderr)})}async function fP(e,t){let r;for(let n=1;n<=3;n+=1){await fk(t,n,1500);let i=new Date().toISOString(),a=await ao(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!fD(a))break}return r}function fD(e){let t=`${e.stdout}
|
|
18
|
-
${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function
|
|
19
|
-
${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(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:{...r,memgraph:!1}};throw t}}function
|
|
20
|
-
${r}`.toLowerCase();return n.includes("timed out")||n.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.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"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
|
|
21
|
-
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?
|
|
22
|
-
`,"utf8"),c}finally{await l.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function f2(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eG("UNSUPPORTED_OPERATION","Apple xctrace perf is not supported on Android.",{platform:e.platform,hint:"Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace."});if("ios"===e.platform&&"device"===e.kind){let r=await f$(e,t);return{pids:r.map(e=>e.pid),processNames:ri(r.map(e=>a.basename(c(e.executable))))}}let r=await fT(e,t),n=await fB(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});return{pids:n.map(e=>e.pid),processNames:[r.executableName]}}async function f3(e,t,r){let n;for(let r=1;r<=3;r+=1){await fk(t,r,1500);let i=eq("xcrun",e,{allowFailure:!0}),a=await f5(i.wait);if(!a)return i;if(n=a,!fD(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eG("COMMAND_FAILED",r.failureMessage,{cmd:"xcrun",args:e,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,appBundleId:r.appBundleId,deviceId:r.device.id,hint:fJ(i.stdout,i.stderr)})}async function f5(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function f4(e,t){e.child.kill("SIGINT");let r=await f6(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await f6(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop",{exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,tracePath:e.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."});throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop after SIGKILL",{tracePath:e.outPath,captureCleanedUp:!1,forcedKill:!0,hint:"xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying."})}async function f6(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function f8(e,t){let r=await l.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await l.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eG("COMMAND_FAILED","xctrace produced no trace data",{tracePath:e,appBundleId:t.appBundleId,deviceId:t.deviceId,stdout:t.stdout,stderr:t.stderr,hint:"Keep the Apple device unlocked and connected, keep the app active, then retry perf."})}function f9(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function f7(e){return Math.round(10*e)/10}let me="adb-shell-dumpsys-gfxinfo-framestats",mt="Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.";function mr(e,t,r){let n=t.get(r);if(void 0===n)return null;let i=Number(e[n]);return Number.isFinite(i)?i:null}function mn(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function mi(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function ma(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`^\\s*${r}:\\s*([0-9][0-9,]*)`,"im"));if(!n)return;let i=n[1];return void 0===i?void 0:f9(i)??void 0}async function mo(e,t,r={}){var n,i,a,o,s,l,d,c;let u=t0(e,r.adb);try{let d,c,p,f,m,h,w,g,v,y,S,I=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new eG("COMMAND_FAILED",`Android gfxinfo did not find a running process for ${t}`,{metric:"fps",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect."})}(n,t),p=function(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??"",r=ma(t,"Total frames rendered"),n=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(void 0===r||!n)return;let i=n[1],a=n[2];if(void 0===i||void 0===a)return;let o=f9(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=ma(t,"Uptime"),d=ma(t,"Stats since");return{droppedFramePercent:p7(s),droppedFrameCount:o,totalFrameCount:r,sampleWindowMs:function(e){let{uptimeMs:t,statsSinceNs:r}=e;if(void 0===t||void 0===r)return;let n=t-Math.round(r/1e6);return n>=0?n:void 0}({uptimeMs:l,statsSinceNs:d}),uptimeMs:l,statsSinceNs:d}}(n),f=function(e){let t=[],r=null;for(let i of e.split("\n")){var n;let e=i.trim();if(0===e.length||"---PROFILEDATA---"===e)continue;let a=e.split(",").map(e=>e.trim());if((n=a).includes("IntendedVsync")&&n.includes("FrameCompleted")){r=new Map(a.map((e,t)=>[e,t]));continue}let o=function(e,t){if(!t||e.length<t.size)return;let r=mr(e,t,"Flags"),n=mr(e,t,"IntendedVsync"),i=mr(e,t,"FrameCompleted");if(0===r&&null!==n&&null!==i&&!(n<=0)&&!(i<=n))return{intendedVsyncNs:n,frameCompletedNs:i,durationNs:i-n}}(a,r);o&&t.push(o)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}(n),m=function(e,t,r){let n=function(e){var t;let r=(t=e.map(e=>e.intendedVsyncNs),[...new Set(t.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)),n=[];for(let e=1;e<r.length;e+=1){let t=r[e]-r[e-1];t>=4e6&&t<=5e7&&n.push(t)}if(0!==n.length){let e,t;return e=[...n].sort((e,t)=>e-t),t=Math.floor(e.length/2),e.length%2==1?e[t]:(e[t-1]+e[t])/2}}(e);if(t||0!==e.length||function(e){throw new eG("COMMAND_FAILED",`Failed to parse Android framestats output for ${e}`,{metric:"fps",package:e,hint:"Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging."})}(r),t||void 0!==n)return n;throw new eG("COMMAND_FAILED",`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:"fps",package:r,hint:"Retry perf after a longer interaction window so consecutive Android frame timestamps are available."})}(f,p,t),h=Date.parse(i),w=function(e){let{frames:t,measuredAtMs:r,summary:n}=e,i=mn(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=mi(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),v=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=mn(e);return mi(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,y={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?p7(c/d*100):0)},S=function(e){let{droppedFrames:t,timing:r,measuredAtMs:n,summary:i}=e;if(0===t.length)return;let a=function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e;if(0===t.length||void 0===r)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>(function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-r)/1e6)),l=Math.max(s,Math.round((o-r)/1e6)),d=void 0!==i&&Number.isFinite(n)?n-i:void 0;return{startOffsetMs:s,endOffsetMs:l,startAt:void 0===d?void 0:new Date(d+a/1e6).toISOString(),endAt:void 0===d?void 0:new Date(d+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:f7(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...y,sampleWindowMs:v,...(l=m,{frameDeadlineMs:void 0===l?void 0:f7(l/1e6),refreshRateHz:void 0===l?void 0:f7(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:me,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await ms(e,t,r),I}catch(e){throw d=t,(c=e)instanceof eG?new eG(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eG("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function ms(e,t,r={}){let n=t0(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function ml(e,t,r,n){if(n instanceof eG){var i,a,o,s,l;let d,c=n.details??{};return new eG(n.code,n.message,{...c,action:e,package:r,tool:t,hint:"string"==typeof c.hint?c.hint:(i=t,d=("string"==typeof(a=c).stderr?a.stderr:"").toLowerCase(),"simpleperf"===i?(s=o=d).includes("permission denied")||s.includes("not profileable")||s.includes("profileable")?"Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.":o.includes("not supported")||o.includes("failed to open perf event")?"This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.":md("simpleperf"):(l=d).includes("permission denied")||l.includes("not allowed")?"Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.":md(i))},n)}return new eG("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:md(t)},n)}function md(e){return"simpleperf"===e?"Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.":"Verify perfetto is available, the app process is running, and the device permits trace capture."}async function mc(e,t,r,n,i){return{capture:{durationMs:n,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:r},frameHealth:"perfetto"===t.kind?await mu(e,t.packageName,i):void 0,notes:["perfetto"===t.kind?"Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.":"Open the Simpleperf report artifact for symbol-level CPU attribution."]}}async function mu(e,t,r){try{let n=await mo(e,t,r);return{available:!0,droppedFramePercent:n.droppedFramePercent,droppedFrameCount:n.droppedFrameCount,totalFrameCount:n.totalFrameCount,method:n.method,worstWindows:n.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:"Android frame health was not available"}}}let mp="adb-shell-simpleperf",mf="adb-shell-perfetto",mm="/data/local/tmp";async function mh(e,t,r){let n=t0(e,r.adb);await mA(n,t),await m_(n,t),await mb(n,t);let i=await mS(t.outPath);await mv(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await mc(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?mp:mf,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function mw(e,t,r={}){let n=t0(e,r.adb);try{"running"===t.state&&(await mA(n,t),await m_(n,t).catch(()=>{}))}finally{await mv(n,t.remotePath)}}function mg(e,t,r=mm){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function mv(e,t){try{await e(["shell",`rm -f ${mI(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function my(e,t){await l.mkdir(a.dirname(e),{recursive:!0}),await l.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
23
|
-
`)}async function
|
|
24
|
-
${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await mW(r,c),new eG("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:"Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs."});let i=await l.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await mW(r,c),new eG("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:s,path:r,remotePath:d,hint:"Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug."});return{available:!0,kind:"android-hprof",path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:mq,packageName:t,pid:s,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function mH(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function mW(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function mX(e,t){let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(0===r.exitCode&&void 0!==n)return n;throw new eG("COMMAND_FAILED",`No running Android process found for ${t}`,{kind:"android-hprof",package:t,stdout:r.stdout,stderr:r.stderr,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot."})}function mz(e,t,r){return r instanceof eG?new eG(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eG("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function mJ(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`${r}:\\s*([0-9][0-9,]*)`,"i"));if(!n)return;let i=n[1];return void 0===i?void 0:f9(i)??void 0}let mZ=new Map;async function mY(e){let t=await g.mkdtemp(a.join(p.tmpdir(),"agent-device-materialized-"));try{let r=await m1(e.installablePath,a.join(t,"installable")),i=e.archivePath?await m1(e.archivePath,a.join(t,"archive")):void 0,o=n.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{mQ(o)},s);return mZ.set(o,{rootPath:t,installablePath:r,archivePath:i,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:r,...i?{archivePath:i}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await g.rm(t,{recursive:!0,force:!0}),e}}async function mQ(e,t){let r=mZ.get(e);if(!r)throw new eG("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),mZ.delete(e),await g.rm(r.rootPath,{recursive:!0,force:!0})}async function m0(e){let t=Array.from(mZ.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await mQ(e)}))}async function m1(e,t){let r=await g.stat(e);await g.mkdir(t,{recursive:!0});let n=a.join(t,a.basename(e));return r.isDirectory()?await g.cp(e,n,{recursive:!0}):await g.copyFile(e,n),n}async function m2(e){if(await uR(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await aM("dismiss",t).catch(t=>{ef({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function m3(e){e.appLog&&await p0(e.appLog)}async function m5(e){e.applePerf?.active&&(await f0(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function m4(e){let t=e.nativePerf?.android;t&&(await mw(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function m6(e){"android"===e.device.platform&&await tK(e.device)}async function m8(e,t){await m3(e),await m5(e),await m4(e),await m6(e),e9(e.device.platform)&&await m2(e),await m0(t).catch(()=>{})}let m9=new WeakMap;async function m7(e){var t,r,n;let i,a,{sessionStore:o,leaseRegistry:s}=e,l=(i={...(r=function(e){let t=eQ(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eJ(r);if(r&&!n)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eG("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},t1(r.command,i)?{...r,flags:i}:r),d=l.command,c=function(e){var t,r;let n=e.session||lV;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=lH(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=ed(),p=o.resolveSessionDir(c),f=rc(p,l.meta?.requestId??u.requestId),m=rd(p);ep({session:c,logPath:f}),ef({level:"info",phase:"request_start",data:{publicSession:l.session,effectiveSession:c,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:m}}),n$((t=l).command)||lz(t,a5(t));let h=nG(d)?.sessionExecutionLockExempt!==!0?await l3({req:l,sessionName:c,sessionStore:o}):[],w=(n=s,(a=m9.get(n))||(a=new Map,m9.set(n,a)),a),g={req:l,command:d,sessionName:c,requestLogPath:f,runnerLogPath:m,throwIfCanceled:()=>rM(l.meta?.requestId),runAdmitted:async e=>(rM(l.meta?.requestId),await lZ({sessionName:c,sessionStore:o,leaseRegistry:s,teardownSession:m8}),g.req=l=function(e){let{sessionName:t,sessionStore:r,leaseRegistry:n}=e,i=r.get(t),a=function(e,t,r){var n,i;let a,o;if(n$(e.command))return;let s=a5(e);lz(e,s);let l=r?.lease;if(!l&&e.meta?.sessionIsolation!=="tenant"&&(!s.leaseId||!s.tenantId&&!s.runId))return;n=s,(i=l)&&(lJ("leaseId",n.leaseId,i.leaseId),lJ("tenantId",n.tenantId,i.tenantId),lJ("runId",n.runId,i.runId),lJ("leaseProvider",n.leaseProvider,i.leaseProvider),lJ("clientId",n.clientId,i.clientId),lJ("deviceKey",n.deviceKey,i.deviceKey));let d=(a=a5(e),o=r?.lease??r?.deviceLease??void 0,tx({tenantId:a.tenantId??o?.tenantId,runId:a.runId??o?.runId,leaseId:a.leaseId??o?.leaseId,leaseTtlMs:a.leaseTtlMs,leaseBackend:a.leaseBackend??o?.leaseBackend,leaseProvider:a.leaseProvider??o?.leaseProvider,deviceKey:a.deviceKey??o?.deviceKey,clientId:a.clientId??o?.clientId})),c={...d,leaseTtlMs:d.leaseTtlMs??(H(d)?3e5:void 0)};return t.assertLeaseAdmission(b(d)),t.heartbeatLease(b(c))}(e.req,n,i);if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&r.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}({req:l,sessionName:c,sessionStore:o,leaseRegistry:s}),await e()),runLocked:async e=>(rM(l.meta?.requestId),0===h.length)?await g.runAdmitted(e):await he(w,h,async()=>await g.runAdmitted(e))};return g}async function he(e,t,r){let[n,...i]=t;return n?await lU(e,n,async()=>await he(e,i,r)):await r()}function ht(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function hr(e,t){return ht(e)?e[t]:void 0}function hn(e,t){let r=hr(e,t);return"string"==typeof r?r:void 0}function hi(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function ha(e){return ht(e)}function ho(e){if(!ht(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function hs(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,hd(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??hc(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??hc(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(hp)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(hp)}(e)??hc(t,["value"]),depth:r,enabled:hu(t,["enabled"]),focused:hu(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=hc(e,["role","type"]);return{index:0,type:t,role:t,label:hc(e,["label","name","text"]),value:hc(e,["value"]),enabled:hu(e,["enabled"]),focused:hu(e,["focused"])}}(e.data),index:n.length}});return n}(hn(e,"snapshot")??"",Array.isArray(r=hr(e,"refs"))?r.flatMap(e=>{let t=ht(e)?e:void 0,r=hd(hc(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):ht(r)?Object.entries(r).flatMap(([e,t])=>{let r=hd(e);return r?[{ref:r,data:ht(t)?t:void 0}]:[]}):[]);return t&&await hl(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=hr(e,"truncated"))?n:void 0}}async function hl(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function hd(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function hc(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function hu(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function hp(e){return"string"==typeof e}let hf="agent-browser",hm="Run `agent-device web setup` to install the managed web backend.";function hh(e={}){let t=e.session?.trim(),r=async r=>await hS(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},async startRecording(e){await r(["record","start",e])},async stopRecording(){await r(["record","stop"])},snapshot:async e=>await hv(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async setViewport(e,t){await r(["set","viewport",String(e),String(t)])},async click(e,t){await hg(r,e,t)},async clickRef(e){await r(["click",hb(e)])},async fill(e,t,n){await hg(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async fillRef(e,t){await r(["fill",hb(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await hw(r,e,t),t?.durationMs!==void 0?{durationMs:t.durationMs}:{}),dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=ht(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(ha).map(e=>({headers:ho(e.headers),method:hn(e,"method"),mimeType:hn(e,"mimeType"),requestId:hn(e,"requestId"),resourceType:hn(e,"resourceType"),responseHeaders:ho(e.responseHeaders),status:hi(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:hn(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=tx({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),tx({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e)}}async function hw(e,t,r){for(let i of function(e){var t,r,n,i;let a,o,s,l=e?.pixels??e?.amount,d=e?.durationMs;if(void 0===d||d<=0)return[{distance:l,delayAfterMs:0}];let c=Math.max(1,Math.min(20,Math.ceil(d/50))),u=d/Math.max(1,c-1);return(t=e,r=c,a=t?.pixels??t?.amount??300,t?.amount!==void 0&&void 0===t.pixels?Array.from({length:r},()=>a/r):(o=Math.floor((n=Math.round(a))/(i=r)),s=n-o*i,Array.from({length:i},(e,t)=>t<s?o+1:o))).map((e,t)=>({distance:e,delayAfterMs:t<c-1?u:0}))}(r)){var n;await e(["scroll",t,...void 0===(n=i.distance)?[]:[String(n)]]),i.delayAfterMs>0&&await e8(i.delayAfterMs)}}async function hg(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function hv(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await hs(n,t?.includeRects?async t=>await hy(e,t):void 0)}async function hy(e,t){try{return function(e){let t=ht(e)&&ht(e.box)?e.box:e;if(ht(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=hi(r,"x"),i=hi(r,"y"),a=hi(r,"width"),h_(e,i,a,hi(r,"height"))??(n=t,o=hi(n,"left"),s=hi(n,"top"),l=hi(n,"right"),d=hi(n,"bottom"),h_(o,s,hx(l,o),hx(d,s)))}}(await e(["get","box",hb(t)]))}catch(t){var r;let e;if(e=(r=t)instanceof Error?r.message:String(r),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function hS(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await hI(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eG("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:hf,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:hm},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!ht(s))return s;if(!1===(s.success??s.ok)){throw new eG("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(ht(t)){let e=hn(t,"message")??hn(t,"error");if(e)return e}return hn(e,"message")??"agent-browser command failed"}(s),{cmd:hf,args:d,hint:hn(s,"hint")??hm,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eG("COMMAND_FAILED","agent-browser command failed",{cmd:hf,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:hn(s,"hint")??hm});return Object.hasOwn(s,"data")?s.data:s}async function hI(e,t){let r="",n="",i=0;try{let a=await eD({stateDir:t.stateDir}),o=await ej(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=eP(a)).code?new eG("TOOL_MISSING",t.message,{...t.details??{},cmd:hf,args:o,hint:hA(t)},t):"COMMAND_FAILED"===t.code?new eG("COMMAND_FAILED",t.message,{...t.details??{},cmd:hf,args:o,hint:hA(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function hA(e){return"string"==typeof e.details?.hint?e.details.hint:hm}function hb(e){return e.startsWith("@")?e:`@${e}`}function h_(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function hx(e,t){return void 0===e||void 0===t?void 0:e-t}function hM(){return{ok:!1,error:eU(new eG("UNAUTHORIZED","Invalid token"))}}async function hN(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize({ok:!1,error:{code:"SESSION_NOT_FOUND",message:"No active session. Run open first."}});let a=await lw({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function hP(e){ef({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ed(),r=ec({force:!0})??void 0;return{ok:!1,error:eU(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function hD(e,t=5e3){await Promise.all(e.map(async e=>{let r;await new Promise(n=>{r=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let r="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof r&&r.call(e)}(e),n()},t);try{e.close(()=>n())}catch{n()}}),r&&clearTimeout(r)}))}function hk(e){o.existsSync(e)&&o.unlinkSync(e)}function hE(e){if(!o.existsSync(e))return null;try{let t=JSON.parse(o.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function hC(e){let t=hE(e);if(!t||t.pid===process.pid)try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}function hR(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hO(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new eG("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,i=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,d=e.exit??(e=>process.exit(e)),{baseDir:c,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=eY(i.AGENT_DEVICE_STATE_DIR),h=e1(i.AGENT_DEVICE_DAEMON_SERVER_MODE);c2(c),function(e){if(o.existsSync(e))for(let t of o.readdirSync(e,{withFileTypes:!0})){if(!t.isDirectory())continue;let r=a.join(e,t.name,ru);if(o.existsSync(r))try{let e=rp(o.readFileSync(r,"utf8"));if(e&&function(e){let t,r=eC(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eR(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{rm(r)}}}(m);let w=new rl(m),g=new nf({maxActiveSimulatorLeases:hR(i.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hR(i.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),y=tZ(),S=n.randomBytes(24).toString("hex"),I=eC(process.pid)??void 0,A=e5(),b=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,trackDownloadableArtifact:f}=e,{sessionStore:m,leaseRegistry:h}=e;async function w(e){let r=!!(e.meta?.debug||e.flags?.verbose);return await el({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(!e_(e.token,n))return hM();try{return await n_(p,async()=>{let t=await m7({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return hP(e)}})}async function g(e,t){let n=async()=>{var n;let p,h=function(e){var t,r,n;let i,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,d=o.runnerLogPath;o.throwIfCanceled();let c=s.get(o.sessionName);c&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=uk(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(c),s.set(o.sessionName,c));let u=(i=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:l0(t.req,i),existingSession:i}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ed();if(!t.ok){ef({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=ec({force:!0})??void 0;return{ok:!1,error:eU(new eG(e$(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:n.diagnosticId,logPath:e})}}return ef({level:"info",phase:"request_success"}),ec(),{ok:!0,data:function(e,t,r){var n,i;let o;if(!t)return t;let s=(n=e,o=Array.isArray((i=t).artifacts)?[...i.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof i.path||o.push({field:"path",path:i.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:a.basename(n.meta?.clientArtifactPaths?.path??i.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,l);if(c?.recording?.invalidatedReason&&(r=o.command,nG(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=o.command,nG(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lB(e,t);if(0!==r.length)throw new eG("INVALID_ARGS",`Session "${e.name}" is already bound to ${lG(e)}, but this request selected ${r.map(lj).join(", ")}.`,{session:e.name,conflicts:r.map(lj),hint:lq(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{var n,i,a,o,s;let l;return n=d,i=e,a=t,o=r,s=p.meta,{...a6(n,i,a,o,l=ed().requestId,s),requestId:l}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:m,trackDownloadableArtifact:f});if("response"===h.type)return h.response;let w=h.scope,g=async e=>await v({lockedScope:w,providerScope:e,allowReplayActions:void 0===t});return t?await g(t):await nB({req:w.req,existingSession:w.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=w,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>hh({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},g)};return t?await e.runAdmitted(n):await e.runLocked(n)}async function v(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await lP({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:m,leaseRegistry:h,invoke:w,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,nG(o)?.replayScopedAction!==!0))return await w(e);if(!e_(e.token,n))return hM();try{let n=await m7({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return hP(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await hN({lockedScope:i,logPath:i.logPath,sessionStore:m})}return w}({logPath:f,stateDir:c,token:S,sessionStore:w,leaseRegistry:g,trackDownloadableArtifact:rD}),_=async e=>{await el({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ef({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),ec({force:!0})})},x=async e=>{let t=m8(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
25
|
-
`)});await Promise.race([t,
|
|
26
|
-
`)})]),w.writeSessionLog(e),w.delete(e.name)},
|
|
27
|
-
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await
|
|
28
|
-
`),
|
|
29
|
-
`)}catch(t){let e=
|
|
30
|
-
`),
|
|
31
|
-
`),
|
|
32
|
-
`),
|
|
33
|
-
`),process.exit(1)});export{
|
|
14
|
+
${r}`.toLowerCase()).includes("device is busy")&&n.includes("connecting")?"Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.":`${tD("IOS_RUNNER_CONNECT_TIMEOUT")} ${uk}`)})}function uT(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${n.randomUUID()}`}}function uL(e){if(rA(e))throw rI()}let uF=new Map;async function u$(e,t,r,n,i=45e3,a,o){let s=tA.fromTimeoutMs(i),{getEndpoints:l}=uK(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tE(async({deadline:s})=>{let u=await uU({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:d,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{d=e},setLastError:e=>{c=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw rI();return new eG("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:d,lastError:c,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:uC},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rM(e))throw rI();c||(c=e)}if(o?.aborted)throw rI();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw uR({port:t,endpoints:d,logPath:n,lastError:c});let a=await uZ(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw uR({port:t,endpoints:d,logPath:n,lastError:c})}async function uU(e){await uB(e);let t=await uq(e);if(t.response)return t.response;let r=await uG(e);return r||await uV(e,t.usedCachedTunnelIp)}async function uB(e){if(e.attemptDeadline?.isExpired())throw new eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await uO({session:e.session,port:e.port,logPath:e.logPath})}async function uq(e){let t=e.endpoints,r=!1;if("device"===e.device.kind){let n=await e.getEndpoints(e.attemptDeadline?.remainingMs());t=n.endpoints,r=n.cached,e.setEndpoints(t)}let n=r?t[0]:null;return{response:await uH(t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{var i;e.setLastError(r),"device"===e.device.kind&&t===n&&(i=e.device.id,uF.delete(i))}}),usedCachedTunnelIp:r}}async function uG(e){return"simulator"===e.device.kind&&e.session?.ready?await uW(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function uV(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,uF.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await uH(n.endpoints,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,r)=>{e.setLastError(r)}})}async function uj(e,t,r,n=45e3,i){if(i?.aborted)throw rI();let a=tA.fromTimeoutMs(n),{getEndpoints:o}=uK(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eG("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await uX(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function uK(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await uz({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=d.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:d.sharedCacheHit}}}}async function uH(e,t){let{command:r,port:n,timeoutMs:i,signal:a,attemptDeadline:o,onError:s}=t;for(let t of e)try{let e=o?.remainingMs()??i;if(e<=0)throw new eG("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await uX(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rM(e))throw rI();s(t,e)}return null}async function uW(e,t,r,n){let{signal:i,attemptDeadline:a,onError:o}=n,s=a?.remainingMs()??45e3;if(s<=0)return null;try{let n=await uZ(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rM(e))throw rI();return o(e),null}}async function uz(e){var t,r,n;let{device:i,timeoutBudgetMs:a,forceRefresh:o,requestTunnelIp:s,setRequestTunnelIp:l}=e;if("device"!==i.kind)return{ip:null,sharedCacheHit:!1};if(!o){let e,r=(t=i.id,(e=uF.get(t))?e.expiresAt<=Date.now()?(uF.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let d=await uJ(i.id,a);return l(d),d&&(r=i.id,n=d,uF.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function uX(e,t,r,n){let i=AbortSignal.timeout(r),a=n?AbortSignal.any([n,i]):i;return await fetch(e,{...t,signal:a})}async function uJ(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=a.join(m.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await oF(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!o.existsSync(n))return null;let a=JSON.parse(o.readFileSync(n,"utf8"));if(a.info?.outcome&&"success"!==a.info.outcome)return null;let s=(a.result?.connectionProperties?.tunnelIPAddress??a.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{u2(n)}}async function uZ(e,t,r,n,i){let a=JSON.stringify(r),o=uD(e,["spawn",e.id,"/usr/bin/curl","-s","-X","POST","-H","Content-Type: application/json","--data",a,`http://127.0.0.1:${t}/command`]),s=await oF(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=t_({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eG("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tD(e)})}return{status:200,body:l}}async function uY(){return await new Promise((e,t)=>{let r=y.createServer();r.listen(0,"127.0.0.1",()=>{let n=r.address();if("object"==typeof n&&n?.port){let t=n.port;r.close(()=>e(t))}else r.close(()=>t(new eG("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function uQ(e,t,r,n){t&&u1(t,e),r&&u1(r,e),n&&process.stderr.write(e)}let u0=new Map;function u1(e,t){let r=(u0.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await o.promises.mkdir(a.dirname(e),{recursive:!0}),await o.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{u0.get(e)===r&&u0.delete(e)});u0.set(e,r)}function u2(e){try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}let u3=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function u5(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eG("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",xctestrunPath:r});let n=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of n)if(!o.existsSync(e))throw new eG("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await u4(e)){await oL("codesign",["--remove-signature",e],{allowFailure:!0});try{await oL("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eG?n:new eG("COMMAND_FAILED",String(n));throw new eG("COMMAND_FAILED","Failed to repair macOS runner product signature",{reason:"RUNNER_PRODUCT_REPAIR_FAILED",productPath:e,xctestrunPath:r,error:t.message,details:t.details})}}}async function u4(e){return 0===(await oL("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let u6=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function u8(e){var t;let r=await u9(e);if(!r||0===r.length)return null;let n=a.dirname(e),i=new Set,s=function(e,t){let r=[],n=new Set,i=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){i.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(a.join(t,e));let s=function(e){let t=/\.app(?:\/|$)/.exec(e);return t&&void 0!==t.index?e.slice(0,t.index+4):null}(e);s&&n.add(a.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:i}}(r,n);for(let e of s.testRootPaths){if(!o.existsSync(e))return null;i.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>o.existsSync(a.join(t,e)));return r?a.join(r,e):null})){if(!e)return null;i.add(e)}return Array.from(i)}async function u9(e){let t=await o$(e);if(t){var r,n,i=t;let e=new Set;for(let t of[i,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!tF(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(tF))}return r}(i),...Object.values(i).filter(e=>tF(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(u6.has(r)){if("string"==typeof n){t.add(n);continue}if(Array.isArray(n))for(let e of n)"string"==typeof e&&t.add(e)}return Array.from(t)}(t))e.add(r);return Array.from(e)}if("darwin"===process.platform)return null;try{let t;return r=o.readFileSync(e,"utf8"),n=nB(r),t=new Set,nq(n,(e,r)=>{if(u6.has(e)){if("string"===r.name&&r.text)return void t.add(r.text);if("array"===r.name)for(let e of r.children)"string"===e.name&&e.text&&t.add(e.text)}}),Array.from(t)}catch{return null}}let u7=["CFBundleIcons","CFBundleIcons~ipad"];async function pe(e){let t=e.filter(pa);if(0===t.length)return;let r=e.filter(e=>ps(e)&&!po(e));for(let e of t){let t=function(e,t){let r=a.dirname(e);return t.find(e=>a.dirname(e)===r&&"AgentDeviceRunner.app"===a.basename(e))??t.find(t=>a.dirname(t)===r&&t!==e)??null}(e,r);t&&await pt(t,e)}}async function pt(e,t){var r;let n,i=function(e,t){let r=!1;for(let i of o.readdirSync(e,{withFileTypes:!0})){var n;if(i.isFile()&&(n=i.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(o.existsSync(t)){let r=o.readFileSync(e),n=o.readFileSync(t);return!r.equals(n)&&(o.copyFileSync(e,t),!0)}return o.copyFileSync(e,t),!0})(a.join(e,i.name),a.join(t,i.name))&&(r=!0)}return r}(e,t),s=await pr(e,t);(i||s)&&(await pi(t),r=t,n=new Date,o.utimesSync(r,n,n))}async function pr(e,t){var r,n;let i=a.join(e,"Info.plist"),o=a.join(t,"Info.plist"),s=await o$(i),l=await o$(o);if(!s||!l)return!1;let d=(r=s,n=l,u7.flatMap(e=>{let t=r[e];return void 0===t||JSON.stringify(n[e])===JSON.stringify(t)?[]:[{key:e,value:t,shouldInsert:void 0===n[e]}]}));if(0===d.length)return!1;for(let e of d)await pn(o,e.key,e.value,e.shouldInsert);return!0}async function pn(e,t,r,n){let i=await oL("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eG("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function pi(e){let t=await oL("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eG("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function pa(e){return ps(e)&&po(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function po(e){return a.basename(e).endsWith("-Runner.app")}function ps(e){return a.basename(e).endsWith(".app")}let pl={iOS:{sdkName:{simulator:"iphonesimulator",device:"iphoneos"},derivedBaseName:{simulator:"ios-simulator",device:"ios-device"},xctestrunHints:{simulator:{preferred:["iphonesimulator"],disallowed:["iphoneos","appletvos","appletvsimulator","macos"]},device:{preferred:["iphoneos"],disallowed:["iphonesimulator","appletvos","appletvsimulator","macos"]}}},tvOS:{sdkName:{simulator:"appletvsimulator",device:"appletvos"},derivedBaseName:{simulator:"tvos-simulator",device:"tvos-device"},xctestrunHints:{simulator:{preferred:["appletvsimulator"],disallowed:["appletvos","iphoneos","iphonesimulator","macos"]},device:{preferred:["appletvos"],disallowed:["appletvsimulator","iphoneos","iphonesimulator","macos"]}}},macOS:{sdkName:{simulator:"macosx",device:"macosx"},derivedBaseName:{simulator:"macos",device:"macos"},xctestrunHints:{simulator:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]},device:{preferred:["macos"],disallowed:["iphoneos","iphonesimulator","appletvos","appletvsimulator"]}}},visionOS:{sdkName:{simulator:"xrsimulator",device:"xros"},derivedBaseName:{simulator:"visionos-simulator",device:"visionos-device"},xctestrunHints:{simulator:{preferred:["xrsimulator"],disallowed:["xros","iphoneos","iphonesimulator","appletvos","appletvsimulator","macos"]},device:{preferred:["xros"],disallowed:["xrsimulator","iphoneos","iphonesimulator","appletvos","appletvsimulator","macos"]}}}};function pd(e){if(!ts(e.platform))throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":tn(e.target,e.appleOs)}function pc(e){return"simulator"===e?"simulator":"device"}function pu(){return"arm64"===process.arch?"arm64":"x86_64"}let pp="XCTestDevices",pf=".agent-device-backup",pm=".agent-device-xctestdevices-backup-",ph=a.join(m.homedir(),".agent-device","apple-runner"),pw=".agent-device-runner-cache.json",pv={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},py=["-IDEPackageSupportDisableManifestSandbox=1","-IDEPackageSupportDisablePluginExecutionSandbox=1","ENABLE_USER_SCRIPT_SANDBOXING=NO"],pg=new Map,pb=new Set,pA=new Map,pS=new Set;function pI(e){return e?.trim()??""}function p_(e=process.env){return pI(e.AGENT_DEVICE_IOS_BUNDLE_ID)||pI(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function pM(e=process.env){let t=pI(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${p_(e)}.uitests`}let px=function(e=process.env){let t=p_(e),r=pM(e);return Array.from(new Set([pI(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function pN(e=m.homedir()){return a.join(e,"Library","Developer","XCTestDevices")}async function pD(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=ty(e.simulatorSetPath);if(!r)return null;let n=a.resolve(r),i=a.resolve(t.xctestDeviceSetPath??pN()),s=a.resolve(t.backupPath??function(e=pN()){return`${e}${pf}`}(i)),l=a.resolve(t.lockDirPath??function(e=m.homedir()){return a.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??eR(process.pid),c=await pE({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(pP({xctestDeviceSetPath:i,backupPath:s}),function(e,t){if(a.resolve(e)===a.resolve(t))return!0;try{return o.realpathSync.native(e)===o.realpathSync.native(t)}catch{return!1}}(n,i))return await c(),null;o.mkdirSync(n,{recursive:!0}),o.existsSync(i)&&o.renameSync(i,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=a.dirname(r),i=a.join(n,`${pp}.agent-device-link-${process.pid}-${Date.now()}`);o.mkdirSync(n,{recursive:!0});try{o.symlinkSync(t,i,"dir"),o.renameSync(i,r)}catch(e){throw o.existsSync(i)&&pk(i),e}}({requestedSetPath:n,xctestDeviceSetPath:i})}catch(e){throw pP({xctestDeviceSetPath:i,backupPath:s}),await c(),new eG("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:i,backupPath:s,error:String(e)})}let u=!1;return{release:async()=>{if(!u){u=!0;try{pP({xctestDeviceSetPath:i,backupPath:s})}finally{await c()}}}}}function pP(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=a.dirname(e),r=a.basename(e).replace(pf,""),n=r===pp?pm:`${r}${pm}`;try{return o.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>a.join(t,e))}catch{return[]}}(r)],i=n.find(e=>o.existsSync(e)),s=o.existsSync(t)&&o.lstatSync(t).isSymbolicLink();if(i){if(s&&pk(t),o.existsSync(t))if(!s)return void ew({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:i}});else i!==r?o.rmSync(i,{recursive:!0,force:!0}):o.rmSync(r,{recursive:!0,force:!0});else o.mkdirSync(a.dirname(t),{recursive:!0}),o.renameSync(i,t);for(let e of n)e!==i&&o.existsSync(e)&&o.rmSync(e,{recursive:!0,force:!0});return}s&&(ew({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),pk(t))}function pk(e){!o.existsSync(e)||o.lstatSync(e).isSymbolicLink()&&o.unlinkSync(e)}async function pE(e){return await tZ({lockDirPath:e.lockDirPath,owner:e.owner,timeoutMs:e.timeoutMs??3e4,pollMs:e.pollMs??100,ownerGraceMs:5e3,description:e.description??"XCTest device set lock"})}async function pC(e){var t;return await pE({lockDirPath:(t=e,a.join(a.dirname(t),`${a.basename(t)}.lock`)),owner:{pid:process.pid,startTime:eR(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function pR(e,t){let r=function(e){var t;let r,i,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=a.resolve(s);if(!o.existsSync(l))throw new eG("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?a.resolve(d):(t=l,(r=n.createHash("sha1")).update(t),i=r.digest("hex").slice(0,12),a.join(m.tmpdir(),"agent-device-ios-xctest-derived",i));return fa("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(r)return r;let i=tw(),s=pB(e,i),l=p8(e,s);return await uo(pg,l,async()=>{let r=await pC(l);try{return await pO({device:e,options:t,projectRoot:i,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function pO(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(tS(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||pb.has(t))&&(fa("clean",r?"forced_rebuild":"forced_clean",{derived:t}),fn(t),p$(t),pb.delete(t));let l=await fi({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>pY(e,n),xctestrunReferencesProjectRoot:p0,resolveExistingXctestrunProductPaths:u8}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&fa("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await pT({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(fn(s),p$(s)),await pL({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function pT(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await pF(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function pL(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:i,derived:s,cache:l,reason:d}=e,c=a.join(n,"apple-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!o.existsSync(c))throw new eG("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();rT({type:"command",status:"progress",message:"Building Apple runner..."}),await p6(t,c,s,r);let p=Math.max(0,Date.now()-u),f=pY(s,t);if(!f)throw new eG("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await u8(f);if(!m)throw new eG("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await u5(t,m,f),await pe(m),pG(s,pH(i,f,m)),fa("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function pF(e,t,r,n){try{var i,a,o,s;return await u5(e,n.productPaths,n.xctestrunPath),fa("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,pG(i,pH(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eG))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&u3.has(t)}(e))throw e;return fa("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function p$(e){try{if(!o.existsSync(e))return;if("derived"!==a.basename(e))return void o.rmSync(e,{recursive:!0,force:!0});for(let r of o.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,pU.has(t)&&o.rmSync(a.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let pU=new Set([pw,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function pB(e,t=tw()){let r,i=pd(e);return{schemaVersion:2,packageVersion:th(),runnerSourceFingerprint:function(e){let t=a.join(e,"apple-runner","AgentDeviceRunner"),r=function(e){if(!o.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of o.readdirSync(e,{withFileTypes:!0})){var n,i;let o=a.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(o);continue}s.isFile()&&(n=s.name,i=o,"project.pbxproj"===n?i.includes(`${a.sep}.xcodeproj${a.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(a.extname(n)))&&t.push(o)}}return t.sort((e,t)=>e.localeCompare(t))}(t),i=function(e,t){let r=n.createHash("sha256");for(let n of t){let t=a.relative(e,n),i=o.statSync(n);r.update(t),r.update("\0"),r.update(String(i.size)),r.update("\0"),r.update(String(Math.trunc(i.mtimeMs))),r.update("\0")}return r.digest("hex")}(t,r),s=pZ.get(t);if(s?.fileStatsFingerprint===i)return s.sourceFingerprint;let l=n.createHash("sha256");for(let e of r){let r=a.relative(t,e);l.update(r),l.update("\0"),l.update(o.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return pZ.set(t,{fileStatsFingerprint:i,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=pq("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=pl[e].sdkName[pc(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:pq("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:pq("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(i,e.kind),platformName:i,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(r=pd(e))?`platform=macOS,arch=${pu()}`:"simulator"===e.kind?`generic/platform=${r} Simulator`:`generic/platform=${r}`,runnerBundleBuildSettings:fe(process.env),runnerSigningBuildSettings:p7(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:ft(),runnerSandboxBuildArgs:fr()}}function pq(e,t){let r=JSON.stringify([e,t]),n=pA.get(r);if(void 0!==n)return n;try{let n=eH(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return pA.set(r,i),i}catch{return pA.set(r,"unknown"),"unknown"}}function pG(e,t){o.mkdirSync(e,{recursive:!0}),o.writeFileSync(a.join(e,pw),`${JSON.stringify(t,null,2)}
|
|
15
|
+
`)}async function pV(e,t){if("external"===e.cache)return void fa("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});pb.add(e.derived);let r=await pC(e.derived);try{fa("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),fn(e.derived),p$(e.derived)}finally{await r()}}function pj(e){let{artifacts:t,packageVersion:r,...n}=e;return n}function pK(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(t=>e(t)):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,r])=>[t,e(r)])):t}(e))}function pH(e,t,r){let n=function(e,t){let r=pz(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=pz(e);if(null===t)return null;n.push({path:e,...t})}return{xctestrunPath:e,xctestrunMtimeMs:r.mtimeMs,xctestrunSize:r.size,productPaths:n}}(t,r);return n?{...e,artifacts:n}:e}function pW(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function pz(e){try{let t=o.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function pX(e,t){let r=pz(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function pJ(e,t){let r=a.relative(a.resolve(t),a.resolve(e));return""!==r&&!r.startsWith("..")&&!a.isAbsolute(r)}let pZ=new Map;function pY(e,t){if(!o.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of o.readdirSync(e,{withFileTypes:!0})){let i=a.join(e,t.name);if(t.isDirectory()){n.push(i);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=o.statSync(i);r.push({path:i,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=pQ(r.path,t)-pQ(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function pQ(e,t){let r=0,n=e.toLowerCase();a.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${a.sep}macos${a.sep}`)&&(r-=5e3);let i=pl[pd(t)].xctestrunHints[pc(t.kind)];return i.preferred.length>0&&(i.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),i.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function p0(e,t){try{let r=o.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(o.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function p1(e,t,r,n={}){let i=n.iosXctestEnvDir?.trim(),s=i?a.resolve(i):a.dirname(e);o.mkdirSync(s,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=a.join(s,`AgentDeviceRunner.env.${l}.json`),c=a.join(s,`AgentDeviceRunner.env.${l}.xctestrun`),u=await p2(e);return p5(u,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),p5(u,e=>Object.assign(e,pv),{requireTestBundlePath:!0}),await p3(u,d,c),{xctestrunPath:c,jsonPath:d}}async function p2(e){let t=await oL("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eG("COMMAND_FAILED","Failed to read xctestrun plist",{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Root must be an object");return e}catch(t){throw new eG("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function p3(e,t,r){o.writeFileSync(t,JSON.stringify(e,null,2));let n=await oL("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eG("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function p5(e,t,r={}){let n=e.TestConfigurations;if(Array.isArray(n))for(let e of n)e&&"object"==typeof e&&function(e,t,r){if(Array.isArray(e))for(let n of e){let e=p4(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=p4(r,{requireTestBundlePath:!0});e&&t(e)}}function p4(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function p6(e,t,r,n){let i=fe(process.env),a=p7(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=ft(),l=fr(),d=await pD(e);try{let d;await ej("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",p9(e),"1","-destination",(d=pd(e),"macOS"===d?`platform=macOS,arch=${pu()}`:"simulator"===e.kind?`platform=${d} Simulator,id=${e.id}`:`generic/platform=${d}`),"-derivedDataPath",r,...s,...l,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{pS.add(e),e.on("close",()=>{pS.delete(e)})},onStdoutChunk:e=>{uQ(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{uQ(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eG?a:new eG("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
|
|
16
|
+
${e}`.toLowerCase()).includes("failed registering bundle identifier")||t.includes("app identifier")&&t.includes("not available")?"Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.":t.includes("requires a development team")?"Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.":t.includes("no profiles for")||t.includes("provisioning profile")?"Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.":t.includes("code signing")?"Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.":void 0)??uk);throw new eG("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await d?.release()}}function p8(e,t){let r,i=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(i)return a.resolve(i);let o=(r=n.createHash("sha256").update(pK(pj(t))).digest("hex"),`cache-${r.slice(0,16)}`),s=function(e){return a.join(ph,"derived",pl[pd(e)].derivedBaseName[pc(e.kind)])}(e);return a.join(s,o)}function p9(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function p7(e=process.env,t=!1,r="ios"){if("macos"===r)return["CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","CODE_SIGN_IDENTITY=","DEVELOPMENT_TEAM="];if(!t)return[];let n=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||"",i=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||"",a=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||"",o=["CODE_SIGN_STYLE=Automatic"];return n&&o.push(`DEVELOPMENT_TEAM=${n}`),i&&o.push(`CODE_SIGN_IDENTITY=${i}`),a&&o.push(`PROVISIONING_PROFILE_SPECIFIER=${a}`),o}function fe(e=process.env){let t=p_(e),r=pM(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function ft(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO","ONLY_ACTIVE_ARCH=YES","ENABLE_PREVIEWS=NO","ENABLE_DEBUG_DYLIB=NO"]}function fr(){return[...py,`OTHER_SWIFT_FLAGS=${tS(process.env.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?"$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_UNIT_TESTS":"$(inherited) -disable-sandbox"}`]}function fn(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=a.resolve(tw(),".tmp"),""===(n=a.relative(t,a.resolve(r)))||n.startsWith("..")||a.isAbsolute(n))throw new eG("COMMAND_FAILED","Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically",{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${a.join(tw(),".tmp")}.`})}}async function fi(e){var t,r;let n,i=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(o.readFileSync(a.join(e,pw),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?pK(pj(n))!==pK(pj(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=i.ok?function(e,t){var r;let n=t?.artifacts;if(!(!(!(r=n)||"object"!=typeof r||Array.isArray(r))&&"string"==typeof r.xctestrunPath&&Number.isInteger(r.xctestrunMtimeMs)&&Number.isInteger(r.xctestrunSize)&&Array.isArray(r.productPaths)&&r.productPaths.length>0&&r.productPaths.every(pW))||!pJ(n.xctestrunPath,e)||!pX(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!pJ(t.path,e)||!pX(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,i.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let d=s?.xctestrunPath===l,c=d?"manifest":"scan",u=d?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||d?i.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:i.reason,xctestrunPath:l,productPaths:u,source:c}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:c}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:c}}function fa(e,t,r){ew({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let fo={readOnly:!1,readinessProbe:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},fs={...fo,readOnly:!0},fl={...fs,readinessProbe:!0},fd={...fo,readinessPreflightSkipEligibleAfterHealthyMutation:!0},fc=Object.fromEntries(Object.entries({tap:"preflightSkippableTouchMutation",mouseClick:"default",longPress:"preflightSkippableTouchMutation",drag:"preflightSkippableTouchMutation",remotePress:"default",type:"default",swipe:"preflightSkippableTouchMutation",scroll:"preflightSkippableTouchMutation",desktopScroll:"preflightSkippableTouchMutation",findText:"readOnly",querySelector:"readOnly",readText:"readOnly",snapshot:"readOnly",screenshot:"readOnly",back:"default",backInApp:"default",backSystem:"default",home:"default",rotate:"default",rotateGesture:"default",transformGesture:"default",appSwitcher:"default",keyboardDismiss:"default",keyboardReturn:"default",alert:"readOnly",pinch:"default",sequence:"preflightSkippableTouchMutation",recordStart:"default",recordStop:"default",status:"readOnlyReadinessProbe",uptime:"readOnlyReadinessProbe",shutdown:"default"}).map(([e,t])=>[e,function(e){switch(e){case"default":return fo;case"readOnly":return fs;case"readOnlyReadinessProbe":return fl;case"preflightSkippableTouchMutation":return fd}}(t)]));function fu(e){return fc[e].readOnly}function fp(e){return fc[e].readinessPreflightSkipEligibleAfterHealthyMutation}let ff=process.pid,fm=eR(process.pid),fh=(t0=ff,t1=fm,(t=n.createHash("sha256")).update(String(t0)),t.update("\0"),t.update(t1??"unknown-start"),`owner-${t0}-${t.digest("hex").slice(0,8)}`);function fw(t){e=t?.trim()||void 0}async function fv(e,t){let r=await tZ({lockDirPath:`${f_(e)}.lock`,owner:{pid:ff,startTime:fm,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function fy(e){try{let a;var t,r,n=JSON.parse(o.readFileSync(f_(e),"utf8")),i=e;if(!n||"object"!=typeof n||Array.isArray(n)||1!==n.schemaVersion||n.deviceId!==i)return null;let s=(t=n,a={ownerToken:fM(t.ownerToken),ownerPid:fN(t.ownerPid),sessionId:fM(t.sessionId),port:fN(t.port),xctestrunPath:fM(t.xctestrunPath),jsonPath:fM(t.jsonPath),createdAtMs:(r=t.createdAtMs,"number"==typeof r&&Number.isFinite(r)?r:null)},Object.values(a).some(e=>null===e)?null:a);return s?{schemaVersion:1,deviceId:i,...s,ownerStartTime:fx(n.ownerStartTime),ownerStateDir:fx(n.ownerStateDir)??void 0,runnerPid:fN(n.runnerPid)}:null}catch{return null}}function fg(e){var t;return e?e.ownerToken===fh?{type:"owned",lease:e}:eF((t=e).ownerPid)&&(!t.ownerStartTime||eR(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function fb(e,t,r){let n=fg(fy(e));if("empty"===n.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===n.type){var i,o,s,l,d,c,u,p,f;let m,h,w,v;if(i=n.lease,(m=fA())&&i.ownerStateDir&&a.resolve(m)===a.resolve(i.ownerStateDir))return void await fD(n.lease,"same-state-dir",t);if(o=n.lease,(s=r)&&"proxy"===s.leaseProvider&&s.leaseId&&s.clientId&&function(e,t){if(!e)return!1;if(e===t)return!0;let[,,r]=e.split(":",3);return r===t}(s.deviceKey,o.deviceId))return void await fD(n.lease,"logical-lease-takeover",t);throw new eG("COMMAND_FAILED",r?`iOS runner for ${e} is busy after device lease admission`:`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,logicalLeaseContext:r,ownerPid:n.lease.ownerPid,ownerStartTime:n.lease.ownerStartTime,ownerStateDir:n.lease.ownerStateDir,ownerToken:n.lease.ownerToken,sessionId:n.lease.sessionId,hint:(l=n.lease,d=r,w=(c=l,h=`Runner owner: PID ${c.ownerPid}`,c.ownerStateDir?`${h} with AGENT_DEVICE_STATE_DIR=${c.ownerStateDir}`:`${h}.`),v=(u=l).ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${p=u.ownerStateDir,`AGENT_DEVICE_STATE_DIR=${f=p,`'${f.replaceAll("'","'\\''")}'`}`} and retry.`:"If it is stuck, stop the owning agent-device daemon and retry.",d?[v,w,"The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission. Retry after the owning session closes or after the five-minute inactivity lease expires."].join(" "):[v,w,"If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this."].join(" "))})}await fD(n.lease,n.type,t)}function fA(){return e||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}async function fS(e,t){let r=fg(fy(e));"owned"===r.type&&await fD(r.lease,"owned",t)}function fI(e){e&&function(e){let t=fy(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{o.unlinkSync(f_(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function f_(e){let t;return a.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?a.resolve(t):a.join(m.homedir(),".agent-device","apple-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function fM(e){return"string"==typeof e&&e.length>0?e:null}function fx(e){return"string"==typeof e?e:null}function fN(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function fD(e,t,r){ew({level:"stale"===t||"same-state-dir"===t||"logical-lease-takeover"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGTERM"),await r.cleanupRunnerXcodebuildProcesses(e.deviceId,e.ownerToken),await r.cleanupRunnerProcessTree(e.runnerPid??void 0,"SIGKILL"),r.cleanupTempFile(e.xctestrunPath),r.cleanupTempFile(e.jsonPath),fI(e)}let fP={cleanupRunnerProcessTree:fq,cleanupRunnerXcodebuildProcesses:fG,cleanupTempFile:u2};async function fk(e,t={}){var r;!1!==t.graceful?await fO(e):await fq(e.child.pid,"SIGTERM"),await fT(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(f$(r)||eT(r))&&await fq(e.child.pid,"SIGKILL"),await fL(e)}async function fE(e){await fS(e,fP)}async function fC(e){let t=Array.from(pS);await fU(e,"SIGINT"),await fB(t,"SIGINT"),await fU(e,"SIGTERM"),await fB(t,"SIGTERM"),await fU(e,"SIGKILL"),await fB(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await fL(e)}))}async function fR(){let e=Array.from(pS);await Promise.allSettled(e.map(async e=>{try{await fq(e.pid,"SIGTERM"),await fq(e.pid,"SIGKILL")}finally{pS.delete(e)}}))}async function fO(e){try{await u$(e.device,e.port,uT({command:"shutdown"}),void 0,15e3)}catch{await fq(e.child.pid,"SIGTERM")}}async function fT(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function fL(e){await fF(e.device),u2(e.xctestrunPath),u2(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{fI(e.lease)}}async function fF(e){"simulator"===e.kind&&await Promise.allSettled(px.map(async t=>{try{await oF(uD(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ew({level:"warn",phase:"ios_runner_simulator_app_terminate_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:2e3,error:r instanceof Error?r.message:String(r)}})}}))}function f$(e){return!!e&&eF(e)}async function fU(e,t){await Promise.allSettled(e.map(async e=>{await fq(e.child.pid,t)}))}async function fB(e,t){await Promise.allSettled(e.map(async e=>{await fq(e.pid,t),"SIGKILL"===t&&pS.delete(e)}))}async function fq(e,t){if(!e||e<=0)return;try{process.kill(-e,t)}catch{}try{process.kill(e,t)}catch{}let r="SIGINT"===t?"INT":"SIGTERM"===t?"TERM":"KILL";try{await oL("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function fG(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${fV(e)}-${fV(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${fV(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await oL("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ew({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function fV(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function fj(e){let t=await fK(e.logPath);return t?new eG(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:"string"==typeof e.error.details?.hint?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function fK(e){if(!e)return;let t=await fH(e,65536);if(t){var r,n;let e;return(r=e=t.toLowerCase()).includes("axruntime")&&r.includes("coretext")&&(r.includes("attributesforelement")||r.includes("axuielementcopymultipleattributevalues")||r.includes("reconstitutedsmuggledctfontfromdictionary")||r.includes("reconstitutedsmuggledattributedstringfromdictionary"))?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_axruntime_coretext_crash",hint:"The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:(n=e).includes("process crashed")||n.includes("the application under test")||n.includes("terminated unexpectedly")||n.includes("exception type:")&&n.includes("thread 0 crashed")?{code:"IOS_TARGET_APP_CRASH",reason:"target_app_crash",hint:"The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime."}:void 0}}async function fH(e,t){let r;try{let n=await v.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await v.open(e,"r");let o=Buffer.alloc(a);return await r.read(o,0,a,i),o.toString("utf8")}catch{return}finally{await r?.close().catch(()=>{})}}let fW=new Map,fz=new Map;async function fX(e,t){return await uo(fz,e.id,async()=>{let r=fW.get(e.id);if(r){let t=await fZ(e,r);if(t)return t}return await fv(e.id,async()=>await fJ(e,t))})}async function fJ(e,t){var r,n;let i,s,l,d={},c=function(e,t){if(!e)return;let r=Object.entries({leaseId:ms(e.leaseId),clientId:ms(e.clientId),tenantId:ms(e.tenantId),runId:ms(e.runId),leaseProvider:ms(e.leaseProvider),deviceKey:ms(e.deviceKey)??t}).filter(([,e])=>void 0!==e);return r.length>0?Object.fromEntries(r):void 0}(t.runnerLeaseContext,e.id);ew({level:"debug",phase:"ios_runner_session_startup",data:{deviceId:e.id,logicalLeaseContext:c}}),await mo(d,"cleanup_stale_xcodebuild",async()=>{await fb(e.id,fP,c)}),await mo(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ew({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):f6(t))}),await mo(d,"verify_developer_mode",async()=>{await f8(e)}),t.cleanStaleBundles?await mo(d,"cleanup_stale_bundles",async()=>{await fY(e)}):(d.cleanup_stale_bundles=0,ew({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let u=await mo(d,"ensure_xctestrun",async()=>await pR(e,t));d.build_xctestrun=u.buildMs;let p=await mo(d,"allocate_port",async()=>await uY()),{xctestrunPath:f,jsonPath:m}=await mo(d,"prepare_xctestrun_env",async()=>await p1(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(p)},`session-${e.id}-${fh}-${p}`,{iosXctestEnvDir:t.iosXctestEnvDir})),h=await mo(d,"simulator_set_redirect",async()=>await pD(e)),w=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",p9(e),"1","-destination-timeout",String(20),"-xctestrun",f,"-derivedDataPath",u.derived,"-destination","macOS"===(l=pd(e))?`platform=macOS,arch=${pu()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{u.buildMs>0&&rT({type:"command",status:"progress",message:"Starting XCTest runner..."}),{child:i,wait:s}=await mo(d,"launch_xcodebuild",()=>eV("xcodebuild",w,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(p)},detached:!0}))}catch(e){throw await h?.release(),e}i.stdout?.on("data",e=>{uQ(e,t.logPath,t.traceLogPath,t.verbose)}),i.stderr?.on("data",e=>{uQ(e,t.logPath,t.traceLogPath,t.verbose)});let v=`${e.id}:${p}:${Date.now()}`,y={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:v,runnerPid:i.pid,port:p,xctestrunPath:f,jsonPath:m}).deviceId,ownerToken:fh,ownerPid:ff,ownerStartTime:fm,ownerStateDir:fA(),sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},g={sessionId:v,device:e,deviceId:e.id,port:p,xctestrunPath:f,xctestrunArtifact:u,jsonPath:m,testPromise:s,child:i,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,logicalLeaseContext:c,simulatorSetRedirect:h??void 0,lease:y};try{let e,t;e=f_(y.deviceId),o.mkdirSync(a.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,o.writeFileSync(t,JSON.stringify(y,null,2),"utf8"),o.renameSync(t,e)}catch(t){throw await f2(e.id,g,{graceful:!1,waitTimeoutMs:1e3}),t}return fW.set(e.id,g),g}async function fZ(e,t){if(!f$(t.child.pid))return await mo({},"stop_stale_session",async()=>{await f2(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ew({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let n=p8(e,pB(e));return r?.derived!==n?(ew({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await mo({},"stop_stale_artifact_session",async()=>{await f2(e.id,t)}),null):(ew({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function fY(e){if("simulator"===e.kind)for(let t of px){let r=await fQ(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
|
|
17
|
+
${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function fQ(e,t){try{return await oF(uD(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ew({level:"warn",phase:"ios_runner_startup_cleanup_stale_bundle_failed",data:{deviceId:e.id,bundleId:t,timeoutMs:1e4,error:r instanceof Error?r.message:String(r)}});return}}function f0(e){let t=fW.get(e);return t?{sessionId:t.sessionId,alive:f$(t.child.pid)}:null}async function f1(e,t){await uo(fz,e.deviceId,async()=>{fW.get(e.deviceId)===e&&(ew({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await f2(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function f2(e,t,r={}){let n=t??fW.get(e);n&&(await fk(n,r),fW.get(e)===n&&fW.delete(e))}async function f3(e){await uo(fz,e,async()=>{await fv(e,async()=>{await f2(e),await fE(e)})})}async function f5(){let e=Array.from(fW.values());for(let t of(await fC(e),e))fW.get(t.deviceId)===t&&fW.delete(t.deviceId)}async function f4(){await f5();let e=Array.from(fW.keys());await Promise.allSettled(e.map(async e=>{await f3(e)})),await fR()}async function f6(e){await oF(uD(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function f8(e){if("ios"!==e.platform||"device"!==e.kind)return;let t=await oL("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
|
|
18
|
+
${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eG("COMMAND_FAILED","Developer mode is disabled for Apple development tools",{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function f9(e){if(!ts(e.platform))throw new eG("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eG("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function f7(e,t,r,n,i,a){var o,s,l,d,c,u;let p;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,ew({level:"info",phase:"ios_runner_session_startup_timings",durationMs:Object.values(o.startupTimings).reduce((e,t)=>e+t,0),data:{command:s,sessionId:o.sessionId,ready:o.ready,logicalLeaseContext:o.logicalLeaseContext,timings:o.startupTimings}}));let f=uT(r),m=fu(f.command),h=tA.fromTimeoutMs(i),w=function(e,t){let r=fu(t.command);if(!e.ready)return r?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if(fc[t.command].readinessProbe)return{action:"skip",reason:"readiness_probe_command"};if(!fp(t.command))return{action:"run",reason:"conservative_command"};let n=e.lastHealthyMutation;if(!n)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==n.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let i=Date.now()-n.atMs;return i>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:i}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:i}}(t,f);"run"===w.action?await mr({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ew({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:c.reason,lastHealthyMutationAgeMs:"recent_healthy_mutation"===c.reason?c.lastHealthyMutationAgeMs:void 0,sessionReady:d.ready}}));try{p=await mt({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw me(e,t,w)}try{let e=await mn(p,t,n),r=function(e){if(!0===e.runnerFatal)return"string"==typeof e.runnerFatalReason&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:"runner_reported_fatal_response"}(e);return r?(t.lastHealthyMutation=void 0,await f1(t,r)):fp(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eG){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);if(e)throw t.lastHealthyMutation=void 0,await f1(t,e),r;if((u=r)instanceof eG&&u.details?.runner!==void 0)throw r;throw me(r,t,w)}}function me(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,mi(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function mt(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,d=a.remainingMs();if(d<=0)throw new eG("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let c=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:n.command,commandId:n.commandId};return await ef("ios_runner_command_send",async()=>l?await u$(t,r.port,n,i,d,r,s):await uj(t,r.port,n,d,s),c)}async function mr(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,signal:o,decision:s}=e,l=r.ready?Math.min(1e3,a.remainingMs()):Math.min(ma(r),a.remainingMs());try{let e=await ef("ios_runner_readiness_preflight",async()=>await u$(t,r.port,uT({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await mn(e,r,i)}catch(e){throw mi(e,{runnerReadinessPreflightFailed:!0})}}async function mn(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eG("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?eU(e):"COMMAND_FAILED",i="string"==typeof n.error?.message?n.error.message:void 0,a="string"==typeof n.error?.hint?n.error.hint:void 0;throw await fj({error:new eG(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,logPath:r}),logPath:r})}if(t.ready=!0,n.data&&"object"==typeof n.data&&!Array.isArray(n.data)){var a;let e,t=n.data;return"string"==typeof(e=(a=t).gestureFallback)&&0!==e.length&&ew({level:"debug",phase:"ios_runner_gesture_fallback",data:{fallback:e,message:"string"==typeof a.gestureFallbackMessage?a.gestureFallbackMessage:void 0,hint:"string"==typeof a.gestureFallbackHint?a.gestureFallbackHint:void 0}}),t}return{}}function mi(e,t){let r=e instanceof eG?e:new eG("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eG(r.code,r.message,{...r.details??{},...t},r.cause??e)}function ma(e){return e.startupTimeoutMs??45e3}async function mo(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ew({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}function ms(e){return"string"==typeof e&&e.trim().length>0?e.trim():void 0}let ml=new p;function md(e,t={}){return{runCommand:e,...t}}function mc(e,t,r,n={}){if(r)return mp(r);let i=function(e,t={}){let r=ml.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?mp(i.provider):mp(t)}async function mu(e,t,r){if(!e)return await r();let n={provider:mp(e),deviceId:t.deviceId,requestId:t.requestId};return await ml.run(n,r)}function mp(e){return"function"==typeof e?{runCommand:e}:e}async function mf(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await mw(t,r,n,i,a,o);return await mm(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function mm(e,t){var r,n,i,a;if(!e)return await mh(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,mg({command:(n=t).command,session:n.session,transportError:n.transportError,decision:"skipped",reason:r.reason,lifecycleState:r.lifecycleState}),r.data}if("skipInvalidation"===e.type){throw i=e,mg({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await mh(t,e.reason,e.lifecycleState,e.error)}async function mh(e,t,r,n){throw mg({command:e.command,session:e.session,transportError:e.transportError,decision:"retained",reason:t,lifecycleState:r}),await e.invalidateSession(e.session,e.invalidationReason),n??e.transportError}async function mw(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,v;let y,g,b,A,S;if("status"===r.command||!r.commandId?.trim())return;let I=my(n);try{y=await f7(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ew({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),...I}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof y.lifecycleState?y.lifecycleState:"";return ew({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...I}}),o=y,s=_,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(fu(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=my(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eG("COMMAND_FAILED",`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",...s,hint:(i=t.command,a=s,`${mv(a)}The runner is still reachable and reports "${i}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,g="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,b="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",A="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,S=my(f),new eG(eU(g),b,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...S,hint:A??(h=p.command,w=S,`${mv(w)}The runner is still reachable and reports "${h}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`),logPath:m.logPath,transportError:f.message},f))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:function(e,t,r,n){var i,a,o;if(fu(t.command))return r;let s=my(r);return new eG("COMMAND_FAILED",`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:"command_still_in_flight",...s,hint:(i=t.command,a=e,o=s,`${mv(o)}The runner is still reachable and reports "${i}" is ${a}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}(s,l,d,c)}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new eG("COMMAND_FAILED",`Runner command "${l.command}" lost its transport response and lifecycle status was ${s?`"${s}"`:"missing"}, so agent-device invalidated the runner session instead of replaying the command.`,{command:l.command,commandId:l.commandId,lifecycleState:s,recovery:"lifecycle_state_not_recoverable",hint:(v=l.command,`The runner did not confirm that "${v}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`),logPath:c.logPath,transportError:d.message},d)}}function mv(e){return!0!==e.readinessPreflightSkipped?"":"This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. "}function my(e){let t,r,n,i={},a="boolean"==typeof(t=e.details?.runnerReadinessPreflightSkipped)?t:void 0;void 0!==a&&(i.readinessPreflightSkipped=a);let o="string"==typeof(r=e.details?.runnerReadinessPreflightSkipReason)?r:void 0;void 0!==o&&(i.readinessPreflightSkipReason=o);let s="number"==typeof(n=e.details?.runnerReadinessPreflightSkippedAgeMs)?n:void 0;return void 0!==s&&(i.readinessPreflightSkippedAgeMs=s),i}function mg(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ew({level:"retained"===i?"warn":"debug",phase:"ios_runner_command_invalidation_decision",data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:void 0!==o,sessionId:r.sessionId,transportError:n.message}})}async function mb(e,t){let r;uL(t.requestId);let n=rS(t.requestId),i=uT({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await mA({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eG("COMMAND_FAILED","iOS runner prepare failed")}async function mA(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await fX(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles,...mP(n,"runner_session")}),d=Date.now()-s;try{var c,u;let e=await mD(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,mE(c,u),u)}}catch(e){return await mS({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function mS(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eG?d:new eG("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&mM(t)))return{kind:"prepared",result:await mI({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!mM(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await m_(i,"prepare_runner_health_failed"),d;return uL(o.requestId),await f1(i,"prepare_runner_health_retry"),ew({level:"warn",phase:"ios_runner_prepare_health_retry",data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:l,maxAttempts:2,reason:u}}),{kind:"retry",recoveryReason:u}}async function mI(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:d,signal:c,error:u}=e,p=u.message||"runner_health_failed";await f1(s,"prepare_cached_runner_health_failed"),await pV(s.xctestrunArtifact,p);let f=Date.now(),m=await fX(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...mP(d,"runner_rebuild")}),h=Date.now()-f;try{let e=await mD(o,m,l,d,c,h,{recoveryReason:p});return ew({level:"info",phase:"ios_runner_prepare_bad_cache_recovered",data:{command:l.command,commandId:l.commandId,sessionId:m.sessionId,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,reason:p}}),t=o,r=e,mE(t,r),r}catch(r){let e;await m_(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eG?n:new eG("COMMAND_FAILED",String(n)),new eG(e.code,"artifact restored but runner did not connect",{...e.details??{},restoredFailureReason:a,xctestrunPath:i.xctestrunArtifact?.xctestrunPath,artifact:i.xctestrunArtifact?.artifact,cache:i.xctestrunArtifact?.cache,reason:e.message},e));throw mE(o,{cache:m.xctestrunArtifact?.cache,artifact:m.xctestrunArtifact?.artifact,buildMs:m.xctestrunArtifact?.buildMs,connectMs:h,healthCheckMs:0,xctestrunPath:m.xctestrunArtifact?.xctestrunPath,failureReason:t.message}),t}}async function m_(e,t){try{await f1(e,t)}catch{}}function mM(e){let t;return!rM(e)&&(uE(e)||uC(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function mx(e,t,r){let n;uL(r.requestId);let i=rS(r.requestId);try{let a=(n=await fX(e,r)).ready?45e3:ma(n);return await f7(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eG?o:new eG("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&uC(a)&&n)return uL(r.requestId),await mN({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_connect_failed_before_command_send"});if(n&&function(e){let t;return e.details?.runnerReadinessPreflightFailed===!0&&(uE(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return uL(r.requestId),await mN({device:e,session:n,command:t,options:r,signal:i,restartReason:"runner_readiness_preflight_failed_before_command_send",recoveredDiagnosticPhase:"ios_runner_readiness_preflight_recovered"});if(n&&uE(a))return await mf({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:f1});throw o}}async function mN(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await f1(e.session,a);let o=await fX(t,{...n,cleanStaleBundles:!0});try{let a=await f7(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ew({level:"debug",phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:"session_restarted",sessionId:o.sessionId}}),a}catch(a){let e=a instanceof eG?a:new eG("COMMAND_FAILED",String(a));if(uE(e))return await mf({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:f1});throw a}}async function mD(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now(),h=mk(n.prepareDeadline,n.healthTimeoutMs,"runner_health");return s=await f7(e,t,r,n.logPath,h,i),l=t,d=a,c=Date.now()-m,u=o,p=l.xctestrunArtifact,f={...u?.recoveryReason?{recoveryReason:u.recoveryReason}:{},...u?.failureReason?{failureReason:u.failureReason}:{}},p?{runner:s,cache:p.cache,artifact:p.artifact,buildMs:p.buildMs,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,d),healthCheckMs:Math.max(0,c),...f}}function mP(e,t){if(!e.prepareDeadline)return{};let r=mk(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:r,startupTimeoutMs:r}}function mk(e,t,r){if(!e)return t??45e3;let n=Math.floor(e.remainingMs());if(n<=0)throw new eG("COMMAND_FAILED","prepare ios-runner timed out",{phase:r,reason:"prepare_deadline_expired"});return n}function mE(e,t){ew({level:t.failureReason?"warn":"info",phase:"apple_runner_prepare",data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}async function mC(e,t,r={}){f9(e),uL(r.requestId);let n=uT(t),i=mF(e,r);return fu(n.command)?tb(()=>(uL(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(uL(r.requestId),uE(e))}):i.runCommand(e,n,r)}function mR(e,t={}){if("ios"===e.platform)return mT({device:e,options:t,failurePhase:"ios_runner_cache_prewarm_failed",task:async t=>{await pR(e,t)}})}function mO(e,t={}){if("ios"!==e.platform)return;let r=mF(e,t).prewarm;return r?mT({device:e,options:t,failurePhase:"ios_runner_session_prewarm_failed",task:async t=>{await r(e,t)}}):void ew({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}function mT(e){let{device:t,options:r,failurePhase:n,task:i}=e,{propagateError:a=!1,...o}=r;return i(o).catch(e=>{if(ew({level:"warn",phase:n,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function mL(e,t){f9(e),uL(t.requestId);let r=uT({command:"uptime"}),n=mF(e,t);if(n.prepare)return await n.prepare(e,t);let i=Date.now();return{runner:await n.runCommand(e,r,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function mF(e,t){return mc(e,m$,void 0,{requestId:t.requestId})}let m$=md(mx,{prepare:mb,prewarm:async(e,t)=>{await mb(e,{...t,healthTimeoutMs:45e3})}});async function mU(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function mB(e,t){let r=t.includeTokens?.filter(e=>e.length>0)??[],n="",i=n=>{(!(r.length>0)||r.some(e=>n.includes(e)))&&e.write(function(e,t){if(0===t.length)return e;let r=e;for(let e of t)r=r.replace(e,"[REDACTED]");return r}(n,t.redactionPatterns))};return{onChunk:e=>{let t=`${n}${e}`.split("\n");for(let e of(n=t.pop()??"",t))i(`${e}
|
|
19
|
+
`)},flush:()=>{n&&(i(n),n="")}}}function mq(e,t,r){let n=e.stdout,i=e.stderr;return n&&i?(n.setEncoding("utf8"),i.setEncoding("utf8"),n.on("data",r.writer.onChunk),i.on("data",r.writer.onChunk),t.on("error",()=>{e.killed||e.kill("SIGKILL")}),e.on("error",()=>t.destroy()),new Promise(n=>{e.on("close",e=>{r.writer.flush(),r.endStreamOnClose&&t.end(),n({stdout:"",stderr:"",exitCode:e??1})})})):Promise.resolve({stdout:"",stderr:"missing stdio pipes",exitCode:1})}function mG(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eG("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function mV(e,t){let r=(await tL(tP(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function mj(e,t){var r,n;let i;mG(t);let a=await mV(e,t),o=tL(tP(e)),s=await tR(o,{lines:4e3,timeoutMs:3e3}).catch(()=>"");if(0===s.trim().length)return null;let l=function(e,t,r){let n=new Set;for(let i of(r&&n.add(r),e.split("\n")))if(i.includes(t))for(let e of function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[RegExp(`\\bStart proc\\s+(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`\\b(\\d+):${r}(?:\\b|/)`,"i"),RegExp(`${r}.*?\\bpid\\s*[=:]?\\s*(\\d+)\\b`,"i"),RegExp(`\\bpid\\s*[=:]?\\s*(\\d+)\\b.*${r}`,"i")],i=[];for(let t of n){let r=t.exec(e),n=r?.[1];n&&/^\d+$/.test(n)&&i.push(n)}return i}(i,t))n.add(e);return[...n]}(s,t,a);if(0===l.length)return null;let d=(r=s,n=t,i=new Set(l),r.split("\n").filter(e=>{var t;let r;if(!e.trim())return!1;if(e.includes(n))return!0;let a=(t=e,r=/\(\s*(\d+)\)\s*:/.exec(t),r?.[1]??null);return!!a&&i.has(a)}).join("\n"));return 0===d.trim().length?null:{pid:a,text:d,recoveredPids:l}}async function mK(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await mV(e,t);if(!d){s="recovering",await tm(1e3);continue}let c=tx(tP(e)),u=tM(c,{pid:d});a=u;let p=mB(r,{redactionPatterns:n});if(o=mq(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&ru(i,u.pid),s="active",await o,rp(i),a=void 0,o=void 0,l)break;s="recovering",await tm(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rp(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await mU(o),a&&!a.killed&&a.kill("SIGKILL"),await mU(d),rp(i)}}}function mH(e,t){let r=mX(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=mX(t);n.push(`process == "${e}"`,`processImagePath ENDSWITH[c] "/${e}"`,`senderImagePath ENDSWITH[c] "/${e}"`,`processImagePath CONTAINS[c] "/${e}.app/"`,`senderImagePath CONTAINS[c] "/${e}.app/"`)}return n.join(" OR ")}async function mW(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=uN(["spawn",t,"log","show","--style","compact","--info","--predicate",mH(r,n)],{simulatorSetPath:a});"number"==typeof i&&Number.isFinite(i)&&i>0?o.push("--start",`@${Math.floor(i/1e3)}`):o.push("--last","5m");let s=await oF(o,{allowFailure:!0,timeoutMs:4e3});if(0!==s.exitCode||0===s.stdout.trim().length)return null;let l=s.stdout.split("\n").map(e=>e.trimEnd()).filter(e=>{let t=e.trim();return t.length>0&&!t.startsWith("Timestamp Ty Process[PID:TID]")});return 0===l.length?null:{text:`${l.join("\n")}
|
|
20
|
+
`,recoveredLineCount:l.length}}async function mz(e,t,r,n,i,a){let o=await mJ({deviceId:e,appBundleId:t,simulatorSetPath:i});return mQ({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return uN(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",mH(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function mX(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function mJ(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,i=await oF(uN(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==i.exitCode)return;let o=i.stdout.trim();if(!o)return;let s=a.join(o,"Info.plist"),l=await eK("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function mZ(e,t,r,n){return mQ({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",mH(e)],stream:t,redactionPatterns:r,pidPath:n})}async function mY(e,t,r,n){return mQ({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function mQ(e){let t="active",r=eV(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=mB(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&ru(e.pidPath,n.pid);let a=mq(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rp(e.pidPath),r),r=>{throw t="failed",rp(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await mU(a),n.killed||n.kill("SIGKILL"),await mU(a),rp(e.pidPath)}}}let m0=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),m1=/https?:\/\/[^\s"'<>\])]+/i,m2=[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i];function m3(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>m4(e)));for(let e of t.entries){let t=m4(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function m5(e,t){let r=ha(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=ha(t?.maxPayloadChars,2048,64,16384),o=ha(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),d=s.slice(l),c=[];for(let e=d.length-1;e>=0&&c.length<r;e-=1){let t=d[e];if(!t?.trim())continue;let r=function(e,t,r,n,i,a){let o=e[t]?.trim();if(!o)return null;let s=function(e){let t=e.indexOf("{");if(t<0)return null;let r=e.lastIndexOf("}");if(r<=t)return null;let n=e.slice(t,r+1);try{let e=JSON.parse(n);return e&&"object"==typeof e?e:null}catch{return null}}(o),l=ht(s,["method","httpMethod"]),d=ht(s,["url","requestUrl"]),c=function(e,t){if(!e)return null;for(let r of t){let t=e[r];if("number"==typeof t&&Number.isInteger(t))return t;if("string"==typeof t&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t.trim(),10)}return null}(s,["status","statusCode","responseCode"]),u=m0.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=m1.exec(o),h=d??m?.[0];if(!h)return null;let w=c??m8(o)??void 0;if(!(l||p?.[1]||u?.[1]||void 0!==w||/\bURL["'=: ]+https?:\/\//i.test(o)||/\bheaders?["'=: ]+/i.test(o)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(o)))return null;let v={method:f,url:h,status:w,timestamp:m9(o),packetId:m7(o)??void 0,durationMs:he(o)??void 0,raw:hi(o,a),line:r};if("android"===n&&function(e,t,r){let n=m6(t,r,5),i=e.packetId??n.map(e=>m7(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?m6(t,r,12).filter(e=>m7(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>m9(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>m8(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>he(e)).find(e=>"number"==typeof e))}(v,e,t),"headers"===i||"all"===i){let e=function(e,t){if(t){let e=t.headers??t.requestHeaders??t.responseHeaders;if(void 0!==e)return hn(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(v.headers=hi(e,a))}if("body"===i||"all"===i){let e=hr(o,s,["requestBody","body","payload","request"]),t=hr(o,s,["responseBody","response"]);e&&(v.requestBody=hi(e,a)),t&&(v.responseBody=hi(t,a))}return v}(d,e,l+e+1,n,i,a);r&&c.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:d.length,matchedLines:c.length,entries:c,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function m4(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function m6(e,t,r){let n=[],i=Math.max(0,t-r),a=Math.min(e.length-1,t+r);for(let t=i;t<=a;t+=1){let r=e[t]?.trim();r&&n.push(r)}return n}function m8(e){for(let t of m2){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function m9(e){let t=/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e);if(t)return t[0];let r=/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e);return r?.[0]}function m7(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function he(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);if(!t)return null;let r=Number.parseInt(t[1]??"",10);return Number.isInteger(r)?r:null}function ht(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.trim().length>0)return t.trim()}}function hr(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return hn(t[e])}for(let t of r){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`\\b${r}["'=: ]+(.+)$`,"i").exec(e);if(n?.[1])return n[1].trim()}}function hn(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function hi(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function ha(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}ai();let ho={start:async e=>await hw(e)},hs=o_(ho,function(e={}){return{...ho,...e}});async function hl(e,t){return await hs.run(e,t)}function hd(e,t){let r=process.env[e];if(!r)return t;let n=Number.parseInt(r,10);return Number.isInteger(n)&&n>0?n:t}function hc(e){let t=a.dirname(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),function(e,t){if(o.existsSync(e)&&!(o.statSync(e).size<t.maxBytes))for(let r=t.maxRotatedFiles;r>=1;r-=1){let t=1===r?e:`${e}.${r-1}`,n=`${e}.${r}`;o.existsSync(t)&&(o.existsSync(n)&&o.unlinkSync(n),o.renameSync(t,n))}}(e,{maxBytes:hd("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:hd("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function hu(e){if(!o.existsSync(e))return{exists:!1,sizeBytes:0};let t=o.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function hp(e){return i2(e.platform)?.appLog?.resolveBackend(e)??"android"}async function hf(e){var t,r,n,i;let a,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y}=e,g=hp(c),b=(t={backend:g,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y},a=ha(t?.maxEntries,25,1,200),s=t?.include??"summary",l=ha(t?.maxPayloadChars,2048,64,16384),d=ha(t?.maxScanLines,4e3,100,2e4),o.existsSync(m)?m5(o.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:a,maxPayloadChars:l,maxScanLines:d}}),A=[],S=await hm({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(S){let e=await mj(c.id,u);if(e){let t=m5(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y});t.entries.length>0&&(b=m3(t,b,h),A.push((r=S,n=e.recoveredPids,"stale-active"===r.reason?`Session app log stream was still bound to prior Android PID ${r.trackedPid}. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`:`Session app log stream was inactive. Recovered recent Android HTTP entries from adb logcat for PID set ${n.join(", ")}.`)))}}if("ios"===c.platform&&"simulator"===c.kind&&u&&0===b.entries.length){let e=await hv({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:v,maxScanLines:y});e&&(e.dump.entries.length>0?(b=m3(e.dump,b,h),A.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&A.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?A.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===A.length&&("ios"===c.platform&&"simulator"===c.kind?A.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):A.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===b.entries.length&&A.push("ios"===(i=c).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:g,dump:b,notes:A}}async function hm(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:i}=e;if("android"!==t.platform||!r)return null;if(void 0!==i&&"active"!==i)return{reason:"inactive"};if("active"!==i)return null;let s=function(e){let t=function(e){if(!e||!o.existsSync(e))return null;try{return rc(o.readFileSync(e,"utf8"))}catch{return null}}(e)?.command;if(!t)return null;let r=/(?:^|\s)--pid\s+(\d+)(?:\s|$)/.exec(t);return r?.[1]??null}(a.join(a.dirname(n),rd));if(!s)return null;let l=await mV(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function hh(e,t,r,n){return await hs.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function hw({device:e,appBundleId:t,outPath:r,pidPath:n}){hc(r);let i=o.createWriteStream(r,{flags:"a"}),a=function(){let e=process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS;if(!e)return[];let t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(let e of t)try{r.push(RegExp(e,"gi"))}catch{}return r}();if("ios"===e.platform)return"device"===e.kind?await mY(e.id,i,a,n):await mz(e.id,t,i,a,e.simulatorSetPath,n);if("android"===e.platform)return mG(t),await mK(e.id,t,i,a,n);if("macos"===e.platform)return await mZ(t,i,a,n);throw i.end(),new eG("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function hv(e){let t=await mW({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:m5(t.text,{path:`${e.appLogPath} (simctl log show recovery)`,backend:"ios-simulator",maxEntries:e.maxEntries,include:e.include,maxPayloadChars:e.maxPayloadChars,maxScanLines:e.maxScanLines}),recoveredLineCount:t.recoveredLineCount}:null}async function hy(e){await e.stop(),await mU(e.wait)}async function hg(e,t){let r={},n=[];if(t||n.push("No app bundle is tracked in this session. Run open <app> first for app-scoped logs."),"android"===e.platform){try{let t=await tv(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await tv(e,["shell","pidof",t],{allowFailure:!0,timeoutMs:1e3})).stdout.trim().length>0}catch{r.androidPidVisible=!1}}if("ios"===e.platform&&"simulator"===e.kind)try{let e=await oF(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await oF(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eK("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function hb(e,t){hc(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
21
|
+
`;o.appendFileSync(e,r,"utf8")}function hA(e){let t=a.dirname(e),r=a.basename(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.existsSync(e)?o.truncateSync(e,0):o.writeFileSync(e,"","utf8");let n=0;for(let e of o.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let i=e.slice(r.length+1);if(/^\d+$/.test(i))try{o.unlinkSync(a.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function hS(e,t){for(let r of e){if(t(r))return r;let e=hS(r.children,t);if(e)return e}}function hI(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...hI(n.children,t));return r}function h_(e,t){let r=hS(e,e=>"schema"===e.name&&e.attributes.name===t);return r?r.children.filter(e=>"col"===e.name).map(e=>{let t;return t=e.children.find(e=>"mnemonic"===e.name),t?.text??null??""}):[]}function hM(e){if(!e||e.children.some(e=>"sentinel"===e.name)||!e.text)return null;let t=Number(e.text);return Number.isFinite(t)?t:null}function hx(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:hM(e):null}function hN(e){return Math.round(10*e)/10}async function hD(e,t,r={}){let n=["devicectl",...e],i=await oF(n,{allowFailure:!0,timeoutMs:r.timeoutMs??2e4});if(0===i.exitCode)return;let a=String(i.stdout??""),o=String(i.stderr??"");throw new eG("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:a,stderr:o,deviceId:t.deviceId,hint:hR(a,o)??hC})}async function hP(e,t){var r;return r=function(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.bundleIdentifier?e.bundleIdentifier.trim():"";if(!t)continue;let n="string"==typeof e.name&&e.name.trim().length>0?e.name.trim():t,i="string"==typeof e.url&&e.url.trim().length>0?e.url.trim():void 0;r.push({bundleId:t,name:n,url:i})}return r}(await hE(e,{jsonPrefix:"agent-device-ios-apps",args:["devicectl","device","info","apps","--device",e.id,"--include-all-apps"],failureMessage:"Failed to list iOS apps",parseFailureMessage:"Failed to parse iOS apps list"})),oM(r,t)}async function hk(e){return function(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!e||"object"!=typeof e)continue;let t="string"==typeof e.executable?e.executable.trim():"",n="number"==typeof e.processIdentifier&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;t&&Number.isFinite(n)&&r.push({executable:t,pid:n})}return r}(await hE(e,{jsonPrefix:"agent-device-ios-processes",args:["devicectl","device","info","processes","--device",e.id],failureMessage:"Failed to list iOS processes",parseFailureMessage:"Failed to parse iOS process list"}))}async function hE(e,t){let r=a.join(m.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],i=await oF(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==i.exitCode){let r=String(i.stdout??""),a=String(i.stderr??"");throw new eG("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:i.exitCode,stdout:r,stderr:a,deviceId:e.id,hint:hR(r,a)??hC})}return JSON.parse(await l.readFile(r,"utf8"))}catch(r){if(r instanceof eG)throw r;throw new eG("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await l.unlink(r).catch(()=>{})}}let hC="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function hR(e,t){let r=`${e}
|
|
22
|
+
${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}async function hO(e,t){try{let r=await o$(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await oL("plutil",["-extract",t,"raw","-o","-",e],{allowFailure:!0});if(0===r.exitCode){let e=String(r.stdout??"").trim();if(e.length>0)return e}}catch{}try{var r,n;let i;return r=await l.readFile(e,"utf8"),n=t,nq(nB(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let hT="xctrace-animation-hitches";function hL(e,t){let r=nB(e),n=h_(r,t);return{rows:0===n.length?[]:hI(r,e=>"row"===e.name),schema:n}}function hF(e,t){for(let r of e)hF(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:hM(r),process:h$(r)})}function h$(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=hM(hS(e.children,e=>"pid"===e.name)),r=(e.attributes.fmt??"").replace(/\s+\(\d+\)$/,"").trim();return null===t&&0===r.length?null:{pid:t??void 0,name:r.length>0?r:void 0}}let hU="ps-process-snapshot",hB="ps-process-snapshot",hq="xctrace-activity-monitor",hG="xctrace-activity-monitor",hV="leaks-output-graph",hj="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function hK(e,t){if("ios"===e.platform&&"device"===e.kind)return await we(e,t);let r=await h7(e,t),n=await wo(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});let i=new Date().toISOString();return wp({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:hU,memoryMethod:hB})}async function hH(e,t,r){let n,i=hQ(e);if(!i.memgraph)return{available:!1,kind:"memgraph",reason:i.reason,hint:i.hint,support:i};let o=await wl(e,t,i);if(!1===o.available)return o;let{process:s}=o;await l.mkdir(a.dirname(r),{recursive:!0});let d=await hz(r);try{n=await hW(e,r,s.pid)}catch(n){throw await hX(r,d),function(e,t,r,n,i){if(i instanceof eG){let o=i.details??{};return new eG(i.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(wu(r.command)),path:n,hint:wd(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:i.message)},i)}return new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:a.basename(wu(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},i)}(e,t,s,r,n)}if(0!==n.exitCode)throw await hX(r,d),new eG("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:s.pid,processName:a.basename(wu(s.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:wd(e,n.stdout,n.stderr)});let c=await l.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await hX(r,d),new eG("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:s.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:c.size,measuredAt:new Date().toISOString(),method:hV,appBundleId:t,pid:s.pid,processName:a.basename(wu(s.command)),support:i}}async function hW(e,t,r){return"macos"===e.platform?await oL("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await oF(uD(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function hz(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function hX(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function hJ(e,t){var r;let n,i,o,s,l,d;if("ios"!==e.platform||"device"!==e.kind)throw new eG("COMMAND_FAILED","Apple frame-health sampling is currently available only on connected iOS devices.",{metric:"fps",platform:e.platform,deviceKind:e.kind});let u=await wt(e,t),p=await h0(e,t,u);return n=hL((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:rr(u.map(e=>a.basename(c(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,i=function(e){if(!e)return;let{rows:t,schema:r}=hL(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){hF(e.children,i);let t=hx(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=nB(e),i=Object.values(r={start:(t=h_(n,"hitches")).indexOf("start"),duration:t.indexOf("duration"),process:t.indexOf("process"),isSystem:t.indexOf("is-system")}).every(e=>e>=0)?r:null;if(!i)return[];let a=new Map;return hI(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(hF(e.children,r),!0===(n=e.children[t.isSystem],null===(o=hx(n,r))?null:0!==o))return null;let s=hx(e.children[t.start],r),l=hx(e.children[t.duration],r);if(null===s||null===l)return null;let d=(i=e.children[t.process],a=r,i?i.attributes.ref?a.get(i.attributes.ref)?.process??null:h$(i):null);return{startNs:s,durationNs:l,pid:d?.pid,processName:d?.name}})(e,i,a)).filter(e=>!!e)})(r.hitchesXml).filter(e=>{var t,n,i;return t=e,n=r.processIds,i=r.processNames,!!(void 0!==t.pid&&n.includes(t.pid))||!!t.processName&&i.includes(t.processName)})).length,l=Math.max(0,Math.round(Date.parse(r.windowEndedAt)-Date.parse(r.windowStartedAt))),d=function(e,t){if(0===e.length)return[];let r=[...e].sort((e,t)=>e.startNs-t.startNs),n=[],i=[];for(let e of r){let t=i.at(-1);if(!t||e.startNs-(t.startNs+t.durationNs)<=5e8){i.push(e);continue}n.push(i),i=[e]}return i.length>0&&n.push(i),n.map(e=>{var r,n;let i,a,o,s;return r=e,n=t,i=Math.min(...r.map(e=>e.startNs)),a=Math.max(...r.map(e=>e.startNs+e.durationNs)),s=Math.max(o=Math.max(0,Math.round(i/1e6)),Math.round(a/1e6)),{startOffsetMs:o,endOffsetMs:s,startAt:new Date(n+o).toISOString(),endAt:new Date(n+s).toISOString(),missedDeadlineFrameCount:r.length,worstFrameMs:hN(Math.max(...r.map(e=>e.durationNs))/1e6)}}).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}(o,Date.parse(r.windowStartedAt)),{droppedFramePercent:n>0?hN(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:hT,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===i?void 0:hN(1e3/i),refreshRateHz:i,worstWindows:d.length>0?d:void 0}}function hZ(e){return"ios"===e.platform&&"device"===e.kind?{method:hT,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:hT,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 hY(e){let t=hZ(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:hG,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:hq,description:"Recent CPU usage snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"percent"}};let r="macos"===e.platform?"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{fps:t,memory:{method:hB,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:hU,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function hQ(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:hV,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."}:"ios"===e.platform&&"simulator"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:hV,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."}:"macos"===e.platform?{platform:e.platform,deviceKind:e.kind,memgraph:!0,method:hV,reason:"macOS app processes are host-visible to leaks --outputGraph.",hint:"Grant Terminal/agent process permissions if macOS denies process inspection."}:{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:hV,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 h0(e,t,r){let n=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-ios-frame-perf-")),i=a.join(n,"animation-hitches.trace"),o=a.join(n,"hitches.xml"),s=a.join(n,"frame-lifetimes.xml"),d=a.join(n,"display-info.xml");try{let n=await h1({device:e,appBundleId:t,tracePath:i,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await h6(e,t,i,"hitches",o),await h6(e,t,i,"hitches-frame-lifetimes",s);let a=await h8(e,t,i,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await l.readFile(o,"utf8"),frameLifetimesXml:await l.readFile(s,"utf8"),displayInfoXml:a?await l.readFile(d,"utf8"):void 0}}finally{await l.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function h1(e){let{device:t,appBundleId:r,tracePath:n,template:i,duration:a}=e,o=e.allProcesses?["--all-processes"]:(e.targetPids??[]).flatMap(e=>["--attach",String(e)]),s=["xctrace","record","--template",i,"--device",t.id,...o,"--time-limit",a,"--output",n,"--quiet","--no-prompt"],l=await h2(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await h4(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eG("COMMAND_FAILED",e.failureMessage,{cmd:"xcrun",args:s,exitCode:l.result.exitCode,stdout:l.result.stdout,stderr:l.result.stderr,appBundleId:r,deviceId:t.id,hint:wm(l.result.stdout,l.result.stderr)})}async function h2(e,t){let r;for(let n=1;n<=3;n+=1){await h5(t,n,1500);let i=new Date().toISOString(),a=await oF(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!h3(a))break}return r}function h3(e){let t=`${e.stdout}
|
|
23
|
+
${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function h5(e,t,r){t<=1||(await l.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function h4(e,t,r){let n=await l.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await l.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new eG("COMMAND_FAILED",`${e.failureMessage}: xctrace produced no trace data`,{tracePath:e.tracePath,appBundleId:e.appBundleId,deviceId:e.device.id,stdout:t,stderr:r,hint:"Keep the iOS device unlocked and connected by cable, keep the app active, then retry perf."})}async function h6(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await oF(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eG("COMMAND_FAILED",`Failed to export iOS device ${n} data`,{cmd:"xcrun",args:a,exitCode:o.exitCode,stdout:o.stdout,stderr:o.stderr,appBundleId:t,deviceId:e.id,hint:wm(o.stdout,o.stderr)})}async function h8(e,t,r,n,i){try{return await h6(e,t,r,n,i),!0}catch{return!1}}async function h9(e){let t=nB(e),r=h_(t,"activity-monitor-process-live");if(0===r.length)throw new eG("COMMAND_FAILED","Failed to parse xctrace activity-monitor-process-live schema");let n=r.indexOf("pid"),i=r.indexOf("process"),a=r.indexOf("cpu-total"),o=r.indexOf("memory-real");if(n<0||i<0||a<0||o<0)throw new eG("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=hI(t,e=>"row"===e.name),l=[],d=new Map;for(let e of s){var c,u;let t=e.children;if(0===t.length)continue;for(let e of t){let t=hS(e.children,e=>"pid"===e.name&&"string"==typeof e.attributes.id);if(t?.attributes.id){let e=Number(t.text);d.set(t.attributes.id,{numberValue:Number.isFinite(e)?e:null})}e.attributes.id&&d.set(e.attributes.id,{numberValue:hM(e),processName:wf(e)})}let r=hx(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:wf(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:hx(t[a],d),residentMemoryBytes:hx(t[o],d)})}return l}async function h7(e,t){let r="macos"===e.platform?await wi(t):await wa(e,t),n="macos"===e.platform?a.join(r,"Contents","Info.plist"):a.join(r,"Info.plist"),i=await hO(n,"CFBundleExecutable");if(!i)throw new eG("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:i,executablePath:"macos"===e.platform?a.join(r,"Contents","MacOS",i):a.join(r,i)}}async function we(e,t){let r=await wt(e,t),n=await wr(e,t),i=await wr(e,t),a=wn(await h9(n.xml),r,t,e),o=wn(await h9(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eG("COMMAND_FAILED",`Invalid Activity Monitor sample window for ${t}`,{appBundleId:t,deviceId:e.id});if(null===a.cpuTimeNs||null===o.cpuTimeNs||null===o.residentMemoryBytes)throw new eG("COMMAND_FAILED",`Incomplete Activity Monitor sample for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});return wp({usagePercent:Math.max(0,o.cpuTimeNs-a.cpuTimeNs)/(1e6*s)*100,residentMemoryKb:o.residentMemoryBytes/1024,measuredAt:new Date(i.capturedAtMs).toISOString(),matchedProcesses:o.matchedProcesses,cpuMethod:hq,memoryMethod:hG})}async function wt(e,t){let r=(await hP(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eG("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eG("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=c(n),a=(await hk(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,appBundlePath:i,hint:"Run open <app> for this session again to ensure the iOS app is active, then retry perf."});return a}async function wr(e,t){let r=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-ios-perf-")),n=a.join(r,"sample.trace"),i=a.join(r,"activity-monitor-process-live.xml");try{let r=await h1({device:e,appBundleId:t,tracePath:n,template:"Activity Monitor",duration:"1s",allProcesses:!0,failureMessage:`Failed to record iOS device Activity Monitor sample for ${t}`});return await h6(e,t,n,"activity-monitor-process-live",i),{capturedAtMs:r.capturedAtMs,xml:await l.readFile(i,"utf8")}}finally{await l.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function wn(e,t,r,n){let i=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>a.basename(c(e.executable)))),s=e.filter(e=>i.has(e.pid)||o.has(e.processName));if(0===s.length)throw new eG("COMMAND_FAILED",`No Activity Monitor sample found for ${r}`,{appBundleId:r,deviceId:n.id,hint:"Keep the app running in the foreground while perf samples the device, then retry."});let l=new Map;for(let e of s){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,cpuTimeNs:wh(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:wh(t.residentMemoryBytes,e.residentMemoryBytes)})}let d=[...l.values()],u=d.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=d.map(e=>e.residentMemoryBytes).filter(e=>null!==e);return{cpuTimeNs:u.length>0?u.reduce((e,t)=>e+t,0):null,residentMemoryBytes:p.length>0?p.reduce((e,t)=>e+t,0):null,matchedProcesses:rr(d.map(e=>e.processName))}}async function wi(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await oL("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eG("COMMAND_FAILED",`Failed to resolve macOS app bundle for ${e}`,{appBundleId:e,stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let n=r.stdout.split("\n").map(e=>e.trim()).find(e=>e.endsWith(".app"));if(!n)throw new eG("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function wa(e,t){let r=uD(e,["get_app_container",e.id,t,"app"]),n=await oF(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eG("COMMAND_FAILED",`Failed to resolve iOS simulator app container for ${t}`,{appBundleId:t,stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,hint:"Ensure the iOS simulator app is installed and booted, then retry perf."});let i=n.stdout.trim();if(0===i.length)throw new eG("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function wo(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:uD(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of tq(e)){let e=r.match(/^(\d+)\s+([0-9]+(?:\.[0-9]+)?)\s+(\d+)\s+(.+)$/);if(!e)continue;let[n,i,a,o]=e.slice(1);if(void 0===n||void 0===i||void 0===a||void 0===o)continue;let s=Number(n),l=Number(i),d=Number(a),c=o.trim();Number.isFinite(s)&&Number.isFinite(l)&&Number.isFinite(d)&&t.push({pid:s,cpuPercent:l,rssKb:d,command:c})}return t})(("macos"===e.platform?await oL("ps",r,{timeoutMs:15e3}):await wc(r)).stdout).filter(e=>(function(e,t){let r=wu(e);if(t.executablePath){var n;let i;for(let a of(i=[n=t.executablePath],n.startsWith("/private/var/")?i.push(n.replace("/private/var/","/var/")):n.startsWith("/var/")&&i.push(n.replace("/var/","/private/var/")),i))if(e===a||r===a||e.startsWith(`${a} `))return!0}return a.basename(r)===t.executableName})(e.command,t))}async function ws(e,t,r){let n=(await wo(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{kind:"memgraph",appBundleId:t,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf memory snapshot."})}async function wl(e,t,r){try{let r=await h7(e,t);return{available:!0,process:await ws(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eG))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
|
|
24
|
+
${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(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:{...r,memgraph:!1}};throw t}}function wd(e,t,r){let n=`${t}
|
|
25
|
+
${r}`.toLowerCase();return n.includes("timed out")||n.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.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"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 wc(e){let t=await oF(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await oL("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function wu(e){let[t=""]=e.trim().split(/\s+/,1);return t}function wp(e){return{cpu:{usagePercent:hN(e.usagePercent),measuredAt:e.measuredAt,method:e.cpuMethod,matchedProcesses:e.matchedProcesses},memory:{residentMemoryKb:Math.round(e.residentMemoryKb),measuredAt:e.measuredAt,method:e.memoryMethod,matchedProcesses:e.matchedProcesses}}}function wf(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function wm(e,t){let r=hR(e,t);if(r)return r;let n=`${e}
|
|
26
|
+
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?hC:n.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 wh(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function ww(e){var t;let r=await wb(e.device,e.appBundleId);await l.mkdir(a.dirname(e.outPath),{recursive:!0});let n=["xctrace","record","--template",(t={device:e.device,template:e.template,targetPids:r.pids,outPath:e.outPath}).template,..."ios"===t.device.platform?["--device",t.device.id]:[],...t.targetPids.flatMap(e=>["--attach",String(e)]),"--output",t.outPath,"--quiet","--no-prompt"],i=new Date().toISOString(),o=await wA(n,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:e.device.platform,targetPids:r.pids,targetProcesses:r.processNames,startedAt:i,child:o.child,wait:o.wait}}async function wv(e,t=e.outPath){t!==e.outPath&&await l.mkdir(a.dirname(t),{recursive:!0});let r=await wI(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eG("COMMAND_FAILED",`Failed to stop Apple xctrace ${e.mode} capture`,{exitCode:r.exitCode,stdout:r.stdout,stderr:r.stderr,tracePath:e.outPath,captureCleanedUp:!0,hint:wm(r.stdout,r.stderr)});return t!==e.outPath&&await l.rename(e.outPath,t).catch(async()=>{await l.cp(e.outPath,t,{recursive:!0}),await l.rm(e.outPath,{recursive:!0,force:!0})}),await wM(t,{appBundleId:e.appBundleId,deviceId:e.deviceId,stdout:r.stdout,stderr:r.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 wy(e){return await wI(e,{failOnForcedKill:!1})}async function wg(e){let t=await l.mkdtemp(a.join(m.tmpdir(),"agent-device-xctrace-report-")),r=a.join(t,"trace-toc.xml");try{var n;let t,i,o,s=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await oF(s,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eG("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:s,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:wm(d.stdout,d.stderr)});let c=(n={...e,tocXml:await l.readFile(r,"utf8")},t=nB(n.tocXml),i=hI(t,e=>"run"===e.name),o=rr(hI(t,e=>"table"===e.name).map(e=>e.attributes.schema).filter(e=>"string"==typeof e&&e.length>0)).sort(),{kind:"xctrace",mode:n.mode,template:n.template,tracePath:n.tracePath,reportPath:n.outPath,appBundleId:n.appBundleId,generatedAt:new Date().toISOString(),summary:{runCount:i.length,tableSchemas:o}});return await l.mkdir(a.dirname(e.outPath),{recursive:!0}),await l.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
|
|
27
|
+
`,"utf8"),c}finally{await l.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function wb(e,t){if(!ts(e.platform))throw new eG("UNSUPPORTED_OPERATION","Apple xctrace perf is not supported on Android.",{platform:e.platform,hint:"Android native profiling belongs to the Android perf rollout and is not implemented under Apple xctrace."});if("ios"===e.platform&&"device"===e.kind){let r=await wt(e,t);return{pids:r.map(e=>e.pid),processNames:rr(r.map(e=>a.basename(c(e.executable))))}}let r=await h7(e,t),n=await wo(e,r);if(0===n.length)throw new eG("COMMAND_FAILED",`No running process found for ${t}`,{appBundleId:t,deviceId:e.id,hint:"Run open <app> for this session again to ensure the Apple app is active, then retry perf."});return{pids:n.map(e=>e.pid),processNames:[r.executableName]}}async function wA(e,t,r){let n;for(let r=1;r<=3;r+=1){await h5(t,r,1500);let i=eV("xcrun",e,{allowFailure:!0}),a=await wS(i.wait);if(!a)return i;if(n=a,!h3(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eG("COMMAND_FAILED",r.failureMessage,{cmd:"xcrun",args:e,exitCode:i.exitCode,stdout:i.stdout,stderr:i.stderr,appBundleId:r.appBundleId,deviceId:r.device.id,hint:wm(i.stdout,i.stderr)})}async function wS(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function wI(e,t){e.child.kill("SIGINT");let r=await w_(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await w_(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop",{exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,tracePath:e.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."});throw new eG("COMMAND_FAILED","Timed out waiting for Apple xctrace capture to stop after SIGKILL",{tracePath:e.outPath,captureCleanedUp:!1,forcedKill:!0,hint:"xctrace did not exit after SIGKILL. Inspect running xctrace processes before retrying."})}async function w_(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function wM(e,t){let r=await l.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await l.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eG("COMMAND_FAILED","xctrace produced no trace data",{tracePath:e,appBundleId:t.appBundleId,deviceId:t.deviceId,stdout:t.stdout,stderr:t.stderr,hint:"Keep the Apple device unlocked and connected, keep the app active, then retry perf."})}function wx(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function wN(e){return Math.round(10*e)/10}let wD="adb-shell-dumpsys-gfxinfo-framestats",wP="Rendered-frame health from the current adb shell dumpsys gfxinfo <package> framestats window. Dropped frames use Android gfxinfo janky-frame/frame-deadline data when available; this is not video recording FPS.";function wk(e,t,r){let n=t.get(r);if(void 0===n)return null;let i=Number(e[n]);return Number.isFinite(i)?i:null}function wE(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function wC(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function wR(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`^\\s*${r}:\\s*([0-9][0-9,]*)`,"im"));if(!n)return;let i=n[1];return void 0===i?void 0:wx(i)??void 0}async function wO(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tL(e,r.adb);try{let d,c,p,f,m,h,w,v,y,g,b,A=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new eG("COMMAND_FAILED",`Android gfxinfo did not find a running process for ${t}`,{metric:"fps",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf after the interaction you want to inspect."})}(n,t),p=function(e){let t=e.split(/\nProfile data in ms:\n/i)[0]??"",r=wR(t,"Total frames rendered"),n=t.match(/^\s*Janky frames:\s*([0-9][0-9,]*)\s*\(([0-9.]+)%\)/im);if(void 0===r||!n)return;let i=n[1],a=n[2];if(void 0===i||void 0===a)return;let o=wx(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=wR(t,"Uptime"),d=wR(t,"Stats since");return{droppedFramePercent:hN(s),droppedFrameCount:o,totalFrameCount:r,sampleWindowMs:function(e){let{uptimeMs:t,statsSinceNs:r}=e;if(void 0===t||void 0===r)return;let n=t-Math.round(r/1e6);return n>=0?n:void 0}({uptimeMs:l,statsSinceNs:d}),uptimeMs:l,statsSinceNs:d}}(n),f=function(e){let t=[],r=null;for(let i of e.split("\n")){var n;let e=i.trim();if(0===e.length||"---PROFILEDATA---"===e)continue;let a=e.split(",").map(e=>e.trim());if((n=a).includes("IntendedVsync")&&n.includes("FrameCompleted")){r=new Map(a.map((e,t)=>[e,t]));continue}let o=function(e,t){if(!t||e.length<t.size)return;let r=wk(e,t,"Flags"),n=wk(e,t,"IntendedVsync"),i=wk(e,t,"FrameCompleted");if(0===r&&null!==n&&null!==i&&!(n<=0)&&!(i<=n))return{intendedVsyncNs:n,frameCompletedNs:i,durationNs:i-n}}(a,r);o&&t.push(o)}return t.sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs)}(n),m=function(e,t,r){let n=function(e){var t;let r=(t=e.map(e=>e.intendedVsyncNs),[...new Set(t.filter(e=>Number.isFinite(e)))].sort((e,t)=>e-t)),n=[];for(let e=1;e<r.length;e+=1){let t=r[e]-r[e-1];t>=4e6&&t<=5e7&&n.push(t)}if(0!==n.length){let e,t;return e=[...n].sort((e,t)=>e-t),t=Math.floor(e.length/2),e.length%2==1?e[t]:(e[t-1]+e[t])/2}}(e);if(t||0!==e.length||function(e){throw new eG("COMMAND_FAILED",`Failed to parse Android framestats output for ${e}`,{metric:"fps",package:e,hint:"Retry perf after exercising the app screen. If the problem persists, capture adb shell dumpsys gfxinfo <package> framestats output for debugging."})}(r),t||void 0!==n)return n;throw new eG("COMMAND_FAILED",`Failed to infer Android frame deadline from framestats output for ${r}`,{metric:"fps",package:r,hint:"Retry perf after a longer interaction window so consecutive Android frame timestamps are available."})}(f,p,t),h=Date.parse(i),w=function(e){let{frames:t,measuredAtMs:r,summary:n}=e,i=wE(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=wC(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),v=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),y=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=wE(e);return wC(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=v,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,g={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?hN(c/d*100):0)},b=function(e){let{droppedFrames:t,timing:r,measuredAtMs:n,summary:i}=e;if(0===t.length)return;let a=function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e;if(0===t.length||void 0===r)return[];let a=[],o=[];for(let e of t){let t=o.at(-1);if(!t||e.intendedVsyncNs-t.frameCompletedNs<=5e8){o.push(e);continue}a.push(o),o=[e]}return o.length>0&&a.push(o),a.map(e=>(function(e){let{frames:t,windowStartNs:r,measuredAtMs:n,uptimeMs:i}=e,a=Math.min(...t.map(e=>e.intendedVsyncNs)),o=Math.max(...t.map(e=>e.frameCompletedNs)),s=Math.max(0,Math.round((a-r)/1e6)),l=Math.max(s,Math.round((o-r)/1e6)),d=void 0!==i&&Number.isFinite(n)?n-i:void 0;return{startOffsetMs:s,endOffsetMs:l,startAt:void 0===d?void 0:new Date(d+a/1e6).toISOString(),endAt:void 0===d?void 0:new Date(d+o/1e6).toISOString(),missedDeadlineFrameCount:t.length,worstFrameMs:wN(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:v,timing:w,measuredAtMs:h,summary:p}),{...g,sampleWindowMs:y,...(l=m,{frameDeadlineMs:void 0===l?void 0:wN(l/1e6),refreshRateHz:void 0===l?void 0:wN(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:wD,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:b&&b.length>0?b:void 0});return await wT(e,t,r),A}catch(e){throw d=t,(c=e)instanceof eG?new eG(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eG("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function wT(e,t,r={}){let n=tL(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function wL(e,t,r,n){if(n instanceof eG){var i,a,o,s,l;let d,c=n.details??{};return new eG(n.code,n.message,{...c,action:e,package:r,tool:t,hint:"string"==typeof c.hint?c.hint:(i=t,d=("string"==typeof(a=c).stderr?a.stderr:"").toLowerCase(),"simpleperf"===i?(s=o=d).includes("permission denied")||s.includes("not profileable")||s.includes("profileable")?"Use a debuggable/profileable Android app or a device image that permits simpleperf for the target process, then retry perf cpu profile start.":o.includes("not supported")||o.includes("failed to open perf event")?"This device image does not expose the requested simpleperf event for the app process. Try a different emulator/system image or a profileable app.":wF("simpleperf"):(l=d).includes("permission denied")||l.includes("not allowed")?"Use a device image that permits perfetto trace capture for shell, keep the app running, then retry perf trace start.":wF(i))},n)}return new eG("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:wF(t)},n)}function wF(e){return"simpleperf"===e?"Verify simpleperf is available, the app process is running, and the app/device permits native CPU profiling.":"Verify perfetto is available, the app process is running, and the device permits trace capture."}async function w$(e,t,r,n,i){return{capture:{durationMs:n,packageName:t.packageName,appPid:t.appPid,artifactPath:t.outPath,sizeBytes:r},frameHealth:"perfetto"===t.kind?await wU(e,t.packageName,i):void 0,notes:["perfetto"===t.kind?"Frame health is sampled from Android gfxinfo around the trace window; open the Perfetto artifact for timeline root cause.":"Open the Simpleperf report artifact for symbol-level CPU attribution."]}}async function wU(e,t,r){try{let n=await wO(e,t,r);return{available:!0,droppedFramePercent:n.droppedFramePercent,droppedFrameCount:n.droppedFrameCount,totalFrameCount:n.totalFrameCount,method:n.method,worstWindows:n.worstWindows?.slice(0,3).map(e=>({startOffsetMs:e.startOffsetMs,endOffsetMs:e.endOffsetMs,missedDeadlineFrameCount:e.missedDeadlineFrameCount,worstFrameMs:e.worstFrameMs}))}}catch(e){return{available:!1,reason:e instanceof Error?e.message:"Android frame health was not available"}}}let wB="adb-shell-simpleperf",wq="adb-shell-perfetto",wG="/data/local/tmp";async function wV(e,t,r){let n=tL(e,r.adb);await wJ(n,t),await wY(n,t),await wZ(n,t);let i=await wz(t.outPath);await wH(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await w$(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?wB:wq,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function wj(e,t,r={}){let n=tL(e,r.adb);try{"running"===t.state&&(await wJ(n,t),await wY(n,t).catch(()=>{}))}finally{await wH(n,t.remotePath)}}function wK(e,t,r=wG){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function wH(e,t){try{await e(["shell",`rm -f ${wX(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function wW(e,t){await l.mkdir(a.dirname(e),{recursive:!0}),await l.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
28
|
+
`)}async function wz(e){try{return(await l.stat(e)).size}catch(t){throw new eG("COMMAND_FAILED",`Profiler artifact was not written: ${e}`,{outPath:e,hint:"Retry the profiling command and check daemon logs if the artifact path is still missing."},t)}}function wX(e){return`'${e.replace(/'/g,"'\\''")}'`}async function wJ(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${wX(r)}; kill -INT "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; kill -TERM "$pid" 2>/dev/null || true; for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || exit 0; sleep 0.2; done; echo "profiler process did not stop after SIGTERM" >&2; exit 1`)],{timeoutMs:3e4})}catch(e){throw wL("stop",t.kind,t.packageName,e)}}async function wZ(e,t){await l.mkdir(a.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new eG("COMMAND_FAILED",`Failed to pull Android ${t.kind} artifact for ${t.packageName}`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,outPath:t.outPath,hint:"Check that the profiling command ran long enough to create an artifact, then retry stop with the same session."},e)}}async function wY(e,t){let r;for(let n=0;n<12;n+=1){let n=await wQ(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await g(250)}throw new eG("COMMAND_FAILED",`Android ${t.kind} artifact is not ready to pull`,{package:t.packageName,tool:t.kind,remotePath:t.remotePath,hint:"The profiler stopped, but the remote artifact was missing, empty, or still changing. Retry stop with the same session or inspect the device-side artifact."})}async function wQ(e,t){let r=wX(t),n=await e(["shell",`if [ -f ${r} ]; then stat -c %s ${r} 2>/dev/null || wc -c < ${r}; fi`],{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)return;let i=Number(n.stdout.trim().split(/\s+/)[0]);return Number.isFinite(i)?i:void 0}async function w0(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=w2(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eG("COMMAND_FAILED",`No active Android app process found for ${t}`,{package:t,hint:"Run open <app> for this session again, wait for the app UI to appear, then retry perf."})}async function w1(e,t,r){let n=await e(["shell",`command -v ${t} || which ${t}`],{allowFailure:!0,timeoutMs:15e3});if(!(0===n.exitCode&&n.stdout.trim()))throw new eG("UNSUPPORTED_OPERATION",`Android device does not expose ${t}`,{package:r,tool:t,hint:"simpleperf"===t?"Use an emulator/system image with simpleperf available, or install the Android NDK simpleperf binary for this device.":"Use Android 10+ or a system image that exposes the perfetto command-line binary."})}function w2(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function w3(e,t,r,n={}){let i,a=tL(e,n.adb),o=await w0(a,t);await w1(a,"perfetto",t);let s=wK(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await wT(e,t,{adb:a}),i=await w4(a,s,t)}catch(e){throw await wH(a,s),e}return{...{type:"trace",kind:"perfetto",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:wq,message:`Started Android Perfetto trace for ${t}`}}async function w5(e,t,r,n={}){return await wV(e,{...t,outPath:r},n)}async function w4(e,t,r){try{let n=await e(["shell","perfetto","--background-wait","-o",t,"-t","3600s","sched","freq","idle","am","wm","gfx","view","binder_driver","hal","dalvik"],{timeoutMs:3e4}),i=w2(n.stdout);if(i)return i;throw new eG("COMMAND_FAILED","Android perfetto did not return a profiler pid",{package:r,tool:"perfetto",hint:"Retry perf trace start. If perfetto exits immediately, verify the device permits trace capture."})}catch(e){throw wL("start","perfetto",r,e)}}async function w6(e,t,r,n={}){let i,a=tL(e,n.adb),o=await w0(a,t);await w1(a,"simpleperf",t);let s=wK(t,"cpu.perf.data");try{i=await w7(a,o,s,t)}catch(e){throw await wH(a,s),e}return{...{type:"cpu-profile",kind:"simpleperf",packageName:t,appPid:o,profilerPid:i,remotePath:s,outPath:r,startedAt:Date.now(),state:"running"},action:"start",platform:"android",method:wB,message:`Started Android Simpleperf CPU profile for ${t}`}}async function w8(e,t,r,n={}){return await wV(e,{...t,outPath:r},n)}async function w9(e,t,r,n={}){let i=tL(e,n.adb);await w1(i,"simpleperf",t.packageName);let a=await ve(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of tq(e)){let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+(.+)$/);if(!e)continue;let n=Number(e[1]),i=e[2]?.trim();if(!Number.isFinite(n)||!i)continue;let a=i.split(/\s{2,}/).filter(Boolean);if(t.push({percentage:hN(n),command:a[0],dso:a[1],symbol:a.slice(2).join(" ")||void 0}),t.length>=50)break}return t}(a.stdout),l={kind:"simpleperf-report",generatedAt:o,packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,sourceRemotePath:t.remotePath,entryCount:s.length,entries:s};await wW(r,l);let d=await wz(r);return{action:"report",platform:"android",type:"cpu-profile-report",kind:"simpleperf",packageName:t.packageName,appPid:t.appPid,sourceProfilePath:t.outPath,outPath:r,sizeBytes:d,generatedAt:o,entryCount:s.length,method:wB,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function w7(e,t,r,n){try{var i,a,o,s;let l,d,c=await e(["shell",(i=t,a=r,o=["simpleperf","record","-e","cpu-clock:u","-p",i,"-o",a,"--duration",String(3600)],s="simpleperf",l=o.map(wX).join(" "),d=`${wG}/agent-device-${s}-${Date.now()}.err`,`err=${wX(d)}; (${l}) >/dev/null 2>"$err" & pid=$!; sleep 1; if kill -0 "$pid" 2>/dev/null; then rm -f "$err"; echo "$pid"; exit 0; fi; cat "$err" >&2; rm -f "$err"; exit 1`)],{timeoutMs:3e4}),u=w2(c.stdout);if(u)return u;throw new eG("COMMAND_FAILED","Android simpleperf did not return a profiler pid",{package:n,tool:"simpleperf",hint:"Retry perf. If simpleperf exits immediately, verify the app is profileable and the device permits native profiling."})}catch(e){throw wL("start","simpleperf",n,e)}}async function ve(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw wL("report","simpleperf",t.packageName,e)}}let vt="adb-shell-dumpsys-cpuinfo",vr="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",vn="adb-shell-dumpsys-meminfo",vi="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",va="adb-shell-am-dumpheap",vo="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function vs(e,t,r={}){let n=tL(e,r.adb);try{let e=await n(["shell","dumpsys","cpuinfo"],{timeoutMs:15e3});return function(e,t,r){let n=new Set,i=0;for(let r of tq(e)){var a,o;let e=r.match(/^([0-9]+(?:\.[0-9]+)?)%\s+\d+\/([^\s]+):\s/);if(!e)continue;let s=e[1],l=e[2];if(void 0===s||void 0===l)continue;let d=Number(s);Number.isFinite(d)&&(a=l,o=t,a===o||a.startsWith(`${o}:`))&&(i+=d,n.add(l))}return{usagePercent:hN(i),measuredAt:r,method:vt,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw vf("cpu",t,e)}}async function vl(e,t,r={}){let n=tL(e,r.adb);try{let e=await n(["shell","dumpsys","meminfo",t],{timeoutMs:15e3});return function(e,t,r){let n;if(/no process found for:/i.test(e))throw new eG("COMMAND_FAILED",`Android meminfo did not find a running process for ${t}`,{metric:"memory",package:t,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf."});let i=vm(e,"TOTAL PSS")??function(e){for(let t of e.split("\n")){let e=t.trim();if(!/^TOTAL\b(?!\s+PSS:)/.test(e))continue;let r=e.split(/\s+/).slice(1).find(e=>null!==wx(e));if(!r)break;return wx(r)??void 0}}(e);if(void 0===i)throw new eG("COMMAND_FAILED",`Failed to parse Android meminfo output for ${t}`,{metric:"memory",package:t,hint:"Retry perf after reopening the app session. If the problem persists, capture adb shell dumpsys meminfo output for debugging."});return{totalPssKb:i,totalRssKb:vm(e,"TOTAL RSS"),measuredAt:r,method:vn,topConsumers:(n=e.split("\n").flatMap(e=>(function(e){let t=e.trim();if(function(e){if(!e||e.startsWith("**")||e.startsWith("-")||e.includes(":"))return!0;let t=/^\S.+\s+\d/.test(e);return/^(pss|total|native|dalvik|unknown|app summary\b)/i.test(e)&&!t}(t))return;let r=t.match(/^(.+?)\s+([0-9][0-9,]*(?:\(\d+\))?)(?:\s|$)/);if(r)return function(e,t){let r=e?.trim(),n=t?wx(t):null;if(r&&"TOTAL"!==r&&null!==n&&!(n<=0)&&!/^(pss|private|shared|heap|size|alloc|free)$/i.test(r))return{name:r,pssKb:n}}(r[1],r[2])})(e)??[]).sort((e,t)=>t.pssKb-e.pssKb).slice(0,5)).length>0?n:void 0}}(e.stdout,t,new Date().toISOString())}catch(e){throw vf("memory",t,e)}}async function vd(e,t,r,n={}){let i,o=tL(e,n.adb),s=await vp(o,t),d=(i=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${i}-${Date.now()}.hprof`);await l.mkdir(a.dirname(r),{recursive:!0});let c=await vc(r);try{let e=await o(["shell","am","dumpheap",t,d],{allowFailure:!0,timeoutMs:12e4});if(0!==e.exitCode){var u,p;let r;throw new eG("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
|
|
29
|
+
${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await vu(r,c),new eG("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:s,remotePath:d,path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:"Verify the daemon can write the requested --out path and retry. The heap dump stays on-device only until cleanup runs."});let i=await l.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await vu(r,c),new eG("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:s,path:r,remotePath:d,hint:"Retry with a writable --out path. If the file is still empty, inspect adb pull output with --debug."});return{available:!0,kind:"android-hprof",path:r,sizeBytes:i.size,measuredAt:new Date().toISOString(),method:va,packageName:t,pid:s,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function vc(e){return await l.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function vu(e,t){t||await l.rm(e,{force:!0}).catch(()=>{})}async function vp(e,t){let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=r.stdout.trim().split(/\s+/).map(e=>Number(e)).find(e=>Number.isInteger(e)&&e>0);if(0===r.exitCode&&void 0!==n)return n;throw new eG("COMMAND_FAILED",`No running Android process found for ${t}`,{kind:"android-hprof",package:t,stdout:r.stdout,stderr:r.stderr,hint:"Run open <app> for this session again to ensure the Android app is active, then retry perf memory snapshot."})}function vf(e,t,r){return r instanceof eG?new eG(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eG("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function vm(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=e.match(RegExp(`${r}:\\s*([0-9][0-9,]*)`,"i"));if(!n)return;let i=n[1];return void 0===i?void 0:wx(i)??void 0}let vh=new Map;async function vw(e){let t=await v.mkdtemp(a.join(m.tmpdir(),"agent-device-materialized-"));try{let r=await vg(e.installablePath,a.join(t,"installable")),i=e.archivePath?await vg(e.archivePath,a.join(t,"archive")):void 0,o=n.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{vv(o)},s);return vh.set(o,{rootPath:t,installablePath:r,archivePath:i,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:r,...i?{archivePath:i}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await v.rm(t,{recursive:!0,force:!0}),e}}async function vv(e,t){let r=vh.get(e);if(!r)throw new eG("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eG("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),vh.delete(e),await v.rm(r.rootPath,{recursive:!0,force:!0})}async function vy(e){let t=Array.from(vh.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await vv(e)}))}async function vg(e,t){let r=await v.stat(e);await v.mkdir(t,{recursive:!0});let n=a.join(t,a.basename(e));return r.isDirectory()?await v.cp(e,n,{recursive:!0}):await v.copyFile(e,n),n}function vb(e){let t=e.state??"stopped";return{audio:"probe",state:t,active:"running"===t,heard:!1,source:e.source,backend:e.backend,durationMs:e.durationMs,elapsedMs:e.elapsedMs??0,bucketMs:e.bucketMs,sampleCount:0,mediaElementCount:e.mediaElementCount,sourceCount:e.sourceCount??0,rmsDbfs:[],peakDbfs:[],reason:e.reason,notes:e.notes}}function vA(e,t){var r,n,i,a;let o=(r=e)&&"object"==typeof r&&!Array.isArray(r)?r:{},s="running"===o.state?"running":"stopped",l=vI(o.rmsDbfs),d=vI(o.peakDbfs),c=[...function(e){if(Array.isArray(e))return e.filter(e=>"string"==typeof e)}(o.notes)??[],...t.notes??[]];return{audio:"probe",state:s,active:"running"===s&&(n=o.active,i=t.activeFallback??!0,"boolean"==typeof n?n:i),heard:!0===o.heard,source:t.source,backend:v_(o.backend)??t.backend,durationMs:vS(o.durationMs,t.durationMs),elapsedMs:vS(o.elapsedMs,t.elapsedMs),bucketMs:vS(o.bucketMs,t.bucketMs),sampleCount:vS(o.sampleCount,l.length),mediaElementCount:void 0===t.mediaElementCount?"number"==typeof(a=o.mediaElementCount)&&Number.isFinite(a)?a:void 0:vS(o.mediaElementCount,t.mediaElementCount),sourceCount:vS(o.sourceCount,t.sourceCount??0),rmsDbfs:l,peakDbfs:d,startedAt:v_(o.startedAt),stoppedAt:v_(o.stoppedAt),reason:v_(o.reason),notes:c.length>0?c:void 0}}function vS(e,t){return"number"==typeof e&&Number.isFinite(e)?e:t}function vI(e){if(!Array.isArray(e))return[];let t=[];for(let r of e)"number"==typeof r&&Number.isFinite(r)&&t.push(r);return t}function v_(e){return"string"==typeof e?e:void 0}async function vM(e){let{session:t,probeAction:r,backend:n}=e;if("start"===r){await vx(t,"restarted");let r=a.join(e.sessionStore.ensureSessionDir(e.sessionName),"audio-probe.json"),i=await n.start({durationMs:e.durationMs,bucketMs:e.bucketMs,statusPath:r});return t.audioProbe={platform:n.platform,source:n.source,backend:n.backend,sourceCount:n.sourceCount,notes:n.notes(t.device),child:i.child,wait:i.wait,statusPath:r,startedAt:Date.now(),durationMs:e.durationMs,bucketMs:e.bucketMs},i.wait.catch(()=>{}),await vN(t)}if("stop"===r)return await vx(t,"stopped")??vP(e,"stopped","not-started");let i=await vD(t);return i?("stopped"===i.state&&(t.audioProbe=void 0),i):vP(e,"stopped","not-started")}async function vx(e,t="session-cleanup"){var r,n,i;let a,o=e.audioProbe;if(!o)return;let s=await vD(e);return o.child.kill("SIGTERM"),await o.wait.catch(()=>{}),e.audioProbe=void 0,r=s,n=o,i=t,a=Math.min(n.durationMs,Math.max(0,Date.now()-n.startedAt)),{...r??vb({source:n.source,backend:n.backend,durationMs:n.durationMs,bucketMs:n.bucketMs,sourceCount:n.sourceCount,notes:n.notes}),state:"stopped",active:!1,elapsedMs:a,stoppedAt:new Date().toISOString(),reason:i}}async function vN(e){let t=Date.now()+5e3;for(;Date.now()<t;){let t=await vD(e);if(t)return t;let r=await Promise.race([e.audioProbe?.wait.then(e=>e,e=>e),tm(100).then(()=>void 0)]);if(r instanceof Error)throw r;if(r){let e=r.stderr?.trim()||r.stdout?.trim()||`host audio probe helper exited with code ${r.exitCode??1}`;throw new eG("COMMAND_FAILED",`failed to start host audio probe: ${e}`)}}throw new eG("COMMAND_FAILED","failed to start host audio probe")}async function vD(e){let t=e.audioProbe;if(t)try{var r,n;let e=await v.readFile(t.statusPath,"utf8");return r=JSON.parse(e),n=t,vA(r,{source:n.source,backend:n.backend,durationMs:n.durationMs,elapsedMs:Date.now()-n.startedAt,bucketMs:n.bucketMs,activeFallback:!0,sourceCount:n.sourceCount,notes:n.notes})}catch(e){if("ENOENT"===e.code)return;throw e}}function vP(e,t,r){return vb({state:t,source:e.backend.source,backend:e.backend.backend,durationMs:e.durationMs,bucketMs:e.bucketMs,sourceCount:0,reason:r,notes:[...e.backend.notes(e.session.device),"No active host audio probe is running."]})}async function vk(e){if(await f3(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await o5("dismiss",t).catch(t=>{ew({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function vE(e){e.appLog&&await hy(e.appLog)}async function vC(e){e.applePerf?.active&&(await wy(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function vR(e){let t=e.nativePerf?.android;t&&(await wj(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function vO(e){"android"===e.device.platform&&await da(e.device)}async function vT(e,t){await vE(e),await vx(e,"session-teardown"),await vC(e),await vR(e),await vO(e),ts(e.device.platform)&&await vk(e),await vy(t).catch(()=>{})}let vL=new WeakMap;async function vF(e){var t,r,n;let i,a,{sessionStore:o,leaseRegistry:s}=e,l=(i={...(r=function(e){let t=eZ(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eJ(r);if(r&&!n)throw new eG("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eG("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},tQ(r.command,i)?{...r,flags:i}:r),d=l.command,c=function(e){var t,r;let n=e.session||uu;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=uf(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(l),u=eu(),p=o.resolveSessionDir(c),f=rl(p,l.meta?.requestId??u.requestId),m=rs(p);em({session:c,logPath:f}),ew({level:"info",phase:"request_start",data:{publicSession:l.session,effectiveSession:c,command:l.command,tenant:l.meta?.tenantId,isolation:l.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:m}}),aI((t=l).command)||uw(t,sx(t));let h=a_(d)?.sessionExecutionLockExempt!==!0?await u_({req:l,sessionName:c,sessionStore:o}):[],w=(n=s,(a=vL.get(n))||(a=new Map,vL.set(n,a)),a),v={req:l,command:d,sessionName:c,requestLogPath:f,runnerLogPath:m,throwIfCanceled:()=>r_(l.meta?.requestId),runAdmitted:async e=>(r_(l.meta?.requestId),await uy({sessionName:c,sessionStore:o,leaseRegistry:s,teardownSession:vT}),v.req=l=function(e){let{sessionName:t,sessionStore:r,leaseRegistry:n}=e,i=r.get(t),a=function(e,t,r){var n,i;if(aI(e.command))return;let a=sx(e);uw(e,a);let o=r?.lease;if(!o&&e.meta?.sessionIsolation!=="tenant"&&(!a.leaseId||!a.tenantId&&!a.runId))return;n=a,(i=o)&&(uv("leaseId",n.leaseId,i.leaseId),uv("tenantId",n.tenantId,i.tenantId),uv("runId",n.runId,i.runId),uv("leaseProvider",n.leaseProvider,i.leaseProvider),uv("clientId",n.clientId,i.clientId),uv("deviceKey",n.deviceKey,i.deviceKey));let s=sN(e,r),l={...s,leaseTtlMs:s.leaseTtlMs??(z(s)?3e5:void 0)};return t.assertLeaseAdmission(I(s)),t.heartbeatLease(I(l))}(e.req,n,i);if(!a)return e.req;let o={...e.req,internal:{...e.req.internal,admittedLease:a}};return i?.lease&&r.set(t,{...i,lease:{...i.lease,leaseBackend:a.backend,expiresAt:a.expiresAt}}),o}({req:l,sessionName:c,sessionStore:o,leaseRegistry:s}),await e()),runLocked:async e=>(r_(l.meta?.requestId),0===h.length)?await v.runAdmitted(e):await v$(w,h,async()=>await v.runAdmitted(e))};return v}async function v$(e,t,r){let[n,...i]=t;return n?await uo(e,n,async()=>await v$(e,i,r)):await r()}function vU(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function vB(e,t){return vU(e)?e[t]:void 0}function vq(e,t){let r=vB(e,t);return"string"==typeof r?r:void 0}function vG(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}let vV=[vK,vH,vW,vz,vX,vJ,vZ,vY,vQ,v0,v1,v2,v3,v5,v4,v6,v8];function vj(e){return void 0!==e&&Number.isFinite(e)?String(Math.trunc(e)):"undefined"}function vK(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function vH(e,t){e.notes.includes(t)||e.notes.push(t)}function vW(){return Array.from(document.querySelectorAll("audio,video"))}function vz(e,t){if(!e||"stopped"===e.state)return e;for(let r of(clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state="stopped",e.active=!1,e.reason=t,e.stoppedAt=Date.now(),e.analysers))try{r.analyser.disconnect(),r.source.disconnect(),r.audible&&r.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of["click","pointerdown","keydown"])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function vX(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let r=window[e];if(r&&"closed"!==r.state)return r;let n=new t;return window[e]=n,n}function vJ(e,t,r){if(t.currentSrc||t.src||0!==t.readyState)try{window[r]||(window[r]=new WeakMap);let n=window[r].get(t);return n||(n=e.context.createMediaElementSource(t),window[r].set(t,n)),n.disconnect(),{source:n,audible:!0}}catch{return}}function vZ(e,t){if(t&&"function"==typeof t.getAudioTracks&&0!==t.getAudioTracks().length)return{source:e.context.createMediaStreamSource(t),audible:!1}}function vY(e,t){if("function"==typeof t.captureStream)return vZ(e,t.captureStream())}function vQ(e,t){let r=e.context.createAnalyser();r.fftSize=2048,t.source.connect(r),r.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:r,buffer:new Float32Array(r.fftSize)})}function v0(e,t){let r=vW();for(let n of(e.mediaElementCount=r.length,r)){if(e.seen.has(n))continue;let r=vZ(e,n.srcObject)??vY(e,n)??vJ(e,n,t);if(!r){vH(e,"Some media elements do not expose capturable audio to Web Audio.");continue}e.seen.add(n),vQ(e,r)}e.sourceCount=e.analysers.length,0===e.sourceCount&&vH(e,"No capturable page media audio sources were found yet.")}function v1(e){let t=0,r=0,n=0;for(let i of e.analysers)for(let e of(i.analyser.getFloatTimeDomainData(i.buffer),i.buffer))t+=e*e,r+=1,n=Math.max(n,Math.abs(e));return{rms:r>0?Math.sqrt(t/r):0,peak:n}}function v2(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function v3(e,t){if(!e||"running"!==e.state)return;v0(e,t);let r=v1(e),n=vK(r.rms),i=vK(r.peak);e.rmsDbfs.push(n),e.peakDbfs.push(i),e.heard=e.heard||n>-90||i>-90,v2(e),Date.now()-e.startedAt>=e.durationMs&&vz(e,"duration")}function v5(e,t){return{audio:"probe",state:"stopped",active:!1,heard:!1,source:"media-elements",backend:"agent-browser",durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:vW().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function v4(e,t,r,n){return e?{audio:"probe",state:e.state,active:"running"===e.state,heard:e.heard,source:"media-elements",backend:"agent-browser",durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:vW().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[r,n,...e.notes]}:v5(t,[r,n])}function v6(e,t,r,n,i,a,o){t&&vz(t,"restarted");let s=vX(n);if(!s)return v5(e,["Web Audio API is not available in this browser context."]);let l=s.createGain();l.gain.value=0,l.connect(s.destination);let d={state:"running",active:!0,context:s,sink:l,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{vH(d,"AudioContext could not be resumed by the probe.")}for(let e of(d.resumeOnGesture=()=>{try{s.resume()}catch{vH(d,"AudioContext could not be resumed from a user gesture.")}},["click","pointerdown","keydown"]))window.addEventListener(e,d.resumeOnGesture,{capture:!0,once:!0});return v0(d,i),d.timer=setInterval(()=>v3(d,i),d.bucketMs),d.timeout=setTimeout(()=>vz(d,"duration"),d.durationMs),window[r]=d,v4(d,e,a,o)}function v8(e){let t="__agentDeviceAudioProbe",r="__agentDeviceAudioProbeSources",n="Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.",i="URL-backed media elements may be routed through the probe AudioContext while they are observed.",a=window[t];return(a&&"running"===a.state&&Date.now()-a.startedAt>=a.durationMs&&(v3(a,r),vz(a,"duration")),"start"===e.action)?v6(e,a,t,"__agentDeviceAudioProbeContext",r,n,i):("stop"===e.action?(a&&v3(a,r),vz(a,"manual")):a&&v3(a,r),v4(a,e,n,i))}function v9(e){return vU(e)}function v7(e){if(!vU(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function ye(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,yr(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??yn(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??yn(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(ya)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(ya)}(e)??yn(t,["value"]),depth:r,enabled:yi(t,["enabled"]),focused:yi(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=yn(e,["role","type"]);return{index:0,type:t,role:t,label:yn(e,["label","name","text"]),value:yn(e,["value"]),enabled:yi(e,["enabled"]),focused:yi(e,["focused"])}}(e.data),index:n.length}});return n}(vq(e,"snapshot")??"",Array.isArray(r=vB(e,"refs"))?r.flatMap(e=>{let t=vU(e)?e:void 0,r=yr(yn(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):vU(r)?Object.entries(r).flatMap(([e,t])=>{let r=yr(e);return r?[{ref:r,data:vU(t)?t:void 0}]:[]}):[]);return t&&await yt(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=vB(e,"truncated"))?n:void 0}}async function yt(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function yr(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function yn(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function yi(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function ya(e){return"string"==typeof e}let yo="agent-browser",ys="Run `agent-device web setup` to install the managed web backend.";function yl(e={}){let t=e.session?.trim(),r=async r=>await yf(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},async startRecording(e){await r(["record","start",e])},async stopRecording(){await r(["record","stop"])},snapshot:async e=>await yu(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async setViewport(e,t){await r(["set","viewport",String(e),String(t)])},async click(e,t){await yc(r,e,t)},async clickRef(e){await r(["click",yw(e)])},async fill(e,t,n){await yc(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async fillRef(e,t){await r(["fill",yw(e),t])},async typeText(e){await r(["keyboard","type",e])},scroll:async(e,t)=>(await yd(r,e,t),t?.durationMs!==void 0?{durationMs:t.durationMs}:{}),dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=vU(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(v9).map(e=>({headers:v7(e.headers),method:vq(e,"method"),mimeType:vq(e,"mimeType"),requestId:vq(e,"requestId"),resourceType:vq(e,"resourceType"),responseHeaders:v7(e.responseHeaders),status:vG(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:vq(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=tB({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),tB({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e),probeAudio:async e=>{var t;let n,i,a,o,s;return{...s=vA(vU(t=await r(["eval",(n=vV.map(e=>`${e.toString()};`).join(""),i=function(e){switch(e){case"start":return"'start'";case"stop":return"'stop'";default:return"'status'"}}(e.action),a=vj(e.durationMs),o=vj(e.bucketMs),`(()=>{${n}return ${v8.name}({action:${i},durationMs:${a},bucketMs:${o}})})()`)]))?vU(t.result)?t.result:t:{},{source:"media-elements",backend:"agent-browser",durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0}),source:"media-elements",mediaElementCount:s.mediaElementCount??0}}}}async function yd(e,t,r){for(let i of function(e){var t,r,n,i;let a,o,s,l=e?.pixels??e?.amount,d=e?.durationMs;if(void 0===d||d<=0)return[{distance:l,delayAfterMs:0}];let c=Math.max(1,Math.min(20,Math.ceil(d/50))),u=d/Math.max(1,c-1);return(t=e,r=c,a=t?.pixels??t?.amount??300,t?.amount!==void 0&&void 0===t.pixels?Array.from({length:r},()=>a/r):(o=Math.floor((n=Math.round(a))/(i=r)),s=n-o*i,Array.from({length:i},(e,t)=>t<s?o+1:o))).map((e,t)=>({distance:e,delayAfterMs:t<c-1?u:0}))}(r)){var n;await e(["scroll",t,...void 0===(n=i.distance)?[]:[String(n)]]),i.delayAfterMs>0&&await tm(i.delayAfterMs)}}async function yc(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function yu(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await ye(n,t?.includeRects?async t=>await yp(e,t):void 0)}async function yp(e,t){try{return function(e){let t=vU(e)&&vU(e.box)?e.box:e;if(vU(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=vG(r,"x"),i=vG(r,"y"),a=vG(r,"width"),yv(e,i,a,vG(r,"height"))??(n=t,o=vG(n,"left"),s=vG(n,"top"),l=vG(n,"right"),d=vG(n,"bottom"),yv(o,s,yy(l,o),yy(d,s)))}}(await e(["get","box",yw(t)]))}catch(t){var r;let e;if(e=(r=t)instanceof Error?r.message:String(r),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function yf(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await ym(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eG("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:yo,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:ys},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!vU(s))return s;if(!1===(s.success??s.ok)){throw new eG("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(vU(t)){let e=vq(t,"message")??vq(t,"error");if(e)return e}return vq(e,"message")??"agent-browser command failed"}(s),{cmd:yo,args:d,hint:vq(s,"hint")??ys,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eG("COMMAND_FAILED","agent-browser command failed",{cmd:yo,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:vq(s,"hint")??ys});return Object.hasOwn(s,"data")?s.data:s}async function ym(e,t){let r="",n="",i=0;try{let a=await tY({stateDir:t.stateDir}),o=await eK(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=tJ(a)).code?new eG("TOOL_MISSING",t.message,{...t.details??{},cmd:yo,args:o,hint:yh(t)},t):"COMMAND_FAILED"===t.code?new eG("COMMAND_FAILED",t.message,{...t.details??{},cmd:yo,args:o,hint:yh(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function yh(e){return"string"==typeof e.details?.hint?e.details.hint:ys}function yw(e){return e.startsWith("@")?e:`@${e}`}function yv(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function yy(e,t){return void 0===e||void 0===t?void 0:e-t}function yg(){return{ok:!1,error:eq(new eG("UNAUTHORIZED","Invalid token"))}}async function yb(e){let{lockedScope:t,logPath:r,sessionStore:n}=e,i=n.get(t.sessionName);if(!i)return t.finalize(am());let a=await cW({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function yA(e){ew({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=eu(),r=ep({force:!0})??void 0;return{ok:!1,error:eq(e,{diagnosticId:t.diagnosticId,logPath:r})}}let yS=["ios_runner_command_send","ios_runner_readiness_preflight"];async function yI(e,t=5e3){await Promise.all(e.map(async e=>{let r;await new Promise(n=>{r=setTimeout(()=>{!function(e){e.destroyConnections?.();let t="closeAllConnections"in e?e.closeAllConnections:void 0;if("function"==typeof t)return t.call(e);let r="closeIdleConnections"in e?e.closeIdleConnections:void 0;"function"==typeof r&&r.call(e)}(e),n()},t);try{e.close(()=>n())}catch{n()}}),r&&clearTimeout(r)}))}function y_(e){o.existsSync(e)&&o.unlinkSync(e)}function yM(e){if(!o.existsSync(e))return null;try{let t=JSON.parse(o.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function yx(e){let t=yM(e);if(!t||t.pid===process.pid)try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}function yN(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function yD(e,t){return new Promise((r,n)=>{e.once("error",n),e.listen(0,"127.0.0.1",()=>{e.off("error",n);let i=e.address();"object"==typeof i&&i?.port?r(i.port):n(new eG("COMMAND_FAILED",t))})})}(async function(e={}){let t,r,i=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,d=e.exit??(e=>process.exit(e)),{baseDir:c,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=e5(i.AGENT_DEVICE_STATE_DIR),h=e4(i.AGENT_DEVICE_DAEMON_SERVER_MODE);fw(c),function(e){if(o.existsSync(e))for(let t of o.readdirSync(e,{withFileTypes:!0})){if(!t.isDirectory())continue;let r=a.join(e,t.name,rd);if(o.existsSync(r))try{let e=rc(o.readFileSync(r,"utf8"));if(e&&function(e){let t,r=eR(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eO(e.pid);return!!n&&!!((t=n.toLowerCase().replaceAll("\\","/")).includes("log stream")||t.includes("logcat")||t.includes("devicectl device log stream"))&&(!e.command||n===e.command)}(e))try{process.kill(e.pid,"SIGTERM")}catch{}}catch{}finally{rp(r)}}}(m);let w=new ro(m),v=new iT({maxActiveSimulatorLeases:yN(i.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:yN(i.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:yN(i.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:yN(i.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),g=th(),b=n.randomBytes(24).toString("hex"),A=eR(process.pid)??void 0,S=e9(),I=function(e=process.env){return ir.map(t=>t.createRuntime(e))}(i),_={leaseLifecycleProvider:function(e){if(0!==e.length)return{allocate:async(t,r)=>await i_(e,"allocate",t,r),heartbeat:async(t,r)=>await i_(e,"heartbeat",t,r),release:async(t,r)=>await i_(e,"release",t,r)}}(I),cloudArtifactProvider:function(e){if(0!==e.length)return{listCloudArtifacts:async t=>await iI(e,t)}}(I),deviceInventoryProvider:function(e){if(0!==e.length)return async t=>{for(let r of e){if(!iM(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t);if(e)return e}return null}}(I),providerDeviceRuntimeScope:async e=>await iw(I,e)},M=function(...e){let t=e.filter(e=>void 0!==e);if(0!==t.length)return{listCloudArtifacts:async e=>{for(let r of t){let t=await r.listCloudArtifacts?.(e);if(t)return t}}}}(_.cloudArtifactProvider,function(e=process.env){return{listCloudArtifacts:async t=>await ip(t,e)}}(i)),x=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,leaseLifecycleProvider:f,cloudArtifactProvider:m,providerDeviceRuntimeScope:h,trackDownloadableArtifact:w}=e,{sessionStore:v,leaseRegistry:y}=e;async function g(e){let r=Date.now(),n=!!(e.meta?.debug||e.flags?.verbose);return await ec({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{var t,n;let i,a,o,s=await b(e);return s.ok?function(e,t,r){var n,i;let a,o,s=function(e,t){let r=e.meta?.responseLevel??"default";if("default"===r)return t;let n=au[e.command];return n?{ok:!0,data:n(t.data??{},r)}:t}(e,t);if(!e.meta?.includeCost)return s;let l=(n=t.data,i=r,a={wallClockMs:Date.now()-i,runnerRoundTrips:eh(yS)},Array.isArray(o=n?.nodes)&&(a.nodeCount=o.length),a);return{ok:!0,data:{...s.data??{},cost:l}}}(e,s,r):{ok:!1,error:(t=e.command,a=(i="UNSUPPORTED_OPERATION"===(n=s.error).code||"UNSUPPORTED_PLATFORM"===n.code?function(e){let t=as[e];if(!t)return[];let r=[];for(let e of["apple","android","linux","web"]){let n=t[e];n&&Object.values(n).some(e=>!0===e)&&r.push(e)}return r}(t):[]).length>0?i.join(", "):void 0,o=e$(n.code),void 0===a&&void 0===o?n:{...n,...void 0!==o?{retriable:o}:{},...void 0!==a?{supportedOn:a}:{}})}})}async function b(e){if(!ex(e.token,n))return yg();try{return await iJ(p,async()=>{let t=await vF({req:e,sessionStore:v,leaseRegistry:y});return await A(t)})}catch(e){return yA(e)}}async function A(e,t){let n=async()=>{var n;let p,f=function(e){var t,r,n;let i,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,d=o.runnerLogPath;o.throwIfCanceled();let c=s.get(o.sessionName);c&&(!function(e){var t;let r;if(!((r=(t=e).recording)&&"ios"===t.device.platform&&"ios"!==r.platform&&!1!==r.showTouches))return;let n=e.recording,i=f0(e.device.id);if(!n.runnerSessionId){i?.alive&&(n.runnerSessionId=i.sessionId);return}if(!i?.alive){n.invalidatedReason??="iOS runner session exited during recording";return}i.sessionId!==n.runnerSessionId&&(n.invalidatedReason??="iOS runner session restarted during recording")}(c),s.set(o.sessionName,c));let u=(i=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:uA(t.req,i),existingSession:i}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=eu();if(!t.ok){ew({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=ep({force:!0})??void 0;return{ok:!1,error:eq(new eG(eU(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??("string"==typeof t.error.details?.hint?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath}),{diagnosticId:n.diagnosticId,logPath:e})}}return ew({level:"info",phase:"request_success"}),ep(),{ok:!0,data:function(e,t,r){var n,i;let o;if(!t)return t;let s=(n=e,o=Array.isArray((i=t).artifacts)?[...i.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof i.path||o.push({field:"path",path:i.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:a.basename(n.meta?.clientArtifactPaths?.path??i.path)}),o.filter(e=>!!(e&&"string"==typeof e.field&&"string"==typeof e.path&&"string"==typeof e.localPath&&e.localPath.length>0)));return 0===s.length?t:{...t,artifacts:s.map(t=>{let n=t.path;return{field:t.field,artifactId:r({artifactPath:n,tenantId:e.meta?.tenantId,fileName:t.fileName}),fileName:t.fileName,localPath:t.localPath}})}}(e,t.data,r)}})(p,e,l);if(c?.recording?.invalidatedReason&&(r=o.command,a_(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:c.recording.invalidatedReason}})};c&&!p.meta?.lockPolicy&&(n=o.command,a_(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=ud(e,t);if(0!==r.length)throw new eG("INVALID_ARGS",`Session "${e.name}" is already bound to ${us(e)}, but this request selected ${r.map(uc).join(", ")}.`,{session:e.name,conflicts:r.map(uc),hint:ul(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{var n,i,a,o,s;let l;return n=d,i=e,a=t,o=r,s=p.meta,{...sP(n,i,a,o,l=eu().requestId,s),requestId:l}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:d,existingSession:c,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:v,trackDownloadableArtifact:w});if("response"===f.type)return f.response;let m=f.scope,y=async e=>{let r=async()=>await S({lockedScope:m,providerScope:e,allowReplayActions:void 0===t});return h?await h(r):await r()};return t?await y(t):await ax({req:m.req,existingSession:m.existingSession,providers:{androidAdbProvider:i,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=m,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>yl({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},y)};return t?await e.runAdmitted(n):await e.runLocked(n)}async function S(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await c4({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:v,leaseRegistry:y,leaseLifecycleProvider:f,cloudArtifactProvider:m,invoke:g,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,a_(o)?.replayScopedAction!==!0))return await g(e);if(!ex(e.token,n))return yg();try{let n=await vF({req:e,sessionStore:v,leaseRegistry:y});return n.sessionName===t.sessionName?await A(n,r):await g(e)}catch(e){return yA(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await yb({lockedScope:i,logPath:i.logPath,sessionStore:v})}return g}({logPath:f,stateDir:c,token:b,sessionStore:w,leaseRegistry:v,leaseLifecycleProvider:_.leaseLifecycleProvider,cloudArtifactProvider:M,deviceInventoryProvider:_.deviceInventoryProvider,providerDeviceRuntimeScope:_.providerDeviceRuntimeScope,trackDownloadableArtifact:rN}),N=async e=>{await ec({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ew({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),ep({force:!0})})},D=async e=>{let t=vT(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
30
|
+
`)});await Promise.race([t,tm(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
31
|
+
`)})]),w.writeSessionLog(e),w.delete(e.name)},P=async()=>{let e=w.toArray();await Promise.all(e.map(D))},k=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=y.createServer(e=>{t.add(e),e.on("close",()=>t.delete(e));let r="",n=0,i=new Set,a=!1,o=()=>{if(!a&&0!==n){for(let e of(a=!0,i))rg(e);ew({level:"warn",phase:"request_client_disconnected",data:{inFlightRequests:n}}),(async()=>{try{let e=Date.now()+15e3;for(;n>0&&Date.now()<e;){let{abortAllIosRunnerSessions:e}=await Promise.resolve(t3);if(await e(),n<=0)break;await tm(200)}}catch(e){ew({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e),inFlightRequests:n}})}})()}};e.setEncoding("utf8"),e.on("close",o),e.on("error",o),e.on("data",async t=>{let a=eX(r,t);for(let t of(r=a.buffer,a.lines)){let r,a;n+=1;let o=!1;try{let n=JSON.parse(t);if(o=e3(n),a=rv(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),ry(a),rA(a))throw rI();r=await rO(o?t=>{e.destroyed||e.write(e7(t))}:void 0,async()=>await x(n))}catch(e){r={ok:!1,error:eq(e)}}finally{n-=1,a&&(i.delete(a),rb(a))}e.destroyed||e.write(o?e2(r):`${JSON.stringify(r)}
|
|
32
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await yD(i,"Failed to bind socket server")}if("socket"!==h){let e=await nA({handleRequest:x,token:b});r.push(e),t=await yD(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){o.existsSync(e)||o.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return o.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let a=yM(t);if(a?.pid&&a.pid!==process.pid&&eL(a.pid,a.processStartTime))return!1;try{o.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:g,startedAt:Date.now(),processStartTime:A}))return l.write("Daemon lock is held by another process; exiting.\n"),fw(void 0),d(0),null;let E=[];try{let e,n=await k();E=n.servers,t=n.socketPort,r=n.httpPort,C=t,R=r,O={socketPort:C,httpPort:R,token:b,version:g,codeSignature:S,processStartTime:A},o.existsSync(c)||o.mkdirSync(c,{recursive:!0}),o.writeFileSync(f,""),e=O.socketPort&&O.httpPort?"dual":O.httpPort?"http":"socket",o.writeFileSync(u,JSON.stringify({port:O.socketPort,httpPort:O.httpPort,transport:e,token:O.token,pid:process.pid,version:O.version,codeSignature:O.codeSignature,processStartTime:O.processStartTime,stateDir:c},null,2),{mode:384}),o.chmodSync(u,384),C&&s.write(`AGENT_DEVICE_DAEMON_PORT=${C}
|
|
33
|
+
`),R&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${R}
|
|
34
|
+
`)}catch(t){var C,R,O;let e=eB(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
35
|
+
`),E))try{t.close(()=>{})}catch{}return y_(u),yx(p),fw(void 0),d(1),null}ev();let T=!1,L=async(e={})=>{if(T)return;T=!0,e.cause&&await N(e.cause),await yI(E),await P(),await Promise.allSettled(I.map(async e=>await e.shutdown()));let{stopAllIosRunnerSessions:t}=await Promise.resolve(t3);await t(),await Promise.race([eI().catch(()=>{}),tm(1e3)]),y_(u),yx(p),fw(void 0),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{L()}),process.on("SIGTERM",()=>{L()}),process.on("SIGHUP",()=>{L()}),process.on("uncaughtException",e=>{let t=e instanceof eG?e:eB(e);l.write(`Daemon error: ${t.message}
|
|
36
|
+
`),L({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eG?t:eB(t);l.write(`Daemon error: ${r.message}
|
|
37
|
+
`),L({exitCode:1,cause:t})})),{httpPort:r,shutdown:L,socketPort:t,token:b}})().catch(e=>{let t=eB(e);process.stderr.write(`Daemon error: ${t.message}
|
|
38
|
+
`),process.exit(1)});export{vr as ANDROID_CPU_SAMPLE_DESCRIPTION,vt as ANDROID_CPU_SAMPLE_METHOD,wP as ANDROID_FRAME_SAMPLE_DESCRIPTION,wD as ANDROID_FRAME_SAMPLE_METHOD,vo as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,va as ANDROID_HPROF_SNAPSHOT_METHOD,vi as ANDROID_MEMORY_SAMPLE_DESCRIPTION,vn as ANDROID_MEMORY_SAMPLE_METHOD,hj as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,hV as APPLE_MEMGRAPH_SNAPSHOT_METHOD,hC as IOS_DEVICECTL_DEFAULT_HINT,px as IOS_RUNNER_CONTAINER_BUNDLE_IDS,aT as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,aO as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,iL as LOCAL_DEVICE_INVENTORY_PLATFORM_SELECTORS,iT as LeaseRegistry,ap as NO_ACTIVE_SESSION_MESSAGE,ro as SessionStore,lv as androidUiNodes,cu as annotateScreenshotWithRefs,hl as withAppLogProvider,hb as appendAppLogMarker,hZ as buildAppleFrameSamplingMetadata,hQ as buildAppleMemorySnapshotSupport,hY as buildAppleSamplingMetadata,iW as buildDeviceInventoryRequestFromFlags,ul as buildSessionRecoveryHint,uN as buildSimctlArgs,uD as buildSimctlArgsForDevice,ld as buildSnapshotState,vd as captureAndroidHeapSnapshot,d_ as captureAndroidUiHierarchyXml,hH as captureAppleMemorySnapshot,s9 as captureSnapshot,vv as cleanupRetainedMaterializedPaths,vy as cleanupRetainedMaterializedPathsForSession,rE as cleanupUploadedArtifact,hA as clearAppLogFiles,rb as clearRequestCanceled,ib as configureProviderPortReverse,sP as context_contextFromFlags,iU as countDeviceInventoryByGroup,yl as createAgentBrowserWebProvider,lh as createDaemonRuntimeSessionStore,md as createLocalAppleRunnerProvider,rI as createRequestCanceledError,o_ as createScopedProvider,od as dispatchCommand,rT as emitRequestProgress,dQ as ensureAndroidBlockingSystemDialogReady,af as errorResponse,oM as filterAppleAppsByBundlePrefix,sS as getActiveAndroidSnapshotFreshness,hu as getAppLogPathMetadata,rS as getRequestSignal,f0 as getRunnerSessionSnapshot,aS as getSessionCommandKind,cP as getSnapshotReferenceFrame,ay as hasExplicitDeviceSelector,oT as hasScopedAppleToolProvider,o8 as runMacOsPressAction,o6 as runMacOsReadTextAction,rt as inferFillText,iy as installProviderDeviceApp,ig as installProviderDeviceInstallablePath,iv as isActiveProviderDevice,al as isCommandSupportedOnDevice,i6 as isHostSystemAudioProbeDevice,uh as isImplicitSessionScopeConflict,s_ as isNavigationSensitiveAction,rA as isRequestCanceled,iZ as listDeviceInventory,hP as listIosDeviceApps,ud as listSessionSelectorConflicts,sA as markAndroidSnapshotFreshness,sk as markPendingInteractionOutcome,s$ as markPostGestureStabilization,rg as markRequestCanceled,am as noActiveSessionError,lR as parseInstrumentationRecords,mL as prepareIosRunner,rk as prepareUploadedArtifact,mR as prewarmAppleRunnerCache,mO as prewarmIosRunnerSession,o2 as quitMacOsApp,lU as readAndroidHelperManifestInteger,lB as readAndroidHelperManifestLiteral,o$ as readApplePlistJson,hO as readInfoPlistString,lF as readInstrumentationResultNumber,rF as readReplayTestActionProgress,hf as readSessionNetworkCapture,cC as recordTouchVisualizationEvent,dY as recoverAndroidBlockingSystemDialog,ai as registerBuiltinPlatformPlugins,ry as registerRequestAbort,ub as releaseSessionLease,iA as removeProviderPortReverse,ah as requireCommandSupported,wT as resetAndroidFramePerfStats,mc as resolveAppleRunnerProvider,oR as resolveAppleToolProvider,o1 as resolveFrontmostMacOsApp,uf as resolveImplicitSessionScope,hR as resolveIosDevicectlHint,sx as resolveLeaseScope,sr as resolveLinuxToolProvider,hp as resolveLogBackend,oo as resolvePayloadInput,up as resolvePublicSessionName,sN as resolveRequestOrSessionLeaseScope,rv as resolveRequestTrackingId,p_ as resolveRunnerAppBundleId,ug as resolveSessionLeaseForRequest,rl as resolveSessionRequestLogPath,rs as resolveSessionRunnerLogPath,lf as resolveSnapshotScope,iH as resolveTargetDevice,vw as retainMaterializedPaths,hg as runAppLogDoctor,oL as runAppleToolCommand,vM as runHostSystemAudioProbeCommand,hD as runIosDevicectl,si as runLinuxToolCommand,o5 as runMacOsAlertAction,o3 as runMacOsPermissionAction,o9 as runMacOsScreenshotAction,o4 as runMacOsSnapshotAction,uP as runSimctlForDevice,oF as runXcrun,mC as runAppleRunnerCommand,mu as withAppleRunnerProvider,f5 as abortAllIosRunnerSessions,f4 as stopAllIosRunnerSessions,vs as sampleAndroidCpuPerf,wO as sampleAndroidFramePerf,vl as sampleAndroidMemoryPerf,hJ as sampleAppleFramePerf,hK as sampleApplePerfMetrics,um as sessionMatchesScope,lm as setSessionSnapshot,dM as snapshotAndroid,sv as snapshotLinux,sy as readLinuxTextAtPoint,w3 as startAndroidPerfettoTrace,w6 as startAndroidSimpleperfProfile,hh as startAppLog,ww as startAppleXctracePerfCapture,oQ as startMacOsAudioProbeProcess,w5 as stopAndroidPerfettoTrace,w8 as stopAndroidSimpleperfProfile,hy as stopAppLog,vk as stopAppleRunnerForClose,wv as stopAppleXctracePerfCapture,f3 as stopIosRunnerSession,vR as stopSessionAndroidNativePerfCapture,vO as stopSessionAndroidSnapshotHelper,vE as stopSessionAppLog,vC as stopSessionApplePerfCapture,vx as stopSessionAudioProbe,sR as stripInternalInteractionFlags,oO as withAppleToolProvider,sn as withLinuxToolProvider,i2 as tryGetPlugin,rr as uniqueStrings,uo as withKeyedLock,rL as withReplayTestActionProgress,w9 as writeAndroidSimpleperfReport,wg as writeAppleXctracePerfReport};
|