agent-device 0.17.2 → 0.17.4
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 +2 -2
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.2.apk → agent-device-android-multitouch-helper-0.17.4.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.4.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.2.manifest.json → agent-device-android-multitouch-helper-0.17.4.manifest.json} +4 -4
- package/android-snapshot-helper/README.md +3 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.2.apk → agent-device-android-snapshot-helper-0.17.4.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.4.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.2.manifest.json → agent-device-android-snapshot-helper-0.17.4.manifest.json} +6 -6
- package/dist/src/123.js +1 -1
- package/dist/src/1231.js +1 -1
- package/dist/src/1352.js +1 -1
- package/dist/src/221.js +2 -2
- package/dist/src/2403.js +3 -3
- package/dist/src/2415.js +37 -29
- package/dist/src/4012.js +4 -0
- package/dist/src/5611.js +1 -0
- package/dist/src/5827.js +1 -0
- package/dist/src/6088.js +1 -0
- package/dist/src/6133.js +1 -0
- package/dist/src/7847.js +1 -1
- package/dist/src/9471.js +1 -1
- package/dist/src/9542.js +6 -3
- package/dist/src/9616.js +2 -1
- package/dist/src/9818.js +1 -1
- package/dist/src/android-snapshot-helper.d.ts +0 -1
- package/dist/src/android.js +5 -5
- package/dist/src/apple.js +1 -1
- package/dist/src/apps.js +10 -10
- package/dist/src/args.js +53 -14
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-output.js +30 -0
- package/dist/src/cli.js +15 -16
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +52 -0
- package/dist/src/contracts.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/generic.js +5 -5
- package/dist/src/index.d.ts +127 -8
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +3 -3
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +14 -0
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session.js +8 -10
- package/dist/src/snapshot.js +2 -2
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +14 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +297 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +327 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +122 -173
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +153 -5
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +171 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +0 -10
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +64 -18
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +200 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +450 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +82 -178
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +425 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +77 -6
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +10 -1
- package/ios-runner/README.md +5 -5
- package/ios-runner/RUNNER_PROTOCOL.md +0 -1
- package/package.json +3 -3
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.2.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.2.apk.sha256 +0 -1
- package/dist/src/1534.js +0 -1
- package/dist/src/1620.js +0 -1
- package/dist/src/1644.js +0 -2
- package/dist/src/2284.js +0 -1
- package/dist/src/2474.js +0 -1
- package/dist/src/2672.js +0 -1
- package/dist/src/3393.js +0 -1
- package/dist/src/5898.js +0 -1
- package/dist/src/695.js +0 -1
- package/dist/src/7455.js +0 -1
- package/dist/src/8173.js +0 -27
- package/dist/src/8407.js +0 -1
- package/dist/src/8699.js +0 -1
- package/dist/src/9238.js +0 -4
- package/dist/src/9673.js +0 -1
- package/dist/src/9974.js +0 -1
package/dist/src/2415.js
CHANGED
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import r,{createHash as n}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as
|
|
2
|
-
`}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return
|
|
3
|
-
`)}function t3(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}function t4(e,t){let n=r.createHash("sha256").update(e).digest(),i=r.createHash("sha256").update(t).digest();return r.timingSafeEqual(n,i)}let t5=new Set,t8=new Map,t6="request_canceled",t9="request canceled";function t7(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 re(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++}}(t8);let t=new AbortController;t8.set(e,t),t5.has(e)&&t.abort()}function rt(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++}}(t5),t5.add(e),t8.get(e)?.abort())}function rr(e){e&&(t5.delete(e),t8.delete(e))}function rn(e){return!!e&&t5.has(e)}function ri(e){if(e)return t8.get(e)?.signal}function ra(){return new ee("COMMAND_FAILED",t9,{reason:t6})}function ro(e){if(rn(e))throw ra()}function rs(e){return e instanceof ee&&"COMMAND_FAILED"===e.code&&(e.details?.reason===t6||e.message===t9)}let rl=new Map;function rc(e){let t=r.randomUUID(),n=setTimeout(()=>{rd(t)},9e5);return n.unref(),rl.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rd(e){let t=rl.get(e);if(t&&(clearTimeout(t.timer),rl.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let ru=new Map;function rp(e,t){let r=ru.get(e);if(!r)throw new ee("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ee("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rf(e){let t=ru.get(e);t&&(clearTimeout(t.timer),ru.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rm(e){let t=await rh(e);await en("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new ee("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rh(e){let t=await en("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new ee("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 ee("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rw),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 ee("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new ee("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 ee("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 ee("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 ee("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await en("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new ee("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rw(e){if(e.includes("\0"))throw new ee("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new ee("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new ee("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rg(e,t){return new Promise((r,n)=>{let i,o=!1,s=0,l=a.createWriteStream(t),c=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void rv(l,t).finally(()=>n(e));r()}},d=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new ee("COMMAND_FAILED","Artifact transfer timed out due to inactivity",{timeoutMs:6e4});"destroy"in e&&"function"==typeof e.destroy&&e.destroy(t),u.destroy(t),c(t)},6e4)},u=new f({transform(e,t,r){d();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new ee("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{c(new ee("COMMAND_FAILED","Artifact transfer was interrupted"))}),d(),m(e,u,l).then(()=>c(),e=>c(e))})}async function rv(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function ry(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new ee("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new ee("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 ee("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=i.basename(t);if(!r||"."===r||".."===r)throw new ee("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"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=i.join(s,o);return await rg(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rg(e,t);let n=await rm({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let rS=new h;async function r_(e,t){return await rS.run(e,t)}function rI(e){rS.getStore()?.(e)}let rb=new Set(["agent_device.command","agent-device.command"]),rA=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rx=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rM={"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"},rN=new Set([...rb,...rA,...rx,...Object.keys(rM)]);function rE(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rD(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rk(e,t){e.destroyed||(e.write(eg(t)),e.end())}function rP(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rC(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 rR(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rT(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rO(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new ee("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rL(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new ee("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function r$(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=Q(new ee("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rE(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=Q(new ee(Z(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rE(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=ec(r.tenantId);if(!e){let e=Q(new ee("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rE(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rF(){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=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(d(n).href)}catch(e){throw new ee("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new ee("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rU(e){let t=await rF(),{handleRequest:r,token:n}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rG(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rq(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||rD(i,rE(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rD(i,rE(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rD(i,rE(n.id??null,-32600,"Invalid Request"),400);if(!rN.has(n.method))return void rD(i,rE(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rD(i,rE(n.id??null,-32602,"Invalid params"),400);try{var s;let a=n.params,l=function(e,t,r){if(rb.has(e))return{token:rC(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(rA.has(e)){let e,n=rR(t,"platform");if("ios"!==n&&"android"!==n)throw new ee("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rC(t,r),session:rR(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rR(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new ee("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new ee("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 ee("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 ee("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 ee("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=rO(e,"owner"),n=rO(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new ee("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new ee("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new ee("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rL(e,"artifactId")}:(a&&(t=rL(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rO(e,"artifactName")})}(t);throw new ee("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:rT(t,"retentionMs")}}}if(rx.has(e)){let e=rR(t,"materializationId")?.trim();if(!e)throw new ee("INVALID_ARGS","Invalid params: materializationId is required");return{token:rC(t,r),session:rR(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rR(t,"requestId"),materializationId:e}}}let n=rM[e];if(n)return{token:rC(t,r),session:rR(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rR(t,"tenantId")??rR(t,"tenant"),runId:rR(t,"runId"),leaseId:rR(t,"leaseId"),leaseTtlMs:rT(t,"ttlMs"),leaseBackend:rR(t,"backend")}};throw new ee("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(s=n.method,rb.has(s)&&("string"!=typeof l.command||0===l.command.length))return void rD(i,rE(n.id??null,-32602,"Invalid params: command is required"),400);o=t7(l.meta?.requestId,n.id),l.meta={...l.meta,requestId:o},re(o);let c=()=>{i.writableFinished||rt(o)};e.on("aborted",c),i.on("close",c);let d=await r$(t,{headers:e.headers,rpcRequest:n,daemonRequest:l});if(!d.ok)return void rD(i,d.response,d.statusCode);if(d.tenantId&&(l.meta={...l.meta,tenantId:d.tenantId,sessionIsolation:l.meta?.sessionIsolation??l.flags?.sessionIsolation??"tenant"}),ed(l)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await r_(e=>{!i.destroyed&&i.write(ew(e))},async()=>await r(l)),t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rE(n.id??null,-32e3,e.error.message,e.error);rk(i,t);return}let u=await r(l);if(u.ok)return void rD(i,{jsonrpc:"2.0",id:n.id??null,result:u});rD(i,rE(n.id??null,-32e3,u.error.message,u.error),rP(u.error.code))}catch(t){let e=Q(t);if(i.headersSent)return void rk(i,rE(n.id??null,-32e3,e.message,e));rD(i,rE(n.id??null,-32e3,e.message,e),rP(e.code))}finally{rr(o)}})})}async function rG(e,t,n,i){try{var a;let o,s,l=await rj({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let c=await ry(e),d=(a={artifactPath:c.artifactPath,tempDir:c.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rf(o)},3e5)).unref(),ru.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:d}))}catch(e){rV(t,Q(e))}}async function rq(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rj({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rl.get(e);if(!r)throw new ee("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new ee("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rd(e),new ee("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,o.tenantId),l=a.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=Q(e);t.statusCode=rP(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rd(i)}),l.pipe(t)}catch(e){rV(t,Q(e))}}async function rj(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rC({},n.headers),c=(t=l,!(r=o)||t4(t,r)?null:Q(new ee("UNAUTHORIZED","Invalid token")));if(c)return rV(i,c),null;let d=await r$(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 d.ok?{tenantId:d.tenantId}:(i.statusCode=d.statusCode,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!1,error:d.response.error?.data?.message??d.response.error?.message??"Unauthorized"})),null)}function rV(e,t){e.statusCode=rP(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rB(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rH(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rK(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 ee("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rW{leases=new Map;runBindings=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=rK(e.backend),n=ec(e.tenantId);if(!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rB(e.runId);if(!i)throw new ee("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),c={leaseId:r.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:t,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(c.leaseId,c),this.runBindings.set(o,c.leaseId),{...c}}heartbeatLease(e){let t=rH(e.leaseId);if(!t)throw new ee("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new ee("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rH(e.leaseId);if(!t)throw new ee("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rK(e.backend),r=ec(e.tenantId);if(!r)throw new ee("INVALID_ARGS","tenant isolation requires tenant id.");let n=rB(e.runId);if(!n)throw new ee("INVALID_ARGS","tenant isolation requires run id.");let i=rH(e.leaseId);if(!i)throw new ee("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new ee("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new ee("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}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 ee("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 ee("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=ec(t),i=rB(r);if(t&&!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new ee("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new ee("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}async function rz(e){var t;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("./8806.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("./8806.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 rJ=new h,rX=new h;async function rZ(e,t,r){var n,i;let a=await rY(e,t,r);if(n=t,i=a,!rQ(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 ee("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function rY(e,t,r){try{return await eM(e,t,r)}catch(e){var n;if(n=e,!rQ(t)&&n instanceof ee&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function rQ(e){return!!(e.udid||e.serial||e.deviceName)}async function r0(e){let t=ex(e.platform),r=ev({simulatorSetPath:eP(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=eK(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 x("resolve_target_device",async()=>{let o=function(e){let t=rJ.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 ee("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await r5({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return r8(s)?r6(i,await rZ(l,s,{simulatorSetPath:r})):r6(i,await eM(l,s,{simulatorSetPath:r}));let c=await rz({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return r8(s)?r6(i,await rZ(c,s,{simulatorSetPath:r})):r6(i,await eM(c,s,{simulatorSetPath:r}))},a)}async function r1(e){return rJ.getStore()?await e():await rJ.run(new Map,e)}async function r2(e,t){return e?await rX.run(e,t):await t()}async function r3(e,t){return await r2(e,async()=>await r1(t))}async function r4(e){return await r5(e)??await rz(e)}async function r5(e){let t=rX.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function r8(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function r6(e,t){return rJ.getStore()?.set(e,{...t}),t}let r9=["platform","target","device","udid","serial"],r7=[...r9,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function ne(e){return"string"==typeof e&&e.trim().length>0}function nt(e,t){return!!e&&t.some(t=>ne(e[t]))}let nr={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nn=function(e){let t=new Map,r=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);if(t.set(n.command,n),"generic"!==n.route){let e=r.get(n.route)??[];e.push(n.command),r.set(n.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:r}}([...no("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},eJ.leaseAllocate,eJ.leaseHeartbeat,eJ.leaseRelease),na(eJ.sessionList,"session",{sessionKind:"inventory",...nr}),na(eZ.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nr}),na(eZ.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...no("session",{sessionKind:"state"},eZ.boot,eZ.shutdown,eZ.appState),...no("session",{sessionKind:"observability"},eZ.perf,eZ.logs,eZ.network),...no("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===eZ.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},eZ.replay,eZ.test),na(eJ.runtime,"session"),na(eZ.clipboard,"session",{replayScopedAction:!0}),na(eZ.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...no("session",{},eZ.install,eZ.reinstall,eJ.installSource),na(eJ.releaseMaterializedPaths,"session",nr),...no("session",{},eZ.push,eZ.triggerAppEvent),na(eZ.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...no("session",{},eZ.prepare,eZ.batch),na(eZ.close,"session",{allowInvalidRecording:!0}),...no("snapshot",{replayScopedAction:!0},eZ.snapshot,eZ.diff,eZ.wait,eZ.alert,eZ.settings),na(eZ.reactNative,"reactNative",{replayScopedAction:!0}),na(eZ.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),na(eZ.trace,"recordTrace"),na(eZ.find,"find",{replayScopedAction:!0}),...no("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eZ.click,eZ.fill,eZ.longPress,eZ.press,eZ.type),...no("interaction",{replayScopedAction:!0},eZ.get,eZ.is),...no("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},eZ.back,eZ.gesture,eZ.home,eZ.rotate,eZ.scroll,eZ.swipe,"pinch"),na(eZ.focus,"generic",{androidBlockingDialogGuard:!0}),na(eZ.screenshot,"generic",{replayScopedAction:!0}),...no("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function ni(e){return ns(e)?.sessionKind}function na(e,t,r={}){return{command:e,route:t,...r}}function no(e,t,...r){return r.map(r=>na(r,e,t))}function ns(e){return nn.descriptorsByCommand.get(e)}let nl=[{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("./9639.js");nf(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&eb(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(tU);nf(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&&eb(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tq);nf(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(tV);nf(t,e.linuxTool,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(tL);nf(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");nf(t,e.recording,r)}}];async function nc(e,t){let r=await nd(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await np(r);return await nm(i,async()=>await t(n))}async function nd(e){var t,r,n;if(t=e.providers,!nl.some(e=>!!t[e.resolverKey]))return{};let i=await nu(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nl.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nu(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return ns(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=ns(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=ns(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nt(e.flags,r9)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await r0(e.flags??{});case"skip":return}}async function np(e){let t=[];for(let r of nl)await r.appendWrapper(e,t);return t}function nf(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nm(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nh(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"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new ee("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nw=/^[A-Za-z0-9_.:-]{1,64}$/,ng="--launch-console is supported only for iOS simulator app launches",nv="--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]];async function nS(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await tc(t)}async function n_(e,t){let{x:r,y:n}=nE(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 -c, 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,...tp(`Long pressed (${r}, ${n})`)}}async function nI(e,t){let{x:r,y:n}=nE(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...tp(`Focused (${r}, ${n})`)}}async function nb(e,t,r){let n=B(t[0]);if(n)throw new ee("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 ee("INVALID_ARGS","type requires text");let a=ti(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...tp(nJ("Typed",i))}}async function nA(e,t,r){if(r?.directElementSelector)return await nx(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 ee("INVALID_ARGS","fill requires x y text");let o=ti(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...tp(nJ("Filled",a))}}async function nx(e,t,r,n){if(!e.fillElementSelector)throw new ee("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new ee("INVALID_ARGS","fill requires text");let a=ti(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...tp(nJ("Filled",i))}}async function nM(e,t,r,n){var i,a,o,s;if(n?.directElementSelector&&"ios"===e.platform)return await nN(t,n.directElementSelector);let{x:l,y:c}=nE(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nD(l,c,n);let d=e9(n);if("primary"!==d)return await nk(e,l,c,d,n);let u=(s=n,{count:nC(s?.count,1,"count",1,200),intervalMs:nC(s?.intervalMs,0,"interval-ms",0,1e4),holdMs:nC(s?.holdMs,0,"hold-ms",0,1e4),jitterPx:nC(s?.jitterPx,0,"jitter-px",0,100),doubleTap:!!s?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new ee("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new ee("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(u),i=u.count,a=u.holdMs,o=u.jitterPx,eb(e.platform)&&i>1&&0===a&&0===o)?await nR(e,l,c,u,n):await nT(t,l,c,u)}async function nN(e,t){if(!e.tapElementSelector)throw new ee("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...tp(`Tapped ${t.raw}`)}}function nE(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new ee("INVALID_ARGS",t,r);return{x:n,y:i}}async function nD(e,t,r){let n=e9(r);if("primary"!==n)throw new ee("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(t$);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...tp(nW({x:e,y:t}))}}async function nk(e,t,r,n,i){if(function(e,t,r){let n=e3({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 nP(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tF);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nO(i)),{x:t,y:r,button:n,...tp(nW({x:t,y:r,button:n}))}}async function nP(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,...tp(nW({x:e,y:t,button:r}))}}function nC(e,t,r,n,i){return ti(void 0===e?t:e,r,n,i)}async function nR(e,t,r,n,i){let{runIosRunnerCommand:a}=await Promise.resolve(tF),o=await a(e,{command:"tapSeries",x:t,y:r,count:n.count,intervalMs:n.intervalMs,doubleTap:n.doubleTap,appBundleId:i?.appBundleId},nO(i));return{x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,timingMode:"runner-series",...o,...tp(nW({x:t,y:r}))}}async function nT(e,t,r,n){let i;return await nS(n.count,n.intervalMs,async a=>{let[o,s]=function(e,t){if(t<=0)return[0,0];let[r,n]=ny[e%ny.length];return[r*t,n*t]}(a,n.jitterPx),l=t+o,c=r+s;if(n.doubleTap){i??=await e.doubleTap(l,c)??void 0;return}n.holdMs>0?i??=await e.longPress(l,c,n.holdMs)??void 0:i??=await e.tap(l,c)??void 0}),tu({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},nW({x:t,y:r}))}function nO(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nL(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 ee("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nF({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function n$(e,t,r,n){let i=e0(r[0]),a=r[1]?Number(r[1]):300,o=ta((await t.snapshot({appBundleId:n?.appBundleId,compact:!0})).nodes??[]);if(!o)throw new ee("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=tl(i,o,{platform:e.platform});return await nF({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nF(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:c}=e,d=ti(l,"durationMs",16,1e4),u=ti(n?.count??1,"count",1,200),p=ti(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!eQ(e7,f))throw new ee("INVALID_ARGS",`Invalid pattern: ${f}`);if(eb(t.platform)&&u>1){let{runIosRunnerCommand:e}=await Promise.resolve(tF),r=await e(t,{command:"dragSeries",x:i,y:a,x2:o,y2:s,durationMs:d,count:u,pauseMs:p,pattern:f,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId});return{x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"runner-series",count:u,pauseMs:p,pattern:f,...r,...tp(nz(u,f))}}return await nS(u,p,async e=>{"ping-pong"===f&&e%2==1?await r.swipe(o,s,i,a,d):await r.swipe(i,a,o,s,d)}),tu({x1:i,y1:a,x2:o,y2:s,...c?{preset:c}:{},durationMs:d,effectiveDurationMs:d,timingMode:"direct",count:u,pauseMs:p,pattern:f},c?`Swiped ${c}`:nz(u,f))}async function nU(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 ee("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=ti(t[4]?Number(t[4]):500,"durationMs",16,1e4),s=r+i,l=n+a,c=await e.pan(r,n,s,l,o);return{x:r,y:n,dx:i,dy:a,x2:s,y2:l,durationMs:o,...c??{},...tp(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nG(e,t){let r=eX(e1,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 ee("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new ee("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=ti(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,...tp(`Flung ${r}`)}}async function nq(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new ee("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new ee("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new ee("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:e2(n)},l={},c=0;if(s.edge){let t=s.edge,n=await tn({edge:t,captureState:async n=>await nj(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},c=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),c=1;return tu({direction:s.direction,...s.edge?{edge:s.edge,passes:c}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},e8(s.direction,s.edge,c,a,o))}async function nj(e,t,r,n){if("function"!=typeof e.snapshot)throw new ee("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await tt({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,compact:!0,scope:e})).nodes??[]})}async function nV(e,t,r,n){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new ee("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 ee("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...tp(`Pinched to scale ${i}`)}}async function nB(e,t,r){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new ee("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 ee("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 ee("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 ee("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 ee("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,...tp(`Rotated gesture ${n} degrees`)}}async function nH(e,t,r){if("tv"===e.target)throw new ee("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new ee("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 ee("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new ee("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:ti(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...tp(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function nK(e,t,r){let{x:n,y:i}=nE(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(tj);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(t$);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tF),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});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function nW(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function nz(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function nJ(e,t){return`${e} ${Array.from(t).length} chars`}function nX(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new ee("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new ee("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof ee)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new ee("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new ee("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new ee("INVALID_ARGS",`${n} file not found: ${o}`)}async function nZ(e){let t=nX(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await nY(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new ee("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof ee)throw t;throw new ee("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function nY(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new ee("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new ee("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new ee("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new ee("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function nQ(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nh(e,a);return N({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await x("platform_command",async()=>await n0(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function n0(e,t,r,n,i,a,o){switch(r){case"open":return await n1(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...tp("Closed session")};return await t.close(e),{app:e,...tp(`Closed: ${e}`)}}case"press":return await nM(e,t,n,a);case"swipe":return await nL(e,t,n,a);case"swipe-preset":return await n$(e,t,n,a);case"pan":return await nU(t,n);case"fling":return await nG(t,n);case"longpress":return await n_(t,n);case"focus":return await nI(t,n);case"type":return await nb(t,n,a);case"fill":return await nA(t,n,a);case"scroll":return await nq(t,n,a);case"pinch":return await nV(e,t,n,a);case"rotate-gesture":return await nB(e,t,n);case"transform-gesture":return await nH(e,t,n);case"trigger-app-event":return await n2(e,t,n,a);case"screenshot":return await n3(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...tp("Back")};case"home":return await t.home(),{action:"home",...tp("Home")};case"rotate":{let e=td(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...tp(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...tp("Opened app switcher")};case"clipboard":return await n4(t,n);case"keyboard":return await n5(e,n,a,o);case"settings":return await n9(e,t,n,a);case"push":return await n7(e,n,a);case"snapshot":return await ie(t,a);case"read":return await nK(e,n,a);default:throw new ee("INVALID_ARGS",`Unknown command: ${r}`)}}async function n1(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new ee("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new ee("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new ee("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...tp("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new ee("UNSUPPORTED_OPERATION",ng);if("linux"===e.platform&&s&&s.length>0)throw new ee("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(eW(i))throw new ee("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!eW(a))throw new ee("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new ee("INVALID_ARGS",nv);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...tp(`Opened: ${i}`)}}if(o&&eW(i))throw new ee("INVALID_ARGS",nv);if(n?.clearAppState){if(eW(i))throw new ee("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}:{},...tp(`Opened: ${i}`)}}async function n2(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new ee("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nw.test(t))throw new ee("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 ee("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 ee("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 ee("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof ee)throw t;throw new ee("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 ee("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 ee("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",...tp(`Triggered app event: ${i}`)}}async function n3(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=y(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...tp(`Saved screenshot: ${a}`)}}async function n4(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new ee("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new ee("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new ee("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,...tp("Clipboard updated")}}async function n5(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!k(i))throw new ee("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new ee("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await n8(e,i);if("ios"===e.platform)return await n6(e,i,r,n);throw new ee("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function n8(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...tp("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.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("./8133.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 n6(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new ee("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(tF),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...tp("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tF),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...tp(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function n9(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new ee("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new ee("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");N({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?tu({setting:i,state:"clear",...s},it(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...tp(`Cleared user data for ${r}`)}}if(!a)throw new ee("INVALID_ARGS","settings requires setting state");let l="location"===i&&"set"===a,c=("permission"===i||l?r[4]:r[2])??n?.appBundleId,d="permission"===i?{permissionTarget:o,permissionMode:s}:l?{latitude:tf(o,"latitude"),longitude:tf(s,"longitude")}:void 0;N({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:c,platform:e.platform}});let u=await t.setSetting(i,a,c,d);return u&&"object"==typeof u?tu({setting:i,state:a,...u},it(u)??`Updated setting: ${i}`):{setting:i,state:a,...tp(`Updated setting: ${i}`)}}async function n7(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new ee("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await nZ(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...tp(`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,...tp(`Pushed notification to ${n}`)}}async function ie(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,compact:t?.snapshotCompact,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function it(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ir=e=>"macos"!==e.platform,ii=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,ia=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,io={device:!0},is={},il={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},ic={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},id={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,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:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:e=>"android"===e.platform||ii(e),unsupportedHint:ia},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},open:il,close:il,reinstall:ic,install:ic,"install-from-source":ic,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:is},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io,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:is,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:io},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},snapshot:il,diff:il,screenshot:il,wait:il,get:il,find:il,is:il,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io,supports:ir},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:ir},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,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:io},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:io},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:is},type:il};function iu(e,t){let r=id[e];if(!r)return!0;let n=eb(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function ip(e,t=e=>e){let r=new h;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 im(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function ih(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 ee("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 ee("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 ee("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 ee("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 ee("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iw(e,t,r)}}async function iw(e,t,r){let n=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of n){let r=await s.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&&a.add(t)}}return im((await Promise.all(Array.from(a).map(async e=>{let r=await ig(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function ig(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iv(e,"CFBundleIdentifier"),i=iv(e,"CFBundleDisplayName"),a=iv(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iv(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iy={runCommand:en,simctl:{run:async(e,t)=>await en("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await en("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iE(en,e)},macosHost:ih(en,async e=>await iE(en,e)),whichCommand:eo},iS=ip(iy,function(e){return"function"==typeof e?i_({runCommand:e}):i_(e)});function i_(e={}){let t={...iy,...e},r=e.plist??{readJson:async e=>await iE(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??ih(t.runCommand,async e=>await r.readJson(e))}}function iI(e){return iS.resolve(e)}async function ib(e,t){return await iS.run(e,t)}function iA(){return iS.hasScope()}async function ix(e,t,r){return await iI().runCommand(e,t,r)}async function iM(e,t){let r=iI(),[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 ix("xcrun",e,t)}async function iN(e){return await iI().plist?.readJson(e)??null}async function iE(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 iD="agent-device-macos-helper",ik="AGENT_DEVICE_MACOS_HELPER_BIN",iP=i.join(u.homedir(),".agent-device","macos-helper","current"),iC=i.join(iP,"manifest.json"),iR=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iT(e){let t=e.trim();if(!iR.test(t))throw new ee("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iO(e,t){t.bundleId&&e.push("--bundle-id",iT(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iL(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let r=i.dirname(t);if(r===t)break;t=r}throw new ee("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(c(import.meta.url))}async function i$(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await i$(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iF(e){let t=await i$(e),r=n("sha256");for(let n of t)r.update(i.relative(e,n)),r.update("\0"),r.update(await s.readFile(n)),r.update("\0");let a=await ix("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(a.stdout||a.stderr||`exit:${a.exitCode}`),r.update("\0"),r.digest("hex")}async function iU(){try{let e=JSON.parse(await s.readFile(iC,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iG(){let e=await ea(process.env[ik],ik);if(e)return e;let t=iL(),r=await iF(t),n=i.join(iP,iD);try{if(await iU()===r)return await s.access(n),n}catch{}let a=i.join(iL(),".build","release",iD);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await ix("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iP,{recursive:!0});let o=`${n}.tmp`;return await s.copyFile(a,o),await s.rename(o,n),await s.chmod(n,493),await s.writeFile(iC,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
-
`,"utf8"),n}async function iq(){let e=process.env[ik]?.trim();if(e){let t=await ea(e,ik);if(t)return t}if(iA())return iD;if("darwin"!==process.platform)throw new ee("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iG()}async function ij(e){let t={allowFailure:!0,timeoutMs:3e4},r=iI().macosHelper,n=r?iD:await iq(),i=r?await r.run(e,t):await ix(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 ee("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 iV(){return await ij(["app","frontmost"])}async function iB(e){return await ij(["app","quit","--bundle-id",iT(e)])}async function iH(e,t){return await ij(["permission",e,t])}async function iK(e,t={}){let r=["alert",e];return iO(r,t),await ij(r)}async function iW(e,t={}){let r=["snapshot","--surface",e];return iO(r,t),await ij(r)}async function iz(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iO(n,r),await ij(n)}async function iJ(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iO(n,r),await ij(n)}async function iX(e,t={}){let r=["screenshot","--out",e];return iO(r,t),t.fullscreen&&r.push("--fullscreen"),await ij(r)}let iZ={"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"},iY={runCommand:en,whichCommand:eo,desktop:i3(en,eo),clipboard:i4(en,eo),screenshot:i5(en,eo)},iQ=ip(iY,function(e={}){let t={...iY,...e};return{...t,desktop:e.desktop??i3(t.runCommand,t.whichCommand),clipboard:e.clipboard??i4(t.runCommand,t.whichCommand),screenshot:e.screenshot??i5(t.runCommand,t.whichCommand)}});function i0(e){return iQ.resolve(e)}async function i1(e,t){return await iQ.run(e,t)}async function i2(e,t,r){return await i0().runCommand(e,t,r)}function i3(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=>{N({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await tc(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 i4(e,t){return{async readText(){let r=i9[await at(t,i8)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=i7[await at(t,i8)](r);await e(n.cmd,n.args,n.options)}}}function i5(e,t){return{async capture(r){let n=ae[await at(t,i6)](r);await e(n.cmd,n.args,n.options)}}}let i8={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."},i6={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."},i9={"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}}},i7={"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}})},ae={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 at(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 ee("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ar="atspi-dump.py",an=null;async function ai(e,t={}){let r,n=i0().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new ee("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await i0().whichCommand("python3"))throw new ee("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,d=[function(){if(an)return an;let e=i.dirname(c(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",ar);if(a.existsSync(r))return an=r,r;if(0===t){let t=i.join(e,ar);if(a.existsSync(t))return an=t,t}e=i.dirname(e)}throw new ee("TOOL_MISSING",`Cannot find ${ar}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await i2("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 ee("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new ee("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new ee("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new ee("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=iZ[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 aa(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&N({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await ai(t);return{nodes:r.nodes,truncated:r.truncated}}async function ao(e,t,r){let{nodes:n}=await aa(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:as(e.rect)-as(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 as(e){return(e?.width??0)*(e?.height??0)}let al=[250,400,600];function ac(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?af(n?.nodes??[]):void 0,routeComparable:i}}function ad(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 au(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ap(e){return"press"===e||"click"===e||"back"===e||"open"===e}function af(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 am(e,t,r,n,i){return{requestId:i??b().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotCompact:t?.snapshotCompact,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...S(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:e9(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function ah(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aI(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=ay(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:av(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aw(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function ag(e){let{session:t,pending:r,snapshot:n}=e,i=aS(r.preSignature,ay(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await nQ(t.device,r.command,r.positionals,r.flags?.out,{...am(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),N({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function av(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function ay(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 aS(e,t){return 0===e.length||0===t.length?"ambiguous":a_(e,t)?"unchanged":"changed"}function a_(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 aI(e){return"ios"===e.device.platform||"android"===e.device.platform}function ab(e,t,r=[],n){var i,a,o;aM(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 aA(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function ax(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aM(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=ay(e.readSnapshot(o).nodes);for(;Date.now()-i<1500;){await tc(200),a+=1;let l=await r(),c=ay(e.readSnapshot(l).nodes);if(a_(s,c))return aA(t),N({level:a>2?"info":"debug",phase:"post_gesture_snapshot_stabilized",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),l;o=l,s=c}return aA(t),N({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aM(e){return"ios"===e||"android"===e}function aN(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aE=new WeakMap;function aD(e,t){if(!e[t])return[];let r=aC(e)[t]??t+1;return e.slice(t+1,r)}function ak(e,t,r){let n=aC(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aP(e,t,r){let n=aC(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aC(e){let t=aE.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 aE.set(e,r),r}function aR(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 aT(e,t){let r=th(e.type??""),n=e.label?.trim();return!!(aO(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function aO(e){return"button"===th(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aL(e){let t=th(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function a$(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aF(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||aU(r)>aU(n)))&&(t=i.rect)}return t}function aU(e){return e?e.width*e.height:0}function aG(e){let t=th(e.type??"");return"scrollview"===t||"scrollarea"===t}function aq(e,t){return!0===e||!!t||void 0}function aj(e,t,r,n){aP(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 aV(e,t,r,n){aP(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 aB(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 aH(e,t,r,n){for(let i of e)(aT(i,t)||n&&aW(i,n))&&r.add(i.index)}function aK(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&&e4(e.rect,t.rect)}function aW(e,t){return"button"===th(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&e4(e.rect,t.rect)}let az=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aF(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),aP(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&&e5(t))})(r)&&function(e,t,r){var n,i,a,o;aL(e.type)||r.suppressedIndexes.add(e.index);let s=te(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aL(e.type)?e:null)??aR(e,t,e=>aL(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,a$(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:aq(i.hiddenContentAbove,o.above),hiddenContentBelow:aq(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){aV(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=ak(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),aV(e,r,i.index,t))}})(e,o),r=e,n=o,aB(r,(e,t,i)=>{ak(r,i,r=>{let n;return("button"===(n=th(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(e4(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,aB(i,(e,t,r)=>{let n;F(e)&&C(e,(n=[],aP(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 aj(e,t,n,i);if("other"===a){if(function(e,t,r){return!!ak(e,t,e=>{let t=th(e.type??"");return("link"===t||"searchfield"===t||aL(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);aj(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=aF(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)||!aR(e,t,aG)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aU(e),i=aU(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&a$(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 aH(aD(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aD(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=>aK(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&a$(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&&(aK(a,t,r)||aW(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)||aT(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=>aK(e,t,r));if(!i){e.some(aO)&&aH(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&a$(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),aH(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function aJ(e){let t=await aX(e);if(t)return t;let r=await aQ(e);return au(e.session),{snapshot:a6(r,a5(e)),analysis:r.analysis,androidSnapshot:r.androidSnapshot}}async function aX(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aI(e)||Date.now()-t.markedAt>3e4?void aw(e):t}(e.session);if(t&&e.session)return await aZ({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await a2({...e,session:e.session});let r=ad(e.session);if(r&&"android"===e.device.platform)return await a0(e,r)}async function aZ(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await aY(e,t,await a3(e)),l=await ag({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await aY(e,t,await a3(e)),l=await ag({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aw(i),s=await ax({session:i,initial:s,capture:async()=>await a3(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.freshness?.staleAfterRetries!==!0&&au(i),"unchanged"===l.change)?N({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}}):N({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,analysis:s.data.analysis,androidSnapshot:s.data.androidSnapshot,freshness:s.freshness}}async function aY(e,t,r){let n=r;return"unchanged"!==aS(t.preSignature,ay(n.snapshot.nodes))?n:(await tc(500),n=await a3(e))}async function aQ(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await aa(r?.surface);return a9({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?a9(await iW(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await nQ(t,"snapshot",[],i,{...am(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function a0(e,t){let r=await a1(e,t);return{snapshot:r.snapshot,analysis:r.data.analysis,androidSnapshot:r.data.androidSnapshot,freshness:r.freshness}}async function a1(e,t){let r=await a4(e),n=a8(r,t,e),i=0,a=t.markedAt+1500;for(let o of al){if(!n)break;let s=a-Date.now();if(s<=0)break;await tc(Math.min(o,s)),r=await a4(e),i+=1,n=a8(r,t,e)}return n||au(e.session),{...r,freshness:i>0||n?{action:t.action,retryCount:i,staleAfterRetries:!!n,reason:n??void 0}:void 0}}async function a2(e){let t=await ax({session:e.session,capture:async()=>await a3(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,analysis:t.data.analysis,androidSnapshot:t.data.androidSnapshot,freshness:t.freshness}}async function a3(e){let t=ad(e.session);return t&&"android"===e.device.platform?await a1(e,t):await a4(e)}async function a4(e){let t=await aQ(e);return{data:t,snapshot:a6(t,a5(e))}}function a5(e){return void 0===e.snapshotScope?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function a8(e,t,r){var n,i;let a=r.flags?.snapshotInteractiveOnly===!0,o=e.data.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&&ap(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=af(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 a6(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=tr(s?o:tw(o)),c=t?.snapshotScope&&e?.backend!=="macos-helper"?a7(l,t.snapshotScope):l,d=(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 az)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}})}(c):c;return{nodes:eD(s?d:to(d)),truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,presentationKey:eN(eI(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&a?.snapshotCompact!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function a9(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=a7(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:oe(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oe(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function a7(e,t){let r=tg(eD(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 oe(a,i)}function oe(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 ot(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aN("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=ey(e.trim());if(!n)return aN("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=eA(e.nodes,n);if(r=t?tv(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aN("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function or(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function on(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?N({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oi(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=G({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...S(a),surface:a?.surface};return"out"===r?oa(await nQ(t.device,"screenshot",[],i,o)):oa(await nQ(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new ee("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),r=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:on({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:q()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...y(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oa(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oo(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function os(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 ol(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oc=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function od(e,t={}){let r=tI(e,t.helperAdb).exec;return(await oh(e,t,r)).xml}async function ou(e,t={}){let r=tI(e,t.helperAdb).exec,n=await oh(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tA(i,void 0,t),s=op(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 ox(e,o.nodes,i,r),o.nodes),{...o,...of(s),androidSnapshot:n.metadata}}let o=tM(i),s=tP(o,void 0,t),l=op(s.truncated,n.metadata);a&&await om({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:c,...d}=s;return{...d,...of(l),androidSnapshot:n.metadata}}function op(e,t){return!0===e||!0===t.helperTruncated||e}function of(e){return!0===e?{truncated:!0}:{}}async function om(e){if(oN(e.interactiveSnapshot.nodes).size>0||oM(e.xml))return;let t=tP(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await ox(e.device,t.nodes,e.xml,e.adb);oR(r,t,e.interactiveSnapshot),0===r.size&&oR(e6(eD(t.nodes)),t,e.interactiveSnapshot)}async function oh(e,t,r){let n=await x("android_snapshot_helper_artifact_resolution",async()=>await ob(t.helperArtifact));return n.artifact?await ow(e,t,r,n.artifact):(N({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oA(e,n.fallbackReason,r))}async function ow(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),c=tI(e,t.helperAdb);try{let e=await og(t,r,c,n,l);return e.installed&&await tC(l),a=await ov(t,r,c,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oy({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function og(e,t,r,n,i){let a=await x("android_snapshot_helper_install",async()=>await tx({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 N({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 ov(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await x("android_snapshot_helper_session_capture",async()=>await tE(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){N({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:Q(e).message}}),await oS(t,n.manifest.packageName)}return await x("android_snapshot_helper_capture",async()=>await tN(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oy(e){let t=function(e){var t;let r=Q(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oI(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=o_(e);return new ee(Z(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=o_(e.error);return N({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tC(e.helperDeviceKey),await oS(e.adb,e.artifact.manifest.packageName),tk({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oA(e.device,r,e.adb)}async function oS(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await tc(150),N({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){N({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:Q(e).message}})}}function o_(e){let t=Q(e),r=oI(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 oI(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 ob(e){if(e)return{artifact:e};let t=tS(),r=i.join(t_(),"android-snapshot-helper","dist"),n=i.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(n)}catch{return{}}try{let e=tD(JSON.parse(await w.readFile(n,"utf8"))),t=i.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:Q(e).message}}}async function oA(e,t,r){let n;try{n=await x("android_snapshot_stock_capture",async()=>await oE(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new ee(Z((r=Q(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 ox(e,t,r,n){if(!t.some(e=>ty(e.type)))return new Map;let i=oN(t);if(i.size>0||oM(r))return i;let a=await oC(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,c]=e.slice(1);if(void 0===i||void 0===a||void 0===o||void 0===s||void 0===l||void 0===c)continue;let d=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(c)-p)},children:[]};for(;r.length>1&&d<=r[r.length-1].indent;)r.pop();r[r.length-1].node.children.push(f),r.push({indent:d,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(ty(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=>ol(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||!ty(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=>ol(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=oo(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(!os(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(!os(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?oo(o):a.length>0?oo(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 oM(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oN(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 oE(e,t=tb(e)){try{return await eR(()=>oD(t),{shouldRetry:oP})}catch(t){var r,n;let e;if((r=t)instanceof ee&&"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 ee("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 oD(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=ok(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}),c=(t=l.stdout,r=l.stderr,n=`${t}
|
|
5
|
-
${r}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!
|
|
6
|
-
${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
|
|
7
|
-
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oR(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 oT=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oO=/^close app$/i,oL="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function o$(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await oV(r)}catch(e){return N({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=oH(t);if(!n?.rect)return{status:"absent"};try{let e=await oB(r,n);if(!e.ok)return N({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 oK(r))return N({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 eL(r.device,r.appBundleId),!await oW(r,r.appBundleId)))return N({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 N({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 N({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 oF(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await eC(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oU(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 oq({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 oq({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${oj(a)}. Automatic recovery failed.`,hint:oL})}throw oq({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${oj(a)}.`,hint:oL})}async function oU(e){try{return await oG(e)}catch(t){return N({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 oG(e){if(!e.appBundleId)return!1;let t=oH(await oV(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await oB(e,t);if(!r.ok)return!1;await eL(e.device,e.appBundleId);let n=await oW(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&N({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 oq(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new ee("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function oj(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function oV(e){return eD(tw((await ou(e.device,{interactiveOnly:!1,compact:!1})).nodes))}async function oB(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=eE(t.rect),i=await ek(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 oH(e,t={}){if(!1===t.requireDialogSignal||oX(e))return e.find(e=>oJ(e).some(e=>oO.test(e))&&e.rect)}async function oK(e){for(let t=0;t<12;t+=1){if(!oX(await oV(e)))return!0;await tc(500)}return!oX(await oV(e))}async function oW(e,t,r={}){for(let n=0;n<12;n+=1){if(await oz(e,t,r))return!0;await tc(500)}return await oz(e,t,r)}async function oz(e,t,r){return!(r.requireNoBlockingDialog&&await eC(e.device))&&(await eV(e.device)).package===t}function oJ(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 oX(e){return e.some(e=>{let t=oJ(e).join(" ").trim();return t.length>0&&oT.test(t)})}function oZ(e){return!!(e&&e.width>0&&e.height>0)}function oY(e){return e.width*e.height}function oQ(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 o0=[255,59,48,255],o1=[255,214,10,255],o2=[0,0,0,255],o3=["scroll","list","recyclerview","edittext","textfield"],o4=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],o5={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 o8(e){let t=await s.readFile(e.screenshotPath),r=await O(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)o7(r)&&oZ(r.rect)&&(!t||oY(r.rect)>oY(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&&oZ(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 oZ(e.rect)&&!("image"===th((t=e).type??"")&&!st(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(sr)||sn(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!oZ(r.rect)||o7(r))return!1;let n=th(r.type??"");return!(o3.some(e=>n.includes(e))||t&&oY(r.rect)>.25*oY(t))}(e,t,r)||(o9(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 o9(e)&&!o7(e)}(s=n)?s:null,tm(o,s,e=>(function(e){return o9(e)&&!o7(e)})(e)),s.hittable?s:null,tm(o,s,e=>!0===e.hittable)].find(se)??null);if(!l?.rect||!oZ(l.rect))continue;let c=function(e,t,r){let n=si(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=si(n);if(!i)continue;let a=function(e){let t=0;return th(e.type??"").includes("text")&&(t+=2),sr(e.label)&&(t+=2),sr(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||si(t)}(n,l,e.nodes),d=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),o9(t)&&(n+=3),o9(e)&&(n+=2),r&&(n+=2),sn(t.identifier)&&(n+=1),st(t.value)&&(n+=1),n}(n,l,c),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=o9,i=e=>!!si(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)&&oZ(t.rect)&&oQ(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),c=Math.round(i.height+2*s);return c<=0||c>=n.height?null:{x:n.x,y:l,width:n.width,height:c}}(t,r,i))??t.rect)}(e,l,e.nodes),p=o6(e,i,u,t,r);if(!oZ(p))continue;let f=a.get(l.ref);(!f||d>f.score)&&a.set(l.ref,{ref:l.ref,label:c,rect:l.rect,overlayRect:p,score:d})}return function(e,t,r,n,i){let a=D(e.nodes).primaryAction;if(!a?.ref||!a.rect||!oZ(a.rect))return;let o=o6(e,t,a.rect,n,i);if(!oZ(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)=>oY(e.overlayRect)-oY(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(oQ(e.overlayRect,r.overlayRect)||oQ(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}oY(r.overlayRect)<oY(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(su).slice(0,n.maxRefs??24).sort(sd).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:eE(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)ss(e,t.x,t.x+t.width-1,t.y+n,r),ss(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sl(e,t.x+n,t.y,t.y+t.height-1,r),sl(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,o0),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=so(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:so(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)sc(e,t+o,r+a,i)})(e,i,o,n,o1),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=o5[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]&&sc(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,o2)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await R(r)),n}function o6(e,t,r,n,i){if("android"===e.backend||!t)return sa(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 sa({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 o9(e){let t=[e.type,e.role,e.subrole].map(e=>th(e??"")).join(" ");return o4.some(e=>t.includes(e))}function o7(e){let t=[e.type,e.role,e.subrole].map(e=>th(e??"")).join(" ");return t.includes("application")||t.includes("window")}function se(e){return!!(e?.rect&&oZ(e.rect)&&!o7(e))}function st(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sr(e){var t;let r;return!!st(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sn(e){var t;return"string"==typeof e&&!!sr(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function si(e){let t=[e.label,e.value].find(sr);return t?t.trim():sn(e.identifier)?e.identifier.trim():void 0}function sa(e,t,r){let n=so(e.x,0,Math.max(0,t-1)),i=so(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:so(e.width,1,a),height:so(e.height,1,o)}}function so(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function ss(e,t,r,n,i){for(let a=t;a<=r;a+=1)sc(e,a,n,i)}function sl(e,t,r,n,i){for(let a=r;a<=n;a+=1)sc(e,t,a,i)}function sc(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 sd(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 su(e,t){return t.score!==e.score?t.score-e.score:sd(e,t)}function sp(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 sf=new WeakMap;function sm(e){if(!e)return;let t=sf.get(e);if(t)return t;let r=sh(e.nodes??[]);if(r)return sf.set(e,r),r}let sh=ta,sw={referenceWidth:1e3,referenceHeight:1e3};function sg(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,c,d,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},_=sx(S.effectiveDurationMs)??sx(S.durationMs),I={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sx(S.gestureStartUptimeMs),gestureEndUptimeMs:sx(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},b="number"==typeof(s={gestureStartUptimeMs:sx(S.gestureStartUptimeMs),gestureEndUptimeMs:sx(S.gestureEndUptimeMs),reportedDurationMs:_,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),A="ios"===e.device.platform&&void 0===sx(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sM(sx(t.count),1)??1,r=!0===t.doubleTap,n=sM(sx(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 sp(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...I,gestureDurationMs:b}):sp(I),x=(l=e.snapshot,w=sx((c=S).referenceWidth),g=sx(c.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sm(l)),M=(d=t,u=r,p=S,f=A,m=b,h=x,v=sv[d],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),N({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:A,gestureDurationMs:b,kinds:M.map(e=>e.kind)}}))}let sv={click:(e,t,r,n,i)=>sy(e,t,r,i),press:(e,t,r,n,i)=>sy(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sy(e,t,r,i):[],fill:(e,t,r,n,i)=>sS(e,t,r,i),focus:(e,t,r,n,i)=>sS(e,t,r,i),longpress:function(e,t,r,n,i){let a=sN(t,e);if(!a)return[];let{x:o,y:s}=a;return[sb(r,o,s,sk(n,[sx(t.durationMs),sx(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sE(t,e),o=sA(t.contentDirection)??sA(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:c,y2:d}=a,u=sk(n,[],250),p=sx(t.amount)??sx(e[1]),f=sx(t.pixels);return[{kind:"scroll",tMs:r,x:s,y:l,x2:c,y2:d,...i,durationMs:u,contentDirection:o,...void 0!==p?{amount:p}:{},...void 0!==f?{pixels:f}:{}}]},pan:s_,fling:s_,swipe:s_,pinch:function(e,t,r,n,i){let a=sN(t,e,1),o=sx(t.scale)??sx(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:sk(n,[],280)}]}};function sy(e,t,r,n){let i=sN(t,e);if(!i)return[];let{x:a,y:o}=i,s=sM(sx(t.count),1)??1,l=sM(sx(t.intervalMs),0)??0,c=!0===t.doubleTap,d=sM(sx(t.holdMs),1),u=[];for(let e=0;e<s;e+=1){let t=r+e*l;if(void 0!==d&&d>0){u.push(sb(t,a,o,d,n));continue}u.push(sI(t,a,o,n)),c&&u.push(sI(t+90,a,o,n))}return u}function sS(e,t,r,n){let i=sN(t,e);if(!i)return[];let{x:a,y:o}=i;return[sI(r,a,o,n)]}function s_(e,t,r,n,i){let a=sE(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:c}=a,d=sk(n,[sx(t.effectiveDurationMs),sx(t.durationMs),sx(e[4])],250),u=sM(sx(t.count),1)??1,p=sM(sx(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,b;let A,{startX:x,startY:M,endX:N,endY:E}=(n=t,a=f,u=o,m=s,h=l,w=c,"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*(d+p),v=x,y=M,S=N,_=E,I=d,"back-swipe"===(A=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,_,b=i))?{kind:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I,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:A,tMs:g,x:v,y,x2:S,y2:_,...b,durationMs:I}})}function sI(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sb(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sA(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 sx(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 sM(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sN(e,t,r=0){let n=sx(e.x)??sx(t[r]),i=sx(e.y)??sx(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sE(e,t){let r=sD(e.x1,e.x,t[0]),n=sD(e.y1,e.y,t[1]),i=sD(e.x2,t[2]),a=sD(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 sD(...e){return e.map(sx).find(e=>void 0!==e)}function sk(e,t,r){return sM(e,1)??t.map(e=>sM(e,1)).find(e=>void 0!==e)??r}let sP={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sC(e){var t,r,n,i,a,o,s;let l,c,d,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?sP[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:eY}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:_}=v,I=await sT(m,y);if(I)return I;let b=await sR(m,y);if("response"in b)return b.response;let{resolvedPositionals:A,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(c=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[tZ.expandHome(l,i),...n.slice(1)]:n),u=(d=(a=r.flags?.out,o=r.meta?.cwd,a?tZ.expandHome(a,o):a))?{...r.flags??{},out:d}:r.flags??{},{resolvedPositionals:c,resolvedOut:d,recordedPositionals:c,recordedFlags:u}):{resolvedPositionals:p=(s=t).positionals??[],resolvedOut:s.flags?.out,recordedPositionals:p,recordedFlags:s.flags??{}},E=Date.now(),D={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},k=await sO({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:A,out:x,dispatchContext:D}),P=await sR(m,y,"after-command");if("response"in P)return P.response;"status"in b&&"recovered"===b.status&&(!k||"object"==typeof k)&&((k??={}).warning=b.warning);let C=Date.now(),R=_===y?M:f.positionals??[],T=_===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:c,actionFinishedAt:d,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sm(e.snapshot),a={...n??{}},o=sA(a.direction)??sA(r[0]);if(!o)return n;let s=sx(a.amount)??sx(r[1]),l=sx(a.pixels),c=sE(a,[]),d=sx(a.referenceWidth),u=sx(a.referenceHeight),p=void 0!==d&&d>0&&void 0!==u&&u>0?{referenceWidth:d,referenceHeight:u}:i??sw;if(c&&(c.x1!==c.x2||c.y1!==c.y2))return{...a,x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,contentDirection:o,...void 0!==s?{amount:s}:{},...void 0!==l?{pixels:l}:{},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:250};let f=ts({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);sg(t,n,a,p,u,c,d),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:_,resolvedPositionals:A,recordedPositionals:R,recordedFlags:T,data:k,actionStartedAt:E,actionFinishedAt:C,flags:f.flags??{}}),ap(y)&&ac(m,y),ab(m,y,A,f.flags),{ok:!0,data:k??{}}}async function sR(e,t,r="before-command"){if("android"!==e.device.platform||ns(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oF({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:Q(e)}}}}async function sT(e,t){if(!iu(t,e.device)){var r;let n=(r=e.device,id[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 o$({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sO(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await nQ(r.device,n,a,o,{...s});let l=await oi({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 sL(r,l,e.logPath),l}async function sL(e,t,r){let n={snapshotInteractiveOnly:!0,snapshotCompact:!0},i=a6(await aQ({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);or(e,i);let a=await o8({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let s$=sY(()=>import("./lease.js")),sF=sY(()=>import("./session.js").then(e=>e.session_namespaceObject)),sU=sY(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sG=sY(()=>import("./react-native.js")),sq=sY(()=>import("./record-trace.js")),sj=sY(()=>import("./find.js")),sV=sY(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function sB(e){var t;switch(t=e.req.command,ns(t)?.route??"generic"){case"lease":return await sH(e);case"session":return await sK(e);case"snapshot":return await sW(e);case"reactNative":return await sz(e);case"recordTrace":return await sJ(e);case"find":return await sX(e);case"interaction":return await sZ(e);case"generic":return null}}async function sH(e){let{handleLeaseCommands:t}=await s$();return sQ(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function sK(e){let{handleSessionCommands:t}=await sF();return sQ(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function sW(e){let{handleSnapshotCommands:t}=await sU();return sQ(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function sz(e){let{handleReactNativeCommands:t}=await sG();return sQ(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function sJ(e){let{handleRecordTraceCommands:t}=await sq();return sQ(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function sX(e){let{handleFindCommands:t}=await sj();return sQ(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function sZ(e){let{handleInteractionCommands:t}=await sV();return sQ(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function sY(e){let t;return()=>t??=e()}function sQ(e,t,r){if(r)return r;throw new ee("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let s0=new h;async function s1(e,t,r){let n=s0.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>s0.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function s2(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function s3(e,t){var r,n,i,a;let o,s,l,c,d,u;return e.recording?(r=e,n=t,o=ef(r.name),s=`agent-device close --session ${o}`,l=`agent-device record stop --session ${o}`,c="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}. ${c} Run agent-device session list to inspect active sessions.`):(i=e,a=t,d=ef(i.name),u=`agent-device close --session ${d}`,"selector-conflict"===a?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${d} 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 ${d}. To open a new session on this device, first run ${u}.`)}function s4(e,t){if(!t)return[];let r=[],n=e.device,i=ex(t.platform);if(i&&!e_(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=eq(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function s5(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 s8="default";function s6(e){return e.session||s8}function s9(e){if(e.meta?.sessionExplicit===!0||(e.session||s8)!==s8||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=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var n;return{kind:"cwd",id:(n=t,r.createHash("sha256").update(n).digest("hex").slice(0,16))}}}function s7(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function le(e,t){let r=s9(e);return!!r&&!!t.sessionScope&&!s7(t,r)}function lt(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}function lr(e,t){var r,n,i,a,o,s,l,c,d,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,ns(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?s4(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=ex(i),void 0!==n.platform&&m&&(a=ex(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!eb(o):"apple"!==o||!eb(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,c=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":return"desktop"!==e;case"apple":return!1;default:return li(t)}}(h,c)&&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"===ex(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return li(e)}}(r,t)){let r=t[n];ne(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return d=v,u=t,p=g,!S||u||void 0!==p.platform||d&&nt(p,r7)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){ln(e,t),e.platform=n.device.platform;return}ln(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new ee("INVALID_ARGS",function(e,t,r){let n=t.map(s5).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${s2(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(s5),hint:function(e,t){if(t)return s3(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${ef(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 ln(e,t){for(let r of t)delete e[r.key]}function li(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function la(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lo(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lr(e)}catch{return e}}(n);if("open"===(r=l).command||nt(r.flags,r9))try{let e=await r0(l.flags??{});s.add(lo(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=ls(e)-ls(t);return 0!==r?r:e.localeCompare(t)})}function lo(e){return`device:${e}`}function ls(e){return+!e.startsWith("session:")}function ll(e,t={}){let r=eP(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lc(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:ll(t,{simulatorSetPath:e.simulatorSetPath})}function ld(e,t,r){return iM(lc(e,t),r)}let lu="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 lp(e){if(!(e instanceof ee)||"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 lf(e){return!(e instanceof ee)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lm(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new ee("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:e$({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:eU("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lh(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)",c=e$({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new ee("COMMAND_FAILED",l,{port:a,logPath:o,xcodebuild:{exitCode:s.exitCode,stdout:s.stdout,stderr:s.stderr},reason:c,hint:(t=s.stdout,r=s.stderr,(n=`${l}
|
|
1
|
+
let e;import{__webpack_require__ as t}from"./rslib-runtime.js";import r,{createHash as n}from"node:crypto";import i from"node:path";import a,{existsSync as o,promises as s}from"node:fs";import l from"node:http";import{fileURLToPath as d,pathToFileURL as c}from"node:url";import"node:https";import u from"node:os";import{once as p}from"node:events";import{Transform as f}from"node:stream";import{pipeline as m}from"node:stream/promises";import{AsyncLocalStorage as h}from"node:async_hooks";import w from"node:fs/promises";import g from"node:net";import{setTimeout as y}from"node:timers/promises";import{resolveUserPath as v}from"./3267.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as I,parseScrollDirection as A,isStringMember as _,isReactNativeCollapsedWarningWrapperWithVisibleBanner as b,deriveMobileSnapshotHiddenContentHints as x,resolveClickButton as M,inferVerticalScrollIndicatorDirections as N,withSuccessText as D,runScrollEdgePasses as k,splitNonEmptyTrimmedLines as P,annotateCoveredSnapshotNodes as E,parseSwipePreset as C,analyzeReactNativeOverlay as R,readLocationCoordinate as O,getClickButtonValidationError as T,areRectsApproximatelyEqual as L,isSystemScrollIndicatorLabel as $,formatScrollEdgeMessage as F,SWIPE_PATTERNS as U,successText as G,screenshotOptionsFromFlags as q,captureScrollEdgeState as j,normalizeSnapshotTree as V,isReactNativeCollapsedWarningWrapperCandidate as B,screenshotFlagsFromOptions as H,snapshotCaptureAnnotationsFrom as K,parseStringMember as W,requireIntInRange as z,inferGestureReferenceFrame as X,parseDeviceRotation as J,buildScrollGesturePlan as Z,buildSwipePresetGesturePlan as Y}from"./6133.js";import{withDiagnosticsScope as Q,getDiagnosticsMeta as ee,flushDiagnosticsToSessionFile as et,withDiagnosticTimer as er,updateDiagnosticsScope as en,emitDiagnostic as ei}from"./7599.js";import{formatScriptStringLiteral as ea,terminatePngWorker as eo,prewarmPngWorker as es,formatPortableActionLine as el,formatScriptArg as ed,isKeyboardAction as ec,encodePngAsync as eu,createAgentDevice as ep,localCommandPolicy as ef,isTouchTargetCommand as em,appendScriptSeriesFlags as eh,decodePngAsync as ew,isClickLikeCommand as eg,findMistargetedTypeRefToken as ey}from"./123.js";import{readProcessStartTime as ev,readProcessCommand as eS,resolveRuntimeTransportHints as eI,isProcessGroupAlive as eA,isAgentDeviceDaemonProcess as e_,isProcessAlive as eb}from"./8656.js";import{toAppErrorCode as ex,asAppError as eM,normalizeError as eN,AppError as eD}from"./9152.js";import{runCmdBackground as ek,runCmdStreaming as eP,runCmd as eE,runCmdSync as eC,resolveExecutableOverridePath as eR,whichCmd as eO}from"./9818.js";import{consumeTextLines as eT,serializeDaemonResponseEnvelope as eL,normalizeTenantId as e$,shouldStreamRequestProgress as eF,resolveDaemonPaths as eU,resolveSessionIsolationMode as eG,shellQuoteIfNeeded as eq,resolveDaemonServerMode as ej,recordSnapshotTiming as eV,resolveDaemonCodeSignature as eB,serializeDaemonProgressEnvelope as eH,serializeDaemonRpcResponseEnvelope as eK}from"./4012.js";import{sleep as eW}from"./4829.js";import{resolveAppleSimulatorSetPathForSelector as ez,normalizeRef as eX,resolveApplePlatformName as eJ,matchesPlatformSelector as eZ,snapshotPresentationOptionsFromFlags as eY,isApplePlatform as eQ,findNodeByRef as e0,normalizePlatformSelector as e1,resolveDevice as e2,buildSnapshotPresentationKey as e3,centerOfRect as e5,attachRefs as e4}from"./9616.js";import{runAndroidAdb as e8,resolveIosSimulatorDeviceSetPath as e6,getAndroidBlockingDialogFocus as e9,withRetry as e7,Deadline as te,isEnvTruthy as tt,openAndroidApp as tr,classifyBootFailure as tn,streamAndroidLogcatWithAdb as ti,bootFailureHint as ta,androidDeviceForSerial as to,parseSerialAllowlist as ts,retryWithPolicy as tl,getAndroidAppState as td,classifyAndroidAppTarget as tc,captureAndroidLogcatWithAdb as tu,resolveAndroidSerialAllowlist as tp,isDeepLinkTarget as tf,formatAndroidInstalledPackageRequiredMessage as tm}from"./8806.js";import{PUBLIC_COMMANDS as th,INTERNAL_COMMANDS as tw,GESTURE_SUBCOMMAND_ERROR as tg}from"./6088.js";import{findNearestAncestor as ty,normalizeType as tv,pruneGroupNodes as tS,findNodeByLabel as tI,resolveRefLabel as tA}from"./7847.js";import{isScrollableType as t_}from"./4778.js";import{readVersion as tb,findProjectRoot as tx}from"./9671.js";import{resolveAndroidAdbProvider as tM,resolveAndroidAdbExecutor as tN}from"./9639.js";import{parseUiHierarchy as tD,ensureAndroidSnapshotHelper as tk,parseUiHierarchyTree as tP,captureAndroidSnapshotWithHelper as tE,captureAndroidSnapshotWithHelperSession as tC,parseAndroidSnapshotHelperManifest as tR,forgetAndroidSnapshotHelperInstall as tO,buildUiHierarchySnapshot as tT,stopAndroidSnapshotHelperSession as tL}from"./221.js";import{applyCommandDefaults as t$}from"./1352.js";var tF,tU,tG={};t.r(tG),t.d(tG,{IH:()=>ph,ug:()=>pw,sE:()=>po,Bx:()=>pl,hQ:()=>ps,WX:()=>pm,Co:()=>pc,wg:()=>pf,withAppLogProvider:()=>pn});var tq={};t.r(tq),t.d(tq,{IO:()=>i3,LB:()=>i2,xY:()=>i4,eN:()=>i5,runMacOsPressAction:()=>i9,runMacOsReadTextAction:()=>i6,rR:()=>i7,r5:()=>i8});var tj={};t.r(tj),t.d(tj,{bu:()=>dP,abortAllIosRunnerSessions:()=>cY,hv:()=>cz,Nr:()=>ux,gE:()=>ub,FS:()=>dD,runIosRunnerCommand:()=>u_,stopAllIosRunnerSessions:()=>cQ,yA:()=>cZ});var tV={};t.r(tV),t.d(tV,{v:()=>ur,M:()=>un,withAppleRunnerProvider:()=>ui});var tB={};t.r(tB),t.d(tB,{ensureBootedSimulator:()=>mq,SA:()=>mV,EB:()=>mU,N3:()=>mj});var tH={};t.r(tH),t.d(tH,{qx:()=>i$,Ly:()=>iG,Gr:()=>iT,vT:()=>iF,Cc:()=>iU,withAppleToolProvider:()=>iL});var tK={};t.r(tK),t.d(tK,{readLinuxTextAtPoint:()=>av,r:()=>ay});var tW={};function tz(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tW),t.d(tW,{uK:()=>an,nE:()=>aa,withLinuxToolProvider:()=>ai});let tX=["platform","device","udid","serial","out","verbose","metroHost","metroPort","bundleUrl","launchUrl","snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw",...S,"relaunch","saveScript","noRecord","fps","quality","hideTouches","count","intervalMs","delayMs","holdMs","jitterPx","doubleTap","clickButton","pauseMs","pattern"];function tJ(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 tZ(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class tY{sessionsDir;constructor(e){this.sessionsDir=e}write(e){let t;try{if(!e.recordSession)return{written:!1};t=this.resolveScriptPath(e);let r=i.dirname(t);a.existsSync(r)||a.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&&tQ(e.command))return eg(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=tJ(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(!tQ(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=${ea(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,eg(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(ed(r)),t0(e,t),eh(e,t),e.join(" ");if(1===t.positionals.length)return e.push(ed(r)),eh(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(ed(r)),t0(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(ed(n)),eh(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(ed(r)),e.push(ed(n)),n.startsWith("@")&&t0(e,t),e.join(" ")}(t,r):void 0);return n||el(e)}(e));return`${n.join("\n")}
|
|
2
|
+
`}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ei({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 v(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=tz(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function tQ(e){return em(e)||"fill"===e||"get"===e}function t0(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(ed(r))}class t1{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new tY(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=v(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 tX)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ei({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ei({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tz(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,tz(e))}ensureSessionDir(e){let t=this.resolveSessionDir(e);return a.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return i.join(this.resolveSessionDir(e),"app.log")}resolveAppLogPidPath(e){return i.join(this.resolveSessionDir(e),"app-log.pid")}static expandHome(e,t){return v(e,{cwd:t})}}function t2(e){return i.join(e,"runner.log")}function t3(e,t){let r=tz(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let t5="app-log.pid";function t4(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 t8(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:ev(t)??void 0,command:eS(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
|
|
3
|
+
`)}function t6(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}function t9(e,t){let n=r.createHash("sha256").update(e).digest(),i=r.createHash("sha256").update(t).digest();return r.timingSafeEqual(n,i)}let t7=new Set,re=new Map,rt="request_canceled",rr="request canceled";function rn(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 ri(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++}}(re);let t=new AbortController;re.set(e,t),t7.has(e)&&t.abort()}function ra(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++}}(t7),t7.add(e),re.get(e)?.abort())}function ro(e){e&&(t7.delete(e),re.delete(e))}function rs(e){return!!e&&t7.has(e)}function rl(e){if(e)return re.get(e)?.signal}function rd(){return new eD("COMMAND_FAILED",rr,{reason:rt})}function rc(e){if(rs(e))throw rd()}function ru(e){return e instanceof eD&&"COMMAND_FAILED"===e.code&&(e.details?.reason===rt||e.message===rr)}let rp=new Map;function rf(e){let t=r.randomUUID(),n=setTimeout(()=>{rm(t)},9e5);return n.unref(),rp.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rm(e){let t=rp.get(e);if(t&&(clearTimeout(t.timer),rp.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let rh=new Map;function rw(e,t){let r=rh.get(e);if(!r)throw new eD("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rg(e){let t=rh.get(e);t&&(clearTimeout(t.timer),rh.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function ry(e){let t=await rv(e);await eE("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new eD("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rv(e){let t=await eE("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eD("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 eD("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(rS),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 eD("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eD("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 eD("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 eD("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 eD("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eE("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eD("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function rS(e){if(e.includes("\0"))throw new eD("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new eD("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eD("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rI(e,t){return new Promise((r,n)=>{let i,o=!1,s=0,l=a.createWriteStream(t),d=e=>{if(!o){if(o=!0,i&&clearTimeout(i),e)return void rA(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eD("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 f({transform(e,t,r){c();let n=Buffer.isBuffer(e)?e.length:Buffer.byteLength(e,t);(s+=n)>0x80000000?r(new eD("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eD("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),m(e,u,l).then(()=>d(),e=>d(e))})}async function rA(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function r_(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eD("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eD("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 eD("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")}(e.headers["content-length"]);let o=function(e){let t=e.trim(),r=i.basename(t);if(!r||"."===r||".."===r)throw new eD("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"),a.mkdtempSync(i.join(u.tmpdir(),`agent-device-artifact-${t}-`)));try{if("file"===r){let t=i.join(s,o);return await rI(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rI(e,t);let n=await ry({archivePath:t,tempDir:s,platform:"ios",expectedRootName:o});return a.rmSync(t,{force:!0}),{artifactPath:n,tempDir:s}}catch(e){throw a.rmSync(s,{recursive:!0,force:!0}),e}}let rb=new h;async function rx(e,t){return await rb.run(e,t)}function rM(e){rb.getStore()?.(e)}let rN=new Set(["replay","test"]),rD=new Set(["agent_device.command","agent-device.command"]),rk=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rP=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rE={"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"},rC=new Set([...rD,...rk,...rP,...Object.keys(rE)]);function rR(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rO(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rT(e,t){e.destroyed||(e.write(eK(t)),e.end())}function rL(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function r$(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 rF(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rU(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rG(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eD("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rq(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eD("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rj(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=eN(new eD("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rR(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eN(new eD(ex(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rR(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=e$(r.tenantId);if(!e){let e=eN(new eD("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rR(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rV(){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=i.isAbsolute(t)?t:i.resolve(t);try{e=await import(c(n).href)}catch(e){throw new eD("COMMAND_FAILED","Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module",{hookPath:n,error:e instanceof Error?e.message:String(e)})}let a=e[r];if("function"!=typeof a)throw new eD("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rB(e){let t=await rV(),{handleRequest:r,token:n}=e;return l.createServer((e,i)=>{if("GET"===e.method&&"/health"===e.url){i.statusCode=200,i.setHeader("content-type","application/json"),i.end(JSON.stringify({ok:!0}));return}if("POST"===e.method&&"/upload"===e.url)return void rH(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rK(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||rO(i,rR(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rO(i,rR(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rO(i,rR(n.id??null,-32600,"Invalid Request"),400);if(!rC.has(n.method))return void rO(i,rR(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rO(i,rR(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rD.has(e))return{token:r$(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(rk.has(e)){let e,n=rF(t,"platform");if("ios"!==n&&"android"!==n)throw new eD("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:r$(t,r),session:rF(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rF(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eD("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eD("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 eD("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 eD("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 eD("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=rG(e,"owner"),n=rG(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eD("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eD("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eD("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rq(e,"artifactId")}:(a&&(t=rq(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rG(e,"artifactName")})}(t);throw new eD("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:rU(t,"retentionMs")}}}if(rP.has(e)){let e=rF(t,"materializationId")?.trim();if(!e)throw new eD("INVALID_ARGS","Invalid params: materializationId is required");return{token:r$(t,r),session:rF(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rF(t,"requestId"),materializationId:e}}}let n=rE[e];if(n)return{token:r$(t,r),session:rF(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rF(t,"tenantId")??rF(t,"tenant"),runId:rF(t,"runId"),leaseId:rF(t,"leaseId"),leaseTtlMs:rU(t,"ttlMs"),leaseBackend:rF(t,"backend")}};throw new eD("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rD.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rO(i,rR(n.id??null,-32602,"Invalid params: command is required"),400);o=rn(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},ri(o);let u=await rj(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rO(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"||rN.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,ra(o),ei({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&rW(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),eF(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rx(e=>{!i.destroyed&&i.write(eH(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rR(n.id??null,-32e3,e.error.message,e.error);rT(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rO(i,{jsonrpc:"2.0",id:n.id??null,result:h});rO(i,rR(n.id??null,-32e3,h.error.message,h.error),rL(h.error.code))}catch(t){s=!0;let e=eN(t);if(i.headersSent)return void rT(i,rR(n.id??null,-32e3,e.message,e));rO(i,rR(n.id??null,-32e3,e.message,e),rL(e.code))}finally{ro(o)}})})}async function rH(e,t,n,i){try{var a;let o,s,l=await rz({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await r_(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rg(o)},3e5)).unref(),rh.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){rX(t,eN(e))}}async function rK(e,t,r,n){let i=e.url?.slice("/artifacts/".length)??"";if(!i){t.statusCode=400,t.end("Missing artifact id");return}try{let o=await rz({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rp.get(e);if(!r)throw new eD("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rm(e),new eD("COMMAND_FAILED",`Artifact file is missing: ${r.artifactPath}`);return{artifactPath:r.artifactPath,fileName:r.fileName,deleteAfterDownload:r.deleteAfterDownload}}(i,o.tenantId),l=a.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=eN(e);t.statusCode=rL(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rm(i)}),l.pipe(t)}catch(e){rX(t,eN(e))}}async function rW(e){try{let t=Date.now()+15e3;for(;rs(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(tj);if(await t(),!rs(e))break;await eW(200)}}catch(e){ei({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function rz(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=r$({},n.headers),d=(t=l,!(r=o)||t9(t,r)?null:eN(new eD("UNAUTHORIZED","Invalid token")));if(d)return rX(i,d),null;let c=await rj(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 rX(e,t){e.statusCode=rL(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rJ(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function rZ(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function rY(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 eD("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class rQ{leases=new Map;runBindings=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=rY(e.backend),n=e$(e.tenantId);if(!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=rJ(e.runId);if(!i)throw new eD("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(e.ttlMs),o=this.bindingKey(n,i,t),s=this.runBindings.get(o);if(s){let e=this.leases.get(s);if(e)return this.refreshLease(e,a);this.runBindings.delete(o)}this.enforceCapacity(t);let l=this.now(),d={leaseId:r.randomBytes(16).toString("hex"),tenantId:n,runId:i,backend:t,createdAt:l,heartbeatAt:l,expiresAt:l+a};return this.leases.set(d.leaseId,d),this.runBindings.set(o,d.leaseId),{...d}}heartbeatLease(e){let t=rZ(e.leaseId);if(!t)throw new eD("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new eD("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});this.assertOptionalScopeMatch(r,e.tenantId,e.runId);let n=this.resolveLeaseTtlMs(e.ttlMs);return this.refreshLease(r,n)}releaseLease(e){let t=rZ(e.leaseId);if(!t)throw new eD("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);return r?(this.assertOptionalScopeMatch(r,e.tenantId,e.runId),this.leases.delete(t),this.runBindings.delete(this.bindingKey(r.tenantId,r.runId,r.backend)),{released:!0}):{released:!1}}assertLeaseAdmission(e){let t=rY(e.backend),r=e$(e.tenantId);if(!r)throw new eD("INVALID_ARGS","tenant isolation requires tenant id.");let n=rJ(e.runId);if(!n)throw new eD("INVALID_ARGS","tenant isolation requires run id.");let i=rZ(e.leaseId);if(!i)throw new eD("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new eD("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new eD("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}cleanupExpiredLeases(){let e=this.now();for(let t of this.leases.values())t.expiresAt>e||(this.leases.delete(t.leaseId),this.runBindings.delete(this.bindingKey(t.tenantId,t.runId,t.backend)))}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 eD("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 eD("INVALID_ARGS",`Lease ttlMs must be between ${this.minLeaseTtlMs} and ${this.maxLeaseTtlMs}.`);return t}refreshLease(e,t){let r=this.now(),n={...e,heartbeatAt:r,expiresAt:r+t};return this.leases.set(n.leaseId,n),this.runBindings.set(this.bindingKey(n.tenantId,n.runId,n.backend),n.leaseId),{...n}}bindingKey(e,t,r){return`${e}:${t}:${r}`}assertOptionalScopeMatch(e,t,r){let n=e$(t),i=rJ(r);if(t&&!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new eD("INVALID_ARGS","Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(n&&e.tenantId!==n||i&&e.runId!==i)throw new eD("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}async function r0(e){var t;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("./8806.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("./8806.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 r1=new h,r2=new h;async function r3(e,t,r){var n,i;let a=await r5(e,t,r);if(n=t,i=a,!r4(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 eD("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function r5(e,t,r){try{return await e2(e,t,r)}catch(e){var n;if(n=e,!r4(t)&&n instanceof eD&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function r4(e){return!!(e.udid||e.serial||e.deviceName)}async function r8(e){let t=e1(e.platform),r=ez({simulatorSetPath:e6(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tp(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 er("resolve_target_device",async()=>{let o=function(e){let t=r1.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 eD("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nt({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nr(s)?nn(i,await r3(l,s,{simulatorSetPath:r})):nn(i,await e2(l,s,{simulatorSetPath:r}));let d=await r0({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nr(s)?nn(i,await r3(d,s,{simulatorSetPath:r})):nn(i,await e2(d,s,{simulatorSetPath:r}))},a)}async function r6(e){return r1.getStore()?await e():await r1.run(new Map,e)}async function r9(e,t){return e?await r2.run(e,t):await t()}async function r7(e,t){return await r9(e,async()=>await r6(t))}async function ne(e){return await nt(e)??await r0(e)}async function nt(e){let t=r2.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nr(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function nn(e,t){return r1.getStore()?.set(e,{...t}),t}let ni=["platform","target","device","udid","serial"],na=[...ni,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function no(e){return"string"==typeof e&&e.trim().length>0}function ns(e,t){return!!e&&t.some(t=>no(e[t]))}let nl={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},nd=function(e){let t=new Map,r=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);if(t.set(n.command,n),"generic"!==n.route){let e=r.get(n.route)??[];e.push(n.command),r.set(n.route,e)}}return{descriptorsByCommand:t,handlerCommandsByRoute:r}}([...np("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tw.leaseAllocate,tw.leaseHeartbeat,tw.leaseRelease),nu(tw.sessionList,"session",{sessionKind:"inventory",...nl}),nu(th.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nl}),nu(th.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...np("session",{sessionKind:"state"},th.boot,th.shutdown,th.appState),...np("session",{sessionKind:"observability"},th.perf,th.logs,th.network),...np("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===th.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},th.replay,th.test),nu(tw.runtime,"session"),nu(th.clipboard,"session",{replayScopedAction:!0}),nu(th.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...np("session",{},th.install,th.reinstall,tw.installSource),nu(tw.releaseMaterializedPaths,"session",nl),...np("session",{},th.push,th.triggerAppEvent),nu(th.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...np("session",{},th.prepare,th.batch),nu(th.close,"session",{allowInvalidRecording:!0}),...np("snapshot",{replayScopedAction:!0},th.snapshot,th.diff,th.wait,th.alert,th.settings),nu(th.reactNative,"reactNative",{replayScopedAction:!0}),nu(th.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nu(th.trace,"recordTrace"),nu(th.find,"find",{replayScopedAction:!0}),...np("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.click,th.fill,th.longPress,th.press,th.type),...np("interaction",{replayScopedAction:!0},th.get,th.is),...np("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.back,th.gesture,th.home,th.rotate,th.scroll,th.swipe,"pinch"),nu(th.focus,"generic",{androidBlockingDialogGuard:!0}),nu(th.screenshot,"generic",{replayScopedAction:!0}),...np("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nc(e){return nf(e)?.sessionKind}function nu(e,t,r={}){return{command:e,route:t,...r}}function np(e,t,...r){return r.map(r=>nu(r,e,t))}function nf(e){return nd.descriptorsByCommand.get(e)}let nm=[{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("./9639.js");nv(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&eQ(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(tV);nv(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&&eQ(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tH);nv(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(tW);nv(t,e.linuxTool,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(tG);nv(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");nv(t,e.recording,r)}}];async function nh(e,t){let r=await nw(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await ny(r);return await nS(i,async()=>await t(n))}async function nw(e){var t,r,n;if(t=e.providers,!nm.some(e=>!!t[e.resolverKey]))return{};let i=await ng(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nm.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function ng(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nf(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nf(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nf(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:ns(e.flags,ni)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await r8(e.flags??{});case"skip":return}}async function ny(e){let t=[];for(let r of nm)await r.appendWrapper(e,t);return t}function nv(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nS(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nI(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"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nA=/^[A-Za-z0-9_.:-]{1,64}$/,n_="--launch-console is supported only for iOS simulator app launches",nb="--launch-console requires a direct app launch and cannot be used with URL opens",nx=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nM(e,t){if(t<=0)return[0,0];let[r,n]=nx[e%nx.length];return[r*t,n*t]}async function nN(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eW(t)}let nD=["tap","doubleTap","longPress","drag"];function nk(e,t,r){return new eD("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nP(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw nk(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nE(e,t){if(!Array.isArray(e)||0===e.length)throw new eD("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eD("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)&&nD.includes(r)))throw nk(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${nD.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw nk(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 nk(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nP(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nP(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nC(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 eD(ex(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 nR(e,t){let{x:r,y:n}=nG(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,...G(`Long pressed (${r}, ${n})`)}}async function nO(e,t){let{x:r,y:n}=nG(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...G(`Focused (${r}, ${n})`)}}async function nT(e,t,r){let n=ey(t[0]);if(n)throw new eD("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 eD("INVALID_ARGS","type requires text");let a=z(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...G(n9("Typed",i))}}async function nL(e,t,r){if(r?.directElementSelector)return await n$(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 eD("INVALID_ARGS","fill requires x y text");let o=z(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...G(n9("Filled",a))}}async function n$(e,t,r,n){if(!e.fillElementSelector)throw new eD("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eD("INVALID_ARGS","fill requires text");let a=z(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...G(n9("Filled",i))}}async function nF(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await nU(t,n.directElementSelector);let{x:o,y:s}=nG(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nq(o,s,n);let l=M(n);if("primary"!==l)return await nj(e,o,s,l,n);let d=(a=n,{count:nB(a?.count,1,"count",1,200),intervalMs:nB(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:nB(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:nB(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eD("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eD("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,eQ(e.platform)&&i>1)?await nK(e,o,s,d,n):await nW(t,o,s,d)}async function nU(e,t){if(!e.tapElementSelector)throw new eD("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...G(`Tapped ${t.raw}`)}}function nG(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eD("INVALID_ARGS",t,r);return{x:n,y:i}}async function nq(e,t,r){let n=M(r);if("primary"!==n)throw new eD("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tq);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...G(n8({x:e,y:t}))}}async function nj(e,t,r,n,i){if(function(e,t,r){let n=T({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 nV(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tj);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},nz(i)),{x:t,y:r,button:n,...G(n8({x:t,y:r,button:n}))}}async function nV(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,...G(n8({x:e,y:t,button:r}))}}function nB(e,t,r,n,i){return z(void 0===e?t:e,r,n,i)}async function nH(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(tj),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,nE(t,r?.appBundleId),nz(r));n??=c,i=c;try{o=nC(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eD)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eD(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 nK(e,t,r,n,i){var a,o,s,l;let d,c,u=await nH(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]=nM(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,...G(n8({x:t,y:r}))}}async function nW(e,t,r,n){let i;return await nN(n.count,n.intervalMs,async a=>{let[o,s]=nM(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}}),D({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},n8({x:t,y:r}))}function nz(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId}}async function nX(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 eD("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await nZ({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nJ(e,t,r,n){let i=C(r[0]),a=r[1]?Number(r[1]):300,o=X((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eD("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=Y(i,o,{platform:e.platform});return await nZ({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function nZ(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=z(l,"durationMs",16,1e4),u=z(n?.count??1,"count",1,200),p=z(n?.pauseMs??0,"pause-ms",0,1e4),f=n?.pattern??"one-way";if(!_(U,f))throw new eD("INVALID_ARGS",`Invalid pattern: ${f}`);if(eQ(t.platform)&&u>1){let e=await nH(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,...G(n6(u,f))}}return await nN(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)}),D({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}`:n6(u,f))}async function nY(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 eD("INVALID_ARGS","gesture pan requires x y dx dy [durationMs]");let o=z(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??{},...G(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function nQ(e,t){let r=W(I,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 eD("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eD("INVALID_ARGS",`${t} must be a positive number`);return e}(t[3]?Number(t[3]):180,"distance"),o=z(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,...G(`Flung ${r}`)}}async function n0(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new eD("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new eD("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new eD("INVALID_ARGS","scroll accepts either a relative amount or --pixels, not both");let s="bottom"===(n=i)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:A(n)},l={},d=0;if(s.edge){let t=s.edge,n=await k({edge:t,captureState:async n=>await n1(e,r,t,n),scroll:async()=>await e.scroll(s.direction,{amount:a,pixels:o})});l=n.result??{},d=n.passes}else l=await e.scroll(s.direction,{amount:a,pixels:o}),d=1;return D({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},F(s.direction,s.edge,d,a,o))}async function n1(e,t,r,n){if("function"!=typeof e.snapshot)throw new eD("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await j({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function n2(e,t,r,n){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eD("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 eD("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...G(`Pinched to scale ${i}`)}}async function n3(e,t,r){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eD("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 eD("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 eD("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 eD("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 eD("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,...G(`Rotated gesture ${n} degrees`)}}async function n5(e,t,r){if("tv"===e.target)throw new eD("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eD("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 eD("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eD("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:z(Number(e[6]),"durationMs",16,1e4)}}(r),a=await t.transformGesture(i);return{...i,...a,...G(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function n4(e,t,r){let{x:n,y:i}=nG(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(tK);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(tq);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tj),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});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function n8(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function n6(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function n9(e,t){return`${e} ${Array.from(t).length} chars`}function n7(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eD("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new eD("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof eD)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eD("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new eD("COMMAND_FAILED",`Unable to read ${n} file: ${o}`,{cause:String(t)})}if((r=i.trim()).startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))return{kind:"inline",text:i};throw new eD("INVALID_ARGS",`${n} file not found: ${o}`)}async function ie(e){let t=n7(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await it(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eD("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eD)throw t;throw new eD("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function it(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eD("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eD("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eD("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eD("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function ir(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath},o=await nI(e,a);return ei({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await er("platform_command",async()=>await ii(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ii(e,t,r,n,i,a,o){switch(r){case"open":return await ia(e,t,n,a);case"close":{let e=n[0];if(!e)return{closed:"session",...G("Closed session")};return await t.close(e),{app:e,...G(`Closed: ${e}`)}}case"press":return await nF(e,t,n,a);case"swipe":return await nX(e,t,n,a);case"swipe-preset":return await nJ(e,t,n,a);case"pan":return await nY(t,n);case"fling":return await nQ(t,n);case"longpress":return await nR(t,n);case"focus":return await nO(t,n);case"type":return await nT(t,n,a);case"fill":return await nL(t,n,a);case"scroll":return await n0(t,n,a);case"pinch":return await n2(e,t,n,a);case"rotate-gesture":return await n3(e,t,n);case"transform-gesture":return await n5(e,t,n);case"trigger-app-event":return await io(e,t,n,a);case"screenshot":return await is(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...G("Back")};case"home":return await t.home(),{action:"home",...G("Home")};case"rotate":{let e=J(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...G(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...G("Opened app switcher")};case"clipboard":return await il(t,n);case"keyboard":return await id(e,n,a,o);case"settings":return await ip(e,t,n,a);case"push":return await im(e,n,a);case"snapshot":return await ih(t,a);case"read":return await n4(e,n,a);default:throw new eD("INVALID_ARGS",`Unknown command: ${r}`)}}async function ia(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eD("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eD("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eD("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...G("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eD("UNSUPPORTED_OPERATION",n_);if("linux"===e.platform&&s&&s.length>0)throw new eD("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tf(i))throw new eD("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tf(a))throw new eD("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eD("INVALID_ARGS",nb);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...G(`Opened: ${i}`)}}if(o&&tf(i))throw new eD("INVALID_ARGS",nb);if(n?.clearAppState){if(tf(i))throw new eD("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}:{},...G(`Opened: ${i}`)}}async function io(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eD("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nA.test(t))throw new eD("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 eD("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 eD("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 eD("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eD)throw t;throw new eD("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 eD("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 eD("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",...G(`Triggered app event: ${i}`)}}async function is(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=q(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...G(`Saved screenshot: ${a}`)}}async function il(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eD("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eD("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eD("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,...G("Clipboard updated")}}async function id(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!ec(i))throw new eD("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eD("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await ic(e,i);if("ios"===e.platform)return await iu(e,i,r,n);throw new eD("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function ic(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...G("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./8133.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("./8133.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 iu(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eD("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(tj),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...G("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tj),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...G(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function ip(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eD("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eD("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ei({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?D({setting:i,state:"clear",...s},iw(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...G(`Cleared user data for ${r}`)}}if(!a)throw new eD("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:O(o,"latitude"),longitude:O(s,"longitude")}:void 0;ei({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?D({setting:i,state:a,...u},iw(u)??`Updated setting: ${i}`):{setting:i,state:a,...G(`Updated setting: ${i}`)}}async function im(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eD("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await ie(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...G(`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,...G(`Pushed notification to ${n}`)}}async function ih(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,surface:t?.surface})}function iw(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ig=e=>"macos"!==e.platform,iy=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iv=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,iS={device:!0},iI={},iA={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},i_={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:ig},ib={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,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:iI,supports:e=>"android"===e.platform||iy(e),unsupportedHint:iv},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:e=>"android"===e.platform||iy(e),unsupportedHint:iv},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:e=>"android"===e.platform||iy(e),unsupportedHint:iv},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:ig},open:iA,close:iA,reinstall:i_,install:i_,"install-from-source":i_,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:ig},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:iI},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,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:iI,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:iS},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},snapshot:iA,diff:iA,screenshot:iA,wait:iA,get:iA,find:iA,is:iA,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS,supports:ig},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:ig},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,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:iS},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iS},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI,supports:e=>"android"===e.platform||"macos"===e.platform||"simulator"===e.kind},"trigger-app-event":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iI},type:iA};function ix(e,t){let r=ib[e];if(!r)return!0;let n=eQ(t.platform)?r.apple:"linux"===t.platform?r.linux:r.android;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function iM(e,t=e=>e){let r=new h;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 iN(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iD(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 eD("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 eD("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 eD("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 eD("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 eD("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await ik(e,t,r)}}async function ik(e,t,r){let n=["/Applications","/System/Applications",i.join(u.homedir(),"Applications")],a=new Set;for(let t of n){let r=await s.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&&a.add(t)}}return iN((await Promise.all(Array.from(a).map(async e=>{let r=await iP(e,t).catch(()=>({})),n=r.bundleId;return n?{bundleId:n,name:r.appName??i.basename(e,".app")}:null}))).filter(e=>null!==e).sort((e,t)=>e.name.localeCompare(t.name)),r)}async function iP(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iE(e,"CFBundleIdentifier"),i=iE(e,"CFBundleDisplayName"),a=iE(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iE(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iC={runCommand:eE,simctl:{run:async(e,t)=>await eE("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eE("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iq(eE,e)},macosHost:iD(eE,async e=>await iq(eE,e)),whichCommand:eO},iR=iM(iC,function(e){return"function"==typeof e?iO({runCommand:e}):iO(e)});function iO(e={}){let t={...iC,...e},r=e.plist??{readJson:async e=>await iq(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??iD(t.runCommand,async e=>await r.readJson(e))}}function iT(e){return iR.resolve(e)}async function iL(e,t){return await iR.run(e,t)}function i$(){return iR.hasScope()}async function iF(e,t,r){return await iT().runCommand(e,t,r)}async function iU(e,t){let r=iT(),[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 iF("xcrun",e,t)}async function iG(e){return await iT().plist?.readJson(e)??null}async function iq(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 ij="agent-device-macos-helper",iV="AGENT_DEVICE_MACOS_HELPER_BIN",iB=i.join(u.homedir(),".agent-device","macos-helper","current"),iH=i.join(iB,"manifest.json"),iK=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iW(e){let t=e.trim();if(!iK.test(t))throw new eD("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function iz(e,t){t.bundleId&&e.push("--bundle-id",iW(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iX(){return function(e){let t=i.dirname(e);for(;;){let e=i.join(t,"macos-helper");if(o(i.join(e,"Package.swift")))return e;let r=i.dirname(t);if(r===t)break;t=r}throw new eD("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(d(import.meta.url))}async function iJ(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let r=i.join(e,t.name);return t.isDirectory()?".build"===t.name?[]:await iJ(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function iZ(e){let t=await iJ(e),r=n("sha256");for(let n of t)r.update(i.relative(e,n)),r.update("\0"),r.update(await s.readFile(n)),r.update("\0");let a=await iF("swift",["--version"],{allowFailure:!0,cwd:e,timeoutMs:1e4});return r.update("swift-version"),r.update("\0"),r.update(a.stdout||a.stderr||`exit:${a.exitCode}`),r.update("\0"),r.digest("hex")}async function iY(){try{let e=JSON.parse(await s.readFile(iH,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function iQ(){let e=await eR(process.env[iV],iV);if(e)return e;let t=iX(),r=await iZ(t),n=i.join(iB,ij);try{if(await iY()===r)return await s.access(n),n}catch{}let a=i.join(iX(),".build","release",ij);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iF("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iB,{recursive:!0});let o=`${n}.tmp`;return await s.copyFile(a,o),await s.rename(o,n),await s.chmod(n,493),await s.writeFile(iH,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
+
`,"utf8"),n}async function i0(){let e=process.env[iV]?.trim();if(e){let t=await eR(e,iV);if(t)return t}if(i$())return ij;if("darwin"!==process.platform)throw new eD("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await iQ()}async function i1(e){let t={allowFailure:!0,timeoutMs:3e4},r=iT().macosHelper,n=r?ij:await i0(),i=r?await r.run(e,t):await iF(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 eD("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 i2(){return await i1(["app","frontmost"])}async function i3(e){return await i1(["app","quit","--bundle-id",iW(e)])}async function i5(e,t){return await i1(["permission",e,t])}async function i4(e,t={}){let r=["alert",e];return iz(r,t),await i1(r)}async function i8(e,t={}){let r=["snapshot","--surface",e];return iz(r,t),await i1(r)}async function i6(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i9(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iz(n,r),await i1(n)}async function i7(e,t={}){let r=["screenshot","--out",e];return iz(r,t),t.fullscreen&&r.push("--fullscreen"),await i1(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"},at={runCommand:eE,whichCommand:eO,desktop:ao(eE,eO),clipboard:as(eE,eO),screenshot:al(eE,eO)},ar=iM(at,function(e={}){let t={...at,...e};return{...t,desktop:e.desktop??ao(t.runCommand,t.whichCommand),clipboard:e.clipboard??as(t.runCommand,t.whichCommand),screenshot:e.screenshot??al(t.runCommand,t.whichCommand)}});function an(e){return ar.resolve(e)}async function ai(e,t){return await ar.run(e,t)}async function aa(e,t,r){return await an().runCommand(e,t,r)}function ao(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=>{ei({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eW(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 as(e,t){return{async readText(){let r=au[await am(t,ad)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=ap[await am(t,ad)](r);await e(n.cmd,n.args,n.options)}}}function al(e,t){return{async capture(r){let n=af[await am(t,ac)](r);await e(n.cmd,n.args,n.options)}}}let ad={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."},ac={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."},au={"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}}},ap={"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}})},af={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 am(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 eD("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ah="atspi-dump.py",aw=null;async function ag(e,t={}){let r,n=an().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eD("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await an().whichCommand("python3"))throw new eD("TOOL_MISSING","python3 is required for AT-SPI2 accessibility snapshots on Linux.");let o=t.maxNodes??1500,s=t.maxDepth??12,l=t.maxApps??24,c=[function(){if(aw)return aw;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",ah);if(a.existsSync(r))return aw=r,r;if(0===t){let t=i.join(e,ah);if(a.existsSync(t))return aw=t,t}e=i.dirname(e)}throw new eD("TOOL_MISSING",`Cannot find ${ah}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await aa("python3",c,{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 eD("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eD("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eD("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eD("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 ay(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ei({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await ag(t);return{nodes:r.nodes,truncated:r.truncated}}async function av(e,t,r){let{nodes:n}=await ay(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:aS(e.rect)-aS(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 aS(e){return(e?.width??0)*(e?.height??0)}let aI=[250,400,600];function aA(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?aM(n?.nodes??[]):void 0,routeComparable:i}}function a_(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 ab(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function ax(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aM(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 aN(e,t,r,n,i){return{requestId:i??ee().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...H(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:M(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}function aD(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aT(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=aC(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aE(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function ak(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aP(e){let{session:t,pending:r,snapshot:n}=e,i=aR(r.preSignature,aC(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await ir(t.device,r.command,r.positionals,r.flags?.out,{...aN(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ei({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aE(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aC(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 aR(e,t){return 0===e.length||0===t.length?"ambiguous":aO(e,t)?"unchanged":"changed"}function aO(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 aT(e){return"ios"===e.device.platform||"android"===e.device.platform}function aL(e,t,r=[],n){var i,a,o;aU(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 a$(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aF(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aU(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aC(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await eW(200),a+=1;let l=await r(),d=aC(e.readSnapshot(l).nodes);if(aO(s,d))return a$(t),ei({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 a$(t),ei({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aU(e){return"ios"===e||"android"===e}function aG(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aq=new WeakMap;function aj(e,t){if(!e[t])return[];let r=aH(e)[t]??t+1;return e.slice(t+1,r)}function aV(e,t,r){let n=aH(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aB(e,t,r){let n=aH(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aH(e){let t=aq.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 aq.set(e,r),r}function aK(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 aW(e,t){let r=tv(e.type??""),n=e.label?.trim();return!!(az(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function az(e){return"button"===tv(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aX(e){let t=tv(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aJ(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function aZ(e){let t;for(let i of e){var r,n;let e=tv(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||aY(r)>aY(n)))&&(t=i.rect)}return t}function aY(e){return e?e.width*e.height:0}function aQ(e){let t=tv(e.type??"");return"scrollview"===t||"scrollarea"===t}function a0(e,t){return!0===e||!!t||void 0}function a1(e,t,r,n){aB(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tv(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function a2(e,t,r,n){aB(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tv((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function a3(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tv(n.type??"")&&t(n,i,r)}}function a5(e,t,r,n){for(let i of e)(aW(i,t)||n&&a8(i,n))&&r.add(i.index)}function a4(e,t,r){if("button"!==tv(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&L(e.rect,t.rect)}function a8(e,t){return"button"===tv(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&L(e.rect,t.rect)}let a6=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=aZ(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"===tv(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),aB(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tv(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&&$(t))})(r)&&function(e,t,r){var n,i,a,o;aX(e.type)||r.suppressedIndexes.add(e.index);let s=N(e.label?.trim()??"",e.value);if(!s)return;let l=function(e,t,r={}){return(!0===r.includeSelf&&aX(e.type)?e:null)??aK(e,t,e=>aX(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aJ(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:a0(i.hiddenContentAbove,o.above),hiddenContentBelow:a0(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"!==tv(n.type??""))continue;if("Search"===n.label){a2(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aV(e,r,e=>"searchfield"===tv(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),a2(e,r,i.index,t))}})(e,o),r=e,n=o,a3(r,(e,t,i)=>{aV(r,i,r=>{let n;return("button"===(n=tv(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&(L(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=tv(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,a3(i,(e,t,r)=>{let n;B(e)&&b(e,(n=[],aB(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=tv(r.type??"");if("statictext"===a||"link"===a)return a1(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aV(e,t,e=>{let t=tv(e.type??"");return("link"===t||"searchfield"===t||aX(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);a1(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=aZ(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tv(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)||!aK(e,t,aQ)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=aY(e),i=aY(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aJ(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=tv(r.type??"");if("button"===a)return a5(aj(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aj(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tv(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=>a4(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aJ(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&&(a4(a,t,r)||a8(a,t)||function(e,t){if("switch"!==tv(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aW(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=>a4(e,t,r));if(!i){e.some(az)&&a5(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aJ(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),a5(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function a9(e){let t=await a7(e);if(t)return t;let r=await os(e);return ab(e.session),{snapshot:r.snapshot,...r.annotations}}async function a7(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aT(e)||Date.now()-t.markedAt>3e4?void ak(e):t}(e.session);if(t&&e.session)return await oe({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oa({...e,session:e.session});let r=a_(e.session);if(r&&"android"===e.device.platform)return await on(e,r)}async function oe(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await ot(e,t,await oo(e)),l=await aP({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await ot(e,t,await oo(e)),l=await aP({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(ak(i),s=await aF({session:i,initial:s,capture:async()=>await oo(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&ab(i),"unchanged"===l.change)?ei({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}}):ei({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 ot(e,t,r){let n=r;return"unchanged"!==aR(t.preSignature,aC(n.snapshot.nodes))?n:(await eW(500),n=await oo(e))}async function or(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await ay(r?.surface);return oc({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?oc(await i8(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await ir(t,"snapshot",[],i,{...aN(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function on(e,t){let r=await oi(e,t);return{snapshot:r.snapshot,...r.annotations}}async function oi(e,t){let r=await os(e),n=ol(r,t,e),i=0,a=t.markedAt+1500;for(let o of aI){if(!n)break;let s=a-Date.now();if(s<=0)break;await eW(Math.min(o,s)),r=await os(e),i+=1,n=ol(r,t,e)}n||ab(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,...K({freshness:o})}}}async function oa(e){let t=await aF({session:e.session,capture:async()=>await oo(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function oo(e){let t=a_(e.session);return t&&"android"===e.device.platform?await oi(e,t):await os(e)}async function os(e){var t;let r=Date.now(),n=await or(e);return eV(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:od(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:K(n)}}function ol(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&&ax(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=aM(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 od(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=V(s?o:tS(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?ou(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 a6)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=e4(s?c:E(c)),p=K(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:e3(eY(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oc(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=ou(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:op(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=op(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function ou(e,t){let r=tI(e4(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 op(a,i)}function op(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 of(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aG("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=eX(e.trim());if(!n)return aG("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=e0(e.nodes,n);if(r=t?tA(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aG("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function om(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function oh(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?ei({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function ow(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=ep({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...H(a),surface:a?.surface};return"out"===r?og(await ir(t.device,"screenshot",[],i,o)):og(await ir(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eD("UNSUPPORTED_OPERATION","screenshot does not resolve input artifacts")},reserveOutput:async e=>{let t,r;return e?.kind==="path"?r=e.path:(t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-screenshot-")),r=i.join(t,"screenshot.png")),await s.mkdir(i.dirname(r),{recursive:!0}),{path:r,visibility:"client-visible",publish:async()=>void 0,...t?{cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await s.mkdtemp(i.join(u.tmpdir(),`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await s.rm(t,{recursive:!0,force:!0})}}}},sessions:oh({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:ef()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...q(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function og(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oy(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ov(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 oS(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oI=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oA(e,t={}){let r=tM(e,t.helperAdb).exec;return(await oN(e,t,r)).xml}async function o_(e,t={}){let r=tM(e,t.helperAdb).exec,n=await oN(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tD(i,void 0,t),s=ob(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 o$(e,o.nodes,i,r),o.nodes),{...o,...ox(s),androidSnapshot:n.metadata}}let o=tP(i),s=tT(o,void 0,t),l=ob(s.truncated,n.metadata);a&&await oM({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...ox(l),androidSnapshot:n.metadata}}function ob(e,t){return!0===e||!0===t.helperTruncated||e}function ox(e){return!0===e?{truncated:!0}:{}}async function oM(e){if(oU(e.interactiveSnapshot.nodes).size>0||oF(e.xml))return;let t=tT(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await o$(e.device,t.nodes,e.xml,e.adb);oH(r,t,e.interactiveSnapshot),0===r.size&&oH(x(e4(t.nodes)),t,e.interactiveSnapshot)}async function oN(e,t,r){let n=await er("android_snapshot_helper_artifact_resolution",async()=>await oT(t.helperArtifact));return n.artifact?await oD(e,t,r,n.artifact):(ei({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oL(e,n.fallbackReason,r))}async function oD(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=tM(e,t.helperAdb);try{let e=await ok(t,r,d,n,l);return e.installed&&await tL(l),a=await oP(t,r,d,n,l),o=n,s=e.reason,{xml:a.xml,metadata:{backend:"android-helper",helperVersion:o.manifest.version,helperApiVersion:a.metadata.helperApiVersion,helperTransport:a.metadata.transport,helperSessionReused:a.metadata.sessionReused,installReason:s,waitForIdleTimeoutMs:a.metadata.waitForIdleTimeoutMs,waitForIdleQuietMs:a.metadata.waitForIdleQuietMs,timeoutMs:a.metadata.timeoutMs,maxDepth:a.metadata.maxDepth,maxNodes:a.metadata.maxNodes,rootPresent:a.metadata.rootPresent,captureMode:a.metadata.captureMode,windowCount:a.metadata.windowCount,nodeCount:a.metadata.nodeCount,helperTruncated:a.metadata.truncated,elapsedMs:a.metadata.elapsedMs}}}catch(t){return await oE({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function ok(e,t,r,n,i){let a=await er("android_snapshot_helper_install",async()=>await tk({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 ei({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 oP(e,t,r,n,i){let a={adb:t,adbProvider:r,deviceKey:i,helperVersion:n.manifest.version,helperVersionCode:n.manifest.versionCode,packageName:n.manifest.packageName,instrumentationRunner:n.manifest.instrumentationRunner,waitForIdleTimeoutMs:e.helperWaitForIdleTimeoutMs??500,timeoutMs:5e3,commandTimeoutMs:3e4};try{let e=await er("android_snapshot_helper_session_capture",async()=>await tC(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ei({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eN(e).message}}),await oC(t,n.manifest.packageName)}return await er("android_snapshot_helper_capture",async()=>await tE(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oE(e){let t=function(e){var t;let r=eN(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oO(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=oR(e);return new eD(ex(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=oR(e.error);return ei({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tL(e.helperDeviceKey),await oC(e.adb,e.artifact.manifest.packageName),tO({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oL(e.device,r,e.adb)}async function oC(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eW(150),ei({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ei({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eN(e).message}})}}function oR(e){let t=eN(e),r=oO(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 oO(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 oT(e){if(e)return{artifact:e};let t=tb(),r=i.join(tx(),"android-snapshot-helper","dist"),n=i.join(r,`agent-device-android-snapshot-helper-${t}.manifest.json`);try{await w.access(n)}catch{return{}}try{let e=tR(JSON.parse(await w.readFile(n,"utf8"))),t=i.join(r,e.assetName??`agent-device-android-snapshot-helper-${e.version}.apk`);return await w.access(t),{artifact:{apkPath:t,manifest:e}}}catch(e){return{fallbackReason:eN(e).message}}}async function oL(e,t,r){let n;try{n=await er("android_snapshot_stock_capture",async()=>await oG(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eD(ex((r=eN(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 o$(e,t,r,n){if(!t.some(e=>t_(e.type)))return new Map;let i=oU(t);if(i.size>0||oF(r))return i;let a=await oB(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(t_(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=>oS(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||!t_(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=>oS(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=oy(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(!ov(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(!ov(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?oy(o):a.length>0?oy(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 oF(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oU(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 oG(e,t=tN(e)){try{return await e7(()=>oq(t),{shouldRetry:oV})}catch(t){var r,n;let e;if((r=t)instanceof eD&&"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 eD("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 oq(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oj(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}`,i=/dumped to:\s*(\S+)/i.exec(n),i?.[1]);if(0!==l.exitCode&&!d)throw new eD("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=oj(c.stdout,c.stderr);if(!u)throw new eD("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function oj(e,t){let r=`${e}
|
|
6
|
+
${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 oV(e){if(!(e instanceof eD)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oI.some(e=>r.includes(e))}async function oB(e,t=tN(e)){try{let e=await t(["shell","dumpsys","activity","top"],{allowFailure:!0,timeoutMs:8e3}),r=`${e.stdout}
|
|
7
|
+
${e.stderr}`.trim();return r.length>0?r:null}catch{return null}}function oH(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 oK=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oW=/^close app$/i,oz="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oX(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await o1(r)}catch(e){return ei({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=o3(t);if(!n?.rect)return{status:"absent"};try{let e=await o2(r,n);if(!e.ok)return ei({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 o5(r))return ei({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 tr(r.device,r.appBundleId),!await o4(r,r.appBundleId)))return ei({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 ei({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 ei({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 oJ(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await e9(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await oZ(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 oQ({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 oQ({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${o0(a)}. Automatic recovery failed.`,hint:oz})}throw oQ({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${o0(a)}.`,hint:oz})}async function oZ(e){try{return await oY(e)}catch(t){return ei({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 oY(e){if(!e.appBundleId)return!1;let t=o3(await o1(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await o2(e,t);if(!r.ok)return!1;await tr(e.device,e.appBundleId);let n=await o4(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ei({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 oQ(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eD("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function o0(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function o1(e){return e4(tS((await o_(e.device,{interactiveOnly:!1})).nodes))}async function o2(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e5(t.rect),i=await e8(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 o3(e,t={}){if(!1===t.requireDialogSignal||o9(e))return e.find(e=>o6(e).some(e=>oW.test(e))&&e.rect)}async function o5(e){for(let t=0;t<12;t+=1){if(!o9(await o1(e)))return!0;await eW(500)}return!o9(await o1(e))}async function o4(e,t,r={}){for(let n=0;n<12;n+=1){if(await o8(e,t,r))return!0;await eW(500)}return await o8(e,t,r)}async function o8(e,t,r){return!(r.requireNoBlockingDialog&&await e9(e.device))&&(await td(e.device)).package===t}function o6(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 o9(e){return e.some(e=>{let t=o6(e).join(" ").trim();return t.length>0&&oK.test(t)})}function o7(e){return!!(e&&e.width>0&&e.height>0)}function se(e){return e.width*e.height}function st(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 sr=[255,59,48,255],sn=[255,214,10,255],si=[0,0,0,255],sa=["scroll","list","recyclerview","edittext","textfield"],so=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],ss={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 sl(e){let t=await s.readFile(e.screenshotPath),r=await ew(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)su(r)&&o7(r.rect)&&(!t||se(r.rect)>se(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&&o7(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 o7(e.rect)&&!("image"===tv((t=e).type??"")&&!sf(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(sm)||sh(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!o7(r.rect)||su(r))return!1;let n=tv(r.type??"");return!(sa.some(e=>n.includes(e))||t&&se(r.rect)>.25*se(t))}(e,t,r)||(sc(r)?n:n&&function(e){let t=tv(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 sc(e)&&!su(e)}(s=n)?s:null,ty(o,s,e=>(function(e){return sc(e)&&!su(e)})(e)),s.hittable?s:null,ty(o,s,e=>!0===e.hittable)].find(sp)??null);if(!l?.rect||!o7(l.rect))continue;let d=function(e,t,r){let n=sw(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=sw(n);if(!i)continue;let a=function(e){let t=0;return tv(e.type??"").includes("text")&&(t+=2),sm(e.label)&&(t+=2),sm(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sw(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sc(t)&&(n+=3),sc(e)&&(n+=2),r&&(n+=2),sh(t.identifier)&&(n+=1),sf(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sc,i=e=>!!sw(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=tv(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&o7(t.rect)&&st(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=sd(e,i,u,t,r);if(!o7(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=R(e.nodes).primaryAction;if(!a?.ref||!a.rect||!o7(a.rect))return;let o=sd(e,t,a.rect,n,i);if(!o7(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)=>se(e.overlayRect)-se(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(st(e.overlayRect,r.overlayRect)||st(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}se(r.overlayRect)<se(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(s_).slice(0,n.maxRefs??24).sort(sA).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e5(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)sv(e,t.x,t.x+t.width-1,t.y+n,r),sv(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sS(e,t.x+n,t.y,t.y+t.height-1,r),sS(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sr),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sy(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sy(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)sI(e,t+o,r+a,i)})(e,i,o,n,sn),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=ss[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]&&sI(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,si)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await eu(r)),n}function sd(e,t,r,n,i){if("android"===e.backend||!t)return sg(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 sg({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 sc(e){let t=[e.type,e.role,e.subrole].map(e=>tv(e??"")).join(" ");return so.some(e=>t.includes(e))}function su(e){let t=[e.type,e.role,e.subrole].map(e=>tv(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sp(e){return!!(e?.rect&&o7(e.rect)&&!su(e))}function sf(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sm(e){var t;let r;return!!sf(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sh(e){var t;return"string"==typeof e&&!!sm(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sw(e){let t=[e.label,e.value].find(sm);return t?t.trim():sh(e.identifier)?e.identifier.trim():void 0}function sg(e,t,r){let n=sy(e.x,0,Math.max(0,t-1)),i=sy(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:sy(e.width,1,a),height:sy(e.height,1,o)}}function sy(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sv(e,t,r,n,i){for(let a=t;a<=r;a+=1)sI(e,a,n,i)}function sS(e,t,r,n,i){for(let a=r;a<=n;a+=1)sI(e,t,a,i)}function sI(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 sA(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 s_(e,t){return t.score!==e.score?t.score-e.score:sA(e,t)}function sb(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 sx=new WeakMap;function sM(e){if(!e)return;let t=sx.get(e);if(t)return t;let r=sN(e.nodes??[]);if(r)return sx.set(e,r),r}let sN=X,sD={referenceWidth:1e3,referenceHeight:1e3};function sk(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,y,v=e.recording;if(!v)return;let S={...i,...n??{}},I=s$(S.effectiveDurationMs)??s$(S.durationMs),A={recordingStartedAt:v.startedAt,gestureClockOriginAtMs:v.gestureClockOriginAtMs,gestureClockOriginUptimeMs:v.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===v.platform?v.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:s$(S.gestureStartUptimeMs),gestureEndUptimeMs:s$(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},_="number"==typeof(s={gestureStartUptimeMs:s$(S.gestureStartUptimeMs),gestureEndUptimeMs:s$(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),b="ios"===e.device.platform&&void 0===s$(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sF(s$(t.count),1)??1,r=!0===t.doubleTap,n=sF(s$(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 sb(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:_}):sb(A),x=(l=e.snapshot,w=s$((d=S).referenceWidth),g=s$(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sM(l)),M=(c=t,u=r,p=S,f=b,m=_,h=x,y=sP[c],y?.(u,p,f,m,h)??[]);0!==M.length&&(v.gestureEvents.push(...M),ei({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:b,gestureDurationMs:_,kinds:M.map(e=>e.kind)}}))}let sP={click:(e,t,r,n,i)=>sE(e,t,r,i),press:(e,t,r,n,i)=>sE(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sE(e,t,r,i):[],fill:(e,t,r,n,i)=>sC(e,t,r,i),focus:(e,t,r,n,i)=>sC(e,t,r,i),longpress:function(e,t,r,n,i){let a=sU(t,e);if(!a)return[];let{x:o,y:s}=a;return[sT(r,o,s,sj(n,[s$(t.durationMs),s$(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sG(t,e),o=sL(t.contentDirection)??sL(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sj(n,[],250),p=s$(t.amount)??s$(e[1]),f=s$(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:sR,fling:sR,swipe:sR,pinch:function(e,t,r,n,i){let a=sU(t,e,1),o=s$(t.scale)??s$(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:sj(n,[],280)}]}};function sE(e,t,r,n){let i=sU(t,e);if(!i)return[];let{x:a,y:o}=i,s=sF(s$(t.count),1)??1,l=sF(s$(t.intervalMs),0)??0,d=!0===t.doubleTap,c=sF(s$(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(sT(t,a,o,c,n));continue}u.push(sO(t,a,o,n)),d&&u.push(sO(t+90,a,o,n))}return u}function sC(e,t,r,n){let i=sU(t,e);if(!i)return[];let{x:a,y:o}=i;return[sO(r,a,o,n)]}function sR(e,t,r,n,i){let a=sG(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sj(n,[s$(t.effectiveDurationMs),s$(t.durationMs),s$(e[4])],250),u=sF(s$(t.count),1)??1,p=sF(s$(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,y,v,S,I,A,_;let b,{startX:x,startY:M,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 g=r+t*(c+p),y=x,v=M,S=N,I=D,A=c,"back-swipe"===(b=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,v,S,I,_=i))?{kind:b,tMs:g,x:y,y:v,x2:S,y2:I,..._,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"}(y,S,_)}:{kind:b,tMs:g,x:y,y:v,x2:S,y2:I,..._,durationMs:A}})}function sO(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sT(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sL(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 s$(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 sF(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sU(e,t,r=0){let n=s$(e.x)??s$(t[r]),i=s$(e.y)??s$(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sG(e,t){let r=sq(e.x1,e.x,t[0]),n=sq(e.y1,e.y,t[1]),i=sq(e.x2,t[2]),a=sq(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 sq(...e){return e.map(s$).find(e=>void 0!==e)}function sj(e,t,r){return sF(e,1)??t.map(e=>sF(e,1)).find(e=>void 0!==e)??r}let sV={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sB(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,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?sV[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tg}}(f);if(!y.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:y.message}};let{platformCommand:v,dispatchRequest:S,recordedCommand:I}=y,A=await sK(m,v);if(A)return A;let _=await sH(m,v);if("response"in _)return _.response;let{resolvedPositionals:b,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[t1.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?t1.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(),k={...g(f.flags,m.appBundleId,m.trace?.outPath),surface:m.surface},P=await sW({session:m,sessionName:e.sessionName,logPath:h,command:v,request:S,positionals:b,out:x,dispatchContext:k}),E=await sH(m,v,"after-command");if("response"in E)return E.response;"status"in _&&"recovered"===_.status&&(!P||"object"==typeof P)&&((P??={}).warning=_.warning);let C=Date.now(),R=I===v?M:f.positionals??[],O=I===v?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=sM(e.snapshot),a={...n??{}},o=sL(a.direction)??sL(r[0]);if(!o)return n;let s=s$(a.amount)??s$(r[1]),l=s$(a.pixels),d=sG(a,[]),c=s$(a.referenceWidth),u=s$(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sD;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=Z({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);sk(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:v,recordedCommand:I,resolvedPositionals:b,recordedPositionals:R,recordedFlags:O,data:P,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),ax(v)&&aA(m,v),aL(m,v,b,f.flags),{ok:!0,data:P??{}}}async function sH(e,t,r="before-command"){if("android"!==e.device.platform||nf(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oJ({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eN(e)}}}}async function sK(e,t){if(!ix(t,e.device)){var r;let n=(r=e.device,ib[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 oX({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sW(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await ir(r.device,n,a,o,{...s});let l=await ow({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 sz(r,l,e.logPath),l}async function sz(e,t,r){let n={snapshotInteractiveOnly:!0},i=od(await or({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);om(e,i);let a=await sl({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sX=le(()=>import("./lease.js")),sJ=le(()=>import("./session.js").then(e=>e.session_namespaceObject)),sZ=le(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),sY=le(()=>import("./react-native.js")),sQ=le(()=>import("./record-trace.js")),s0=le(()=>import("./find.js")),s1=le(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function s2(e){var t;switch(t=e.req.command,nf(t)?.route??"generic"){case"lease":return await s3(e);case"session":return await s5(e);case"snapshot":return await s4(e);case"reactNative":return await s8(e);case"recordTrace":return await s6(e);case"find":return await s9(e);case"interaction":return await s7(e);case"generic":return null}}async function s3(e){let{handleLeaseCommands:t}=await sX();return lt(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s5(e){let{handleSessionCommands:t}=await sJ();return lt(e.req.command,"session",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke,invokeReplayAction:e.invokeReplayAction,androidAdbExecutor:e.androidAdbExecutor}))}async function s4(e){let{handleSnapshotCommands:t}=await sZ();return lt(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s8(e){let{handleReactNativeCommands:t}=await sY();return lt(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function s6(e){let{handleRecordTraceCommands:t}=await sQ();return lt(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function s9(e){let{handleFindCommands:t}=await s0();return lt(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function s7(e){let{handleInteractionCommands:t}=await s1();return lt(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function le(e){let t;return()=>t??=e()}function lt(e,t,r){if(r)return r;throw new eD("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lr=new h;async function ln(e,t,r){let n=lr.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lr.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function li(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function la(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 lo(e,t){if(!t)return[];let r=[],n=e.device,i=e1(t.platform);if(i&&!eZ(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=ts(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function ls(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 ll="default";function ld(e){return e.session||ll}function lc(e){if(e.meta?.sessionExplicit===!0||(e.session||ll)!==ll||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=i.resolve(e);try{return a.realpathSync.native(t)}catch{return t}}(e);return function(e){let t=e;for(;;){if(a.existsSync(i.join(t,".git")))return t;let e=i.dirname(t);if(e===t)return;t=e}}(t)??t}(e.meta?.cwd);if(t){var n;return{kind:"cwd",id:(n=t,r.createHash("sha256").update(n).digest("hex").slice(0,16))}}}function lu(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lp(e,t){let r=lc(e);return!!r&&!!t.sessionScope&&!lu(t,r)}function lf(e){return{tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend}}function lm(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??{}},y=(r=e.command,nf(r)?.lockPolicySelectorOverride===!0),v=y?[]:t?lo(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=e1(i),void 0!==n.platform&&m&&(a=e1(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!eQ(o):"apple"!==o||!eQ(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":return"desktop"!==e;case"apple":return!1;default:return lw(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"===e1(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lw(e)}}(r,t)){let r=t[n];no(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===v.length){return c=y,u=t,p=g,!S||u||void 0!==p.platform||c&&ns(p,na)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lh(e,t),e.platform=n.device.platform;return}lh(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,v,S,t),{...e,flags:g};throw new eD("INVALID_ARGS",function(e,t,r){let n=t.map(ls).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${li(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,v,t),{session:e.session,conflicts:v.map(ls),hint:function(e,t){if(t)return la(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 lh(e,t){for(let r of t)delete e[r.key]}function lw(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lg(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[ly(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lm(e)}catch{return e}}(n);if("open"===(r=l).command||ns(r.flags,ni))try{let e=await r8(l.flags??{});s.add(ly(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lv(e)-lv(t);return 0!==r?r:e.localeCompare(t)})}function ly(e){return`device:${e}`}function lv(e){return+!e.startsWith("session:")}function lS(e,t={}){let r=e6(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lI(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lS(t,{simulatorSetPath:e.simulatorSetPath})}function lA(e,t,r){return iU(lI(e,t),r)}let l_="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 lb(e){if(!(e instanceof eD)||"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 lx(e){return!(e instanceof eD)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lM(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eD("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tn({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:ta("IOS_RUNNER_CONNECT_TIMEOUT")})}async function lN(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=tn({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eD("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
8
|
${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.":`${eU("IOS_RUNNER_CONNECT_TIMEOUT")} ${lu}`)})}function lw(e){return"interactionFrame"===e||"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lg(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lv(e){if(rn(e))throw ra()}let ly=new Map;async function lS(e,t,r,n,i=45e3,a,o){let s=eT.fromTimeoutMs(i),{getEndpoints:l}=lN(e,t),{endpoints:c}=await l(s.remainingMs()),d=null,u=Math.max(1,Math.ceil(i/250));try{return await ej(async({deadline:s})=>{let u=await l_({device:e,port:t,command:r,timeoutMs:i,logPath:n,session:a,endpoints:c,getEndpoints:l,signal:o,attemptDeadline:s,setEndpoints:e=>{c=e},setLastError:e=>{d=e}});if(u)return u;throw function(e){if(e.signal?.aborted)throw ra();return new ee("COMMAND_FAILED","Runner endpoint probe failed",{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0})}({port:t,endpoints:c,lastError:d,signal:o})},{maxAttempts:u,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:lf},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rs(e))throw ra();d||(d=e)}if(o?.aborted)throw ra();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lm({port:t,endpoints:c,logPath:n,lastError:d});let a=await lR(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lm({port:t,endpoints:c,logPath:n,lastError:d})}async function l_(e){await lI(e);let t=await lb(e);if(t.response)return t.response;let r=await lA(e);return r||await lx(e,t.usedCachedTunnelIp)}async function lI(e){if(e.attemptDeadline?.isExpired())throw new ee("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 lh({session:e.session,port:e.port,logPath:e.logPath})}async function lb(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 lE(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,ly.delete(i))}}),usedCachedTunnelIp:r}}async function lA(e){return"simulator"===e.device.kind&&e.session?.ready?await lD(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lx(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,ly.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lE(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 lM(e,t,r,n=45e3,i){if(i?.aborted)throw ra();let a=eT.fromTimeoutMs(n),{getEndpoints:o}=lN(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new ee("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let c=a.remainingMs();if(c<=0)throw new ee("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lP(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},c,i)}function lN(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,c=await lk({device:e,timeoutBudgetMs:n,forceRefresh:i,requestTunnelIp:r,setRequestTunnelIp:e=>{r=e}});return{endpoints:(a=e,o=t,s=c.ip,l=[`http://127.0.0.1:${o}/command`],"device"!==a.kind||s&&l.unshift(`http://[${s}]:${o}/command`),l),cached:c.sharedCacheHit}}}}async function lE(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 ee("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lP(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rs(e))throw ra();s(t,e)}return null}async function lD(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 lR(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rs(e))throw ra();return o(e),null}}async function lk(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=ly.get(t))?e.expiresAt<=Date.now()?(ly.delete(t),null):e.ip:null);if(r)return{ip:r,sharedCacheHit:!0};if(void 0!==s)return{ip:s,sharedCacheHit:!1}}let c=await lC(i.id,a);return l(c),c&&(r=i.id,n=c,ly.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:c,sharedCacheHit:!1}}async function lP(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 lC(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await iM(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!a.existsSync(n))return null;let o=JSON.parse(a.readFileSync(n,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lF(n)}}async function lR(e,t,r,n,i){let a=JSON.stringify(r),o=lc(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 iM(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=e$({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new ee("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:eU(e)})}return{status:200,body:l}}async function lT(){return await new Promise((e,t)=>{let r=g.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 ee("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lO(e,t,r,n){t&&l$(t,e),r&&l$(r,e),n&&process.stderr.write(e)}let lL=new Map;function l$(e,t){let r=(lL.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lL.get(e)===r&&lL.delete(e)});lL.set(e,r)}function lF(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lU(e){let{lockDirPath:t,owner:r}=e,n=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,c=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(r,JSON.stringify(t),"utf8"),a.renameSync(r,e)}(n,r);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,r){let n=null;try{n=a.statSync(e)}catch{return!0}let i=lG(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&X(o.pid)&&(!o.startTime||H(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-n.mtimeMs<r)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,n,l))continue;await tc(s)}throw new ee("COMMAND_FAILED",`Timed out waiting for ${c}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),i=lG(t);try{r=Math.max(0,Math.round(n-a.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(n-i.acquiredAtMs))}:{}}}(t,n)})}function lG(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lq=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function lj(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new ee("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(!a.existsSync(e))throw new ee("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await lV(e)){await ix("codesign",["--remove-signature",e],{allowFailure:!0});try{await ix("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof ee?n:new ee("COMMAND_FAILED",String(n));throw new ee("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 lV(e){return 0===(await ix("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let lB=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),lH=new Set([" "," ","\n","\r"]),lK=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function lW(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new lJ(e).parse()}function lz(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)}lz(r.children,t)}}class lJ{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(lK.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?lX(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])&&lB.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,lX(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])&&lH.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function lX(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 lZ=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function lY(e){var t;let r=await lQ(e);if(!r||0===r.length)return null;let n=i.dirname(e),o=new Set,s=function(e,t){let r=[],n=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(i.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(i.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:a}}(r,n);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return r?i.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function lQ(e){let t=await iN(e);if(t){var r,n,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!l0(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(l0))}return r}(i),...Object.values(i).filter(e=>l0(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(lZ.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=a.readFileSync(e,"utf8"),n=lW(r),t=new Set,lz(n,(e,r)=>{if(lZ.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}}function l0(e){return!!e&&"object"==typeof e}let l1=["CFBundleIcons","CFBundleIcons~ipad"];async function l2(e){let t=e.filter(l6);if(0===t.length)return;let r=e.filter(e=>l7(e)&&!l9(e));for(let e of t){let t=function(e,t){let r=i.dirname(e);return t.find(e=>i.dirname(e)===r&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===r&&t!==e)??null}(e,r);t&&await l3(t,e)}}async function l3(e,t){var r;let n,o=function(e,t){let r=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var n;if(o.isFile()&&(n=o.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(a.existsSync(t)){let r=a.readFileSync(e),n=a.readFileSync(t);return!r.equals(n)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(r=!0)}return r}(e,t),s=await l4(e,t);(o||s)&&(await l8(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function l4(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iN(a),l=await iN(o);if(!s||!l)return!1;let c=(r=s,n=l,l1.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===c.length)return!1;for(let e of c)await l5(o,e.key,e.value,e.shouldInsert);return!0}async function l5(e,t,r,n){let i=await ix("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new ee("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function l8(e){let t=await ix("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new ee("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function l6(e){return l7(e)&&l9(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function l9(e){return i.basename(e).endsWith("-Runner.app")}function l7(e){return i.basename(e).endsWith(".app")}let ce={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 ct(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new ee("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":eS(e.target)}function cr(e){return"simulator"===e?"simulator":"device"}function cn(){return"arm64"===process.arch?"arm64":"x86_64"}let ci="XCTestDevices",ca=".agent-device-backup",co=".agent-device-xctestdevices-backup-",cs=i.join(u.homedir(),".agent-device","ios-runner"),cl=".agent-device-runner-cache.json",cc={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},cd=new Map,cu=new Set,cp=new Map,cf=new Set;function cm(e){return e?.trim()??""}function ch(e=process.env){return cm(e.AGENT_DEVICE_IOS_BUNDLE_ID)||cm(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function cw(e=process.env){let t=cm(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${ch(e)}.uitests`}let cg=function(e=process.env){let t=ch(e),r=cw(e);return Array.from(new Set([cm(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function cv(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function cy(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=eP(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??cv()),s=i.resolve(t.backupPath??function(e=cv()){return`${e}${ca}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),c=t.ownerStartTime??H(process.pid),d=await cI({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:c,acquiredAtMs:t.nowMs??Date.now()}});try{if(cS({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(n,o))return await d(),null;a.mkdirSync(n,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=i.dirname(r),o=i.join(n,`${ci}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(n,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,r)}catch(e){throw a.existsSync(o)&&c_(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw cS({xctestDeviceSetPath:o,backupPath:s}),await d(),new ee("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{cS({xctestDeviceSetPath:o,backupPath:s})}finally{await d()}}}}}function cS(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(ca,""),n=r===ci?co:`${r}${co}`;try{return a.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=n.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&c_(t),a.existsSync(t))if(!s)return void N({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(r,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of n)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(N({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),c_(t))}function c_(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function cI(e){return await lU({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 cb(e){var t;return await cI({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:H(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function cA(e,t){let r=t_(),n=cP(e,r),i=cY(e,n);return await s1(cd,i,async()=>{let a=await cb(i);try{return await cx({device:e,options:t,projectRoot:r,expectedCacheMetadata:n,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function cx(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(eO(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||cu.has(t))&&(c5("clean",r?"forced_rebuild":"forced_clean",{derived:t}),c3(t),cD(t),cu.delete(t));let l=await c4({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>cV(e,n),xctestrunReferencesProjectRoot:cH,resolveExistingXctestrunProductPaths:lY}),c="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&c5("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let d=await cM({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:c});return d||(l.xctestrunPath&&(c3(s),cD(s)),await cN({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:c,reason:l.reason}))}async function cM(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await cE(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function cN(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:o,derived:s,cache:l,reason:c}=e,d=i.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(d))throw new ee("COMMAND_FAILED","iOS runner project not found",{projectPath:d});let u=Date.now();await cZ(t,d,s,r);let p=Math.max(0,Date.now()-u),f=cV(s,t);if(!f)throw new ee("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await lY(f);if(!m)throw new ee("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await lj(t,m,f),await l2(m),cR(s,c$(o,f,m)),c5("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:c}}async function cE(e,t,r,n){try{var i,a,o,s;return await lj(e,n.productPaths,n.xctestrunPath),c5("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,cR(i,c$(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof ee))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lq.has(t)}(e))throw e;return c5("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function cD(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let r of a.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,ck.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let ck=new Set([cl,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function cP(e,t=t_()){let n,o=ct(e);return{schemaVersion:2,packageVersion:tS(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),n=function(e){if(!a.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var n,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(a);continue}s.isFile()&&(n=s.name,o=a,"project.pbxproj"===n?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(n)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let n=r.createHash("sha256");for(let r of t){let t=i.relative(e,r),o=a.statSync(r);n.update(t),n.update("\0"),n.update(String(o.size)),n.update("\0"),n.update(String(Math.trunc(o.mtimeMs))),n.update("\0")}return n.digest("hex")}(t,n),s=cj.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=r.createHash("sha256");for(let e of n){let r=i.relative(t,e);l.update(r),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let c=l.digest("hex");return cj.set(t,{fileStatsFingerprint:o,sourceFingerprint:c}),c}(t),...function(e,t){var r;let n=(r=cC("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=ce[e].sdkName[cr(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:cC("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:cC("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=ct(e))?`platform=macOS,arch=${cn()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:c1(process.env),runnerSigningBuildSettings:c0(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:c2()}}function cC(e,t){let r=JSON.stringify([e,t]),n=cp.get(r);if(void 0!==n)return n;try{let n=ei(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return cp.set(r,i),i}catch{return cp.set(r,"unknown"),"unknown"}}function cR(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,cl),`${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)??lu);throw new ee("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cY(e,t){let n,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(n=r.createHash("sha256").update(cL(cO(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(cs,"derived",ce[ct(e)].derivedBaseName[cr(e.kind)])}(e);return i.join(s,o)}function cQ(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function c0(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 c1(e=process.env){let t=ch(e),r=cw(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function c2(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function c3(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(t_(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new ee("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 ${i.join(t_(),".tmp")}.`})}}async function c4(e){var t,r;let n,o=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,cl),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?cL(cO(n))!==cL(cO(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=o.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(cF))||!cq(n.xctestrunPath,e)||!cG(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!cq(t.path,e)||!cG(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.metadata):null,l=s?.xctestrunPath??e.findXctestrun(e.derived);if(!l)return{reason:"missing_xctestrun",xctestrunPath:null};let c=s?.xctestrunPath===l,d=c?"manifest":"scan",u=c?s.productPaths:await e.resolveExistingXctestrunProductPaths(l);return u?e.xctestrunReferencesProjectRoot(l,e.projectRoot)||c?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:d}:{reason:o.reason,xctestrunPath:l,productPaths:u,source:d}:{reason:"project_root_mismatch",xctestrunPath:l,productPaths:u,source:d}:{reason:"missing_products",xctestrunPath:l,productPaths:[],source:d}}function c5(e,t,r){N({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let c8=process.pid,c6=H(process.pid),c9=(tT=c8,tO=c6,(e=r.createHash("sha256")).update(String(tT)),e.update("\0"),e.update(tO??"unknown-start"),`owner-${tT}-${e.digest("hex").slice(0,8)}`);async function c7(e,t){let r=await lU({lockDirPath:`${da(e)}.lock`,owner:{pid:c8,startTime:c6,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function de(e){try{let t=JSON.parse(a.readFileSync(da(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:ds(r.ownerToken),ownerPid:dl(r.ownerPid),sessionId:ds(r.sessionId),port:dl(r.port),xctestrunPath:ds(r.xctestrunPath),jsonPath:ds(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:dl(e.runnerPid)}:null}(t,e)}catch{return null}}function dt(e){var t;return e?e.ownerToken===c9?{type:"owned",lease:e}:X((t=e).ownerPid)&&(!t.ownerStartTime||H(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function dr(e,t){let r=dt(de(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new ee("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await dc(r.lease,r.type,t)}async function dn(e,t){let r=dt(de(e));"owned"===r.type&&await dc(r.lease,"owned",t)}function di(e){e&&function(e){let t=de(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(da(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function da(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function ds(e){return"string"==typeof e&&e.length>0?e:null}function dl(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function dc(e,t,r){N({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,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),di(e)}let dd={cleanupRunnerProcessTree:d_,cleanupRunnerXcodebuildProcesses:dI,cleanupTempFile:lF};async function du(e,t={}){var r;!1!==t.graceful?await dh(e):await d_(e.child.pid,"SIGTERM"),await dw(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(dv(r)||z(r))&&await d_(e.child.pid,"SIGKILL"),await dg(e)}async function dp(e){await dn(e,dd)}async function df(e){let t=Array.from(cf);await dy(e,"SIGINT"),await dS(t,"SIGINT"),await dy(e,"SIGTERM"),await dS(t,"SIGTERM"),await dy(e,"SIGKILL"),await dS(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await dg(e)}))}async function dm(){let e=Array.from(cf);await Promise.allSettled(e.map(async e=>{try{await d_(e.pid,"SIGTERM"),await d_(e.pid,"SIGKILL")}finally{cf.delete(e)}}))}async function dh(e){try{await lS(e.device,e.port,lg({command:"shutdown"}),void 0,15e3)}catch{await d_(e.child.pid,"SIGTERM")}}async function dw(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function dg(e){lF(e.xctestrunPath),lF(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{di(e.lease)}}function dv(e){return!!e&&X(e)}async function dy(e,t){await Promise.allSettled(e.map(async e=>{await d_(e.child.pid,t)}))}async function dS(e,t){await Promise.allSettled(e.map(async e=>{await d_(e.pid,t),"SIGKILL"===t&&cf.delete(e)}))}async function d_(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 ix("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function dI(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${db(e)}-${db(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${db(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await ix("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){N({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function db(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let dA=new Map,dx=new Map;async function dM(e,t){return await s1(dx,e.id,async()=>{let r=dA.get(e.id);if(r){let t=await dE(e,r);if(t)return t}return await c7(e.id,async()=>await dN(e,t))})}async function dN(e,t){var r,n;let o,s,l={};await dB(l,"cleanup_stale_xcodebuild",async()=>{await dr(e.id,dd)}),await dB(l,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(N({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):d$(t))}),t.cleanStaleBundles?await dB(l,"cleanup_stale_bundles",async()=>{await dD(e)}):(l.cleanup_stale_bundles=0,N({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await dB(l,"ensure_xctestrun",async()=>await cA(e,t));l.build_xctestrun=c.buildMs;let d=await dB(l,"allocate_port",async()=>await lT()),{xctestrunPath:u,jsonPath:p}=await dB(l,"prepare_xctestrun_env",async()=>await cK(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},`session-${e.id}-${c9}-${d}`)),f=await dB(l,"simulator_set_redirect",async()=>await cy(e));try{({child:o,wait:s}=await dB(l,"launch_xcodebuild",()=>{let t;return et("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cQ(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=ct(e),"macOS"===t?`platform=macOS,arch=${cn()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(d)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lO(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lO(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${d}:${Date.now()}`,h={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:d,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:c9,ownerPid:c8,ownerStartTime:c6,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:d,xctestrunPath:u,xctestrunArtifact:c,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=da(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await dR(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return dA.set(e.id,w),w}async function dE(e,t){if(!dv(t.child.pid))return await dB({},"stop_stale_session",async()=>{await dR(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=cY(e,cP(e));return t.xctestrunArtifact?.derived!==r?(N({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:r}}),await dB({},"stop_stale_artifact_session",async()=>{await dR(e.id,t)}),null):(N({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function dD(e){if("simulator"===e.kind)for(let t of cg){let r=await dk(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 dk(e,t){try{return await iM(lc(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){N({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 dP(e){let t=dA.get(e);return t?{sessionId:t.sessionId,alive:dv(t.child.pid)}:null}async function dC(e,t){await s1(dx,e.deviceId,async()=>{dA.get(e.deviceId)===e&&(N({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await dR(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function dR(e,t,r={}){let n=t??dA.get(e);n&&(await du(n,r),dA.get(e)===n&&dA.delete(e))}async function dT(e){await s1(dx,e,async()=>{await c7(e,async()=>{await dR(e),await dp(e)})})}async function dO(){let e=Array.from(dA.values());for(let t of(await df(e),e))dA.get(t.deviceId)===t&&dA.delete(t.deviceId)}async function dL(){await dO();let e=Array.from(dA.keys());await Promise.allSettled(e.map(async e=>{await dT(e)})),await dm()}async function d$(e){await iM(lc(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}function dF(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new ee("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new ee("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function dU(e,t,r,n,i,a){var o,s,l,c,d;o=t,s=r.command,o.startupTimingsReported||!o.startupTimings||(o.startupTimingsReported=!0,N({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,timings:o.startupTimings}}));let u=lg(r),p=lw(u.command),f=eT.fromTimeoutMs(i),m=function(e,t){var r;let n=lw(t.command);if(!e.ready)return n?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};return"uptime"===(r=t.command)||"status"===r?{action:"skip",reason:"readiness_probe_command"}:{action:"run",reason:"ready_session"}}(t,u);"run"===m.action?await dq({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,signal:a,decision:m}):(l=u,c=t,d=m,N({level:"debug",phase:"ios_runner_readiness_preflight_skipped",data:{command:l.command,commandId:l.commandId,reason:d.reason,sessionReady:c.ready}}));let h=await dG({device:e,session:t,runnerCommand:u,logPath:n,deadline:f,timeoutMs:i,signal:a,readOnlyCommand:p});try{let e=await dj(h,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&&await dC(t,r),e}catch(r){let e=function(e){if(e instanceof ee){if("IOS_AX_SNAPSHOT_FAILED"===e.code)return"ax_snapshot_failure";if("XCTEST_RECORDED_FAILURE"===e.code)return"xctest_recorded_failure"}}(r);throw e&&await dC(t,e),r}}async function dG(e){let{device:t,session:r,runnerCommand:n,logPath:i,deadline:a,timeoutMs:o,signal:s,readOnlyCommand:l}=e,c=a.remainingMs();if(c<=0)throw new ee("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:o});let d=l?{command:n.command,commandId:n.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:c}:{command:n.command,commandId:n.commandId};return await x("ios_runner_command_send",async()=>l?await lS(t,r.port,n,i,c,r,s):await lM(t,r.port,n,c,s),d)}async function dq(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(dV(r),a.remainingMs());try{let e=await x("ios_runner_readiness_preflight",async()=>await lS(t,r.port,lg({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,sessionReady:r.ready,timeoutMs:l});await dj(e,r,i)}catch(t){var c,d;let e;throw d={runnerReadinessPreflightFailed:!0},e=(c=t)instanceof ee?c:new ee("COMMAND_FAILED",c instanceof Error?c.message:String(c),void 0,c),new ee(e.code,e.message,{...e.details??{},...d},e.cause??c)}}async function dj(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new ee("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?Z(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 new ee(t,i??"Runner error",{runner:n,xcodebuild:{exitCode:1,stdout:"",stderr:""},hint:a,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&&N({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 dV(e){return e.startupTimeoutMs??45e3}async function dB(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,N({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let dH=new h;function dK(e,t={}){return{runCommand:e,...t}}function dW(e,t,r,n={}){if(r)return dJ(r);let i=function(e,t={}){let r=dH.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?dJ(i.provider):dJ(t)}async function dz(e,t,r){if(!e)return await r();let n={provider:dJ(e),deviceId:t.deviceId,requestId:t.requestId};return await dH.run(n,r)}function dJ(e){return"function"==typeof e?{runCommand:e}:e}async function dX(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await dQ(t,r,n,i,a,o);return await dZ(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function dZ(e,t){var r,n,i,a;if(!e)return await dY(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,d0({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,d0({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await dY(t,e.reason,e.lifecycleState,e.error)}async function dY(e,t,r,n){throw d0({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 dQ(e,t,r,n,i,a){var o,s,l,c,d,u,p,f,m,h,w,g,v,y,S,_,I,b,A,x,M,E;let D,k,P,C,R;if("status"===r.command||!r.commandId?.trim())return;try{D=await dU(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return N({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e)}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let T="string"==typeof D.lifecycleState?D.lifecycleState:"";return N({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:T}}),o=D,s=T,l=r,c=n,d=i,"completed"===s?(u=o,p=l,f=c,m=d,(k=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:{}}(u.lifecycleResponseJson))?{type:"recovered",data:k,reason:"completed_with_retained_response",lifecycleState:"completed"}:lw(p.command)?{type:"skipInvalidation",error:f,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"}:{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new ee("COMMAND_FAILED",`Runner command "${p.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:p.command,commandId:p.commandId,lifecycleState:"completed",recovery:"completed_without_retained_response",hint:(h=p.command,`The runner is still reachable and reports "${h}" 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:m.logPath,transportError:f.message},f)}):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(w=o,g=l,v=c,y=d,P="string"==typeof w.lifecycleErrorCode?w.lifecycleErrorCode:void 0,C="string"==typeof w.lifecycleErrorMessage?w.lifecycleErrorMessage:"Runner command failed",R="string"==typeof w.lifecycleErrorHint?w.lifecycleErrorHint:void 0,new ee(Z(P),C,{command:g.command,commandId:g.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",hint:R??(S=g.command,`The runner is still reachable and reports "${S}" 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:y.logPath,transportError:v.message},v))}:"accepted"===s||"started"===s?{type:"skipInvalidation",reason:"command_still_in_flight",lifecycleState:s,error:(_=s,I=l,b=c,A=d,lw(I.command)?b:new ee("COMMAND_FAILED",`Runner command "${I.command}" is still ${_} after the transport response was lost.`,{command:I.command,commandId:I.commandId,lifecycleState:_,recovery:"command_still_in_flight",hint:(x=I.command,M=_,`The runner is still reachable and reports "${x}" is ${M}, 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:A.logPath,transportError:b.message},b))}:{type:"retainInvalidation",reason:s?"unknown_lifecycle_state":"missing_lifecycle_state",lifecycleState:s,error:new ee("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:(E=l.command,`The runner did not confirm that "${E}" 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:d.logPath,transportError:c.message},c)}}function d0(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;N({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 d1(e,t){let r;lv(t.requestId);let n=ri(t.requestId),i=lg({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await d2({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new ee("COMMAND_FAILED","iOS runner prepare failed")}async function d2(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await dM(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),c=Date.now()-s;try{var d,u;let e=await d7(t,l,r,n,i,c,{recoveryReason:o});return{kind:"prepared",result:(d=t,u=e,ue(d,u),u)}}catch(e){return await d3({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function d3(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:c}=e,d=c instanceof ee?c:new ee("COMMAND_FAILED",String(c));if(1===l&&(t=d,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&d8(t)))return{kind:"prepared",result:await d4({device:n,session:i,command:a,options:o,signal:s,error:d})};if(!d8(d))throw c;let u=d.message||"runner_health_failed";if(l>=2)throw await d5(i,"prepare_runner_health_failed"),c;return lv(o.requestId),await dC(i,"prepare_runner_health_retry"),N({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 d4(e){var t,r,n,i,a;let{device:o,session:s,command:l,options:c,signal:d,error:u}=e,p=u.message||"runner_health_failed";await dC(s,"prepare_cached_runner_health_failed"),await cT(s.xctestrunArtifact,p);let f=Date.now(),m=await dM(o,{...c,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await d7(o,m,l,c,d,h,{recoveryReason:p});return N({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,ue(t,r),r}catch(r){let e;await d5(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof ee?n:new ee("COMMAND_FAILED",String(n)),new ee(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 ue(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 d5(e,t){try{await dC(e,t)}catch{}}function d8(e){let t;return!rs(e)&&(lp(e)||lf(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function d6(e,t,r){let n;lv(r.requestId);let i=ri(r.requestId);try{let a=(n=await dM(e,r)).ready?45e3:dV(n);return await dU(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof ee?o:new ee("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lf(a)&&n)return lv(r.requestId),await d9({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&&(lp(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lv(r.requestId),await d9({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&&lp(a))return await dX({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:dC});throw o}}async function d9(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await dC(e.session,a);let o=await dM(t,{...n,cleanStaleBundles:!0});try{let a=await dU(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&N({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 ee?a:new ee("COMMAND_FAILED",String(a));if(lp(e))return await dX({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:dC});throw a}}async function d7(e,t,r,n,i,a,o){var s,l,c,d,u;let p,f,m=Date.now();return s=await dU(e,t,r,n.logPath,n.healthTimeoutMs,i),l=t,c=a,d=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,c),healthCheckMs:Math.max(0,d),xctestrunPath:p.xctestrunPath,...f}:{runner:s,connectMs:Math.max(0,c),healthCheckMs:Math.max(0,d),...f}}function ue(e,t){N({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 ut(e,t,r={}){dF(e),lv(r.requestId);let n=lg(t),i=ui(e,r);return lw(n.command)?eR(()=>(lv(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lv(r.requestId),lp(e))}):i.runCommand(e,n,r)}function ur(e,t={}){if("ios"!==e.platform)return;let r=ui(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{N({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void N({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function un(e,t){dF(e),lv(t.requestId);let r=lg({command:"uptime"}),n=ui(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 ui(e,t){return dW(e,ua,void 0,{requestId:t.requestId})}let ua=dK(d6,{prepare:d1,prewarm:async(e,t)=>{await d1(e,{...t,healthTimeoutMs:45e3})}}),uo=new WeakMap;async function us(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=ep(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=ec(r);if(r&&!n)throw new ee("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new ee("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??{}},tR(t.command,n)?{...t,flags:n}:t),l=s.command,c=function(e){var t,r;let n=e.session||s8;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=s9(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),d=b(),u=a.resolveSessionDir(c),p=tQ(u,s.meta?.requestId??d.requestId),f=tY(u);M({session:c,logPath:p}),N({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:c,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:f}}),function(e,t){var r;if(r=e.command,ns(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lt(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=ns(l)?.sessionExecutionLockExempt!==!0?await la({req:s,sessionName:c,sessionStore:a}):[],h=(r=o,(i=uo.get(r))||(i=new Map,uo.set(r,i)),i);return{req:s,command:l,sessionName:c,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>ro(s.meta?.requestId),runLocked:async e=>(ro(s.meta?.requestId),0===m.length)?await e():await ul(h,m,async()=>(ro(s.meta?.requestId),await e()))}}async function ul(e,t,r){let[n,...i]=t;return n?await s1(e,n,async()=>await ul(e,i,r)):await r()}function uc(){return{ok:!1,error:Q(new ee("UNAUTHORIZED","Invalid token"))}}async function ud(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 sC({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uu(e){N({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=b(),r=A({force:!0})??void 0;return{ok:!1,error:Q(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function up(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uf(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}
|
|
13
|
-
`)},flush:()=>{n&&(i(n),n="")}}}function um(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 uh(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new ee("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function uw(e,t){let r=(await tb(eG(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function ug(e,t){var r,n;let i;uh(t);let a=await uw(e,t),o=tb(eG(e)),s=await eH(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 c=(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===c.trim().length?null:{pid:a,text:c,recoveredPids:l}}async function uv(e,t,r,n,i){let a,o,s="recovering",l=!1,c=(async()=>{try{for(;!l;){let c=await uw(e,t);if(!c){s="recovering",await tc(1e3);continue}let d=tI(eG(e)),u=eF(d,{pid:c});a=u;let p=uf(r,{redactionPatterns:n});if(o=um(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t2(i,u.pid),s="active",await o,t3(i),a=void 0,o=void 0,l)break;s="recovering",await tc(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),t3(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:c,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await up(o),a&&!a.killed&&a.kill("SIGKILL"),await up(c),t3(i)}}}function uy(e,t){let r=uI(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=uI(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 uS(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=ll(["spawn",t,"log","show","--style","compact","--info","--predicate",uy(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 iM(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")}
|
|
14
|
-
`,recoveredLineCount:l.length}}async function u_(e,t,r,n,i,a){let o=await ub({deviceId:e,appBundleId:t,simulatorSetPath:i});return uM({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return ll(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uy(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function uI(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function ub(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iM(ll(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await en("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uA(e,t,r,n){return uM({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uy(e)],stream:t,redactionPatterns:r,pidPath:n})}async function ux(e,t,r,n){return uM({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uM(e){let t="active",r=et(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=uf(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t2(e.pidPath,n.pid);let a=um(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t3(e.pidPath),r),r=>{throw t="failed",t3(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await up(a),n.killed||n.kill("SIGKILL"),await up(a),t3(e.pidPath)}}}let uN=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uE=/https?:\/\/[^\s"'<>\])]+/i,uD=[/\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 uk(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>uC(e)));for(let e of t.entries){let t=uC(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uP(e,t){let r=uj(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=uj(t?.maxPayloadChars,2048,64,16384),o=uj(t?.maxScanLines,4e3,100,2e4),s=e.split("\n"),l=Math.max(0,s.length-o),c=s.slice(l),d=[];for(let e=c.length-1;e>=0&&d.length<r;e-=1){let t=c[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=uF(s,["method","httpMethod"]),c=uF(s,["url","requestUrl"]),d=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=uN.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=uE.exec(o),h=c??m?.[0];if(!h)return null;let w=d??uT(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:uO(o),packetId:uL(o)??void 0,durationMs:u$(o)??void 0,raw:uq(o,a),line:r};if("android"===n&&function(e,t,r){let n=uR(t,r,5),i=e.packetId??n.map(e=>uL(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?uR(t,r,12).filter(e=>uL(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>uO(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>uT(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>u$(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 uG(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=uq(e,a))}if("body"===i||"all"===i){let e=uU(o,s,["requestBody","body","payload","request"]),t=uU(o,s,["responseBody","response"]);e&&(g.requestBody=uq(e,a)),t&&(g.responseBody=uq(t,a))}return g}(c,e,l+e+1,n,i,a);r&&d.push(r)}return{path:t?.path??"<memory>",exists:!0,scannedLines:c.length,matchedLines:d.length,entries:d,include:i,limits:{maxEntries:r,maxPayloadChars:a,maxScanLines:o}}}function uC(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function uR(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 uT(e){for(let t of uD){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function uO(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 uL(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u$(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 uF(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 uU(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return uG(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 uG(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function uq(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function uj(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let uV={start:async e=>await uQ(e)},uB=ip(uV,function(e={}){return{...uV,...e}});async function uH(e,t){return await uB.run(e,t)}function uK(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 uW(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.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}`;a.existsSync(t)&&(a.existsSync(n)&&a.unlinkSync(n),a.renameSync(t,n))}}(e,{maxBytes:uK("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:uK("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function uz(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function uJ(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function uX(e){var t,r,n,i;let o,s,l,c,{device:d,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v}=e,y=uJ(d),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=uj(t?.maxEntries,25,1,200),s=t?.include??"summary",l=uj(t?.maxPayloadChars,2048,64,16384),c=uj(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uP(a.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:c}}),_=[],I=await uZ({device:d,appBundleId:u,appLogPath:m,appLogState:p});if(I){let e=await ug(d.id,u);if(e){let t=uP(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=uk(t,S,h),_.push((r=I,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"===d.platform&&"simulator"===d.kind&&u&&0===S.entries.length){let e=await u0({deviceId:d.id,appBundleId:u,startedAt:f,simulatorSetPath:d.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=uk(e.dump,S,h),_.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&&_.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?_.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===_.length&&("ios"===d.platform&&"simulator"===d.kind?_.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."):_.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&_.push("ios"===(i=d).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:_}}async function uZ(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t1(a.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}(i.join(i.dirname(n),t0));if(!s)return null;let l=await uw(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function uY(e,t,r,n){return await uB.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function uQ({device:e,appBundleId:t,outPath:r,pidPath:n}){uW(r);let i=a.createWriteStream(r,{flags:"a"}),o=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 ux(e.id,i,o,n):await u_(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return uh(t),await uv(e.id,t,i,o,n);if("macos"===e.platform)return await uA(t,i,o,n);throw i.end(),new ee("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function u0(e){let t=await uS({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uP(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 u1(e){await e.stop(),await up(e.wait)}async function u2(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 ek(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await ek(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 iM(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iM(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await en("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function u3(e,t){uW(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
15
|
-
`;a.appendFileSync(e,r,"utf8")}function u4(e){let t=i.dirname(e),r=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let n=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}let u5="shared_prefs/ReactNativeDevPrefs.xml",u8="debug_http_host",u6="dev_server_https",u9="RCT_jsLocation",u7="RCT_packager_scheme",pe="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",pt='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function pr(e){return void 0!==W(e)}async function pn(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=W(n);if(i){if("android"===t.platform)return void await pa(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await pc(t,r,i)}}async function pi(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await po(t,r);"ios"===t.platform&&"simulator"===t.kind&&await pd(t,r)}}async function pa(e,t,r){var n,i,a,o,s,l;let c,d;pm(t);let u=(n=await ps(e,t),i=u8,a=`${r.host}:${r.port}`,c=` <string name="${ph(i)}">${ph(a)}</string>`,pp(pf(n,i),c));o=u,s=u6,l="https"===r.scheme,d=` <boolean name="${ph(s)}" value="${l?"true":"false"}" />`,u=pp(pf(o,s),d),await pl(e,t,u)}async function po(e,t){pm(t);let r=await ps(e,t),n=pf(r,u8),i=pf(n,u6);i!==r&&await pl(e,t,i)}async function ps(e,t){let r=await ek(e,["shell","run-as",t,"cat",u5],{allowFailure:!0});return 0!==r.exitCode?pt:pu(r.stdout)}async function pl(e,t,r){let n=["shell","run-as",t,"id"],i=await ek(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=pw(i.stdout,i.stderr);throw new ee("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?pe:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await ek(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await ek(e,["shell","run-as",t,"tee",u5],{stdin:r.trimEnd()})}catch(n){let e=Y(n);if("TOOL_MISSING"===e.code)throw e;let r=pw("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new ee("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?pe:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function pc(e,t,r){await iM(lc(e,["spawn",e.id,"defaults","write",t,u9,"-string",`${r.host}:${r.port}`])),await iM(lc(e,["spawn",e.id,"defaults","write",t,u7,"-string",r.scheme]))}async function pd(e,t){await iM(lc(e,["spawn",e.id,"defaults","delete",t,u9]),{allowFailure:!0}),await iM(lc(e,["spawn",e.id,"defaults","delete",t,u7]),{allowFailure:!0})}function pu(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
16
|
-
|
|
17
|
-
</map>`)}function pf(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return pu(e).replace(RegExp(`^\\s*<string name="${r}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${r}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function pm(e){if("binary"!==eB(e))return;let t=ez(e);throw new ee("INVALID_ARGS",t,{package:e,hint:t})}function ph(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function pw(e,t){let r=`${e}
|
|
18
|
-
${
|
|
19
|
-
${
|
|
20
|
-
${
|
|
21
|
-
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pF)}let pK=300,pW=300;function pz(e,t,r){return t||nt(r,r9)?null:aN("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function pJ(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function pX(e,t){pD(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function pZ(e){let t=nt(e.flags,r9)||!e.session?await r0(e.flags??{}):await pY(e.session.device);return!1!==e.ensureReady&&await pq(t),t}async function pY(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await r0(t)}catch(e){if(!(e instanceof ee)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r0({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function pQ(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}function p0(e,t){return!!t&&0===s4(t,e).length}async function p1(e){let{device:t,shutdownRequested:r}=e;if(r&&(pD(t)||"android"===t.platform&&"emulator"===t.kind))return await pk(t)}async function p2(e){if(await dT(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await iK("dismiss",t).catch(t=>{N({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function p3(e,t){e.appLog&&await u1(e.appLog),eb(e.device.platform)&&await p2(e),await pS(t).catch(()=>{})}async function p4(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await p5(t,n);a.appLog&&await u1(a.appLog),t.positionals&&t.positionals.length>0&&(eb(a.device.platform)&&!pD(a.device)&&await p2(a),await nQ(a.device,"close",t.positionals,t.flags?.out,{...am(n,t.flags,a.appBundleId,a.trace?.outPath)}),await pX(a.device,pK)),eb(a.device.platform)&&(!pD(a.device)||t.flags?.shutdown||a.recording)?await p2(a):eb(a.device.platform)&&N({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),pr(i.getRuntimeHints(r))&&a.appBundleId&&await pi({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...tp(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await pS(r).catch(()=>{}),i.delete(r);let o=await p1({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:tu({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...tp(`Closed: ${a.name}`)}}}async function p5(e,t){if(!e.positionals||0===e.positionals.length)return aN("SESSION_NOT_FOUND","No active session");let r=await pZ({session:void 0,flags:e.flags,ensureReady:!0});return await nQ(r,"close",e.positionals,e.flags?.out,{...am(t,e.flags)}),await pX(r,pK),{ok:!0,data:{app:e.positionals[0],...tp(`Closed: ${e.positionals[0]}`)}}}async function p8(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 p6(e){a.existsSync(e)&&a.unlinkSync(e)}function p9(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function p7(e){let t=p9(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function fe(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function ft(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 ee("COMMAND_FAILED",t))})})}(async function(e={}){let t,n,o=e.env??process.env,s=e.stdout??process.stdout,l=e.stderr??process.stderr,c=e.exit??(e=>process.exit(e)),{baseDir:d,infoPath:u,lockPath:p,logPath:f,sessionsDir:m}=eu(o.AGENT_DEVICE_STATE_DIR),h=em(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,v,y,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t0);if(a.existsSync(t))try{let e=t1(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=H(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=K(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{t3(t)}}let _=new tZ(m),x=new rW({maxActiveSimulatorLeases:fe(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:fe(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),M=tS(),D=r.randomBytes(24).toString("hex"),k=H(process.pid)??void 0,P=eh(),C=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c,deviceInventoryProvider:d,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let n=!!(e.meta?.debug||e.flags?.verbose);return await I({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{if(!t4(e.token,r))return uc();try{return await r3(d,async()=>{let t=await us({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uu(e)}})}async function h(e,t){let r=async()=>{let r=function(e){var t,r,n;let a,{scope:o,sessionStore:s,trackDownloadableArtifact:l}=e,c=o.runnerLogPath;o.throwIfCanceled();let d=s.get(o.sessionName);d&&(!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=dP(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")}(d),s.set(o.sessionName,d));let u=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:lr(t.req,a),existingSession:a}),p=u.req;d=u.existingSession;let f=e=>(function(e,t,r){let n=b();if(!t.ok){N({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=A({force:!0})??void 0;return{ok:!1,error:Q(new ee(Z(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 N({level:"info",phase:"request_success"}),A(),{ok:!0,data:function(e,t,r){var n,a;let o;if(!t)return t;let s=(n=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:i.basename(n.meta?.clientArtifactPaths?.path??a.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(d?.recording?.invalidatedReason&&(r=o.command,ns(r)?.allowInvalidRecording!==!0))return{type:"response",response:f({ok:!1,error:{code:"COMMAND_FAILED",message:d.recording.invalidatedReason}})};d&&!p.meta?.lockPolicy&&(n=o.command,ns(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=s4(e,t);if(0!==r.length)throw new ee("INVALID_ARGS",`Session "${e.name}" is already bound to ${s2(e)}, but this request selected ${r.map(s5).join(", ")}.`,{session:e.name,conflicts:r.map(s5),hint:s3(e,"selector-conflict")})}(d,p.flags);let m=(e,t,r)=>{let n;return{...am(c,e,t,r,n=b().requestId),requestId:n}};return{type:"scope",scope:{req:p,sessionName:o.sessionName,logPath:c,existingSession:d,finalize:f,contextFromFlags:m,handlerContextFromFlags:(e,t,r)=>({...m(e,t,r),surface:s.get(o.sessionName)?.surface})}}}({scope:e,sessionStore:p,trackDownloadableArtifact:u});if("response"===r.type)return r.response;let d=r.scope,f=async e=>await w({lockedScope:d,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await nc({req:d.req,existingSession:d.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:c}},f)};return t?await r():await e.runLocked(r)}async function w(e){var t,n;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await sB({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,n=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,ns(o)?.replayScopedAction!==!0))return await m(e);if(!t4(e.token,r))return uc();try{let r=await us({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return uu(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await ud({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:D,sessionStore:_,leaseRegistry:x,trackDownloadableArtifact:rc}),R=async e=>{await I({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{N({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),A({force:!0})})},T=async e=>{let t=p3(e,e.name).catch(t=>{l.write(`Daemon session teardown error (${e.name}): ${t instanceof Error?t.message:String(t)}
|
|
22
|
-
`)});await Promise.race([t,tc(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
23
|
-
`)})]),
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
`),G({exitCode:1,cause:t})})),{httpPort:n,shutdown:G,socketPort:t,token:D}})().catch(e=>{let t=Y(e);process.stderr.write(`Daemon error: ${t.message}
|
|
30
|
-
`),
|
|
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.":`${ta("IOS_RUNNER_CONNECT_TIMEOUT")} ${l_}`)})}function lD(e){return"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lk(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lP(e){if(rs(e))throw rd()}let lE=new Map;async function lC(e,t,r,n,i=45e3,a,o){let s=te.fromTimeoutMs(i),{getEndpoints:l}=lU(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await tl(async({deadline:s})=>{let u=await lR({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 rd();return new eD("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:lx},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||ru(e))throw rd();c||(c=e)}if(o?.aborted)throw rd();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lM({port:t,endpoints:d,logPath:n,lastError:c});let a=await lH(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lM({port:t,endpoints:d,logPath:n,lastError:c})}async function lR(e){await lO(e);let t=await lT(e);if(t.response)return t.response;let r=await lL(e);return r||await l$(e,t.usedCachedTunnelIp)}async function lO(e){if(e.attemptDeadline?.isExpired())throw new eD("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 lN({session:e.session,port:e.port,logPath:e.logPath})}async function lT(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 lG(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,lE.delete(i))}}),usedCachedTunnelIp:r}}async function lL(e){return"simulator"===e.device.kind&&e.session?.ready?await lq(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function l$(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,lE.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lG(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 lF(e,t,r,n=45e3,i){if(i?.aborted)throw rd();let a=te.fromTimeoutMs(n),{getEndpoints:o}=lU(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eD("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eD("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lV(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lU(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lj({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 lG(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 eD("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lV(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||ru(e))throw rd();s(t,e)}return null}async function lq(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 lH(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||ru(e))throw rd();return o(e),null}}async function lj(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=lE.get(t))?e.expiresAt<=Date.now()?(lE.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 lB(i.id,a);return l(d),d&&(r=i.id,n=d,lE.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lV(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 lB(e,t){if("number"==typeof t&&t<=0)return null;let r="number"==typeof t?Math.max(1,Math.min(1e4,t)):1e4,n=i.join(u.tmpdir(),`agent-device-devicectl-info-${process.pid}-${Date.now()}.json`);try{let t=Math.max(1,Math.ceil(r/1e3)),i=await iU(["devicectl","device","info","details","--device",e,"--json-output",n,"--timeout",String(t)],{allowFailure:!0,timeoutMs:r});if(0!==i.exitCode||!a.existsSync(n))return null;let o=JSON.parse(a.readFileSync(n,"utf8"));if(o.info?.outcome&&"success"!==o.info.outcome)return null;let s=(o.result?.connectionProperties?.tunnelIPAddress??o.result?.device?.connectionProperties?.tunnelIPAddress)?.trim();return s&&s.length>0?s:null}catch{return null}finally{lJ(n)}}async function lH(e,t,r,n,i){let a=JSON.stringify(r),o=lI(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 iU(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tn({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eD("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:ta(e)})}return{status:200,body:l}}async function lK(){return await new Promise((e,t)=>{let r=g.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 eD("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function lW(e,t,r,n){t&&lX(t,e),r&&lX(r,e),n&&process.stderr.write(e)}let lz=new Map;function lX(e,t){let r=(lz.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{lz.get(e)===r&&lz.delete(e)});lz.set(e,r)}function lJ(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function lZ(e){let{lockDirPath:t,owner:r}=e,n=i.join(t,"owner.json"),o=Date.now()+(e.timeoutMs??3e4),s=e.pollMs??100,l=e.ownerGraceMs??5e3,d=e.description??"process lock";for(a.mkdirSync(i.dirname(t),{recursive:!0});Date.now()<o;)try{a.mkdirSync(t),function(e,t){let r=`${e}.${process.pid}.${Date.now()}.tmp`;a.writeFileSync(r,JSON.stringify(t),"utf8"),a.renameSync(r,e)}(n,r);let e=!1;return async()=>{e||(e=!0,a.rmSync(t,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,t,r){let n=null;try{n=a.statSync(e)}catch{return!0}let i=lY(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&eb(o.pid)&&(!o.startTime||ev(o.pid)===o.startTime))&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-n.mtimeMs<r)&&(a.rmSync(e,{recursive:!0,force:!0}),!0)}(t,n,l))continue;await eW(s)}throw new eD("COMMAND_FAILED",`Timed out waiting for ${d}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),i=lY(t);try{r=Math.max(0,Math.round(n-a.statSync(e).mtimeMs))}catch{}return{...void 0!==r?{lockAgeMs:r}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(n-i.acquiredAtMs))}:{}}}(t,n)})}function lY(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let lQ=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function l0(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eD("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(!a.existsSync(e))throw new eD("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await l1(e)){await iF("codesign",["--remove-signature",e],{allowFailure:!0});try{await iF("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eD?n:new eD("COMMAND_FAILED",String(n));throw new eD("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 l1(e){return 0===(await iF("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let l2=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l3=new Set([" "," ","\n","\r"]),l5=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function l4(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new l6(e).parse()}function l8(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)}l8(r.children,t)}}class l6{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(l5.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?l9(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])&&l2.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,l9(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])&&l3.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function l9(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 l7=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function de(e){var t;let r=await dt(e);if(!r||0===r.length)return null;let n=i.dirname(e),o=new Set,s=function(e,t){let r=[],n=new Set,a=[];for(let o of e){if(o.startsWith("__TESTHOST__/")){a.push(o.slice(13));continue}if(!o.startsWith("__TESTROOT__/"))continue;let e=o.slice(13);r.push(i.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(i.join(t,s))}return{testRootPaths:r,hostRoots:Array.from(n),hostRelativePaths:a}}(r,n);for(let e of s.testRootPaths){if(!a.existsSync(e))return null;o.add(e)}for(let e of(t=s).hostRelativePaths.map(e=>{let r=t.hostRoots.find(t=>a.existsSync(i.join(t,e)));return r?i.join(r,e):null})){if(!e)return null;o.add(e)}return Array.from(o)}async function dt(e){let t=await iG(e);if(t){var r,n,i,o=t;let e=new Set;for(let t of[i=o,...function(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let r=[];for(let e of t){if(!dr(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(dr))}return r}(i),...Object.values(i).filter(e=>dr(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(l7.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=a.readFileSync(e,"utf8"),n=l4(r),t=new Set,l8(n,(e,r)=>{if(l7.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}}function dr(e){return!!e&&"object"==typeof e}let dn=["CFBundleIcons","CFBundleIcons~ipad"];async function di(e){let t=e.filter(dc);if(0===t.length)return;let r=e.filter(e=>dp(e)&&!du(e));for(let e of t){let t=function(e,t){let r=i.dirname(e);return t.find(e=>i.dirname(e)===r&&"AgentDeviceRunner.app"===i.basename(e))??t.find(t=>i.dirname(t)===r&&t!==e)??null}(e,r);t&&await da(t,e)}}async function da(e,t){var r;let n,o=function(e,t){let r=!1;for(let o of a.readdirSync(e,{withFileTypes:!0})){var n;if(o.isFile()&&(n=o.name,/^AppIcon.*\.png$/.test(n)||"Assets.car"===n))(function(e,t){if(a.existsSync(t)){let r=a.readFileSync(e),n=a.readFileSync(t);return!r.equals(n)&&(a.copyFileSync(e,t),!0)}return a.copyFileSync(e,t),!0})(i.join(e,o.name),i.join(t,o.name))&&(r=!0)}return r}(e,t),s=await ds(e,t);(o||s)&&(await dd(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function ds(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iG(a),l=await iG(o);if(!s||!l)return!1;let d=(r=s,n=l,dn.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 dl(o,e.key,e.value,e.shouldInsert);return!0}async function dl(e,t,r,n){let i=await iF("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eD("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dd(e){let t=await iF("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eD("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dc(e){return dp(e)&&du(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function du(e){return i.basename(e).endsWith("-Runner.app")}function dp(e){return i.basename(e).endsWith(".app")}let df={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 dm(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":eJ(e.target)}function dh(e){return"simulator"===e?"simulator":"device"}function dw(){return"arm64"===process.arch?"arm64":"x86_64"}let dg="XCTestDevices",dy=".agent-device-backup",dv=".agent-device-xctestdevices-backup-",dS=i.join(u.homedir(),".agent-device","ios-runner"),dI=".agent-device-runner-cache.json",dA={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},d_=new Map,db=new Set,dx=new Map,dM=new Set;function dN(e){return e?.trim()??""}function dD(e=process.env){return dN(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dN(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dk(e=process.env){let t=dN(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dD(e)}.uitests`}let dP=function(e=process.env){let t=dD(e),r=dk(e);return Array.from(new Set([dN(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dE(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function dC(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=e6(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dE()),s=i.resolve(t.backupPath??function(e=dE()){return`${e}${dy}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??ev(process.pid),c=await dT({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dR({xctestDeviceSetPath:o,backupPath:s}),function(e,t){if(i.resolve(e)===i.resolve(t))return!0;try{return a.realpathSync.native(e)===a.realpathSync.native(t)}catch{return!1}}(n,o))return await c(),null;a.mkdirSync(n,{recursive:!0}),a.existsSync(o)&&a.renameSync(o,s),function(e){let{requestedSetPath:t,xctestDeviceSetPath:r}=e,n=i.dirname(r),o=i.join(n,`${dg}.agent-device-link-${process.pid}-${Date.now()}`);a.mkdirSync(n,{recursive:!0});try{a.symlinkSync(t,o,"dir"),a.renameSync(o,r)}catch(e){throw a.existsSync(o)&&dO(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw dR({xctestDeviceSetPath:o,backupPath:s}),await c(),new eD("COMMAND_FAILED","Failed to redirect XCTest device set path",{requestedSetPath:n,xctestDeviceSetPath:o,backupPath:s,error:String(e)})}let p=!1;return{release:async()=>{if(!p){p=!0;try{dR({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dR(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dy,""),n=r===dg?dv:`${r}${dv}`;try{return a.readdirSync(t).filter(e=>e.startsWith(n)).sort().map(e=>i.join(t,e))}catch{return[]}}(r)],o=n.find(e=>a.existsSync(e)),s=a.existsSync(t)&&a.lstatSync(t).isSymbolicLink();if(o){if(s&&dO(t),a.existsSync(t))if(!s)return void ei({level:"warn",phase:"ios_runner_xctest_device_set_restore_collision",data:{xctestDeviceSetPath:t,activeBackupPath:o}});else o!==r?a.rmSync(o,{recursive:!0,force:!0}):a.rmSync(r,{recursive:!0,force:!0});else a.mkdirSync(i.dirname(t),{recursive:!0}),a.renameSync(o,t);for(let e of n)e!==o&&a.existsSync(e)&&a.rmSync(e,{recursive:!0,force:!0});return}s&&(ei({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),dO(t))}function dO(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function dT(e){return await lZ({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 dL(e){var t;return await dT({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:ev(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function d$(e,t){let r=tx(),n=dB(e,r),i=ct(e,n);return await ln(d_,i,async()=>{let a=await dL(i);try{return await dF({device:e,options:t,projectRoot:r,expectedCacheMetadata:n,derived:i,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await a()}})}async function dF(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(tt(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||db.has(t))&&(cl("clean",r?"forced_rebuild":"forced_clean",{derived:t}),co(t),dj(t),db.delete(t));let l=await cs({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>d2(e,n),xctestrunReferencesProjectRoot:d5,resolveExistingXctestrunProductPaths:de}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cl("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await dU({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(co(s),dj(s)),await dG({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function dU(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await dq(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function dG(e){let{device:t,options:r,projectRoot:n,expectedCacheMetadata:o,derived:s,cache:l,reason:d}=e,c=i.join(n,"ios-runner","AgentDeviceRunner","AgentDeviceRunner.xcodeproj");if(!a.existsSync(c))throw new eD("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await ce(t,c,s,r);let p=Math.max(0,Date.now()-u),f=d2(s,t);if(!f)throw new eD("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await de(f);if(!m)throw new eD("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await l0(t,m,f),await di(m),dK(s,dJ(o,f,m)),cl("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function dq(e,t,r,n){try{var i,a,o,s;return await l0(e,n.productPaths,n.xctestrunPath),cl("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,dK(i,dJ(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eD))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&lQ.has(t)}(e))throw e;return cl("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function dj(e){try{if(!a.existsSync(e))return;if("derived"!==i.basename(e))return void a.rmSync(e,{recursive:!0,force:!0});for(let r of a.readdirSync(e,{withFileTypes:!0})){var t;t=r.name,dV.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dV=new Set([dI,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dB(e,t=tx()){let n,o=dm(e);return{schemaVersion:2,packageVersion:tb(),runnerSourceFingerprint:function(e){let t=i.join(e,"ios-runner","AgentDeviceRunner"),n=function(e){if(!a.existsSync(e))return[];let t=[],r=[e];for(;r.length>0;){let e=r.pop();for(let s of a.readdirSync(e,{withFileTypes:!0})){var n,o;let a=i.join(e,s.name);if(s.isDirectory()){if("xcuserdata"===s.name)continue;r.push(a);continue}s.isFile()&&(n=s.name,o=a,"project.pbxproj"===n?o.includes(`${i.sep}.xcodeproj${i.sep}`):[".jpg",".json",".png",".swift",".m",".h",".plist",".entitlements",".xctestplan",".xcconfig",".storyboard",".xib"].includes(i.extname(n)))&&t.push(a)}}return t.sort((e,t)=>e.localeCompare(t))}(t),o=function(e,t){let n=r.createHash("sha256");for(let r of t){let t=i.relative(e,r),o=a.statSync(r);n.update(t),n.update("\0"),n.update(String(o.size)),n.update("\0"),n.update(String(Math.trunc(o.mtimeMs))),n.update("\0")}return n.digest("hex")}(t,n),s=d1.get(t);if(s?.fileStatsFingerprint===o)return s.sourceFingerprint;let l=r.createHash("sha256");for(let e of n){let r=i.relative(t,e);l.update(r),l.update("\0"),l.update(a.readFileSync(e)),l.update("\0")}let d=l.digest("hex");return d1.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=dH("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=df[e].sdkName[dh(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:dH("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:dH("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=dm(e))?`platform=macOS,arch=${dw()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:ci(process.env),runnerSigningBuildSettings:cn(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:ca()}}function dH(e,t){let r=JSON.stringify([e,t]),n=dx.get(r);if(void 0!==n)return n;try{let n=eC(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return dx.set(r,i),i}catch{return dx.set(r,"unknown"),"unknown"}}function dK(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,dI),`${JSON.stringify(t,null,2)}
|
|
10
|
+
`)}async function dW(e,t){db.add(e.derived);let r=await dL(e.derived);try{cl("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),co(e.derived),dj(e.derived)}finally{await r()}}function dz(e){let{artifacts:t,...r}=e;return r}function dX(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 dJ(e,t,r){let n=function(e,t){let r=dY(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=dY(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 dZ(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function dY(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function dQ(e,t){let r=dY(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function d0(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let d1=new Map;function d2(e,t){if(!a.existsSync(e))return null;let r=[],n=[e];for(;n.length>0;){let e=n.pop();for(let t of a.readdirSync(e,{withFileTypes:!0})){let o=i.join(e,t.name);if(t.isDirectory()){n.push(o);continue}if(t.isFile()&&t.name.endsWith(".xctestrun"))try{let e=a.statSync(o);r.push({path:o,mtimeMs:e.mtimeMs})}catch{}}}return 0===r.length?null:(r.sort((e,r)=>{if(t){let n=d3(r.path,t)-d3(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function d3(e,t){let r=0,n=e.toLowerCase();i.basename(n).startsWith("agentdevicerunner.env.")&&(r-=1e3),n.includes(`${i.sep}macos${i.sep}`)&&(r-=5e3);let a=df[dm(t)].xctestrunHints[dh(t.kind)];return a.preferred.length>0&&(a.preferred.some(e=>n.includes(e))?r+=2e3:r-=500),a.disallowed.some(e=>n.includes(e))&&(r-=2500),r}function d5(e,t){try{let r=a.readFileSync(e,"utf8"),n=new Set([t]);try{n.add(a.realpathSync(t))}catch{}for(let e of n)if(r.includes(e))return!0;return!1}catch{return!1}}async function d4(e,t,r){let n=i.dirname(e),a=r.replace(/[^a-zA-Z0-9._-]/g,"_"),o=i.join(n,`AgentDeviceRunner.env.${a}.json`),s=i.join(n,`AgentDeviceRunner.env.${a}.xctestrun`),l=await d8(e);return d9(l,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})}),d9(l,e=>Object.assign(e,dA),{requireTestBundlePath:!0}),await d6(l,o,s),{xctestrunPath:s,jsonPath:o}}async function d8(e){let t=await iF("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eD("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 eD("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function d6(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await iF("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eD("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function d9(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=d7(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=d7(r,{requireTestBundlePath:!0});e&&t(e)}}function d7(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function ce(e,t,r,n){let i=ci(process.env),a=cn(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=ca(),l=await dC(e);try{let l;await eP("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cr(e),"1","-destination",(l=dm(e),"macOS"===l?`platform=macOS,arch=${dw()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`generic/platform=${l}`),"-derivedDataPath",r,...s,...i,...o,...a],{detached:!0,timeoutMs:n.buildTimeoutMs,onSpawn:e=>{dM.add(e),e.on("close",()=>{dM.delete(e)})},onStdoutChunk:e=>{lW(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{lW(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eD?a:new eD("COMMAND_FAILED",String(a)),i=(e=r.details?JSON.stringify(r.details):"",((t=`${r.message}
|
|
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)??l_);throw new eD("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function ct(e,t){let n,a=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();if(a)return i.resolve(a);let o=(n=r.createHash("sha256").update(dX(dz(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(dS,"derived",df[dm(e)].derivedBaseName[dh(e.kind)])}(e);return i.join(s,o)}function cr(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cn(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 ci(e=process.env){let t=dD(e),r=dk(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function ca(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function co(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(tx(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new eD("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 ${i.join(tx(),".tmp")}.`})}}async function cs(e){var t,r;let n,o=(t=e.derived,r=e.expectedCacheMetadata,(n=function(e){try{let t=JSON.parse(a.readFileSync(i.join(e,dI),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?dX(dz(n))!==dX(dz(r))?{ok:!1,reason:"cache_metadata_mismatch"}:{ok:!0,metadata:n}:{ok:!1,reason:"cache_metadata_missing"}),s=o.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(dZ))||!d0(n.xctestrunPath,e)||!dQ(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!d0(t.path,e)||!dQ(t.path,t))return null;i.push(t.path)}return{xctestrunPath:n.xctestrunPath,productPaths:i}}(e.derived,o.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?o.ok?{reason:"reuse_ready",xctestrunPath:l,productPaths:u,source:c}:{reason:o.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 cl(e,t,r){ei({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cd=process.pid,cc=ev(process.pid),cu=(tF=cd,tU=cc,(e=r.createHash("sha256")).update(String(tF)),e.update("\0"),e.update(tU??"unknown-start"),`owner-${tF}-${e.digest("hex").slice(0,8)}`);async function cp(e,t){let r=await lZ({lockDirPath:`${cy(e)}.lock`,owner:{pid:cd,startTime:cc,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cf(e){try{let t=JSON.parse(a.readFileSync(cy(e),"utf8"));return function(e,t){var r,n,i;let a;if(!e||"object"!=typeof e||Array.isArray(e)||1!==e.schemaVersion||e.deviceId!==t)return null;let o=(r=e,a={ownerToken:cv(r.ownerToken),ownerPid:cS(r.ownerPid),sessionId:cv(r.sessionId),port:cS(r.port),xctestrunPath:cv(r.xctestrunPath),jsonPath:cv(r.jsonPath),createdAtMs:(n=r.createdAtMs,"number"==typeof n&&Number.isFinite(n)?n:null)},Object.values(a).some(e=>null===e)?null:a);return o?{schemaVersion:1,deviceId:t,...o,ownerStartTime:(i=e.ownerStartTime,"string"==typeof i?i:null),runnerPid:cS(e.runnerPid)}:null}(t,e)}catch{return null}}function cm(e){var t;return e?e.ownerToken===cu?{type:"owned",lease:e}:eb((t=e).ownerPid)&&(!t.ownerStartTime||ev(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function ch(e,t){let r=cm(cf(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new eD("COMMAND_FAILED",`iOS runner for ${e} is already owned by another agent-device daemon`,{deviceId:e,ownerPid:r.lease.ownerPid,ownerStartTime:r.lease.ownerStartTime,ownerToken:r.lease.ownerToken,sessionId:r.lease.sessionId,hint:"Use a different simulator/session, wait for the other run to finish, or stop the owning daemon before retrying."});await cI(r.lease,r.type,t)}async function cw(e,t){let r=cm(cf(e));"owned"===r.type&&await cI(r.lease,"owned",t)}function cg(e){e&&function(e){let t=cf(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cy(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cy(e){let t;return i.join((t=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim())?i.resolve(t):i.join(u.homedir(),".agent-device","ios-runner","leases"),`${e.replaceAll(/[^A-Za-z0-9._-]/g,"-")||"unknown-device"}.json`)}function cv(e){return"string"==typeof e&&e.length>0?e:null}function cS(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cI(e,t,r){ei({level:"stale"===t?"warn":"debug",phase:"ios_runner_lease_cleanup",data:{deviceId:e.deviceId,ownerPid:e.ownerPid,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),cg(e)}let cA={cleanupRunnerProcessTree:cO,cleanupRunnerXcodebuildProcesses:cT,cleanupTempFile:lJ};async function c_(e,t={}){var r;!1!==t.graceful?await cN(e):await cO(e.child.pid,"SIGTERM"),await cD(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(cE(r)||eA(r))&&await cO(e.child.pid,"SIGKILL"),await ck(e)}async function cb(e){await cw(e,cA)}async function cx(e){let t=Array.from(dM);await cC(e,"SIGINT"),await cR(t,"SIGINT"),await cC(e,"SIGTERM"),await cR(t,"SIGTERM"),await cC(e,"SIGKILL"),await cR(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await ck(e)}))}async function cM(){let e=Array.from(dM);await Promise.allSettled(e.map(async e=>{try{await cO(e.pid,"SIGTERM"),await cO(e.pid,"SIGKILL")}finally{dM.delete(e)}}))}async function cN(e){try{await lC(e.device,e.port,lk({command:"shutdown"}),void 0,15e3)}catch{await cO(e.child.pid,"SIGTERM")}}async function cD(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function ck(e){await cP(e.device),lJ(e.xctestrunPath),lJ(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cg(e.lease)}}async function cP(e){"simulator"===e.kind&&await Promise.allSettled(dP.map(async t=>{try{await iU(lI(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ei({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 cE(e){return!!e&&eb(e)}async function cC(e,t){await Promise.allSettled(e.map(async e=>{await cO(e.child.pid,t)}))}async function cR(e,t){await Promise.allSettled(e.map(async e=>{await cO(e.pid,t),"SIGKILL"===t&&dM.delete(e)}))}async function cO(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 iF("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function cT(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cL(e)}-${cL(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cL(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iF("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ei({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function cL(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function c$(e){let t=await cF(e.logPath);return t?new eD(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 cF(e){if(!e)return;let t=await cU(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 cU(e,t){let r;try{let n=await w.stat(e),i=Math.max(0,n.size-t),a=n.size-i;if(a<=0)return;r=await w.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 cG=new Map,cq=new Map,cj=new Set(["tap","longPress","drag","swipe","scroll","sequence"]);async function cV(e,t){return await ln(cq,e.id,async()=>{let r=cG.get(e.id);if(r){let t=await cH(e,r);if(t)return t}return await cp(e.id,async()=>await cB(e,t))})}async function cB(e,t){var r,n;let o,s,l={};await ue(l,"cleanup_stale_xcodebuild",async()=>{await ch(e.id,cA)}),await ue(l,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ei({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):c0(t))}),await ue(l,"verify_developer_mode",async()=>{await c1(e)}),t.cleanStaleBundles?await ue(l,"cleanup_stale_bundles",async()=>{await cK(e)}):(l.cleanup_stale_bundles=0,ei({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let d=await ue(l,"ensure_xctestrun",async()=>await d$(e,t));l.build_xctestrun=d.buildMs;let c=await ue(l,"allocate_port",async()=>await lK()),{xctestrunPath:u,jsonPath:p}=await ue(l,"prepare_xctestrun_env",async()=>await d4(d.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(c)},`session-${e.id}-${cu}-${c}`)),f=await ue(l,"simulator_set_redirect",async()=>await dC(e));try{({child:o,wait:s}=await ue(l,"launch_xcodebuild",()=>{let t;return ek("xcodebuild",["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cr(e),"1","-destination-timeout",String(20),"-xctestrun",u,"-destination",(t=dm(e),"macOS"===t?`platform=macOS,arch=${dw()}`:"simulator"===e.kind?`platform=${t} Simulator,id=${e.id}`:`platform=${t},id=${e.id}`)],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(c)},detached:!0})}))}catch(e){throw await f?.release(),e}o.stdout?.on("data",e=>{lW(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lW(e,t.logPath,t.traceLogPath,t.verbose)});let m=`${e.id}:${c}:${Date.now()}`,h={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:m,runnerPid:o.pid,port:c,xctestrunPath:u,jsonPath:p}).deviceId,ownerToken:cu,ownerPid:cd,ownerStartTime:cc,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},w={sessionId:m,device:e,deviceId:e.id,port:c,xctestrunPath:u,xctestrunArtifact:d,jsonPath:p,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:l,simulatorSetRedirect:f??void 0,lease:h};try{let e,t;e=cy(h.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await cJ(e.id,w,{graceful:!1,waitTimeoutMs:1e3}),t}return cG.set(e.id,w),w}async function cH(e,t){if(!cE(t.child.pid))return await ue({},"stop_stale_session",async()=>{await cJ(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=ct(e,dB(e));return t.xctestrunArtifact?.derived!==r?(ei({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:t.xctestrunArtifact?.derived,expectedDerived:r}}),await ue({},"stop_stale_artifact_session",async()=>{await cJ(e.id,t)}),null):(ei({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function cK(e){if("simulator"===e.kind)for(let t of dP){let r=await cW(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 cW(e,t){try{return await iU(lI(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ei({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 cz(e){let t=cG.get(e);return t?{sessionId:t.sessionId,alive:cE(t.child.pid)}:null}async function cX(e,t){await ln(cq,e.deviceId,async()=>{cG.get(e.deviceId)===e&&(ei({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await cJ(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function cJ(e,t,r={}){let n=t??cG.get(e);n&&(await c_(n,r),cG.get(e)===n&&cG.delete(e))}async function cZ(e){await ln(cq,e,async()=>{await cp(e,async()=>{await cJ(e),await cb(e)})})}async function cY(){let e=Array.from(cG.values());for(let t of(await cx(e),e))cG.get(t.deviceId)===t&&cG.delete(t.deviceId)}async function cQ(){await cY();let e=Array.from(cG.keys());await Promise.allSettled(e.map(async e=>{await cZ(e)})),await cM()}async function c0(e){await iU(lI(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function c1(e){if("ios"!==e.platform)return;let t=await iF("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
|
|
13
|
+
${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eD("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 c2(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eD("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function c3(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,ei({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,timings:o.startupTimings}}));let f=lk(r),m=lD(f.command),h=te.fromTimeoutMs(i),w=function(e,t){var r;let n=lD(t.command);if(!e.ready)return n?{action:"skip",reason:"read_only_startup_command"}:{action:"run",reason:"startup"};if("uptime"===(r=t.command)||"status"===r)return{action:"skip",reason:"readiness_probe_command"};if(!cj.has(t.command))return{action:"run",reason:"conservative_command"};let i=e.lastHealthyMutation;if(!i)return{action:"run",reason:"no_recent_healthy_mutation"};if(t.appBundleId!==i.appBundleId)return{action:"run",reason:"app_activation_uncertain"};let a=Date.now()-i.atMs;return a>5e3?{action:"run",reason:"healthy_mutation_stale",lastHealthyMutationAgeMs:a}:{action:"skip",reason:"recent_healthy_mutation",lastHealthyMutationAgeMs:a}}(t,f);"run"===w.action?await c8({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ei({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 c4({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw c5(e,t,w)}try{let e=await c6(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 cX(t,r)):cj.has(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eD){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 cX(t,e),r;if((u=r)instanceof eD&&u.details?.runner!==void 0)throw r;throw c5(r,t,w)}}function c5(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,c9(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function c4(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 eD("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 er("ios_runner_command_send",async()=>l?await lC(t,r.port,n,i,d,r,s):await lF(t,r.port,n,d,s),c)}async function c8(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(c7(r),a.remainingMs());try{let e=await er("ios_runner_readiness_preflight",async()=>await lC(t,r.port,lk({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await c6(e,r,i)}catch(e){throw c9(e,{runnerReadinessPreflightFailed:!0})}}async function c6(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eD("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?ex(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 c$({error:new eD(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&&ei({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 c9(e,t){let r=e instanceof eD?e:new eD("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eD(r.code,r.message,{...r.details??{},...t},r.cause??e)}function c7(e){return e.startupTimeoutMs??45e3}async function ue(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ei({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let ut=new h;function ur(e,t={}){return{runCommand:e,...t}}function un(e,t,r,n={}){if(r)return ua(r);let i=function(e,t={}){let r=ut.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?ua(i.provider):ua(t)}async function ui(e,t,r){if(!e)return await r();let n={provider:ua(e),deviceId:t.deviceId,requestId:t.requestId};return await ut.run(n,r)}function ua(e){return"function"==typeof e?{runCommand:e}:e}async function uo(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await ud(t,r,n,i,a,o);return await us(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function us(e,t){var r,n,i,a;if(!e)return await ul(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,up({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,up({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await ul(t,e.reason,e.lifecycleState,e.error)}async function ul(e,t,r,n){throw up({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 ud(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let y,v,S,I,A;if("status"===r.command||!r.commandId?.trim())return;let _=uu(n);try{y=await c3(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ei({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),..._}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let b="string"==typeof y.lifecycleState?y.lifecycleState:"";return ei({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:b,..._}}),o=y,s=b,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(lD(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=uu(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eD("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,`${uc(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,v="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=uu(f),new eD(ex(v),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:I??(h=p.command,w=A,`${uc(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(lD(t.command))return r;let s=uu(r);return new eD("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,`${uc(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 eD("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 uc(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 uu(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 up(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ei({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 uf(e,t){let r;lP(t.requestId);let n=rl(t.requestId),i=lk({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await um({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eD("COMMAND_FAILED","iOS runner prepare failed")}async function um(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await cV(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await uI(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,uA(c,u),u)}}catch(e){return await uh({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function uh(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eD?d:new eD("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&uy(t)))return{kind:"prepared",result:await uw({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uy(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await ug(i,"prepare_runner_health_failed"),d;return lP(o.requestId),await cX(i,"prepare_runner_health_retry"),ei({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 uw(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 cX(s,"prepare_cached_runner_health_failed"),await dW(s.xctestrunArtifact,p);let f=Date.now(),m=await cV(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await uI(o,m,l,d,c,h,{recoveryReason:p});return ei({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,uA(t,r),r}catch(r){let e;await ug(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eD?n:new eD("COMMAND_FAILED",String(n)),new eD(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 uA(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 ug(e,t){try{await cX(e,t)}catch{}}function uy(e){let t;return!ru(e)&&(lb(e)||lx(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uv(e,t,r){let n;lP(r.requestId);let i=rl(r.requestId);try{let a=(n=await cV(e,r)).ready?45e3:c7(n);return await c3(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eD?o:new eD("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lx(a)&&n)return lP(r.requestId),await uS({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&&(lb(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lP(r.requestId),await uS({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&&lb(a))return await uo({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:cX});throw o}}async function uS(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await cX(e.session,a);let o=await cV(t,{...n,cleanStaleBundles:!0});try{let a=await c3(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ei({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 eD?a:new eD("COMMAND_FAILED",String(a));if(lb(e))return await uo({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:cX});throw a}}async function uI(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await c3(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 uA(e,t){ei({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 u_(e,t,r={}){c2(e),lP(r.requestId);let n=lk(t),i=uM(e,r);return lD(n.command)?e7(()=>(lP(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lP(r.requestId),lb(e))}):i.runCommand(e,n,r)}function ub(e,t={}){if("ios"!==e.platform)return;let r=uM(e,t);return r.prewarm?r.prewarm(e,t).then(()=>{}).catch(t=>{ei({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}})}):void ei({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function ux(e,t){c2(e),lP(t.requestId);let r=lk({command:"uptime"}),n=uM(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 uM(e,t){return un(e,uN,void 0,{requestId:t.requestId})}let uN=ur(uv,{prepare:uf,prewarm:async(e,t)=>{await uf(e,{...t,healthTimeoutMs:45e3})}}),uD=new WeakMap;async function uk(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=eG(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=e$(r);if(r&&!n)throw new eD("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eD("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??{}},t$(t.command,n)?{...t,flags:n}:t),l=s.command,d=function(e){var t,r;let n=e.session||ll;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=lc(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),c=ee(),u=a.resolveSessionDir(d),p=t3(u,s.meta?.requestId??c.requestId),f=t2(u);en({session:d,logPath:p}),ei({level:"info",phase:"request_start",data:{publicSession:s.session,effectiveSession:d,command:s.command,tenant:s.meta?.tenantId,isolation:s.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:f}}),function(e,t){var r;if(r=e.command,nf(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lf(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=nf(l)?.sessionExecutionLockExempt!==!0?await lg({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=uD.get(r))||(i=new Map,uD.set(r,i)),i);return{req:s,command:l,sessionName:d,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>rc(s.meta?.requestId),runLocked:async e=>(rc(s.meta?.requestId),0===m.length)?await e():await uP(h,m,async()=>(rc(s.meta?.requestId),await e()))}}async function uP(e,t,r){let[n,...i]=t;return n?await ln(e,n,async()=>await uP(e,i,r)):await r()}function uE(){return{ok:!1,error:eN(new eD("UNAUTHORIZED","Invalid token"))}}async function uC(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 sB({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uR(e){ei({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=ee(),r=et({force:!0})??void 0;return{ok:!1,error:eN(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function uO(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function uT(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 uL(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 u$(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eD("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function uF(e,t){let r=(await tN(to(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function uU(e,t){var r,n;let i;u$(t);let a=await uF(e,t),o=tN(to(e)),s=await tu(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 uG(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await uF(e,t);if(!d){s="recovering",await eW(1e3);continue}let c=tM(to(e)),u=ti(c,{pid:d});a=u;let p=uT(r,{redactionPatterns:n});if(o=uL(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&t8(i,u.pid),s="active",await o,t6(i),a=void 0,o=void 0,l)break;s="recovering",await eW(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),t6(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await uO(o),a&&!a.killed&&a.kill("SIGKILL"),await uO(d),t6(i)}}}function uq(e,t){let r=uB(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=uB(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 uj(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lS(["spawn",t,"log","show","--style","compact","--info","--predicate",uq(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 iU(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")}
|
|
15
|
+
`,recoveredLineCount:l.length}}async function uV(e,t,r,n,i,a){let o=await uH({deviceId:e,appBundleId:t,simulatorSetPath:i});return uz({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lS(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uq(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function uB(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uH(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iU(lS(["get_app_container",t,r,"app"],{simulatorSetPath:n}),{allowFailure:!0,timeoutMs:4e3});if(0!==a.exitCode)return;let o=a.stdout.trim();if(!o)return;let s=i.join(o,"Info.plist"),l=await eE("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function uK(e,t,r,n){return uz({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uq(e)],stream:t,redactionPatterns:r,pidPath:n})}async function uW(e,t,r,n){return uz({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function uz(e){let t="active",r=ek(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=uT(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t8(e.pidPath,n.pid);let a=uL(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t6(e.pidPath),r),r=>{throw t="failed",t6(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await uO(a),n.killed||n.kill("SIGKILL"),await uO(a),t6(e.pidPath)}}}let uX=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uJ=/https?:\/\/[^\s"'<>\])]+/i,uZ=[/\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 uY(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>u0(e)));for(let e of t.entries){let t=u0(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function uQ(e,t){let r=pe(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=pe(t?.maxPayloadChars,2048,64,16384),o=pe(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=u8(s,["method","httpMethod"]),d=u8(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=uX.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=uJ.exec(o),h=d??m?.[0];if(!h)return null;let w=c??u2(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:u3(o),packetId:u5(o)??void 0,durationMs:u4(o)??void 0,raw:u7(o,a),line:r};if("android"===n&&function(e,t,r){let n=u1(t,r,5),i=e.packetId??n.map(e=>u5(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?u1(t,r,12).filter(e=>u5(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>u3(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>u2(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>u4(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 u9(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=u7(e,a))}if("body"===i||"all"===i){let e=u6(o,s,["requestBody","body","payload","request"]),t=u6(o,s,["responseBody","response"]);e&&(g.requestBody=u7(e,a)),t&&(g.responseBody=u7(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 u0(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function u1(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 u2(e){for(let t of uZ){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function u3(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 u5(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u4(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 u8(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 u6(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return u9(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 u9(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function u7(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function pe(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let pt={start:async e=>await pu(e)},pr=iM(pt,function(e={}){return{...pt,...e}});async function pn(e,t){return await pr.run(e,t)}function pi(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 pa(e){let t=i.dirname(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),function(e,t){if(a.existsSync(e)&&!(a.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}`;a.existsSync(t)&&(a.existsSync(n)&&a.unlinkSync(n),a.renameSync(t,n))}}(e,{maxBytes:pi("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:pi("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function po(e){if(!a.existsSync(e))return{exists:!1,sizeBytes:0};let t=a.statSync(e);return{exists:!0,sizeBytes:t.size,modifiedAt:t.mtime.toISOString()}}function ps(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pl(e){var t,r,n,i;let o,s,l,d,{device:c,appBundleId:u,appLogState:p,appLogStartedAt:f,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y}=e,v=ps(c),S=(t={backend:v,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y},o=pe(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pe(t?.maxPayloadChars,2048,64,16384),d=pe(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?uQ(a.readFileSync(m,"utf8"),{...t,path:m}):{path:m,exists:!1,scannedLines:0,matchedLines:0,entries:[],include:s,limits:{maxEntries:o,maxPayloadChars:l,maxScanLines:d}}),I=[],A=await pd({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await uU(c.id,u);if(e){let t=uQ(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});t.entries.length>0&&(S=uY(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 pp({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:y});e&&(e.dump.entries.length>0?(S=uY(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:v,dump:S,notes:I}}async function pd(e){let{device:t,appBundleId:r,appLogPath:n,appLogState:o}=e;if("android"!==t.platform||!r)return null;if(void 0!==o&&"active"!==o)return{reason:"inactive"};if("active"!==o)return null;let s=function(e){let t=function(e){if(!e||!a.existsSync(e))return null;try{return t4(a.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}(i.join(i.dirname(n),t5));if(!s)return null;let l=await uF(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pc(e,t,r,n){return await pr.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pu({device:e,appBundleId:t,outPath:r,pidPath:n}){pa(r);let i=a.createWriteStream(r,{flags:"a"}),o=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 uW(e.id,i,o,n):await uV(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return u$(t),await uG(e.id,t,i,o,n);if("macos"===e.platform)return await uK(t,i,o,n);throw i.end(),new eD("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pp(e){let t=await uj({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:uQ(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 pf(e){await e.stop(),await uO(e.wait)}async function pm(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 e8(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e8(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 iU(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iU(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eE("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function ph(e,t){pa(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
16
|
+
`;a.appendFileSync(e,r,"utf8")}function pw(e){let t=i.dirname(e),r=i.basename(e);a.existsSync(t)||a.mkdirSync(t,{recursive:!0}),a.existsSync(e)?a.truncateSync(e,0):a.writeFileSync(e,"","utf8");let n=0;for(let e of a.readdirSync(t)){if(!e.startsWith(`${r}.`))continue;let o=e.slice(r.length+1);if(/^\d+$/.test(o))try{a.unlinkSync(i.join(t,e)),n+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:n}}function pg(e,t){for(let r of e){if(t(r))return r;let e=pg(r.children,t);if(e)return e}}function py(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...py(n.children,t));return r}function pv(e,t){let r=pg(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 pS(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 pI(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:pS(e):null}function pA(e){return Math.round(10*e)/10}async function p_(e,t){let r=["devicectl",...e],n=await iU(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eD("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:pD(i,a)??pN})}async function pb(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 pM(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"})),iN(r,t)}async function px(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 pM(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 pM(e,t){let r=i.join(u.tmpdir(),`${t.jsonPrefix}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),n=[...t.args,"--json-output",r],a=await iU(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new eD("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:pD(r,i)??pN})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof eD)throw r;throw new eD("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let pN="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function pD(e,t){let r=`${e}
|
|
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 pk(e,t){try{let r=await iG(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await iF("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 s.readFile(e,"utf8"),n=t,l8(l4(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let pP="xctrace-animation-hitches";function pE(e,t){let r=l4(e),n=pv(r,t);return{rows:0===n.length?[]:py(r,e=>"row"===e.name),schema:n}}function pC(e,t){for(let r of e)pC(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:pS(r),process:pR(r)})}function pR(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=pS(pg(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 pO="ps-process-snapshot",pT="ps-process-snapshot",pL="xctrace-activity-monitor",p$="xctrace-activity-monitor",pF="leaks-output-graph",pU="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function pG(e,t){if("ios"===e.platform&&"device"===e.kind)return await p4(e,t);let r=await p5(e,t),n=await ft(e,r);if(0===n.length)throw new eD("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 fs({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:pO,memoryMethod:pT})}async function pq(e,t,r){let n,a=pz(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await fn(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await pV(r);try{n=await pj(e,r,l.pid)}catch(n){throw await pB(r,d),function(e,t,r,n,a){if(a instanceof eD){let o=a.details??{};return new eD(a.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fo(r.command)),path:n,hint:fi(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:a.message)},a)}return new eD("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(fo(r.command)),path:n,hint:"Retry perf memory snapshot. If it still fails, run with --debug and inspect leaks output."},a)}(e,t,l,r,n)}if(0!==n.exitCode)throw await pB(r,d),new eD("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(fo(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:fi(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await pB(r,d),new eD("COMMAND_FAILED","Apple memgraph artifact is missing or empty",{kind:"memgraph",appBundleId:t,pid:l.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:pF,appBundleId:t,pid:l.pid,processName:i.basename(fo(l.command)),support:a}}async function pj(e,t,r){return"macos"===e.platform?await iF("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await iU(lI(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function pV(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function pB(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function pH(e,t){var r;let n,a,o,s,l,c;if("ios"!==e.platform||"device"!==e.kind)throw new eD("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 p8(e,t),p=await pX(e,t,u);return n=pE((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:tZ(u.map(e=>i.basename(d(e.executable)))),windowStartedAt:p.windowStartedAt,windowEndedAt:p.windowEndedAt,measuredAt:p.windowEndedAt}).frameLifetimesXml,"hitches-frame-lifetimes").rows.length,a=function(e){if(!e)return;let{rows:t,schema:r}=pE(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){pC(e.children,i);let t=pI(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=l4(e),i=Object.values(r={start:(t=pv(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 py(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(pC(e.children,r),!0===(n=e.children[t.isSystem],null===(o=pI(n,r))?null:0!==o))return null;let s=pI(e.children[t.start],r),l=pI(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:pR(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))),c=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:pA(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?pA(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:pP,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:pA(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function pK(e){return"ios"===e.platform&&"device"===e.kind?{method:pP,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:pP,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 pW(e){let t=pK(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:p$,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:pL,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:pT,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:pO,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function pz(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:pF,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:pF,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:pF,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:pF,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 pX(e,t,r){let n=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-frame-perf-")),a=i.join(n,"animation-hitches.trace"),o=i.join(n,"hitches.xml"),l=i.join(n,"frame-lifetimes.xml"),d=i.join(n,"display-info.xml");try{let n=await pJ({device:e,appBundleId:t,tracePath:a,template:"Animation Hitches",duration:"2s",targetPids:r.map(e=>e.pid),validateTraceOutput:!0,failureMessage:`Failed to record iOS frame-health sample for ${t}`});await p1(e,t,a,"hitches",o),await p1(e,t,a,"hitches-frame-lifetimes",l);let i=await p2(e,t,a,"device-display-info",d);return{windowStartedAt:n.startedAt,windowEndedAt:n.endedAt,hitchesXml:await s.readFile(o,"utf8"),frameLifetimesXml:await s.readFile(l,"utf8"),displayInfoXml:i?await s.readFile(d,"utf8"):void 0}}finally{await s.rm(n,{recursive:!0,force:!0}).catch(()=>{})}}async function pJ(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 pZ(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await p0(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eD("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:fd(l.result.stdout,l.result.stderr)})}async function pZ(e,t){let r;for(let n=1;n<=3;n+=1){await pQ(t,n,1500);let i=new Date().toISOString(),a=await iU(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!pY(a))break}return r}function pY(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 pQ(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function p0(e,t,r){let n=await s.stat(e.tracePath).catch(()=>null);if(!(n?.isDirectory()===!0?(await s.readdir(e.tracePath).catch(()=>[])).length>0:(n?.size??0)>0))throw new eD("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 p1(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await iU(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eD("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:fd(o.stdout,o.stderr)})}async function p2(e,t,r,n,i){try{return await p1(e,t,r,n,i),!0}catch{return!1}}async function p3(e){let t=l4(e),r=pv(t,"activity-monitor-process-live");if(0===r.length)throw new eD("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 eD("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=py(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=pg(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:pS(e),processName:fl(e)})}let r=pI(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:fl(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:pI(t[a],d),residentMemoryBytes:pI(t[o],d)})}return l}async function p5(e,t){let r="macos"===e.platform?await p7(t):await fe(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await pk(n,"CFBundleExecutable");if(!a)throw new eD("COMMAND_FAILED",`Failed to resolve executable for ${t}`,{appBundleId:t,appPath:r});return{executableName:a,executablePath:"macos"===e.platform?i.join(r,"Contents","MacOS",a):i.join(r,a)}}async function p4(e,t){let r=await p8(e,t),n=await p6(e,t),i=await p6(e,t),a=p9(await p3(n.xml),r,t,e),o=p9(await p3(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eD("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 eD("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 fs({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:pL,memoryMethod:p$})}async function p8(e,t){let r=(await pb(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eD("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eD("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=d(n),a=(await px(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eD("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 p6(e,t){let r=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-ios-perf-")),n=i.join(r,"sample.trace"),a=i.join(r,"activity-monitor-process-live.xml");try{let r=await pJ({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 p1(e,t,n,"activity-monitor-process-live",a),{capturedAtMs:r.capturedAtMs,xml:await s.readFile(a,"utf8")}}finally{await s.rm(r,{recursive:!0,force:!0}).catch(()=>{})}}function p9(e,t,r,n){let a=new Set(t.map(e=>e.pid)),o=new Set(t.map(e=>i.basename(d(e.executable)))),s=e.filter(e=>a.has(e.pid)||o.has(e.processName));if(0===s.length)throw new eD("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:fc(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:fc(t.residentMemoryBytes,e.residentMemoryBytes)})}let c=[...l.values()],u=c.map(e=>e.cpuTimeNs).filter(e=>null!==e),p=c.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:tZ(c.map(e=>e.processName))}}async function p7(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await iF("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eD("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 eD("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function fe(e,t){let r=lI(e,["get_app_container",e.id,t,"app"]),n=await iU(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eD("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 eD("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function ft(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:lI(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of P(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 iF("ps",r,{timeoutMs:15e3}):await fa(r)).stdout).filter(e=>(function(e,t){let r=fo(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 i.basename(r)===t.executableName})(e.command,t))}async function fr(e,t,r){let n=(await ft(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eD("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 fn(e,t,r){try{let r=await p5(e,t);return{available:!0,process:await fr(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eD))return!1;let r=t.details??{},n=Array.isArray(r.args)?r.args.join(" "):"",i="string"==typeof r.stderr?r.stderr:"",a=`${t.message}
|
|
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 fi(e,t,r){let n=`${t}
|
|
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 fa(e){let t=await iU(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await iF("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function fo(e){let[t=""]=e.trim().split(/\s+/,1);return t}function fs(e){return{cpu:{usagePercent:pA(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 fl(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function fd(e,t){let r=pD(e,t);if(r)return r;let n=`${e}
|
|
21
|
+
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?pN: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 fc(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function fu(e){var t;let r=await fh(e.device,e.appBundleId);await s.mkdir(i.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"],a=new Date().toISOString(),o=await fw(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:a,child:o.child,wait:o.wait}}async function fp(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await fy(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eD("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:fd(r.stdout,r.stderr)});return t!==e.outPath&&await s.rename(e.outPath,t).catch(async()=>{await s.cp(e.outPath,t,{recursive:!0}),await s.rm(e.outPath,{recursive:!0,force:!0})}),await fS(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 ff(e){return await fy(e,{failOnForcedKill:!1})}async function fm(e){let t=await s.mkdtemp(i.join(u.tmpdir(),"agent-device-xctrace-report-")),r=i.join(t,"trace-toc.xml");try{var n;let t,a,o,l=["xctrace","export","--input",e.tracePath,"--xpath","/trace-toc","--output",r],d=await iU(l,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eD("COMMAND_FAILED","Failed to export Apple xctrace report metadata",{cmd:"xcrun",args:l,exitCode:d.exitCode,stdout:d.stdout,stderr:d.stderr,tracePath:e.tracePath,hint:fd(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=l4(n.tocXml),a=py(t,e=>"run"===e.name),o=tZ(py(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:a.length,tableSchemas:o}});return await s.mkdir(i.dirname(e.outPath),{recursive:!0}),await s.writeFile(e.outPath,`${JSON.stringify(c,null,2)}
|
|
22
|
+
`,"utf8"),c}finally{await s.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function fh(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eD("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 p8(e,t);return{pids:r.map(e=>e.pid),processNames:tZ(r.map(e=>i.basename(d(e.executable))))}}let r=await p5(e,t),n=await ft(e,r);if(0===n.length)throw new eD("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 fw(e,t,r){let n;for(let r=1;r<=3;r+=1){await pQ(t,r,1500);let i=ek("xcrun",e,{allowFailure:!0}),a=await fg(i.wait);if(!a)return i;if(n=a,!pY(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eD("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:fd(i.stdout,i.stderr)})}async function fg(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function fy(e,t){e.child.kill("SIGINT");let r=await fv(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await fv(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eD("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 eD("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 fv(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function fS(e,t){let r=await s.stat(e).catch(()=>null);if(!(r?.isDirectory()===!0?(await s.readdir(e).catch(()=>[])).length>0:(r?.size??0)>0))throw new eD("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 fI(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function fA(e){return Math.round(10*e)/10}let f_="adb-shell-dumpsys-gfxinfo-framestats",fb="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 fx(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 fM(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function fN(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function fD(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:fI(i)??void 0}async function fk(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tN(e,r.adb);try{let d,c,p,f,m,h,w,g,y,v,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 eD("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=fD(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=fI(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=fD(t,"Uptime"),d=fD(t,"Stats since");return{droppedFramePercent:pA(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=fx(e,t,"Flags"),n=fx(e,t,"IntendedVsync"),i=fx(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 eD("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 eD("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=fM(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=fN(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}),y=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=fM(e);return fN(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,v={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?pA(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:fA(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}),{...v,sampleWindowMs:y,...(l=m,{frameDeadlineMs:void 0===l?void 0:fA(l/1e6),refreshRateHz:void 0===l?void 0:fA(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:f_,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await fP(e,t,r),I}catch(e){throw d=t,(c=e)instanceof eD?new eD(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eD("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function fP(e,t,r={}){let n=tN(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function fE(e,t,r,n){if(n instanceof eD){var i,a,o,s,l;let d,c=n.details??{};return new eD(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.":fC("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.":fC(i))},n)}return new eD("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:fC(t)},n)}function fC(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 fR(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 fO(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 fO(e,t,r){try{let n=await fk(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 fT="adb-shell-simpleperf",fL="adb-shell-perfetto",f$="/data/local/tmp";async function fF(e,t,r){let n=tN(e,r.adb);await fH(n,t),await fW(n,t),await fK(n,t);let i=await fV(t.outPath);await fq(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await fR(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?fT:fL,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function fU(e,t,r={}){let n=tN(e,r.adb);try{"running"===t.state&&(await fH(n,t),await fW(n,t).catch(()=>{}))}finally{await fq(n,t.remotePath)}}function fG(e,t,r=f$){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function fq(e,t){try{await e(["shell",`rm -f ${fB(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function fj(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
23
|
+
`)}async function fV(e){try{return(await s.stat(e)).size}catch(t){throw new eD("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 fB(e){return`'${e.replace(/'/g,"'\\''")}'`}async function fH(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${fB(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 fE("stop",t.kind,t.packageName,e)}}async function fK(e,t){await s.mkdir(i.dirname(t.outPath),{recursive:!0});try{await e(["pull",t.remotePath,t.outPath],{timeoutMs:3e4})}catch(e){throw new eD("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 fW(e,t){let r;for(let n=0;n<12;n+=1){let n=await fz(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await y(250)}throw new eD("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 fz(e,t){let r=fB(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 fX(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=fZ(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eD("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 fJ(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 eD("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 fZ(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function fY(e,t,r,n={}){let i,a=tN(e,n.adb),o=await fX(a,t);await fJ(a,"perfetto",t);let s=fG(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await fP(e,t,{adb:a}),i=await f0(a,s,t)}catch(e){throw await fq(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:fL,message:`Started Android Perfetto trace for ${t}`}}async function fQ(e,t,r,n={}){return await fF(e,{...t,outPath:r},n)}async function f0(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=fZ(n.stdout);if(i)return i;throw new eD("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 fE("start","perfetto",r,e)}}async function f1(e,t,r,n={}){let i,a=tN(e,n.adb),o=await fX(a,t);await fJ(a,"simpleperf",t);let s=fG(t,"cpu.perf.data");try{i=await f5(a,o,s,t)}catch(e){throw await fq(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:fT,message:`Started Android Simpleperf CPU profile for ${t}`}}async function f2(e,t,r,n={}){return await fF(e,{...t,outPath:r},n)}async function f3(e,t,r,n={}){let i=tN(e,n.adb);await fJ(i,"simpleperf",t.packageName);let a=await f4(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of P(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:pA(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 fj(r,l);let d=await fV(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:fT,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function f5(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(fB).join(" "),d=`${f$}/agent-device-${s}-${Date.now()}.err`,`err=${fB(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=fZ(c.stdout);if(u)return u;throw new eD("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 fE("start","simpleperf",n,e)}}async function f4(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw fE("report","simpleperf",t.packageName,e)}}let f8="adb-shell-dumpsys-cpuinfo",f6="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",f9="adb-shell-dumpsys-meminfo",f7="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",me="adb-shell-am-dumpheap",mt="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function mr(e,t,r={}){let n=tN(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 P(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:pA(i),measuredAt:r,method:f8,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw ml("cpu",t,e)}}async function mn(e,t,r={}){let n=tN(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 eD("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=md(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!==fI(e));if(!r)break;return fI(r)??void 0}}(e);if(void 0===i)throw new eD("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:md(e,"TOTAL RSS"),measuredAt:r,method:f9,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?fI(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 ml("memory",t,e)}}async function mi(e,t,r,n={}){let a,o=tN(e,n.adb),l=await ms(o,t),d=(a=t.replace(/[^a-zA-Z0-9._-]/g,"_"),`/data/local/tmp/agent-device-${a}-${Date.now()}.hprof`);await s.mkdir(i.dirname(r),{recursive:!0});let c=await ma(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 eD("COMMAND_FAILED",`Failed to capture Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,remotePath:d,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,hint:(u=e.stdout,p=e.stderr,(r=`${u}
|
|
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 mo(r,c),new eD("COMMAND_FAILED",`Failed to pull Android heap dump for ${t}`,{kind:"android-hprof",package:t,pid:l,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 s.stat(r).catch(()=>null);if(!i?.isFile()||i.size<=0)throw await mo(r,c),new eD("COMMAND_FAILED","Android heap dump artifact is missing or empty",{kind:"android-hprof",package:t,pid:l,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:me,packageName:t,pid:l,remotePath:d}}finally{await o(["shell","rm","-f",d],{allowFailure:!0,timeoutMs:15e3}).catch(()=>{})}}async function ma(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function mo(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function ms(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 eD("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 ml(e,t,r){return r instanceof eD?new eD(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eD("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function md(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:fI(i)??void 0}let mc="shared_prefs/ReactNativeDevPrefs.xml",mu="debug_http_host",mp="dev_server_https",mf="RCT_jsLocation",mm="RCT_packager_scheme",mh="React Native runtime hints require adb run-as access to the app sandbox. Verify the app is debuggable and the selected package/device are correct.",mw='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function mg(e){return void 0!==eI(e)}async function my(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=eI(n);if(i){if("android"===t.platform)return void await mS(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await mb(t,r,i)}}async function mv(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await mI(t,r);"ios"===t.platform&&"simulator"===t.kind&&await mx(t,r)}}async function mS(e,t,r){var n,i,a,o,s,l;let d,c;mk(t);let u=(n=await mA(e,t),i=mu,a=`${r.host}:${r.port}`,d=` <string name="${mP(i)}">${mP(a)}</string>`,mN(mD(n,i),d));o=u,s=mp,l="https"===r.scheme,c=` <boolean name="${mP(s)}" value="${l?"true":"false"}" />`,u=mN(mD(o,s),c),await m_(e,t,u)}async function mI(e,t){mk(t);let r=await mA(e,t),n=mD(r,mu),i=mD(n,mp);i!==r&&await m_(e,t,i)}async function mA(e,t){let r=await e8(e,["shell","run-as",t,"cat",mc],{allowFailure:!0});return 0!==r.exitCode?mw:mM(r.stdout)}async function m_(e,t,r){let n=["shell","run-as",t,"id"],i=await e8(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=mE(i.stdout,i.stderr);throw new eD("COMMAND_FAILED",e?`Failed to access Android app sandbox for ${t}`:`Failed to probe Android app sandbox for ${t}`,{package:t,cmd:"adb",args:n,stdout:i.stdout,stderr:i.stderr,exitCode:i.exitCode,hint:e?mh:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await e8(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await e8(e,["shell","run-as",t,"tee",mc],{stdin:r.trimEnd()})}catch(n){let e=eM(n);if("TOOL_MISSING"===e.code)throw e;let r=mE("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new eD("COMMAND_FAILED",r?`Failed to access Android app sandbox for ${t}`:`Failed to write Android runtime hints for ${t}`,{...e.details??{},package:t,cmd:"adb",phase:"write-runtime-hints",hint:r?mh:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function mb(e,t,r){await iU(lI(e,["spawn",e.id,"defaults","write",t,mf,"-string",`${r.host}:${r.port}`])),await iU(lI(e,["spawn",e.id,"defaults","write",t,mm,"-string",r.scheme]))}async function mx(e,t){await iU(lI(e,["spawn",e.id,"defaults","delete",t,mf]),{allowFailure:!0}),await iU(lI(e,["spawn",e.id,"defaults","delete",t,mm]),{allowFailure:!0})}function mM(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
25
|
+
`:mw}function mN(e,t){return mM(e).replace("</map>",`${t}
|
|
26
|
+
</map>`)}function mD(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return mM(e).replace(RegExp(`^\\s*<string name="${r}">[\\s\\S]*?<\\/string>\\n?`,"m"),"").replace(RegExp(`^\\s*<boolean name="${r}" value="(?:true|false)"\\s*\\/?>\\n?`,"m"),"")}function mk(e){if("binary"!==tc(e))return;let t=tm(e);throw new eD("INVALID_ARGS",t,{package:e,hint:t})}function mP(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function mE(e,t){let r=`${e}
|
|
27
|
+
${t}`.toLowerCase();return["run-as: package not debuggable","run-as: permission denied","run-as: package is unknown","run-as: unknown package","is unknown","is not an application","could not set capabilities"].some(e=>r.includes(e))}let mC=new Map;async function mR(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await mL(e.installablePath,i.join(t,"installable")),a=e.archivePath?await mL(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{mO(o)},s);return mC.set(o,{rootPath:t,installablePath:n,archivePath:a,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:l,timer:d}),{materializationId:o,installablePath:n,...a?{archivePath:a}:{},expiresAt:new Date(l).toISOString()}}catch(e){throw await w.rm(t,{recursive:!0,force:!0}),e}}async function mO(e,t){let r=mC.get(e);if(!r)throw new eD("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eD("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),mC.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function mT(e){let t=Array.from(mC.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await mO(e)}))}async function mL(e,t){let r=await w.stat(e);await w.mkdir(t,{recursive:!0});let n=i.join(t,i.basename(e));return r.isDirectory()?await w.cp(e,n,{recursive:!0}):await w.copyFile(e,n),n}let m$=["Simulator"],mF=["Device Hub","Simulator"];function mU(e,t){if("simulator"!==e.kind)throw new eD("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function mG(e={}){let t=e.deviceHub?mF:m$,r=e.background?["-g","-a"]:["-a"];for(let e of t)if(0===(await iF("open",[...r,e],{allowFailure:!0,timeoutMs:1e4})).exitCode)return}async function mq(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await mV(e)){t.focusExisting&&await mG({background:t.deviceHub,deviceHub:t.deviceHub});return}let i=te.fromTimeoutMs(18e4);try{await tl(async({deadline:t})=>{if(t?.isExpired())throw new eD("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await iU(lI(e,["boot",e.id]),{allowFailure:!0,timeoutMs:i});r={stdout:String(a.stdout??""),stderr:String(a.stderr??""),exitCode:a.exitCode};let o=`${r.stdout}
|
|
28
|
+
${r.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==r.exitCode&&!s)throw new eD("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await iU(lI(e,["bootstatus",e.id,"-b"]),{allowFailure:!0,timeoutMs:i});if(n={stdout:String(l.stdout??""),stderr:String(l.stderr??""),exitCode:l.exitCode},0!==n.exitCode)throw new eD("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await mV(e);if("Booted"!==d)throw new eD("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=tn({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});return"IOS_BOOT_TIMEOUT"!==t&&"CI_RESOURCE_STARVATION_SUSPECTED"!==t}},{deadline:i,phase:"boot",classifyReason:e=>tn({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=tn({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new eD("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:ta(t),boot:r,bootstatus:n})}await mG({deviceHub:t.deviceHub})}async function mj(e){let t=lI(e,["shutdown",e.id]),r=await iU(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function mV(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lS(["list","devices","-j"]):lI(e,["list","devices","-j"]),n=await iU(r,{allowFailure:!0,timeoutMs:6e4});if(0!==n.exitCode)return null;try{let e=JSON.parse(String(n.stdout??""));for(let r of Object.values(e.devices??{})){let e=r.find(e=>e.udid===t);if(e)return e.state}return null}catch{return null}}function mB(e){return"ios"===e.platform&&"simulator"===e.kind}async function mH(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return mB(e)?await mK(e):await mz(e)}catch(t){let e=eN(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function mK(e){let t=await mj(e);return t.success?t:"Shutdown"===await mW(e)?{...t,success:!0,exitCode:0}:t}async function mW(e){try{return await mV(e)}catch{return null}}async function mz(e){let t=await e8(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}let mX=new Map;async function mJ(e,t={}){var r;let n,i=(n="simulator"===(r=e).kind?r.simulatorSetPath??"":"",JSON.stringify([r.platform,r.kind,r.id,r.target??"",n])),a=mX.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;mX.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(tB);await r(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting}),mZ(i);return}if("device"===e.kind){await mY(e.id),mZ(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./8806.js");await t(e.id),mZ(i)}}function mZ(e){mX.set(e,Date.now()+5e3)}async function mY(e){let t=i.join(u.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),r=Math.max(1,Math.ceil(15));try{let n=await iU(["devicectl","device","info","details","--device",e,"--json-output",t,"--timeout",String(r)],{allowFailure:!0,timeoutMs:18e3}),i=String(n.stdout??""),a=String(n.stderr??""),o=await mQ(t);if(0===n.exitCode){if(!o.parsed)throw new eD("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:e,stdout:i,stderr:a,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let t=o?.tunnelState?.toLowerCase();if("connecting"===t)throw new eD("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,tunnelState:t,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new eD("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:e,stdout:i,stderr:a,exitCode:n.exitCode,tunnelState:o?.tunnelState,hint:m0(i,a)})}catch(t){if(t instanceof eD&&"COMMAND_FAILED"===t.code){if("not_ready"===("string"==typeof t.details?.kind?t.details.kind:""))throw t;let r=t.details??{},n=String(r.stdout??""),i=String(r.stderr??""),a=Number(r.timeoutMs??15e3),o=`CoreDevice did not respond within ${a}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new eD("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?m0(n,i):o},t)}throw new eD("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,hint:"Reconnect the device, keep it unlocked, and retry."},t instanceof Error?t:void 0)}finally{await s.rm(t,{force:!0}).catch(()=>{})}}async function mQ(e){try{let t=await s.readFile(e,"utf8"),r=JSON.parse(t),n=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let r=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,i="string"==typeof r?r:"string"==typeof n?n:void 0;return i?{tunnelState:i}:{}}(r);return{parsed:!0,tunnelState:n.tunnelState}}catch{return{parsed:!1}}}function m0(e,t){let r=pD(e,t);return r||(`${e}
|
|
29
|
+
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pN)}let m1=300,m2=300;function m3(e,t,r){return t||ns(r,ni)?null:aG("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function m5(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function m4(e,t){mB(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function m8(e){let t=ns(e.flags,ni)||!e.session?await r8(e.flags??{}):await m6(e.session.device);return!1!==e.ensureReady&&await mJ(t),t}async function m6(e){if("ios"!==e.platform||"simulator"!==e.kind||"darwin"!==process.platform)return e;let t={platform:"ios",target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await r8(t)}catch(e){if(!(e instanceof eD)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r8({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function m9(e){let t=e.flags?.device?.trim();return t||(e.resolvedDevice?.platform==="android"&&"emulator"===e.resolvedDevice.kind?e.resolvedDevice.name:e.sessionDevice?.platform==="android"&&"emulator"===e.sessionDevice.kind?e.sessionDevice.name:void 0)}function m7(e,t){return!!t&&0===lo(t,e).length}async function he(e){let{device:t,shutdownRequested:r}=e;if(r&&(mB(t)||"android"===t.platform&&"emulator"===t.kind))return await mH(t)}async function ht(e){if(await cZ(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i4("dismiss",t).catch(t=>{ei({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function hr(e){e.applePerf?.active&&(await ff(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function hn(e){let t=e.nativePerf?.android;t&&(await fU(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function hi(e,t){e.appLog&&await pf(e.appLog),await hr(e),await hn(e),eQ(e.device.platform)&&await ht(e),await mT(t).catch(()=>{})}async function ha(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await ho(t,n);a.appLog&&await pf(a.appLog),await hr(a),await hn(a),t.positionals&&t.positionals.length>0&&(eQ(a.device.platform)&&!mB(a.device)&&await ht(a),await ir(a.device,"close",t.positionals,t.flags?.out,{...aN(n,t.flags,a.appBundleId,a.trace?.outPath)}),await m4(a.device,m1)),eQ(a.device.platform)&&(!mB(a.device)||t.flags?.shutdown||a.recording)?await ht(a):eQ(a.device.platform)&&ei({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),mg(i.getRuntimeHints(r))&&a.appBundleId&&await mv({device:a.device,appId:a.appBundleId}).catch(()=>{}),i.recordAction(a,{command:"close",positionals:t.positionals??[],flags:t.flags??{},result:{session:a.name,...G(`Closed: ${a.name}`)}}),t.flags?.saveScript&&(a.recordSession=!0),i.writeSessionLog(a),await mT(r).catch(()=>{}),i.delete(r);let o=await he({device:a.device,shutdownRequested:t.flags?.shutdown});return o?{ok:!0,data:D({session:a.name,shutdown:o},`Closed: ${a.name}`)}:{ok:!0,data:{session:a.name,...G(`Closed: ${a.name}`)}}}async function ho(e,t){if(!e.positionals||0===e.positionals.length)return aG("SESSION_NOT_FOUND","No active session");let r=await m8({session:void 0,flags:e.flags,ensureReady:!0});return await ir(r,"close",e.positionals,e.flags?.out,{...aN(t,e.flags)}),await m4(r,m1),{ok:!0,data:{app:e.positionals[0],...G(`Closed: ${e.positionals[0]}`)}}}async function hs(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 hl(e){a.existsSync(e)&&a.unlinkSync(e)}function hd(e){if(!a.existsSync(e))return null;try{let t=JSON.parse(a.readFileSync(e,"utf8"));if(!Number.isInteger(t.pid)||t.pid<=0)return null;return t}catch{return null}}function hc(e){let t=hd(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function hu(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hp(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 eD("COMMAND_FAILED",t))})})}(async function(e={}){let t,n,o=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}=eU(o.AGENT_DEVICE_STATE_DIR),h=ej(o.AGENT_DEVICE_DAEMON_SERVER_MODE);var w,y,v,S=m;if(a.existsSync(S))for(let e of a.readdirSync(S,{withFileTypes:!0})){if(!e.isDirectory())continue;let t=i.join(S,e.name,t5);if(a.existsSync(t))try{let e=t4(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=ev(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=eS(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{t6(t)}}let I=new t1(m),A=new rQ({maxActiveSimulatorLeases:hu(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hu(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hu(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hu(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),_=tb(),b=r.randomBytes(24).toString("hex"),x=ev(process.pid)??void 0,M=eB(),N=function(e){let{logPath:t,token:r,androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:d,deviceInventoryProvider:c,trackDownloadableArtifact:u}=e,{sessionStore:p,leaseRegistry:f}=e;async function m(e){let n=!!(e.meta?.debug||e.flags?.verbose);return await Q({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:n,logPath:t},async()=>{if(!t9(e.token,r))return uE();try{return await r7(c,async()=>{let t=await uk({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uR(e)}})}async function h(e,t){let r=async()=>{let r=function(e){var t,r,n;let a,{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=cz(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=(a=(t={req:o.req,sessionName:o.sessionName,sessionStore:s}).sessionStore.get(t.sessionName),{req:lm(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=ee();if(!t.ok){ei({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=et({force:!0})??void 0;return{ok:!1,error:eN(new eD(ex(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 ei({level:"info",phase:"request_success"}),et(),{ok:!0,data:function(e,t,r){var n,a;let o;if(!t)return t;let s=(n=e,o=Array.isArray((a=t).artifacts)?[...a.artifacts]:[],"screenshot"!==n.command||o.some(e=>e?.field==="path")||"string"!=typeof a.path||o.push({field:"path",path:a.path,localPath:n.meta?.clientArtifactPaths?.path,fileName:i.basename(n.meta?.clientArtifactPaths?.path??a.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,nf(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,nf(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lo(e,t);if(0!==r.length)throw new eD("INVALID_ARGS",`Session "${e.name}" is already bound to ${li(e)}, but this request selected ${r.map(ls).join(", ")}.`,{session:e.name,conflicts:r.map(ls),hint:la(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...aN(d,e,t,r,n=ee().requestId),requestId:n}};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:p,trackDownloadableArtifact:u});if("response"===r.type)return r.response;let c=r.scope,f=async e=>await w({lockedScope:c,providerScope:e,allowReplayActions:void 0===t});return t?await f(t):await nh({req:c.req,existingSession:c.existingSession,providers:{androidAdbProvider:n,appleRunnerProvider:a,appleToolProvider:o,linuxToolProvider:s,appLogProvider:l,recordingProvider:d}},f)};return t?await r():await e.runLocked(r)}async function w(e){var t,n;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await s2({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:p,leaseRegistry:f,invoke:m,invokeReplayAction:o?(t=i,n=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,nf(o)?.replayScopedAction!==!0))return await m(e);if(!t9(e.token,r))return uE();try{let r=await uk({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return uR(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await uC({lockedScope:i,logPath:i.logPath,sessionStore:p})}return m}({logPath:f,token:b,sessionStore:I,leaseRegistry:A,trackDownloadableArtifact:rf}),D=async e=>{await Q({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ei({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),et({force:!0})})},k=async e=>{let t=hi(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,eW(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
31
|
+
`)})]),I.writeSessionLog(e),I.delete(e.name)},P=async()=>{let e=I.toArray();await Promise.all(e.map(k))},E=async()=>{let e,t,r=[];if("http"!==h){let t,n,i=(t=new Set,(n=g.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))ra(e);ei({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(tj);if(await e(),n<=0)break;await eW(200)}}catch(e){ei({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=eT(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=eF(n),a=rn(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),ri(a),rs(a))throw rd();r=await rx(o?t=>{e.destroyed||e.write(eH(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:eN(e)}}finally{n-=1,a&&(i.delete(a),ro(a))}e.destroyed||e.write(o?eL(r):`${JSON.stringify(r)}
|
|
32
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await hp(i,"Failed to bind socket server")}if("socket"!==h){let e=await rB({handleRequest:N,token:b});r.push(e),t=await hp(e,"Failed to bind HTTP server")}return{servers:r,socketPort:e,httpPort:t}};if(!function(e,t,r){a.existsSync(e)||a.mkdirSync(e,{recursive:!0});let n=JSON.stringify(r,null,2),i=()=>{try{return a.writeFileSync(t,n,{flag:"wx",mode:384}),!0}catch(e){if("EEXIST"===e.code)return!1;throw e}};if(i())return!0;let o=hd(t);if(o?.pid&&o.pid!==process.pid&&e_(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:_,startedAt:Date.now(),processStartTime:x}))return l.write("Daemon lock is held by another process; exiting.\n"),d(0),null;let C=[];try{let e,r=await E();C=r.servers,t=r.socketPort,n=r.httpPort,w=t,y=n,v={socketPort:w,httpPort:y,token:b,version:_,codeSignature:M,processStartTime:x},a.existsSync(c)||a.mkdirSync(c,{recursive:!0}),a.writeFileSync(f,""),e=v.socketPort&&v.httpPort?"dual":v.httpPort?"http":"socket",a.writeFileSync(u,JSON.stringify({port:v.socketPort,httpPort:v.httpPort,transport:e,token:v.token,pid:process.pid,version:v.version,codeSignature:v.codeSignature,processStartTime:v.processStartTime,stateDir:c},null,2),{mode:384}),a.chmodSync(u,384),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
|
|
33
|
+
`),y&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${y}
|
|
34
|
+
`)}catch(t){let e=eM(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
35
|
+
`),C))try{t.close(()=>{})}catch{}return hl(u),hc(p),d(1),null}es();let R=!1,O=async(e={})=>{if(R)return;R=!0,e.cause&&await D(e.cause),await hs(C),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tj);await t(),await Promise.race([eo().catch(()=>{}),eW(1e3)]),hl(u),hc(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{O()}),process.on("SIGTERM",()=>{O()}),process.on("SIGHUP",()=>{O()}),process.on("uncaughtException",e=>{let t=e instanceof eD?e:eM(e);l.write(`Daemon error: ${t.message}
|
|
36
|
+
`),O({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eD?t:eM(t);l.write(`Daemon error: ${r.message}
|
|
37
|
+
`),O({exitCode:1,cause:t})})),{httpPort:n,shutdown:O,socketPort:t,token:b}})().catch(e=>{let t=eM(e);process.stderr.write(`Daemon error: ${t.message}
|
|
38
|
+
`),process.exit(1)});export{f6 as ANDROID_CPU_SAMPLE_DESCRIPTION,f8 as ANDROID_CPU_SAMPLE_METHOD,fb as ANDROID_FRAME_SAMPLE_DESCRIPTION,f_ as ANDROID_FRAME_SAMPLE_METHOD,mt as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,me as ANDROID_HPROF_SNAPSHOT_METHOD,f7 as ANDROID_MEMORY_SAMPLE_DESCRIPTION,f9 as ANDROID_MEMORY_SAMPLE_METHOD,pU as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,pF as APPLE_MEMGRAPH_SNAPSHOT_METHOD,pN as IOS_DEVICECTL_DEFAULT_HINT,dP as IOS_RUNNER_CONTAINER_BUNDLE_IDS,m1 as IOS_SIMULATOR_POST_CLOSE_SETTLE_MS,m2 as IOS_SIMULATOR_POST_OPEN_SETTLE_MS,nb as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,n_ as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,t1 as SessionStore,lZ as acquireProcessLock,sl as annotateScreenshotWithRefs,pn as withAppLogProvider,ph as appendAppLogMarker,my as applyRuntimeHintsToApp,pK as buildAppleFrameSamplingMetadata,pz as buildAppleMemorySnapshotSupport,pW as buildAppleSamplingMetadata,nE as buildRunnerSequenceCommand,la as buildSessionRecoveryHint,lS as buildSimctlArgs,lI as buildSimctlArgsForDevice,od as buildSnapshotState,mi as captureAndroidHeapSnapshot,oA as captureAndroidUiHierarchyXml,pq as captureAppleMemorySnapshot,a9 as captureSnapshot,mO as cleanupRetainedMaterializedPaths,rg as cleanupUploadedArtifact,pw as clearAppLogFiles,ro as clearRequestCanceled,mv as clearRuntimeHintsFromApp,aN as context_contextFromFlags,oh as createDaemonRuntimeSessionStore,ur as createLocalAppleRunnerProvider,rd as createRequestCanceledError,iM as createScopedProvider,ir as dispatchCommand,rM as emitRequestProgress,oJ as ensureAndroidBlockingSystemDialogReady,mJ as ensureDeviceReady,aG as errorResponse,iN as filterAppleAppsByBundlePrefix,a_ as getActiveAndroidSnapshotFreshness,po as getAppLogPathMetadata,rl as getRequestSignal,cz as getRunnerSessionSnapshot,nc as getSessionCommandKind,mV as getSimulatorState,sM as getSnapshotReferenceFrame,ha as handleCloseCommand,mg as hasRuntimeTransportHints,i$ as hasScopedAppleToolProvider,tJ as inferFillText,ix as isCommandSupportedOnDevice,lp as isImplicitSessionScopeConflict,ax as isNavigationSensitiveAction,rs as isRequestCanceled,ne as listDeviceInventory,pb as listIosDeviceApps,i9 as runMacOsPressAction,i6 as runMacOsReadTextAction,aA as markAndroidSnapshotFreshness,aD as markPendingInteractionOutcome,aL as markPostGestureStabilization,ra as markRequestCanceled,nC as parseRunnerSequenceResult,ux as prepareIosRunner,rw as prepareUploadedArtifact,ub as prewarmIosRunnerSession,i3 as quitMacOsApp,iG as readApplePlistJson,pk as readInfoPlistString,pl as readSessionNetworkCapture,sk as recordTouchVisualizationEvent,oX as recoverAndroidBlockingSystemDialog,m6 as refreshSessionDeviceIfNeeded,ri as registerRequestAbort,m3 as requireSessionOrExplicitSelector,mU as requireSimulatorDevice,fP as resetAndroidFramePerfStats,m9 as resolveAndroidEmulatorAvdName,un as resolveAppleRunnerProvider,iT as resolveAppleToolProvider,m8 as resolveCommandDevice,i2 as resolveFrontmostMacOsApp,lc as resolveImplicitSessionScope,pD as resolveIosDevicectlHint,lf as resolveLeaseScope,an as resolveLinuxToolProvider,ps as resolveLogBackend,n7 as resolvePayloadInput,ld as resolvePublicSessionName,rn as resolveRequestTrackingId,dD as resolveRunnerAppBundleId,t3 as resolveSessionRequestLogPath,t2 as resolveSessionRunnerLogPath,of as resolveSnapshotScope,r8 as resolveTargetDevice,mR as retainMaterializedPaths,pm as runAppLogDoctor,iF as runAppleToolCommand,p_ as runIosDevicectl,aa as runLinuxToolCommand,i4 as runMacOsAlertAction,i5 as runMacOsPermissionAction,i7 as runMacOsScreenshotAction,i8 as runMacOsSnapshotAction,lA as runSimctlForDevice,iU as runXcrun,u_ as runIosRunnerCommand,ui as withAppleRunnerProvider,cY as abortAllIosRunnerSessions,cQ as stopAllIosRunnerSessions,mr as sampleAndroidCpuPerf,fk as sampleAndroidFramePerf,mn as sampleAndroidMemoryPerf,pH as sampleAppleFramePerf,pG as sampleApplePerfMetrics,m7 as selectorTargetsSessionDevice,lu as sessionMatchesScope,m5 as session_device_utils_hasExplicitSessionFlag,om as setSessionSnapshot,m4 as settleIosSimulator,mH as shutdownDeviceTarget,mj as shutdownSimulator,mq as ensureBootedSimulator,o_ as snapshotAndroid,ay as snapshotLinux,av as readLinuxTextAtPoint,fY as startAndroidPerfettoTrace,f1 as startAndroidSimpleperfProfile,pc as startAppLog,fu as startAppleXctracePerfCapture,fQ as stopAndroidPerfettoTrace,f2 as stopAndroidSimpleperfProfile,pf as stopAppLog,fp as stopAppleXctracePerfCapture,cZ as stopIosRunnerSession,aE as stripInternalInteractionFlags,iL as withAppleToolProvider,ai as withLinuxToolProvider,tZ as uniqueStrings,ln as withKeyedLock,f3 as writeAndroidSimpleperfReport,fm as writeAppleXctracePerfReport};
|